Skip to main content

Backport CPython changes from master to maintenance branches.

Project description

Usage (from a cloned CPython directory)

cherry_picker [--pr-remote REMOTE] [--dry-run] [--config-path CONFIG-PATH] [--status] [--abort/--continue] [--push/--no-push] <commit_sha1> <branches>

pyversion status pypi status travis status

About

Use this to backport CPython changes from master into one or more of the maintenance branches (3.6, 3.5, 2.7).

It will prefix the commit message with the branch, e.g. [3.6], and then opens up the pull request page.

Tests are to be written using pytest.

Setup Info

Requires Python 3.6.

$ python3 -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install cherry_picker

The cherry picking script assumes that if an upstream remote is defined, then it should be used as the source of upstream changes and as the base for cherry-pick branches. Otherwise, origin is used for that purpose.

Verify that an upstream remote is set to the CPython repository:

$ git remote -v
...
upstream    https://github.com/python/cpython (fetch)
upstream    https://github.com/python/cpython (push)

If needed, create the upstream remote:

$ git remote add upstream https://github.com/python/cpython.git

By default, the PR branches used to submit pull requests back to the main repository are pushed to origin. If this is incorrect, then the correct remote will need be specified using the --pr-remote option (e.g. --pr-remote pr to use a remote named pr).

Cherry-picking 🐍🍒⛏️

(Setup first! See prev section)

From the cloned CPython directory:

(venv) $ cherry_picker [--pr-remote REMOTE] [--dry-run] [--config-path CONFIG-PATH] [--abort/--continue] [--status] [--push/--no-push] <commit_sha1> <branches>

Commit sha1

The commit sha1 for cherry-picking is the squashed commit that was merged to the master branch. On the merged pull request, scroll to the bottom of the page. Find the event that says something like:

<coredeveloper> merged commit <commit_sha1> into python:master <sometime> ago.

By following the link to <commit_sha1>, you will get the full commit hash. Use the full commit hash for cherry_picker.py.

Options

-- dry-run           Dry Run Mode.  Prints out the commands, but not executed.
-- pr-remote REMOTE  Specify the git remote to push into.  Default is 'origin'.
-- status            Do `git status` in cpython directory.

Additional options:

-- abort        Abort current cherry-pick and clean up branch
-- continue     Continue cherry-pick, push, and clean up branch
-- no-push      Changes won't be pushed to remote
-- config-path  Path to config file
                (`.cherry_picker.toml` from project root by default)

Configuration file example:

team = "aio-libs"
repo = "aiohttp"
check_sha = "f382b5ffc445e45a110734f5396728da7914aeb6"
fix_commit_msg = False

Available config options:

team            github organization or individual nick,
                e.g "aio-libs" for https://github.com/aio-libs/aiohttp
                ("python" by default)

repo            github project name,
                e.g "aiohttp" for https://github.com/aio-libs/aiohttp
                ("cpython" by default)

check_sha       A long hash for any commit from the repo,
                e.g. a sha1 hash from the very first initial commit
                ("7f777ed95a19224294949e1b4ce56bbffcb1fe9f" by default)

