summaryrefslogtreecommitdiffstats
path: root/hacking/cherrypick.py
blob: d99f4055953b067dcd1045708812abcc27d3891b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/env python3

import os
import sh
import sys
import tempfile

REPO_PATH = {
    'extras': '/srv/ansible/stable-2.2/lib/ansible/modules/extras',
    'core': '/srv/ansible/stable-2.2/lib/ansible/modules/core'
}


if __name__ == '__main__':
    commit_hash = sys.argv[1]
    which_modules = sys.argv[2]
    git = sh.git.bake('--no-pager', _tty_out=False)
    try:
        # Get the change
        git('checkout', 'devel')
        patch = git('format-patch', '-1', '--stdout', commit_hash).stdout
    finally:
        git('checkout', '-')

    # Transform the change for the new repo
    patch = patch.replace(b'lib/ansible/modules/', b'')
    new_patch = []
    patch_stream = (l for l in patch.split(b'\n'))
    for line in patch_stream:
        if line.strip() == b'---':
            new_patch.append(b'(cherry picked from %s)' % commit_hash.encode('utf-8'))
            new_patch.append(line)
            break
        new_patch.append(line)
    new_patch.extend(list(patch_stream))

    # Save the patch
    try:
        fh, patchfilename = tempfile.mkstemp()
        os.write(fh, b'\n'.join(new_patch))
        os.close(fh)

        # Apply the patch
        try:
            orig_dir = os.getcwd()
            os.chdir(REPO_PATH[which_modules])
            git('am', patchfilename)
        finally:
            os.chdir(orig_dir)
    except:
        print("Problem occurred.  Patch saved in: {0}".format(patchfilename))
    else:
        os.remove(patchfilename)