Mercurial > hg-stable
view tests/test-rebase-conflicts.t @ 35121:66c5a8cf2868
lfs: import the Facebook git-lfs client extension
The purpose of this is the same as the built-in largefiles extension- to handle
huge files outside of the normal storage system, generally to keep the amount of
data cloned to a lower amount. There are several benefits of implementing the
git-lfs protocol, instead of using the largefiles extension:
- Bitbucket and Github support (and probably wider support in 3rd party
hosting sites in general). [1][2]
- The number of hg internals monkey patched are several orders of magnitude
lower, so it will be easier to reason about and maintain. Future commands
will likely just work, without requiring various wrappers.
- The "standin" files are only written to the filelog, not the disk. That
should avoid weird edge cases where the largefile and standin files get out
of sync. [3] It also avoids the occasional printing of the "hidden" standin
file in various messages.
- Filesets like size() will work, even if the file isn't present. (It always
says 41 bytes for largefiles, whether present or not.)
The only place that I see where largefiles comes out on top is that it works
with `hg serve` for simple sharing, without external infrastructure. Getting
lfs-test-server working was a hassle, and took awhile to figure out. Maybe we
can do something to make it work in the future.
Long term, I expect that this will be highly preferred over largefiles. But if
we are to recommend this to largefile users, there are some UI issues to
bikeshed. Until they are resolved, I've marked this experimental, and am not
putting a pointer to this in the largefiles help. The (non exhaustive) list of
issues I've seen so far are:
- It isn't sufficient to just enable the largefiles extension- you have to
explicitly add a file with --large before it will pay attention to the
configured sizes and patterns on future adds. The justification being that
once you use it, you're stuck with it. I've seen people confused by this,
and haven't liked it myself. But it's also saved me a few times. Should we
do something like have a specific enabling config setting that must be set
in the local repo config, so that enabling this extension in the user or
system hgrc doesn't silently start storing lfs files?
- The largefiles extension adds a repo requirement when the first largefile is
committed, so that the extension must always be enabled in the future. This
extension is not doing that, and since I only enabled it locally to avoid
infecting other repos, I got a cryptic error about missing flag processors
when I cloned. Is there no repo requirement due to shallow/narrow clone
considerations (or other future advanced things)?
- In the (small amount of) reading I've done about the git implementation, it
seems that the files and sizes are stored in a tracked .gitattributes file.
I think a tracked file for this would be extremely useful for consistency
across developers, but this kind of touches on the tracked hgrc file
proposal a few months back.
- The git client can specify file patterns, not just sizes.
- The largefiles extension has a cache directory in the local repo, but also a
system wide one. We should probably implement a system wide cache too, so
that multiple clones don't have to refetch the files from the server.
- Jun mentioned other missing features, like SSH authentication, gc, etc.
The code corresponds to c0492b73c7ef in hg-experimental. [4] The only tweaks
are to load the extension in the tests with 'lfs=' instead of
'lfs=$TESTDIR/../hgext3rd/lfs', change the import in the *.py test to hgext
(from hgext3rd), add the 'testedwith' declaration, and mark it experimental for
now. The infinite-push, p4fastimport, and remotefilelog tests were left behind.
The devel-warnings for unregistered config options are not corrected yet, nor
are the import check warnings.
[1] https://www.mercurial-scm.org/pipermail/mercurial/2017-November/050699.html
[2] https://bitbucket.org/site/master/issues/3843/largefiles-support-bb-3903
[3] https://bz.mercurial-scm.org/show_bug.cgi?id=5738
[4] https://bitbucket.org/facebook/hg-experimental
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Tue, 14 Nov 2017 00:06:23 -0500 |
parents | a0100f34e20b |
children | b9bdee046cc2 |
line wrap: on
line source
$ cat >> $HGRCPATH <<EOF > [format] > usegeneraldelta=yes > [extensions] > rebase= > drawdag=$TESTDIR/drawdag.py > > [phases] > publish=False > > [alias] > tglog = log -G --template "{rev}:{phase} '{desc}' {branches} {bookmarks}\n" > EOF $ hg init a $ cd a $ echo c1 >common $ hg add common $ hg ci -m C1 $ echo c2 >>common $ hg ci -m C2 $ echo c3 >>common $ hg ci -m C3 $ hg up -q -C 1 $ echo l1 >>extra $ hg add extra $ hg ci -m L1 created new head $ sed -e 's/c2/l2/' common > common.new $ mv common.new common $ hg ci -m L2 $ echo l3 >> extra2 $ hg add extra2 $ hg ci -m L3 $ hg bookmark mybook $ hg phase --force --secret 4 $ hg tglog @ 5:secret 'L3' mybook | o 4:secret 'L2' | o 3:draft 'L1' | | o 2:draft 'C3' |/ o 1:draft 'C2' | o 0:draft 'C1' Try to call --continue: $ hg rebase --continue abort: no rebase in progress [255] Conflicting rebase: $ hg rebase -s 3 -d 2 rebasing 3:3163e20567cc "L1" rebasing 4:46f0b057b5c0 "L2" merging common warning: conflicts while merging common! (edit, then use 'hg resolve --mark') unresolved conflicts (see hg resolve, then hg rebase --continue) [1] $ hg status --config commands.status.verbose=1 M common ? common.orig # The repository is in an unfinished *rebase* state. # Unresolved merge conflicts: # # common # # To mark files as resolved: hg resolve --mark FILE # To continue: hg rebase --continue # To abort: hg rebase --abort Try to continue without solving the conflict: $ hg rebase --continue abort: unresolved merge conflicts (see 'hg help resolve') [255] Conclude rebase: $ echo 'resolved merge' >common $ hg resolve -m common (no more unresolved files) continue: hg rebase --continue $ hg rebase --continue already rebased 3:3163e20567cc "L1" as 3e046f2ecedb rebasing 4:46f0b057b5c0 "L2" rebasing 5:8029388f38dc "L3" (mybook) saved backup bundle to $TESTTMP/a/.hg/strip-backup/3163e20567cc-5ca4656e-rebase.hg (glob) $ hg tglog @ 5:secret 'L3' mybook | o 4:secret 'L2' | o 3:draft 'L1' | o 2:draft 'C3' | o 1:draft 'C2' | o 0:draft 'C1' Check correctness: $ hg cat -r 0 common c1 $ hg cat -r 1 common c1 c2 $ hg cat -r 2 common c1 c2 c3 $ hg cat -r 3 common c1 c2 c3 $ hg cat -r 4 common resolved merge $ hg cat -r 5 common resolved merge Bookmark stays active after --continue $ hg bookmarks * mybook 5:d67b21408fc0 $ cd .. Check that the right ancestors is used while rebasing a merge (issue4041) $ hg clone "$TESTDIR/bundles/issue4041.hg" issue4041 requesting all changes adding changesets adding manifests adding file changes added 11 changesets with 8 changes to 3 files (+1 heads) new changesets 24797d4f68de:2f2496ddf49d updating to branch default 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cd issue4041 $ hg log -G o changeset: 10:2f2496ddf49d |\ branch: f1 | | tag: tip | | parent: 7:4c9fbe56a16f | | parent: 9:e31216eec445 | | user: szhang | | date: Thu Sep 05 12:59:39 2013 -0400 | | summary: merge | | | o changeset: 9:e31216eec445 | | branch: f1 | | user: szhang | | date: Thu Sep 05 12:59:10 2013 -0400 | | summary: more changes to f1 | | | o changeset: 8:8e4e2c1a07ae | |\ branch: f1 | | | parent: 2:4bc80088dc6b | | | parent: 6:400110238667 | | | user: szhang | | | date: Thu Sep 05 12:57:59 2013 -0400 | | | summary: bad merge | | | o | | changeset: 7:4c9fbe56a16f |/ / branch: f1 | | parent: 2:4bc80088dc6b | | user: szhang | | date: Thu Sep 05 12:54:00 2013 -0400 | | summary: changed f1 | | | o changeset: 6:400110238667 | | branch: f2 | | parent: 4:12e8ec6bb010 | | user: szhang | | date: Tue Sep 03 13:58:02 2013 -0400 | | summary: changed f2 on f2 | | | | @ changeset: 5:d79e2059b5c0 | | | parent: 3:8a951942e016 | | | user: szhang | | | date: Tue Sep 03 13:57:39 2013 -0400 | | | summary: changed f2 on default | | | | o | changeset: 4:12e8ec6bb010 | |/ branch: f2 | | user: szhang | | date: Tue Sep 03 13:57:18 2013 -0400 | | summary: created f2 branch | | | o changeset: 3:8a951942e016 | | parent: 0:24797d4f68de | | user: szhang | | date: Tue Sep 03 13:57:11 2013 -0400 | | summary: added f2.txt | | o | changeset: 2:4bc80088dc6b | | branch: f1 | | user: szhang | | date: Tue Sep 03 13:56:20 2013 -0400 | | summary: added f1.txt | | o | changeset: 1:ef53c9e6b608 |/ branch: f1 | user: szhang | date: Tue Sep 03 13:55:26 2013 -0400 | summary: created f1 branch | o changeset: 0:24797d4f68de user: szhang date: Tue Sep 03 13:55:08 2013 -0400 summary: added default.txt $ hg rebase -s9 -d2 --debug # use debug to really check merge base used rebase onto 4bc80088dc6b starting from e31216eec445 rebase status stored rebasing 9:e31216eec445 "more changes to f1" future parents are 2 and -1 rebase status stored update to 2:4bc80088dc6b resolving manifests branchmerge: False, force: True, partial: False ancestor: d79e2059b5c0+, local: d79e2059b5c0+, remote: 4bc80088dc6b f2.txt: other deleted -> r removing f2.txt f1.txt: remote created -> g getting f1.txt merge against 9:e31216eec445 detach base 8:8e4e2c1a07ae searching for copies back to rev 3 unmatched files in other (from topological common ancestor): f2.txt resolving manifests branchmerge: True, force: True, partial: False ancestor: 8e4e2c1a07ae, local: 4bc80088dc6b+, remote: e31216eec445 f1.txt: remote is newer -> g getting f1.txt committing files: f1.txt committing manifest committing changelog updating the branch cache rebased as 19c888675e13 rebasing 10:2f2496ddf49d "merge" (tip) future parents are 11 and 7 rebase status stored already in destination merge against 10:2f2496ddf49d detach base 9:e31216eec445 searching for copies back to rev 3 unmatched files in other (from topological common ancestor): f2.txt resolving manifests branchmerge: True, force: True, partial: False ancestor: e31216eec445, local: 19c888675e13+, remote: 2f2496ddf49d f1.txt: remote is newer -> g getting f1.txt committing files: f1.txt committing manifest committing changelog updating the branch cache rebased as 2a7f09cac94c rebase merging completed update back to initial working directory parent resolving manifests branchmerge: False, force: False, partial: False ancestor: 2a7f09cac94c, local: 2a7f09cac94c+, remote: d79e2059b5c0 f1.txt: other deleted -> r removing f1.txt f2.txt: remote created -> g getting f2.txt 2 changesets found list of changesets: e31216eec445e44352c5f01588856059466a24c9 2f2496ddf49d69b5ef23ad8cf9fb2e0e4faf0ac2 bundle2-output-bundle: "HG20", (1 params) 2 parts total bundle2-output-part: "changegroup" (params: 1 mandatory 1 advisory) streamed payload bundle2-output-part: "phase-heads" 24 bytes payload saved backup bundle to $TESTTMP/issue4041/.hg/strip-backup/e31216eec445-15f7a814-rebase.hg (glob) 3 changesets found list of changesets: 4c9fbe56a16f30c0d5dcc40ec1a97bbe3325209c 19c888675e133ab5dff84516926a65672eaf04d9 2a7f09cac94c7f4b73ebd5cd1a62d3b2e8e336bf bundle2-output-bundle: "HG20", 2 parts total bundle2-output-part: "changegroup" (params: 1 mandatory 1 advisory) streamed payload bundle2-output-part: "phase-heads" 24 bytes payload adding branch bundle2-input-bundle: with-transaction bundle2-input-part: "changegroup" (params: 1 mandatory 1 advisory) supported adding changesets add changeset 4c9fbe56a16f add changeset 19c888675e13 add changeset 2a7f09cac94c adding manifests adding file changes adding f1.txt revisions added 2 changesets with 2 changes to 1 files bundle2-input-part: total payload size 1686 bundle2-input-part: "phase-heads" supported bundle2-input-part: total payload size 24 bundle2-input-bundle: 1 parts total updating the branch cache invalid branchheads cache (served): tip differs rebase completed Test minimization of merge conflicts $ hg up -q null $ echo a > a $ hg add a $ hg commit -q -m 'a' $ echo b >> a $ hg commit -q -m 'ab' $ hg bookmark ab $ hg up -q '.^' $ echo b >> a $ echo c >> a $ hg commit -q -m 'abc' $ hg rebase -s 7bc217434fc1 -d ab --keep rebasing 13:7bc217434fc1 "abc" (tip) merging a warning: conflicts while merging a! (edit, then use 'hg resolve --mark') unresolved conflicts (see hg resolve, then hg rebase --continue) [1] $ hg diff diff -r 328e4ab1f7cc a --- a/a Thu Jan 01 00:00:00 1970 +0000 +++ b/a * (glob) @@ -1,2 +1,6 @@ a b +<<<<<<< dest: 328e4ab1f7cc ab - test: ab +======= +c +>>>>>>> source: 7bc217434fc1 - test: abc $ hg rebase --abort rebase aborted $ hg up -q -C 7bc217434fc1 $ hg rebase -s . -d ab --keep -t internal:merge3 rebasing 13:7bc217434fc1 "abc" (tip) merging a warning: conflicts while merging a! (edit, then use 'hg resolve --mark') unresolved conflicts (see hg resolve, then hg rebase --continue) [1] $ hg diff diff -r 328e4ab1f7cc a --- a/a Thu Jan 01 00:00:00 1970 +0000 +++ b/a * (glob) @@ -1,2 +1,8 @@ a +<<<<<<< dest: 328e4ab1f7cc ab - test: ab b +||||||| base +======= +b +c +>>>>>>> source: 7bc217434fc1 - test: abc Test rebase with obsstore turned on and off (issue5606) $ cd $TESTTMP $ hg init b $ cd b $ hg debugdrawdag <<'EOS' > D > | > C > | > B E > |/ > A > EOS $ hg update E -q $ echo 3 > B $ hg commit --amend -m E -A B -q $ hg rebase -r B+D -d . --config experimental.evolution=true rebasing 1:112478962961 "B" (B) merging B warning: conflicts while merging B! (edit, then use 'hg resolve --mark') unresolved conflicts (see hg resolve, then hg rebase --continue) [1] $ echo 4 > B $ hg resolve -m (no more unresolved files) continue: hg rebase --continue $ hg rebase --continue --config experimental.evolution=none rebasing 1:112478962961 "B" (B) rebasing 3:f585351a92f8 "D" (D) warning: orphaned descendants detected, not stripping 112478962961 saved backup bundle to $TESTTMP/b/.hg/strip-backup/f585351a92f8-e536a9e4-rebase.hg (glob) $ rm .hg/localtags $ hg tglog o 5:draft 'D' | o 4:draft 'B' | @ 3:draft 'E' | | o 2:draft 'C' | | | o 1:draft 'B' |/ o 0:draft 'A'