Skip to content

Instantly share code, notes, and snippets.

@shrikantgond
Forked from EvanSnapp/githubClient.cs
Created March 29, 2020 10:17
Show Gist options
  • Save shrikantgond/23a17f28c3a7cee13c5be0afad1d76f5 to your computer and use it in GitHub Desktop.
Save shrikantgond/23a17f28c3a7cee13c5be0afad1d76f5 to your computer and use it in GitHub Desktop.
C# use the github api to read files out of a directory
namespace GithubClient
{
//JSON parsing methods
struct LinkFields {
public String self;
}
struct FileInfo{
public String name;
public String type;
public String download_url;
public LinkFields _links;
}
//Structs used to hold file data
public struct FileData {
public String name;
public String contents;
}
public struct Directory {
public String name;
public List<Directory> subDirs;
public List<FileData> files;
}
//Github classes
public class Github
{
//Get all files from a repo
public static async Task<Directory> getRepo(string owner, string name, string access_token)
{
HttpClient client = new HttpClient();
Directory root = await readDirectory("root", client,String.Format("https://api.github.com/repos/{0}/{1}/contents/", owner, name) ,access_token);
client.Dispose();
return root;
}
//recursively get the contents of all files and subdirectories within a directory
private static async Task<Directory> readDirectory(String name, HttpClient client, string uri, string access_token) {
//get the directory contents
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, uri);
request.Headers.Add("Authorization",
"Basic "+ Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(String.Format("{0}:{1}", access_token, "x-oauth-basic"))));
request.Headers.Add("User-Agent", "lk-github-client");
//parse result
HttpResponseMessage response = await client.SendAsync(request);
String jsonStr = await response.Content.ReadAsStringAsync();;
response.Dispose();
FileInfo[] dirContents = JsonConvert.DeserializeObject<FileInfo[]>(jsonStr);
//read in data
Directory result;
result.name = name;
result.subDirs = new List<Directory>();
result.files = new List<FileData>();
foreach( FileInfo file in dirContents) {
if (file.type == "dir") { //read in the subdirectory
Directory sub = await readDirectory(file.name, client, file._links.self, access_token);
result.subDirs.Add(sub);
} else { //get the file contents;
HttpRequestMessage downLoadUrl = new HttpRequestMessage(HttpMethod.Get, file.download_url);
downLoadUrl.Headers.Add("Authorization",
"Basic "+ Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(String.Format("{0}:{1}", access_token, "x-oauth-basic"))));
request.Headers.Add("User-Agent", "lk-github-client");
HttpResponseMessage contentResponse = await client.SendAsync(downLoadUrl);
String content = await contentResponse.Content.ReadAsStringAsync();
contentResponse.Dispose();
FileData data;
data.name = file.name;
data.contents = content;
result.files.Add(data);
}
}
return result;
}
}
public class MainClass {
public static void Main() {
var task = Github.getRepo("LeanKit-Labs", "cowpoke", "<myToken>");
task.Wait();
var dir = task.Result;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment