transparencia-mg / new-dataset-template

0 stars 27 forks source link

Merge errado de PR em repositórios forkados #33

Closed gabrielbdornas closed 1 year ago

gabrielbdornas commented 1 year ago

@Andrelamor me relatou o seguinte problema:

Criou uma branch em um repositório fork deste new-dataset_template. Abriu um PR que deveria ter sido feito no repositório fork, mas por engano o PR foi aberto para este repo new-dataset_template. Aprovou o PR e, portanto, incluiu códigos neste repositório por engano.

Esta situação pode acontecer com muita facilidade, já que durante o processo de criação de PR não é muito intuitivo ver se o PR está sendo aberto para o repositório forkado (orginal) e não para o fork.

Esta sugestão stackoverflow poderia ser a base para a solução do problema. Criaríamos um actions para verificar se o PR está vindo de um repositório fork ou do original[^1]:

name: Check pull request source branch
on:
  pull_request_target:
    types:
      - opened
      - reopened
      - synchronize
jobs:
  check-branches:
    runs-on: ubuntu-latest
    steps:
      - name: Check branches
        run: |
          if [ ${{ github.head_ref }} != "dev" ] && [ ${{ github.base_ref }} == "main" ]; then
            echo "Merge requests to main branch are only allowed from dev branch."
            exit 1
          fi

Pergunto:

[^1]: No exemplo dado seria necessário modificar o if [ ${{ github.head_ref }} != "dev" ] && [ ${{ github.base_ref }} == "main" ]; then para verificar se o PR foi aberto de um fork ao invés de comparar o nome das branchs.

gabrielbdornas commented 1 year ago

Esta resposta stackoverflow me ajudou a entender como utiliar jq para acessar valores de um dicionário utilizando shell[^1].

venv) ➜  new-dataset-template git:(main) ✗ echo '{"foo": 1, "foo2": 2}' | jq .
{
  "foo": 1,
  "foo2": 2
}

[^1]: Utlizei `jq --help para visualizar as opções disponíveis.

gabrielbdornas commented 1 year ago

O endpoint https://api.github.com/repos/OWNER/REPO dá acesso a informações de um repo como:

// 20230828140257
// https://api.github.com/repos/transparencia-mg/bens-tombados

{
  "id": 666504118,
  "node_id": "R_kgDOJ7oLtg",
  "name": "bens-tombados",
  "full_name": "transparencia-mg/bens-tombados",
  "private": false,
  "owner": {
    "login": "transparencia-mg",
    "id": 52837282,
    "node_id": "MDEyOk9yZ2FuaXphdGlvbjUyODM3Mjgy",
    "avatar_url": "https://avatars.githubusercontent.com/u/52837282?v=4",
    "gravatar_id": "",
    "url": "https://api.github.com/users/transparencia-mg",
    "html_url": "https://github.com/transparencia-mg",
    "followers_url": "https://api.github.com/users/transparencia-mg/followers",
    "following_url": "https://api.github.com/users/transparencia-mg/following{/other_user}",
    "gists_url": "https://api.github.com/users/transparencia-mg/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/transparencia-mg/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/transparencia-mg/subscriptions",
    "organizations_url": "https://api.github.com/users/transparencia-mg/orgs",
    "repos_url": "https://api.github.com/users/transparencia-mg/repos",
    "events_url": "https://api.github.com/users/transparencia-mg/events{/privacy}",
    "received_events_url": "https://api.github.com/users/transparencia-mg/received_events",
    "type": "Organization",
    "site_admin": false
  }, 
,
  "html_url": "https://github.com/transparencia-mg/bens-tombados",
  "description": "conjunto em homologação",
  "fork": true,
...
}

Poderia utilizá-lo para buscara informação fork do repositório responsável pela abertura do PR, seguindo a idéia utilizada neste actions reutilizável:

jobs:
  reusable_job:
    name: Add project to issue
    runs-on: ubuntu-latest
    steps:
      - name: See repo owner/name
        id: split
        env:
          OWNER_NAME: ${{ github.repository }}
        run: echo "::set-output name=owner::${OWNER_NAME%/*}"
      - name: Call github api
        uses: octokit/request-action@v2.x
        id: get_account_info
        with:
          route: GET /users/{owner}
          owner: ${{ steps.split.outputs.owner }}
        env:
          GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
      - name: Get repo type
        id: get_repo_type
        run: |
          if [ ${{ fromJson(steps.get_account_info.outputs.data).type }} == 'Organization' ]
          then
            echo "::set-output name=type::orgs"
          else
            echo "::set-output name=type::users"
          fi

Mas como dito no início do issue demos primeiro que avaliar se esta ação é realmente o melhor caminho.

gabrielbdornas commented 1 year ago

Independente da pergunta feita na abertura do issue sobre ser esta uma boa ideia, alguns testes foram feitos deste commit até este commit, mas nenhum funcionou,

Andrelamor commented 1 year ago

@gabrielbdornas para efeito de segurança, como conversamos, pensar em incluir uma trava para o merge na main ser dependente da aprovação de um PR de uma única pessoa