HOWTO populate the integration branch » History » Version 15
« Previous -
Version 15/31
(diff) -
Next » -
Current version
Abhishek Lekshmanan, 06/13/2015 05:14 AM
get PR numbers using github's api
Before a backported commit can be merged into the release branch, it must be tested in an integration branch. It serves two purposes:
- Detect trivial problems that would break the upgrade tests run on the release branch (they are run at the tip of the branch, not at the latest point release)
- Do not pollute the release branch with reverted commits (commits would have to be reverted because the stable branch must never be rebased)
Let say the release to be tested is $release (i.e. giant for instance) and your local clone has two remotes: origin which is your read/write fork of the official ceph repository and ceph which is the read only official ceph repository.
ceph https://github.com/ceph/ceph.git (fetch) ceph https://github.com/ceph/ceph.git (push) origin git@github.com:dachary/ceph.git (fetch) origin git@github.com:dachary/ceph.git (push)
- Create a $release-backport branch locally if it does not already exists: git checkout -b $release-backports ceph/$release
- Reset it to ceph/$release: git reset --hard ceph/$release
- Fetch all pull requests from github. Each pull request XXX has its own branch in the official ceph repository, named pull/XXX
- For finding out the pull requests in github against a milestone; Github's api can be queried. Since github paginates results by default, this has to be run against all the pages.
pages=$(curl -Is 'https://api.github.com/repos/ceph/ceph/issues?page=1&per_page=100' | grep ^Link | sed 's/.*?page=\([0-9]\+\).*/\1/') PRS="" for i in $(seq 1 $pages) do PRS+=$(curl --silent 'https://api.github.com/repos/ceph/ceph/issues?page=$page&per_page=100' | jq '.[] | select(.milestone.title == "hammer") | .number') PRS+=' ' # othewise we'll have a PR number that is appending two done
- Retrieve the commits of the pull request XXX: git fetch --force ceph +refs/pull/XXX/head:refs/remotes/ceph/pull/XXX/head
- Get the title of the pull request: eval title=$(curl --silent https://api.github.com/repos/ceph/ceph/pulls/XXX | jq .title)
- Merge the pull request in the local integration branch. The --no-ff ensures that even if the merge commit could be skipped, it will not be. git merge --no-ff -m "$(echo -e "Merge XXX: $title\n\nReviewed-by: Myself <me@me.com>")" ceph/pull/XXX/head
- For finding out the pull requests in github against a milestone; Github's api can be queried. Since github paginates results by default, this has to be run against all the pages.
- Modify the pull requests individually to fix merge conflicts (i.e. they must merge cleanly, which may involving aggregating two pull requests into a single one designed to properly resolve the conflict).
- Push the integration branch to github: git push --force origin $release-backports
- Verify the integration branch compiles and passes make check
- On the local machine: ./run-make-check.sh
- Via the make check bot by creating a pull request with the $release-backports* integration branch
- Push the integration branch to the official repository: git push --force ceph $release-backports (requires write permission to the ceph repository)
The following snippet summarizes all the actions above:
release=hammer PRS="3963 4185" reviewer='Loic Dachary <ldachary@redhat.com>' git checkout -b $release-backports ceph/$release git reset --hard ceph/$release git fetch --force ceph $(for ref in $PRS ; do echo +refs/pull/$ref/head:refs/remotes/ceph/pull/$ref/head ; echo +refs/pull/$ref/merge:refs/remotes/ceph/pull/$ref/merge ; done) for pr in $PRS ; do eval title=$(curl --silent https://api.github.com/repos/ceph/ceph/pulls/$pr | jq .title) ; echo $title ; git log --oneline ceph/pull/$pr/merge^1..ceph/pull/$pr/merge^2 ; git merge --no-ff -m "$(echo -e "Merge $pr: $title\n\nReviewed-by: $reviewer")" ceph/pull/$pr/head ; done git push --force origin $release-backports