Actualizar un file en el repository de GitHub usando Octokit

Estoy tratando de desarrollar una aplicación de formularios de Windows que pueda crear, actualizar y eliminar files en un repository de GitHub usando Octokit.

public Form1() { InitializeComponent(); var ghClient = new GitHubClient(new ProductHeaderValue("Octokit-Test")); ghClient.Cnetworkingentials = new Cnetworkingentials("-personal access token here-"); // github variables var owner = "username"; var repo = "repository name"; var branch = "master"; // create file //var createChangeSet = ghClient.Repository.Content.CreateFile(owner,repo,"path/file2.txt",new CreateFileRequest("File creation", "Hello World!", branch)); // update file var updateChangeSet = ghClient.Repository.Content.UpdateFile(owner, repo,"path/file2.txt", new UpdateFileRequest("File update","Hello Universe!", "SHA value should be here", branch)); } 

En primer lugar, logré crear un file (verifique el código comentado), que es completamente funcional. Luego traté de actualizar ese file usando,

 var updateChangeSet = ghClient.Repository.Content.UpdateFile(owner, repo,"path/file2.txt", new UpdateFileRequest("File update","Hello Universe!", "SHA value should be here", branch)); 

Como puede ver, en esta situación, tengo que get el valor de sha ya que el requisito para la "UpdateFileRequest" es,

 UpdateFileRequest(string message, string content, string sha, string branch) 

¿Cómo puedo recibir este valor de Sha para mi file de GitHub?

Estoy siguiendo este tutorial, pero cuando pruebo "createChangeSet.Content.Sha" (sin comentar createChangeSet), dibuja una línea roja debajo de "Content" y dice:

 Task<RepositoryChangeSet> does not contain a definition for 'Content' and no extention method 'Content' accepting a first argument of type Task<RepositoryChangeSet> could be found 

Miré la Documentación de GitHub y dice que debería usar,

 GET /repos/:owner/:repo/contents/:path 

para devolver el contenido de un file o directory en un repository, así que supongo que podré get el valor de sha de esta manera.

¿Cómo puedo implementar este método para recibir el valor de sha para mi file en el repository para poder usar ese valor para actualizar el file?

Tuve el mismo problema y para get el sha necesitarás primero get el file existente y con este file también obtendrás el último commit sha, que se puede usar para actualizar el file.

Código de demostración completo:

  var ghClient = new GitHubClient(new ProductHeaderValue("Octokit-Test")); ghClient.Cnetworkingentials = new Cnetworkingentials("//...//"); // github variables var owner = "owner"; var repo = "repo"; var branch = "branch"; var targetFile = "_data/test.txt"; try { // try to get the file (and with the file the last commit sha) var existingFile = await ghClient.Repository.Content.GetAllContentsByRef(owner, repo, targetFile, branch); // update the file var updateChangeSet = await ghClient.Repository.Content.UpdateFile(owner, repo, targetFile, new UpdateFileRequest("API File update", "Hello Universe! " + DateTime.UtcNow, existingFile.First().Sha, branch)); } catch (Octokit.NotFoundException) { // if file is not found, create it var createChangeSet = await ghClient.Repository.Content.CreateFile(owner,repo, targetFile, new CreateFileRequest("API File creation", "Hello Universe! " + DateTime.UtcNow, branch)); } 

No estoy seguro de si hay una mejor manera de hacerlo: si el file buscado no se encuentra, se lanza una exception.

Pero parece funcionar de esa manera.

    Intereting Posts