はじめに
C#でGitHubのリポジトリブラウザーみたいなのを作りたいと思い、C#でGitHubを操作できるライブラリであるoctokit.netでどんな情報が引っ張れそうか調べました。
octokit.netのリポジトリはこちら。
公式ドキュメントはこちら。
事前準備
個人アクセストークンの発行が必要です。取得方法はこちらを参照してください。
トークンに付与する権限はrepoのみでいいと思います。
また、プロジェクトにOctokit.netのNugetPackageをインストールする必要があります。
詳しくはこちら。
色々情報を取得する
リポジトリ内のすべてのファイルを取得する
リポジトリブラウザーを作りたいので、まずは、指定したリポジトリファイルやフォルダ構造を閲覧できるよう、ファイルやフォルダを取得する必要があります。
以下のサンプルプログラムで説明します。
// GitHubクライアントを作成
var tokenAuth = new Credentials("ここに個人アクセストークンを指定する");
var client = new GitHubClient(new ProductHeaderValue("my-cool-app"),
new InMemoryCredentialStore(tokenAuth));
// ブランチをすべて取得
var branches = await client.Repository.Branch.GetAll("リポジトリのオーナー名", "リポジトリ名");
// リポジトリにあるファイルやフォルダの情報を取得
// リポジトリの直下のファイルまたはフォルダをすべて取得できる
// 第3引数にブランチ名を指定することもできる。
var contents = await client.Repository.Content.GetAllContents("リポジトリのオーナー名", "リポジトリ名");
// 上記で取得したフォルダのトップレベルのファイル・フォルダを取得する。
// フォルダまでのパスを指定すれば、そのフォルダ直下のファイルやフォルダが取得できる
var folderContents = await client.Repository.Content.GetAllContents("リポジトリのオーナー名", "リポジトリ名",
contents.FirstOrDefault(c => c.Type == ContentType.Dir).Path);
指定したファイルのコミット履歴を取得する
リポジトリブラウザでは、特定のコミット時点でのファイルを取得したい場合もあると思います。そのため、コミット履歴を取得してこようと思います。
以下のサンプルプログラムで説明します。
// 今回はリポジトリ直下の一番最初にあるファイルを指定
var contentPath = contents.FirstOrDefault(c => c.Type == ContentType.File).Path;
var commitRequest = new CommitRequest()
{
Path = contentPath;
};
// 新しい順に10件だけ取得する
// 次の10件を取得したい場合はStartPageの指定を+1する
var apiOptions = new ApiOptions()
{
PageCount = 1,
PageSize = 10,
StartPage = 1
};
var commits = await client.Repository.Commit.GetAll("リポジトリのオーナー名", "リポジトリ名", commitRequest, apiOptions);
指定したファイルを取得する
リポジトリのファイル一覧からファイルや、そのコミットを選択し、そのファイルを取得しようと思います。
以下のサンプルコードで説明します。
// ファイルのデータを取得する
// refernce引数にはファイルのブランチ名や、コミットハッシュを指定できる
// 今回は上の章で取得してきた、リポジトリの直下の一番最初にあるファイルの一番最初のコミットを指定
var reference = commits.FirstOrDefault().
var rawContent = await client.Repository.Content.GetRawContentByRef("リポジトリのオーナー名", "リポジトリ名", contentPath, reference);
バイト文字列が取得できます。
ContentPathからファイルの拡張子を取得してローカルフォルダに保存するなどすれば、ファイルを開くことができます。
さいごに
公式ドキュメントにはなぜか今回書いたようなリポジトリの中身を取得するみたいなのが書いてなかったのもあり、今回まとめてみました。
ライブラリのリポジトリを見ると、ライブラリでGitHubから柔軟に情報を取得できるみたいでした。