.github icon indicating copy to clipboard operation
.github copied to clipboard

Fix wrong format for Co-authored automerged commits + pagination

Open smoya opened this issue 1 year ago • 7 comments

Describe the bug

Commit Co-authoring allow us to merge PR's and tell Github who were the committers so it does not appear only the PR creator as the author of all the code on it. Unfortunately, it doesn't work at this moment due to a bug in our side. The way it works is described here. We basically make it happen in this action.

However, the final commit message contains a wrong format that makes the co-authoring feature fail.

It seems like a format problem: no new line character is being printed (each co-author should appear in new line). Instead, the new line characters appears encoded (%0A) :disappointed:

How to Reproduce

See an example here: https://github.com/asyncapi/parser-js/commit/4799f2a1f5fd538e16f28a0490a06a6fe89caee1

Expected behavior

Each co-author line (Co-authored-by: ...) should appear in a new line as the documentation says. Additionally, we should find an alternative to curl + jq or maybe use some bash so we can implement pagination and by pass the limitation of 100 commit results. There are PR's that have more than 100 commits, specially in long-live branches.

smoya avatar Dec 04 '23 09:12 smoya

/help

smoya avatar Dec 04 '23 09:12 smoya

Hello, @smoya! 👋🏼

I'm 🧞🧞🧞 Genie 🧞🧞🧞 from the magic lamp. Looks like somebody needs a hand!

At the moment the following comments are supported in issues:

  • /good-first-issue {js | ts | java | go | docs | design | ci-cd} or /gfi {js | ts | java | go | docs | design | ci-cd} - label an issue as a good first issue. example: /gfi js or /good-first-issue ci-cd

asyncapi-bot avatar Dec 04 '23 09:12 asyncapi-bot

/gfi ci-cd

smoya avatar Dec 04 '23 09:12 smoya

Hey @smoya I have found a way around for this problem "Each co-author line (Co-authored-by: ...) should appear in a new line as the documentation says." Now for this problem "we should find an alternative to curl + jq or maybe use some bash so we can implement pagination and by pass the limitation of 100 commit results. There are PR's that have more than 100 commits, specially in long-live branches." should we leverage github rest API?

Gmin2 avatar Dec 09 '23 07:12 Gmin2

Hey @smoya I have found a way around for this problem "Each co-author line (Co-authored-by: ...) should appear in a new line as the documentation says."

Feel free to open a PR with that fix as soon as you have it 👍

Now for this problem "we should find an alternative to curl + jq or maybe use some bash so we can implement pagination and by pass the limitation of 100 commit results. There are PR's that have more than 100 commits, specially in long-live branches." should we leverage github rest API?

If we don't use github rest API, what do you suggest as an alternative? GraphQL API also have the same limitation (100 results "per page")

smoya avatar Dec 11 '23 10:12 smoya

can anyone help me with this

const { Octokit } = require('@octokit/rest');
const { paginateRest } = require('@octokit/plugin-paginate-rest');

const token = process.env.GITHUB_TOKEN;
const prNumber = process.env.PR_NUMBER;
const repository = process.env.GITHUB_REPOSITORY;

async function getCoAuthors() {
  try {
    const octokit = new Octokit({ auth: token });
    const commitsResponse = await octokit.paginate("GET /repos/{owner}/{repo}/pulls/{pull_number}/commits", {
      owner: "asyncapi",
      repo: repository,
      pull_number: prNumber,
      per_page: 100,
    });

    const authors = commitsResponse
      .map(data => ({
        name: data.commit.author.name,
        email: data.commit.author.email,
        login: data.commit.author.login,
      }))
      .filter(author => author.login !== 'PR_sender_login')
      .reduce((uniqueAuthors, author) => {
        if (!uniqueAuthors.some(a => a.email === author.email)) {
          uniqueAuthors.push(author);
        }
        return uniqueAuthors;
      }, [])
      .map(author => `Co-authored-by: ${author.name} <${author.email}>`)
      .join('\n');
      consoler.log(authors);
    return authors;
  } catch (error) {
    console.error('Error fetching commits:', error);
    return null;
  }
}

how do i run this within the github action should i make a seperate js file ? cc @smoya @KhudaDad414

Gmin2 avatar Jan 04 '24 08:01 Gmin2

can anyone help me with this

const { Octokit } = require('@octokit/rest');
const { paginateRest } = require('@octokit/plugin-paginate-rest');

const token = process.env.GITHUB_TOKEN;
const prNumber = process.env.PR_NUMBER;
const repository = process.env.GITHUB_REPOSITORY;

async function getCoAuthors() {
  try {
    const octokit = new Octokit({ auth: token });
    const commitsResponse = await octokit.paginate("GET /repos/{owner}/{repo}/pulls/{pull_number}/commits", {
      owner: "asyncapi",
      repo: repository,
      pull_number: prNumber,
      per_page: 100,
    });

    const authors = commitsResponse
      .map(data => ({
        name: data.commit.author.name,
        email: data.commit.author.email,
        login: data.commit.author.login,
      }))
      .filter(author => author.login !== 'PR_sender_login')
      .reduce((uniqueAuthors, author) => {
        if (!uniqueAuthors.some(a => a.email === author.email)) {
          uniqueAuthors.push(author);
        }
        return uniqueAuthors;
      }, [])
      .map(author => `Co-authored-by: ${author.name} <${author.email}>`)
      .join('\n');
      consoler.log(authors);
    return authors;
  } catch (error) {
    console.error('Error fetching commits:', error);
    return null;
  }
}

how do i run this within the github action should i make a seperate js file ? cc @smoya @KhudaDad414

You will need to run it on your fork or somehow using act. Whatever you use, you will need to modify the action and include something like this.

smoya avatar Jan 09 '24 12:01 smoya