Как с помощью GitHub GraphQL API узнать размер файла для коммитов с течением времени? - PullRequest
1 голос
/ 26 мая 2020

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

Как мне получить эти данные с помощью GitHub GraphQL API?

Я могу получить историю проекта:

{ 
  repository(owner:"someOwner", name:"some-Repo") {
    defaultBranchRef{
      target {
        ...on Commit{
          history(first:100, path: "some/file/path") {
            nodes {
              committedDate
            }
          }
        }
      }
    }
  }
}

И я могу получить размер файла в HEAD мастера:

{
  repository(owner:"someOwner", name:"some-Repo" ) {
    object(expression: "master:some/file/path") {
      ...on Blob {
        byteSize
      }
    }
  } 
}

Но следующее не работает :

{
  repository(owner: "someOwner", name: "some-Repo") {
    defaultBranchRef {
      target {
        ... on Commit {
          history(first: 100, path: "some/file/path") {
            nodes {
              committedDate
              repository {
                object(expression: "master:some/file/path") {
                  ... on Blob {
                    byteSize
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

Это дает мне текущий размер файла каждый раз вместо размера файла для данного коммита.

Это возможно чтобы получить эти данные через GraphQL API за один запрос?

1 Ответ

0 голосов
/ 26 мая 2020

Один из способов - получить tree из результата commit и список записей файла. Это сработает, но вернет все файлы для этой фиксации. Например:

{
  repository(owner: "bertrandmartel", name: "media-optimizer") {
    defaultBranchRef {
      target {
        ... on Commit {
          history(first: 100, path: "cloudformation.yml") {
            nodes {
              oid
              tree {
                entries {
                  name
                  object {
                    ...on Blob {
                      byteSize
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

Затем вы можете отфильтровать правильный файл в результате, например:

TOKEN=[YOUR TOKEN]
REPO_OWNER=bertrandmartel
REPO_NAME=media-optimizer
FILE_PATH=cloudformation.yml

curl -s -H "Authorization: token $TOKEN" \
     -H  "Content-Type:application/json" \
     -d '{ 
          "query": "{repository(owner: \"'"$REPO_OWNER"'\", name: \"'"$REPO_NAME"'\") { defaultBranchRef {target {... on Commit {history(first: 100, path: \"'"$FILE_PATH"'\") {nodes {committedDate tree {entries {name object {...on Blob {byteSize}}}}}}}}}}}"
      }' https://api.github.com/graphql | jq '.data.repository.defaultBranchRef.target.history.nodes[] | 
        {
            date:.committedDate, 
            size: .tree.entries[] | select(.name=="'"$FILE_PATH"'") | .object.byteSize
        }'

, который выведет:

{
  "date": "2020-01-29T17:30:58Z",
  "size": 8408
}
{
  "date": "2020-01-29T16:43:00Z",
  "size": 8030
}
{
  "date": "2020-01-29T01:50:31Z",
  "size": 7601
}

Другой способ без перечисления все поля предназначены для выполнения 2 запросов, в первом перечисляются все идентификаторы фиксации. Второй запрос создается динамически с использованием псевдонимов для выполнения нескольких object(expression: "OID:some/file/path"), как вы предложили

Первый запрос: дата запроса и oid:

query getCommitOid {
  repository(owner: "bertrandmartel", name: "media-optimizer") {
    defaultBranchRef {
      target {
        ... on Commit {
          history(first: 100, path: "cloudformation.yml") {
            nodes {
              committedDate
              oid
            }
          }
        }
      }
    }
  }
}

Второй запрос: сборка псевдонимы для каждого коммита (здесь для 3 коммитов):

query getByteSize {
  repository(owner: "bertrandmartel", name: "media-optimizer") {
    commit1: object(expression: "310fe12a847549ac33096d1f7301ea0a968c638c:cloudformation.yml") {
      ... on Blob {
        byteSize
      }
    }
    commit2: object(expression: "9eb80883322420fc1bf51b924c2c56ec8af8b109:cloudformation.yml") {
      ... on Blob {
        byteSize
      }
    }
    commit3: object(expression: "53172d2c7d439d7d97935c422c5b853a7cc5458d:cloudformation.yml") {
      ... on Blob {
        byteSize
      }
    }
  }
}
...