Mercurial > hg > hg-git
view Makefile @ 867:a3b12aa1bcd6
git_handler: don't store rename source if branch info is stored
Consider a Mercurial commit with hash 'h1'. Originally, if the only Mercurial
field stored is the branch info (which is stored in the commit message rather
than as an extra field), we'd store the rename source explicitly as a Git extra
field -- let's call the original exported hash 'g1'.
In Git, some operations throw all extra fields away. (One such example is a
rebase.) If such an operation happens, we'll be left with a frankencommit with
the branch info but without the rename source. Let's call this hash 'g2'. For a
setup where Git is the source of truth, let's say that this 'g2' frankencommit
is what gets pushed to the server.
When 'g2' is subsequently imported into Mercurial, we'd look at the fact that
it contains a Mercurial field in the commit message and believe that it was a
legacy commit from the olden days when all info was stored in the commit
message. In that case, in an attempt to preserve the hash, we wouldn't store
any extra rename source info, resulting in 'h1'. Then, when the commit is
re-exported to Git, we'd add the rename source again and produce 'g1' -- and
thus break bidirectionality.
Prevent this situation by not storing the rename source if we're adding branch
info to the commit message. Then for 'h1' we export as 'g2' directly and never
produce 'g1'.
What happens if we not only need to store branch info but also other extra
info, like renames? For 'h1' we'd produce 'g1', then it'd be rewritten on the
Git side to 'g2' throwing away all that extra information. 'g2' being
subsequently imported into Mercurial would produce a new hash, say 'h2'. That's
fine because the commit did get rewritten in Git. We unfortunately wouldn't
perform rename detection thinking that the commit is from Mercurial and had no
renames recorded there, but when the commit is re-exported to Git we'd export
it to 'g2' again. This at least preserves bidirectionality.
author | Siddharth Agarwal <sid0@fb.com> |
---|---|
date | Thu, 26 Feb 2015 22:14:44 -0800 |
parents | 81c55f8629ba |
children | 49831f78c412 |
line wrap: on
line source
PYTHON=python help: @echo 'Commonly used make targets:' @echo ' tests - run all tests in the automatic test suite' @echo ' all-version-tests - run all tests against many hg versions' @echo ' tests-%s - run all tests in the specified hg version' all: help tests: cd tests && $(PYTHON) run-tests.py --with-hg=`which hg` $(TESTFLAGS) test-%: python -m doctest hggit/hg2git.py cd tests && $(PYTHON) run-tests.py --with-hg=`which hg` $(TESTFLAGS) $@ tests-%: @echo "Path to crew repo is $(CREW) - set this with CREW= if needed." hg -R $(CREW) checkout $$(echo $@ | sed s/tests-//) && \ (cd $(CREW) ; $(MAKE) clean ) && \ cd tests && $(PYTHON) $(CREW)/tests/run-tests.py $(TESTFLAGS) # This is intended to be the authoritative list of Hg versions that this # extension is tested with. Versions prior to the version that ships in the # latest Ubuntu LTS release (2.8.2 for 14.04 LTS) may be dropped if they # interfere with new development. The latest released minor version should be # listed for each major version; earlier minor versions are not needed. all-version-tests: tests-2.8.2 tests-3.0.1 tests-3.1 tests-3.2.2 tests-@ .PHONY: tests all-version-tests