asyncapi / .github

Location of all reusable community health files
29 stars 62 forks source link

Fix wrong format for Co-authored automerged commits + pagination #263

Open smoya opened 7 months ago

smoya commented 7 months ago

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 commented 7 months ago

/help

asyncapi-bot commented 7 months ago

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:

smoya commented 7 months ago

/gfi ci-cd

Gmin2 commented 6 months ago

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?

smoya commented 6 months ago

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")

Gmin2 commented 6 months ago

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

smoya commented 5 months ago

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.