2014-02-19 2 views
3

Я пытаюсь создать метод, в котором я могу получить доступ к имени пользователя Github, и публиковать либо все коммиты, либо, по крайней мере, несколько коммитов от этого пользователя.Github API - извлекает пользовательские обязательства?

Есть ли вызов GET для связи пользователя/репо/фиксации или прямого пользователя/фиксации?

Прямо сейчас, я думаю, что он будет принимать следующий: 1. Получение сделок РЕПО, связанные с определенным именем api.github.com/users/:name/repos

  1. из корма получают репо name.

  2. названия места Репо в массиве, например:

    api.github.com/repos/:user/:repo1/commits api.github.com/repos/:user/:repo2/commits api.github.com/repos/:user/:repo3/commits

4.from каналы, получить подсчет количества ШАС?

ответ

2

Возможно, другие заинтересованы в этом позже.

  1. Нет API для извлечения всех коммитов одного пользователя -> вам нужно сделать это самостоятельно.

  2. Как вы описали это хорошо, но вы пропустили, что из 2 и 4 вы получите все коммиты не только этого пользователя.

Github API позволяет получить список коммитов автора фильтрации https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository

Мое предложение сделать следующее:

  1. Получить хранилищами этого пользователя разобрать JSON ответа и получить имена репозитория в массиве.
    API Link - api.github.com/users/:user/repos; замените: пользователь с вашим желаемым пользователем

  2. Для каждого репозитория получите список коммитов, созданных этим пользователем.

    API Link - api.github.com/repos/:user/repositoryNameFromArray/commits?author=:user; замените: пользователь с вашим желаемым пользователем, а репозиторийNameFromArray должен появиться из вашего массива.

Здесь следует быть осторожным, чтобы Github извлекал по умолчанию только последние 30 коммитов. Вам нужно использовать разбивку на страницы, чтобы получить большие куски, не более 100.

Все готово. Остальное зависит от вас и того, что вы хотите делать с данными.

3

Итерирование через репозитории пользователя является неоптимальным, поскольку оно пропускает любые коммиты, которые они делают в других репозиториях. Лучше использовать вместо этого Events API.

Первый шаг заключается в get the user's events:

GET /users/:username/events 

Далее вам нужно перебирать возвращенных событий, проверка элементов where result.type is set to PushEvent. Каждый из них соответствует пользователю git push, и фиксации от этого нажатия доступны (в обратном хронологическом порядке) как result.payload.commits.

Вы можете отфильтровать их, чтобы игнорировать любые фиксации, сделанные другими пользователями, путем проверки того, что commit.author.email соответствует тому, что вы ожидаете. У вас также есть доступ к таким объектам, как sha, message и url, и вы можете устранить повторяющиеся фиксации через несколько нажатий, используя свойство distinct.

В целом существует больше проблем с работой с новинками, но также дает более точное представление о том, что пользователь фактически совершил.

В случае помогает, вот некоторые example code взяты с моего сайта, который использует выше подход для извлечения последней фиксации для пользователя (реализована с использованием Node.js и octokat npm module):

const USER = 'TODO: your GitHub user name' 
const EMAIL = 'TODO: your GitHub email address' 

const github = require('octokat')({ token: 'TODO: your GitHub API token' }) 

return github.fromUrl(`https://api.github.com/users/${USER}/events`) 
    .fetch() 
    .then(events => { 
    let lastCommit 

    events.some(event => { 
     return event.type === 'PushEvent' && event.payload.commits.reverse().some(commit => { 
     if (commit.author.email === EMAIL) { 
      lastCommit = { 
      repo: event.repo.name, 
      sha: commit.sha, 
      time: new Date(event.createdAt), 
      message: commit.message, 
      url: commit.url 
      } 

      return true 
     } 

     return false 
     }) 
    }) 

    return lastCommit 
    })