Запрос всех коммитов в одном репозитории с помощью GitHub GraphQL API v4 - PullRequest
1 голос
/ 29 марта 2019

Я пытаюсь запросить все коммиты в указанном репозитории на GitHub через GitHub GraphQL API v4.

Я только хочу получить даты, в которые они были зафиксированы, чтобы оценить общее времякоторый был добавлен в этот репозиторий (что-то вроде git-hours )

Вот мой первоначальный запрос: (примечание: вы можете попробовать запустить его в Explorer )

{
  repository(owner: "facebook", name: "react") {
    object(expression: "master") {
      ... on Commit {
        history {
          nodes {
            committedDate
          }
        }
      }
    }
  }
}

К сожалению, он возвращает только последние 100 коммитов из-за ограничений ресурса API :

Node Limit

Чтобы пройти проверку схемы, все вызовы GraphQL API v4 должны соответствовать следующим стандартам:

  • Клиенты должны предоставить первый или последний аргумент для любого соединения.
  • Значенияпервый и последний должны быть в пределах 1-100.
  • Индивидуальные вызовы не могут запрашивать более 500 000 узлов.

Так как я не предоставляю first илиlast аргумент, API предполагает, что я запрашиваю history(first: 100).И я не могу запросить более 100 узлов за одно соединение.

Однако, если общее ограничение узла намного выше (500 000), я должен иметь возможность запрашивать коммиты группами по 100, пока у меня не будет всехих.

Я смог запросить последние 200 коммитов, используя этот запрос:

{
  repository(owner: "facebook", name: "react") {
    object(expression: "master") {
      ... on Commit {
        total: history {
          totalCount
        }
        first100: history(first: 100) {
          edges {
            cursor
            node {
              committedDate
            }
          }
        }
        second100: history(after: "700f17be6752a13a8ead86458e343d2d637ee3ee 99") {
          edges {
            cursor
            node {
              committedDate
            }
          }
        }
      }
    }
  }
}

Однако мне пришлось вручную вводить строку курсора, которую я передаю во втором соединении: second100: history(after: "cursor-string") {}.

Как я могу рекурсивно запустить это соединение, пока у меня не будет запроса на все committedDate коммитов в репозитории?

1 Ответ

0 голосов
/ 04 апреля 2019

Хотя может быть способ рекурсивного запроса всех коммитов в репо, я не смог найти работающего решения.

Вот мое решение

Моя потребность была:

Я только хочу указать даты, когда они были зафиксированы, чтобы оценить общее время, отведенное для этого хранилища (что-то вроде git-часов)

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

Запрос данных из API GitHub GraphQL

  • история коммитов totalCount
  • committedDate из последних 100 коммитов
{
  repository(owner: "facebook", name: "react") {
    object(expression: "master") {
      ... on Commit {
        history {
          totalCount
          nodes {
            committedDate
          }
        }
      }
    }
  }
}

Запустите сегодня, запрос вернет:

{
  "data": {
    "repository": {
      "object": {
        "history": {
          "totalCount": 10807,
          "nodes": [
            {
              "committedDate": "2019-04-04T01:15:33Z"
            },
            {
              "committedDate": "2019-04-03T22:07:09Z"
            },
            {
              "committedDate": "2019-04-03T20:21:27Z"
            },
            // 97 other committed dates
          ]
        }
      }
    }
  }
}

Оценка общего внесенного времени

Я подсчитал время, потраченное на последние 100 коммитов, используя алгоритм, аналогичный описанному в git-hours README .

Затем я масштабировал его до totalCount:

const timeContributedTotal = timeContributedLatest100 * totalCount / 100;

Я подсчитал, что на Bootstrap в Твиттере на сегодняшний день было занято 13152 часа, а git-hours - примерно 9959 часов 7 месяцев назад. Звучит неплохо.

Что касается React, я получаю в общей сложности 15097 часов или 629 дней.

Оценка очень приблизительная, но она настолько близка, насколько я могу найти то, что мне нужно. Не стесняйтесь комментировать или отвечать, если вы видите какое-либо возможное улучшение.

...