Значение общего события pull_request и других более конкретных событий pull_request, таких как pull_request.opened

Я разрабатываю приложение GitHub, используя nodejs и платформу probot. Я вижу, что класс приложения (https://probot.github.io/api/latest/classes/application.html) среды пробота содержит такие события, как:

> event: "pull_request" | "pull_request.assigned" |
> "pull_request.closed" | "pull_request.edited" | "pull_request.labeled"
> | "pull_request.opened" | "pull_request.reopened" |
> "pull_request.review_request_removed" |
> "pull_request.review_requested" | "pull_request.unassigned" |
> "pull_request.unlabeled" | "pull_request.synchronize

Я заметил, что при нажатии кнопки "Создать запрос на включение" запускаются события pull_request и pull_request.opened.

Чтобы понять, как происходит запуск нескольких, казалось бы, похожих событий при нажатии одной и той же кнопки, я попытался повторно открыть закрытый запрос и распечатать объект Context как для события pull_request, так и для события pull_request.reopened.

Я провел сравнение обоих контекстов и обнаружил, что контексты, возвращаемые обоими событиями, идентичны, за исключением того, что контекст события pull_request содержал следующие дополнительные свойства:

merged: false,
        mergeable: null,
        rebaseable: null,
        mergeable_state: 'unknown',
        merged_by: null,
        comments: 6,
        review_comments: 0,
        maintainer_can_modify: false,
        commits: 1,
        additions: 1,
        deletions: 0,
        changed_files: 1 },
     repository:
      { id: 123456789,
        node_id: '',
        name: '',
        full_name: '',
        private: true,
        owner: [Object],
        html_url: 'some-url-here'
        .
        .
        ///////////////////--------many more urls-------//////////////////////
        created_at: '2020-04-0',
        updated_at: '2020-04-0',

Мы знаем, что общий формат возвращаемого объекта контекста следующий:

Context {
  name: 'pull_request',
  id: '187128937812-8219-89891892133-16752-1234576765545',
  payload:
   { action: 'reopened',
     number: 1,
     pull_request:
      { url:
        .
        .
        .and so on.......

Приведенная выше информация присутствует в обоих контекстах. Мы можем видеть, что это также говорит нам о конкретном действии, которое было выполнено, и это обозначено context.payload.action. Итак, если кому-то требуется получить pull_request.opened, он / она может сделать это, просто используя событие pull_request следующим образом:

app.on('pull_request', async context => {
    console.log('---------------------- on pull_request event')
    console.log('Context returned :----', context)
  })

И не нужно заботиться о других, более конкретных событиях (здесь pull_request.opened), т.е. помимо того, что достигается из приведенного выше кода, приведенный ниже код не предоставит никакой реальной дополнительной помощи:

app.on('pull_request.opened', async context => {
    console.log('---------------------- on pull_request.opened')
    console.log('Context returned :----', context)
  })

Итак, вот вопрос, который меня беспокоит: какова цель   события pull_request, если его другие конкретные формы (например,  pull_request.reopened) не несут другой информации (точнее, если их контексты не содержат другой информации)?

Я совершенно уверен, что за этим стоит какая-то мудрость. Я не могу найти ничего в Интернете, ничего в документации, что могло бы это объяснить.

Пожалуйста, помогите мне понять скрытую мудрость.

РЕДАКТИРОВАТЬ 1: НАЧАТЬ

Забыл упомянуть одно наблюдение, а именно: повторное открытие запроса на перенос также вызывает событие issue_comment.created. Итак, три события запускаются одним действием (щелчком по Create Pull Request).

РЕДАКТИРОВАТЬ 2: НАЧАТЬ

1 ответ

Решение

Какова цель события pull_request, если другие его конкретные формы (например, pull_request.reopened) не несут другой информации (точнее, если их контексты не содержат другой информации)?

Это всего лишь функция Probot для упрощения обработки событий веб-перехватчиков из GitHub. Я постараюсь объяснить, почему это полезно.

Если бы вы использовали события webhook без Probot, вам пришлось бы анализировать каждый pull_request событие, проверьте action поле для дела и решите, обрабатывать ли его.

Есть несколько событий, которые имеют высший уровень action поле в полезной нагрузке, включая:

Вместо того, чтобы заставлять разработчиков приложений выполнять этот синтаксический анализ и проверку JSON, они решили упростить обратные вызовы, чтобы вы могли подписываться на веб-перехватчики, используя определенные [event].[action] шаблон, а структура позаботится о вызове вашего обратного вызова при получении соответствующего события и действия.

Итак, у вас есть два варианта обработки pull_request События:

  • если вы не знаете, какие события вам нужны, или вам нужно динамически обрабатывать события, подписавшись на pull_request как вы будете получать все события запроса на вытягивание
  • если вы знаете, какие события следует обрабатывать, а остальные можете игнорировать, подпишитесь на явные pull_request.[event] должен упростить код вашего приложения

Вы также можете подписаться на *, который представляет все события, которые получает приложение-пробот, а не явно перечисляет все поддерживаемые события в вашем приложении.

Другие вопросы по тегам