Использование GraphQL от Github для вывода списка всех тегов и поиска выпусков - PullRequest
1 голос
/ 24 февраля 2020

Я пытаюсь использовать GraphQL, чтобы получить все теги из репозитория, а затем (или, если возможно, в той же команде) получить некоторые подробности о выпуске каждого тега.

Я пытаюсь используйте этот подход git/refs/tags -> releases/tags/[tag_name], поскольку перечисление всех выпусков по releases не дает мне полный список выпусков.

В v3 это эквивалентно следующему:

"https://api.github.com/repos/" + repo + "/git/refs/tags"
"https://api.github.com/repos/" + repo + "/releases/tags/" + tag

В GraphQL Explorer я смог создать этот запрос (замените его своим именем пользователя и репо):

{
  repository(owner: ":UserName", name: ":Repository") {
    refs(refPrefix: "refs/tags/", last: 100) {
      edges {
        node {
          name
        }
      }
    }
  }
}

Но он дает такой результат:

{
  "data": {
    "repository": {
      "refs": {
        "edges": [
          {
            "node": {
              "name": "2.1"
            }
          },
          {
            "node": {
              "name": "2.2"
            }
          },
          {
            "node": {
              "name": "2.3"
            }
          },
 [...]

Мне как-то нужно вписать это и в запрос (просто пример, мне тоже нужны другие поля), взяв name и используя в качестве параметра:

repository(owner: ":UserName", name: ":Repository") {
  release(tagName: name) {
    name
  }
}

Пытаясь так:

query ListTags {
  repository(owner: ":Username", name: ":Repository") {
    refs(refPrefix: "refs/tags/", last: 100) {
      edges {
        node {
          name
          repository {
            release(tagName: Ref.name) {
              name
            }
          }
        }
      }
    }
  }
}

Но я не могу использовать Ref.name в качестве параметра release.


При использовании запроса в моем проекте возвращаемый объект имеет все узлы JSON, а не просто поле name.

var httpClient = new HttpClient
{
    BaseAddress = new Uri("https://api.github.com/graphql")
};

httpClient.DefaultRequestHeaders.Add("User-Agent", "ReleaseSearcher");

var basicValue = Convert.ToBase64String(Encoding.UTF8.GetBytes($"username:key"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", basicValue);

var queryObject = new
{
    query = @"query {
        repository(owner: "":Username"", name: "":repo"") {
            refs(refPrefix: ""refs/tags/"", last: 100) {
                edges {
                    node {
                        name
                    }
                }
            }
        }
    }",
    variables = new { }
};

var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    Content = new StringContent(JsonConvert.SerializeObject(queryObject), Encoding.UTF8, "application/json")
};

dynamic responseObj;

using (var response = await httpClient.SendAsync(request))
{
    response.EnsureSuccessStatusCode();

    var responseString = await response.Content.ReadAsStringAsync();
    responseObj = JsonConvert.DeserializeObject<dynamic>(responseString);
}

Console.WriteLine(responseObj.data.viewer.login);
Console.ReadLine();

* 10 41 * Как я могу искать отдельные выпуски по имени тега?

Как правильно прочитать данные результатов?

1 Ответ

0 голосов
/ 25 февраля 2020

Мне удалось получить то, что я хочу с этим:

query {
    rateLimit {
        cost
        remaining
     }
     repository(owner: "NickeManarin", name: "ScreenToGif") {
         refs(refPrefix: "refs/tags/", last: 100) {
             nodes {
                 repository {
                     releases(last: 100, orderBy: { field: CREATED_AT, direction: DESC}) {
                         nodes {
                             name
                             createdAt
                             url
                             releaseAssets(last: 2) {
                                 nodes {
                                     name
                                     downloadCount
                                     downloadUrl
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
 }

Я просто не уверен, что это лучший способ сделать это.

...