fix_commit_msg  Replace # with GH- in cherry-picked commit message.
                It is the default behavior for CPython because of external
                Roundup bug tracker (https://bugs.python.org) behavior:
                #xxxx should point on issue xxxx but GH-xxxx points
                on pull-request xxxx.
                For projects using GitHub Issues, this option can be disabled.

To customize the tool for used by other project:

  1. Create a file called .cherry_picker.toml in the project’s root folder (alongside with .git folder).

  2. Add team, repo, fix_commit_msg and check_sha config values as described above.

  3. Use git add .cherry_picker.toml / git commit to add the config into git.

  4. Add cherry_picker to development dependencies or install it by pip install cherry_picker

  5. Now everything is ready, use cherry_picker <commit_sha> <branch1> <branch2> for cherry-picking changes from <commit_sha into maintenance branches.

Demo

Example

For example, to cherry-pick 6de2b7817f-some-commit-sha1-d064 into 3.5 and 3.6, run the following command from the cloned CPython directory:

(venv) $ cherry_picker 6de2b7817f-some-commit-sha1-d064 3.5 3.6

What this will do:

(venv) $ git fetch upstream

(venv) $ git checkout -b backport-6de2b78-3.5 upstream/3.5
(venv) $ git cherry-pick -x 6de2b7817f-some-commit-sha1-d064
(venv) $ git push origin backport-6de2b78-3.5
(venv) $ git checkout master
(venv) $ git branch -D backport-6de2b78-3.5

(venv) $ git checkout -b backport-6de2b78-3.6 upstream/3.6
(venv) $ git cherry-pick -x 6de2b7817f-some-commit-sha1-d064
(venv) $ git push origin backport-6de2b78-3.6
(venv) $ git checkout master
(venv) $ git branch -D backport-6de2b78-3.6

In case of merge conflicts or errors, the following message will be displayed:

Failed to cherry-pick 554626ada769abf82a5dabe6966afa4265acb6a6 into 2.7 :frowning_face:
... Stopping here.

To continue and resolve the conflict:
    $ cherry_picker --status  # to find out which files need attention
    # Fix the conflict
    $ cherry_picker --status  # should now say 'all conflict fixed'
    $ cherry_picker --continue

To abort the cherry-pick and cleanup:
    $ cherry_picker --abort

Passing the --dry-run option will cause the script to print out all the steps it would execute without actually executing any of them. For example:

$ cherry_picker --dry-run --pr-remote pr 1e32a1be4a1705e34011770026cb64ada2d340b5 3.6 3.5
Dry run requested, listing expected command sequence
fetching upstream ...
dry_run: git fetch origin
Now backporting '1e32a1be4a1705e34011770026cb64ada2d340b5' into '3.6'
dry_run: git checkout -b backport-1e32a1b-3.6 origin/3.6
dry_run: git cherry-pick -x 1e32a1be4a1705e34011770026cb64ada2d340b5
dry_run: git push pr backport-1e32a1b-3.6
dry_run: Create new PR: https://github.com/python/cpython/compare/3.6...ncoghlan:backport-1e32a1b-3.6?expand=1
dry_run: git checkout master
dry_run: git branch -D backport-1e32a1b-3.6
Now backporting '1e32a1be4a1705e34011770026cb64ada2d340b5' into '3.5'
dry_run: git checkout -b backport-1e32a1b-3.5 origin/3.5
dry_run: git cherry-pick -x 1e32a1be4a1705e34011770026cb64ada2d340b5
dry_run: git push pr backport-1e32a1b-3.5
dry_run: Create new PR: https://github.com/python/cpython/compare/3.5...ncoghlan:backport-1e32a1b-3.5?expand=1
dry_run: git checkout master
dry_run: git branch -D backport-1e32a1b-3.5

–pr-remote option

This will generate pull requests through a remote other than origin (e.g. pr)

–status option

This will do git status for the CPython directory.

–abort option

Cancels the current cherry-pick and cleans up the cherry-pick branch.

–continue option

Continues the current cherry-pick, commits, pushes the current branch to origin, opens the PR page, and cleans up the branch.

–no-push option

Changes won’t be pushed to remote. This allows you to test and make additional changes. Once you’re satisfied with local changes, use --continue to complete the backport, or --abort to cancel and clean up the branch. You can also cherry-pick additional commits, by:

$ git cherry-pick -x <commit_sha1>

–config-path option

Allows to override default config file path (<PROJ-ROOT>/.cherry_picker.toml) with a custom one. This allows cherry_picker to backport projects other than CPython.

Creating Pull Requests

When a cherry-pick was applied successfully, this script will open up a browser tab that points to the pull request creation page.

The url of the pull request page looks similar to the following:

https://github.com/python/cpython/compare/3.5...<username>:backport-6de2b78-3.5?expand=1

Press the Create Pull Request button.

Bedevere will then remove the needs backport to ... label from the original pull request against master.

Running Tests

Install pytest: pip install -U pytest

$ pytest test.py

Publishing to PyPI

Publish to PyPI using flit.

Install flit (preferably in a virtual environment):

python3 -m pip install flit

In the directory where pyproject.toml exists:

flit publish

Local installation

With flit installed, in the directory where pyproject.toml exists:

flit install

Changelog

1.1.0

  • Add fix_commit_msg configuration item. Setting fix_commit_msg to True will replace the issue number in the commit message, from # to GH-. This is the default behavior for CPython. Other projects can opt out by setting it to False. (PR #233 and aiohttp Issue #2853).

1.0.0

  • Support configuration file by using --config-path option, or by adding .cherry-picker.toml file to the root of the project. (Issue #225).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cherry_picker-1.1.0.tar.gz (10.3 kB view details)

Uploaded Source

Built Distribution

cherry_picker-1.1.0-py3-none-any.whl (31.0 kB view details)

Uploaded Python 3

File details

Details for the file cherry_picker-1.1.0.tar.gz.

File metadata

File hashes

Hashes for cherry_picker-1.1.0.tar.gz
Algorithm Hash digest
SHA256 d71bcc5048d7b4c97166daef6fc8bb265c36304e65a23840d18bced8fdec5a87
MD5 337da2291b1b909684ee7cbdd92a9e2c
BLAKE2b-256 fd6a1041abc77169ed857938e377439505501a5ca60c4a6075b9cba67b7a4379

See more details on using hashes here.

Provenance

File details

Details for the file cherry_picker-1.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for cherry_picker-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1253c520d61c9a425f63d7bef120083b9b171e5a55b1b369cd682520fd3e8b0d
MD5 68cec9e631d1fe0fdb7129bddf6e26b6
BLAKE2b-256 2643dcb16c5f8a720e6daf6cc1fdb4a697a1e9f71357d0f82ca0675ca449e126

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page