Mercurial > hg
view tests/test-pull-pull-corruption.t @ 45121:b6269741ed42
config: add option to control creation of empty successors during rewrite
The default for many history-rewriting commands (e.g. rebase and absorb) is
that changesets which would become empty are not created in the target branch.
This makes sense if the source branch consists of small fix-up changes. For
more advanced workflows that make heavy use of history-editing to create
curated patch series, dropping empty changesets is not as important or even
undesirable.
Some users want to keep the meta-history, e.g. to make finding comments in a
code review tool easier or to avoid that divergent bookmarks are created. For
that, obsmarkers from the (to-be) empty changeset to the changeset(s) that
already made the changes should be added. If a to-be empty changeset is pruned
without a successor, adding the obsmarkers is hard because the changeset has to
be found within the hidden part of the history.
If rebasing in TortoiseHg, it’s easy to miss the fact that the to-be empty
changeset was pruned. An empty changeset will function as a reminder that
obsmarkers should be added.
Martin von Zweigbergk mentioned another advantage. Stripping the successor will
de-obsolete the predecessor. If no (empty) successor is created, this won’t be
possible.
In the future, we may want to consider other behaviors, like e.g. creating the
empty successor, but pruning it right away. Therefore this configuration
accepts 'skip' and 'keep' instead of being a boolean configuration.
author | Manuel Jacob <me@manueljacob.de> |
---|---|
date | Sat, 11 Jul 2020 23:53:27 +0200 |
parents | f1186c292d03 |
children | 2f2682f40ea0 |
line wrap: on
line source
Corrupt an hg repo with two pulls. create one repo with a long history $ hg init source1 $ cd source1 $ touch foo $ hg add foo $ for i in 1 2 3 4 5 6 7 8 9 10; do > echo $i >> foo > hg ci -m $i > done $ cd .. create one repo with a shorter history $ hg clone -r 0 source1 source2 adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files new changesets 495a0ec48aaf updating to branch default 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cd source2 $ echo a >> foo $ hg ci -m a $ cd .. create a third repo to pull both other repos into it $ hg init corrupted $ cd corrupted use a hook to make the second pull start while the first one is still running $ echo '[hooks]' >> .hg/hgrc $ echo 'prechangegroup = sleep 5' >> .hg/hgrc start a pull... $ hg pull ../source1 > pull.out 2>&1 & ... and start another pull before the first one has finished $ sleep 1 $ hg pull ../source2 2>/dev/null pulling from ../source2 searching for changes adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) new changesets ca3c05af513e (run 'hg heads' to see heads, 'hg merge' to merge) $ cat pull.out pulling from ../source1 requesting all changes adding changesets adding manifests adding file changes added 10 changesets with 10 changes to 1 files new changesets 495a0ec48aaf:1e7b6c812ca8 (run 'hg update' to get a working copy) see the result $ wait $ hg verify checking changesets checking manifests crosschecking files in changesets and manifests checking files checked 11 changesets with 11 changes to 1 files $ cd ..