Как сравнить две ветки в github с GraphQL?

Можно ли сравнить две ветки с Github GraphQL?

Из их API v3 rest вы можете:

/repos/:owner/:repo/compare/:base...:head

(документы: https://developer.github.com/v3/repos/commit/#compare-two-commit)

и это работает с SHA, ветками, тегами и т. д.

Однако я не могу найти эквивалентный запрос GraphQL в документации.

Это моя попытка:

Я могу получить список коммитов для каждой ветки отдельно, однако загружается вся история, и мне нужна только разница между канареечной веткой и ночной веткой.

query{
  repository(owner:"samridh",name:"release-generator"){
    name
    branch0: ref(qualifiedName: "canary"){
      target{
        ... on Commit {
         history(first:100){
           ...CommitFragment
         }
       }
      }
    }
    branch1: ref(qualifiedName: "nightly"){
      target{
        ... on Commit {
         history(first:100){
           ...CommitFragment
         }
       }
      }
    }
  }
}
             
fragment CommitFragment on CommitHistoryConnection {
  totalCount
  nodes {
    oid
    message
    committedDate
    author {
      name
      email
    }
  }
  pageInfo {
    hasNextPage
    endCursor
  }
}

Это можно было бы сделать так:

/repos/samridh/release-generator/compare/nightly...canary

в v3 REST API


person Samridh Tuladhar    schedule 05.10.2020    source источник


Ответы (1)


К сожалению, после многочасовой прокрутки страницы сообщества github кажется, что на эту дату API не переносится на v4 и должен выполняться через сам v3.

Однако API v3 поддерживает только 250 коммитов, любые другие коммиты будут игнорироваться и не отображаться. Однако это можно обойти с помощью graphQL.

Запустите этот запрос, чтобы получить начальную и конечную точки:

query getStartAndEndPoints {
  repository(owner: "samridh", name: "release-generator") {
    endPoint: ref(qualifiedName: "canary") {
      ...internalBranchContent
    }
    startPoint: ref(qualifiedName: "nightly") {
      ...internalBranchContent
    }
  }
}

fragment internalBranchContent on Ref {
  target {
    ... on Commit {
      history(first: 1) {
        edges {
          node {
            committedDate
          }
        }
      }
    }
  }
}

Это даст вам дату начала и окончания запроса.

Вставьте эти значения в:

query findDifference{
  repository(owner:"samridh",name:"release-generator"){
    ref(qualifiedName: "canary"){
      target{
        ... on Commit {
         history(
                  first : 100,
                  after: $(value of previous end cursor) #keep it empty first time
                  until : $(endDate),
                  since: $(startDate),
                  ){
           ...CommitFragment
         }
       }
      }
    }
  }
}

fragment CommitFragment on CommitHistoryConnection {
  totalCount
  nodes {
    oid
  }
  pageInfo {
    startCursor
    hasNextPage
    endCursor
  }
}

и извлеките все oid, по 100 за раз (Github GraphQL поддерживает только 100 за раз)

Наконец, вы можете аналогичным образом вызвать API v3:

/repos/samridh/release-generator/compare/<commit1>...<commit100>
/repos/samridh/release-generator/compare/<commit101>...<commit200>
/repos/samridh/release-generator/compare/<commit201>...<commit300>
person Samridh Tuladhar    schedule 12.10.2020