Эффективная загрузка одного файла из большого корпоративного репозитория github с помощью Octokit (c#, .net)

Я пытаюсь загрузить один файл с предприятия github по URL-адресу на С# с помощью OctoKit. Это головная версия от мастера (или ветки по умолчанию).

Я хочу сделать эквивалент:

curl -H 'Authorization: token INSERTACCESSTOKENHERE' -H 'Accept:application/vnd.github.v3.raw' -O -L https://private.github.enterprise.com/repos/owner/repo/contents/path/foo.txt

Я нашел способ сделать это, но репо очень большое и занимает много времени. Причина в том, что я должен просмотреть все дерево, чтобы найти идентификаторы для конкретных файлов, которые мне нужны.

Uri url = new Uri(URL);
String trans_fullname = String.Format("/{0}/", repo.FullName);
String basePath = url.AbsolutePath.Replace(trans_fullname, "");

/* this, and the linq line, are what is taking all the time */

var cannotuseawait = client.Git.Tree.GetRecursive(repo.Id, "heads/master" );
cannotuseawait.Wait();
TreeResponse tree = cannotuseawait.Result;

/* searching through a lot of items!!!!! */

TreeItem Found = (from foo in tree.Tree where foo.Path.Contains(basePath) select foo).SingleOrDefault<TreeItem>();
var fwait = client.Git.Blob.Get(Repo.Id, Found.Sha);
fwait.wait();
var contents_64 = fwait.Result;

Опять же, это занимает более 4 минут, потому что наш репозиторий очень большой. В то время как приведенная выше команда curl выполняется относительно мгновенно... так что я знаю, что есть способ. Я бы предпочел не отказываться от Octokit, так как у меня в проекте есть другой функционал, который уже с ним работает.


person Mark Hattarki    schedule 20.03.2018    source источник


Ответы (1)


Итак, получается, что в объекте client.Repository.Content есть методы с именами типа UpdateFile, GetReadMe, DeleteFile, CreateFile, но нет "GetFile".

Но, вопреки интуиции (по крайней мере, для меня), есть функция под названием «GetAllContents», которая обычно, как и следовало ожидать, получает все содержимое для репо. Но одна из перегрузок принимает путь в качестве параметра, поэтому вы можете ограничить его файлом. Я ограничу выражение своего разочарования здесь и просто скажу, что это не интуитивно.

        var cannotuseawait = client.Repository.Content.GetAllContents(Repo.Id, basePath);
        cannotuseawait.Wait();
        var res = cannotuseawait.Result;
person Mark Hattarki    schedule 23.03.2018