2017-08-09 3 views
0

ich eine Klasse GitHub mit einer Methode haben, die Liste aller zurückgeben sollte spezifischen Benutzernamen und ein Repo auf GitHub verpflichtet für:Wie für jede Liste von Dateien erhalten begehen mit octokit und C#

using System; 
using Octokit; 
using System.Threading.Tasks; 
using System.Collections.Generic; 

namespace ReadRepo 
{ 
    public class GitHub 
    { 
     public GitHub() 
     { 
     } 

     public async Task<List<GitHubCommit>> getAllCommits() 
     {    
      string username = "lukalopusina"; 
      string repo = "flask-microservices-main"; 

      var github = new GitHubClient(new ProductHeaderValue("MyAmazingApp")); 
      var repository = await github.Repository.Get(username, repo); 
      var commits = await github.Repository.Commit.GetAll(repository.Id); 

      List<GitHubCommit> commitList = new List<GitHubCommit>(); 

      foreach(GitHubCommit commit in commits) { 
       commitList.Add(commit); 
      } 

      return commitList; 
     } 

    } 
} 

Und ich habe Haupt Funktion, die getAllCommits Methode aufrufen:

using System; 
using Octokit; 
using System.Threading.Tasks; 
using System.Collections.Generic; 

namespace ReadRepo 
{ 
    class MainClass 
    { 

     public static void Main(string[] args) 
     {    

      GitHub github = new GitHub(); 

      Task<List<GitHubCommit>> commits = github.getAllCommits(); 
      commits.Wait(10000); 

      foreach(GitHubCommit commit in commits.Result) {     
       foreach (GitHubCommitFile file in commit.Files) 
        Console.WriteLine(file.Filename);  
      } 

     } 
    } 
} 

Wenn ich laufen diese i folgende Fehlermeldung erhalten:

enter image description here

Problem ist, weil diese Variable commit.Files Null wahrscheinlich wegen Async-Aufruf ist, aber ich bin mir nicht sicher, wie man es löst. Bitte etwas Hilfe?

Antwort

1

Meine Vermutung ist, wenn Sie eine Liste von Dateien für alle Commits bekommen müssen müssen Sie jeweils separat erhalten begehen, indem

foreach(GitHubCommit commit in commits) 
{ 
    var commitDetails = github.Repository.Commit.Get(commit.Sha); 
    var files = commitDetails.Files; 
} 

einen Blick auf this Nehmen Sie mit. Es gibt auch einen anderen Ansatz, um Ihr Ziel zu erreichen - zuerst erhalten Sie die Liste aller Dateien in einem Repository und dann die Liste der Commits für jede Datei.

+0

Sie sind richtig, um Dateien zu erhalten, die ich für jedes Commit benötige, um eine weitere Abfrage durchzuführen, und außerdem haben Sie Recht, dass es eine bessere Strategie ist, eine Liste von Dateien zu erhalten und dann für jede Datei alle Versionen zu übertragen. Vielen Dank. –

+0

Ich habe auch Ihr Codebeispiel mit einem von mir getesteten Arbeitsbeispiel bearbeitet. –

Verwandte Themen