Upstrem Merge¶
The process to merge ruamel.yaml
’s Mercurial repository to ours is
non-trivial due to non-unique Mergurial-to-git imports and squash merges.
Preparation¶
We create a git import of the Upstream repository. Then we add a pseudo-merge node to it which represents our version of the code at the point where the last merge happened. The commit we want is most likely named “Upstream 0.xx.yy”.
So, first we get a git copy of an HG clone of the ruamel.yaml
repository:
# install Mercurial (depends on your distribution)
cd /your/src
mkdir -p ruyaml/git
cd ruyaml/git; git init
cd ../
hg clone http://hg.code.sf.net/p/ruamel-yaml/code hg
Next we prepare our repository for merging. We need a hg-fast-export
script:
cd ..
git clone git@github.com:frej/fast-export.git
We use that script to setup our git copy:
cd ../git
../fast-export/hg-fast-export.sh -r ../hg --ignore-unnamed-heads
Now let’s create a third repository for the actual work:
cd ../
git clone git@github.com:pycontribs/ruyaml.git repo
cd repo
git remote add ../git ruamel
git fetch ruamel
Create a branch for merging:
git checkout -b merge main
This concludes setting things up.
Incremental merge¶
First, let’s pull the remote changes (if any):
cd /your/src/ruyaml/hg
hg pull
cd ../git
../fast-export/hg-fast-export.sh -r ../hg --ignore-unnamed-heads
cd ../repo
git fetch --all
git checkout merge
Next, we need a pseudo-merge that declares “we have merged all of Upstream up to THAT into THIS”, where THIS is the latest Merge commit in our repository (typically named “Upstream 0.xx.yy”) and THAT is the corresponding commit in the Ruamel tree (it should be tagged 0.xx.yy):
git log --date-order --all --oneline
git reset --hard THIS
git merge -s ours THAT
Now we’ll “merge” the current Upstream sources:
git merge --squash ruamel/main
This will create a heap of conflicts, but no commit yet.
Note
The reason we do a squash-merge here is that otherwise git will
un-helpfully upload the complete history of ruamel.yaml
to GitHub.
It’s already there, of course, but due to the diverging git hashes that
doesn’t help.
The next step, obviously, is to fix the conflicts. (There will be a bunch.)
If git complains about a deleted __init__.py
, the solution is to git
rm -f __init__.py
.
Then, commit your changes:
git commit -a -m "Merge Upstream 0.xx.yz"
git push -f origin merge
Now check github. If everything is OK, congratulations, otherwise fix and
push (no need to repeat the -f
).