# HG changeset patch # User Pierre-Yves David # Date 1585279822 -3600 # Node ID 99123c3229b44d63c8656662bb8c326910c5a59d # Parent a28f24828f62c5e3a1ebd129505dd8d400a7a3bd# Parent b9b71fdea6935fe8a9a42afa23a95f9919e06c7d branching: merge with stable diff -r a28f24828f62 -r 99123c3229b4 CHANGELOG --- a/CHANGELOG Wed Mar 25 17:44:08 2020 -0400 +++ b/CHANGELOG Fri Mar 27 04:30:22 2020 +0100 @@ -6,6 +6,14 @@ * compat: clean up old compatibility code +9.3.0 - in progress +------------------- + + * obsexchange: avoid sending too large request to http server + * obsdiscovery: server no longer aborts with a 500 error if client sends a + request without obscommon + * evolve: improved behavior when evolving above the result of a split + 9.3.0 -- 2020-03-04 ------------------- diff -r a28f24828f62 -r 99123c3229b4 hgext3rd/evolve/evolvecmd.py diff -r a28f24828f62 -r 99123c3229b4 hgext3rd/evolve/obsdiscovery.py --- a/hgext3rd/evolve/obsdiscovery.py Wed Mar 25 17:44:08 2020 -0400 +++ b/hgext3rd/evolve/obsdiscovery.py Fri Mar 27 04:30:22 2020 +0100 @@ -824,7 +824,12 @@ repo = pullop.repo remote = pullop.remote unfi = repo.unfiltered() - revs = unfi.revs(b'::(%ln - null)', pullop.common) + # Also exclude filtered revisions. Working on unfiltered repository can + # give a bit more precise view of the repository. However it makes the + # overall operation more complicated. + filteredrevs = repo.changelog.filteredrevs + # XXX probably not very efficient + revs = unfi.revs(b'::(%ln - null) - %ld', pullop.common, filteredrevs) boundaries = {b'heads': pullop.pulledsubset} if not revs: # nothing common boundaries[b'common'] = [node.nullid] @@ -839,8 +844,14 @@ if bundle2 and _canobshashrange(repo, remote): obsexcmsg(repo.ui, b"looking for common markers in %i nodes\n" % len(revs)) - boundaries[b'missing'] = findmissingrange(repo.ui, unfi, pullop.remote, - revs) + missing = findmissingrange(repo.ui, repo, pullop.remote, revs) + boundaries[b'missing'] = missing + # using getattr since `limitedarguments` is missing + # hg <= 5.0 (69921d02daaf) + if getattr(pullop.remote, 'limitedarguments', False): + # prepare for a possible fallback to common + common = repo.set("heads(only(%ld, %ln))", revs, missing) + boundaries[b'common'] = [c.node() for c in common] else: boundaries[b'common'] = [node.nullid] return boundaries diff -r a28f24828f62 -r 99123c3229b4 hgext3rd/evolve/obsexchange.py --- a/hgext3rd/evolve/obsexchange.py Wed Mar 25 17:44:08 2020 -0400 +++ b/hgext3rd/evolve/obsexchange.py Fri Mar 27 04:30:22 2020 +0100 @@ -50,6 +50,18 @@ gboptsmap[b'evo_obscommon'] = b'nodes' gboptsmap[b'evo_missing_nodes'] = b'nodes' +ARGUMENTS_LIMIT = 200 + +OVERFLOW_MSG = """obsmarkers differ for %d common nodes +| +| This might be too much for the remote HTTP server that doesn't accept +| arguments through POST request. (config: experimental.httppostargs=yes) +| +| Falling back to a less efficient fetching method. +| +| More efficient fetching method is possible and will be used in the future. +""" + @eh.wrapfunction(exchange, '_pullbundle2extraprepare') def _addobscommontob2pull(orig, pullop, kwargs): ret = orig(pullop, kwargs) @@ -57,18 +69,27 @@ if (b'obsmarkers' in kwargs and pullop.remote.capable(b'_evoext_getbundle_obscommon')): boundaries = obsdiscovery.buildpullobsmarkersboundaries(pullop) - if b'common' in boundaries: + use_common = True + if b'missing' in boundaries: + use_common = False + missing = boundaries[b'missing'] + # using getattr since `limitedarguments` is missing + # hg <= 5.0 (69921d02daaf) + limitedarguments = getattr(pullop.remote, 'limitedarguments', False) + if limitedarguments and len(missing) > ARGUMENTS_LIMIT: + obsexcmsg(ui, OVERFLOW_MSG % len(missing)) + use_common = True + else: + if missing: + obsexcmsg(ui, b'request obsmarkers for %d common nodes\n' + % len(missing)) + kwargs[b'evo_missing_nodes'] = missing + if use_common and b'common' in boundaries: common = boundaries[b'common'] if common != pullop.common: obsexcmsg(ui, b'request obsmarkers for some common nodes\n') if common != [node.nullid]: kwargs[b'evo_obscommon'] = common - elif b'missing' in boundaries: - missing = boundaries[b'missing'] - if missing: - obsexcmsg(ui, b'request obsmarkers for %d common nodes\n' - % len(missing)) - kwargs[b'evo_missing_nodes'] = missing return ret def _getbundleobsmarkerpart(orig, bundler, repo, source, **kwargs): @@ -81,8 +102,10 @@ if heads is None: heads = repo.heads() obscommon = kwargs.get('evo_obscommon', ()) - assert obscommon - obsset = repo.unfiltered().set(b'::%ln - ::%ln', heads, obscommon) + if obscommon: + obsset = repo.unfiltered().set(b'::%ln - ::%ln', heads, obscommon) + else: + obsset = repo.unfiltered().set(b'::%ln', heads) subset = [c.node() for c in obsset] else: common = kwargs.get('common') diff -r a28f24828f62 -r 99123c3229b4 hgext3rd/evolve/utility.py --- a/hgext3rd/evolve/utility.py Wed Mar 25 17:44:08 2020 -0400 +++ b/hgext3rd/evolve/utility.py Fri Mar 27 04:30:22 2020 +0100 @@ -139,10 +139,9 @@ targets = obsutil.successorssets(repo, ctx.node())[0] assert targets targetrevs = [repo[r].rev() for r in targets] - roots = repo.revs(b'roots(%ld)', targetrevs) - heads = repo.revs(b'heads(%ld)', targetrevs) - if len(roots) > 1 or len(heads) > 1: - cheader = (_(b"ancestor '%s' split over multiple topological" + heads = repo.revs(b'heads(%ld::%ld)', targetrevs, targetrevs) + if len(heads) > 1: + cheader = (_(b"ancestor of '%s' split over multiple topological" b" branches.\nchoose an evolve destination:") % evolvecand) selectedrev = revselectionprompt(ui, repo, list(heads), cheader) diff -r a28f24828f62 -r 99123c3229b4 tests/test-discovery-hidden-common.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-discovery-hidden-common.t Fri Mar 27 04:30:22 2020 +0100 @@ -0,0 +1,103 @@ +test for discovery with some remote changesets hidden locally +============================================================= + + $ . $TESTDIR/testlib/common.sh + + $ cat << EOF >> $HGRCPATH + > [phases] + > publish = false + > [extensions] + > evolve = + > [experimental] + > verbose-obsolescence-exchange = 1 + > [ui] + > logtemplate = "{rev} {node|short} {desc} {tags}\n" + > ssh = "$PYTHON" "$RUNTESTDIR/dummyssh" + > EOF + + $ hg init server + $ hg clone ssh://user@dummy/server client + no changes found + updating to branch default + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd server + $ mkcommit root + $ mkcommit A0 + +second pull: + + $ hg -R ../client pull + pulling from ssh://user@dummy/server + requesting all changes + adding changesets + adding manifests + adding file changes + added 2 changesets with 2 changes to 2 files + new changesets 1e4be0697311:8aaa48160adc (2 drafts) + (run 'hg update' to get a working copy) + $ hg -R ../client log -G + o 1 8aaa48160adc A0 tip + | + o 0 1e4be0697311 root + + +more update + + $ hg tag --local stay-visible + $ hg up 0 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ mkcommit A1 + created new head + $ hg debugobsolete `getid 'desc(A0)'` `getid 'desc(A1)'` + 1 new obsolescence markers + obsoleted 1 changesets + +second pull: + + $ hg -R ../client pull + pulling from ssh://user@dummy/server + searching for changes + OBSEXC: looking for common markers in 2 nodes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files (+1 heads) + 1 new obsolescence markers + obsoleted 1 changesets + new changesets f6082bc4ffef (1 drafts) + (run 'hg heads' to see heads) + $ hg -R ../client log -G + o 2 f6082bc4ffef A1 tip + | + o 0 1e4be0697311 root + + +more update: + + $ hg up 0 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ mkcommit A2 + created new head + $ hg debugobsolete `getid 'desc(A1)'` `getid 'desc(A2)'` + 1 new obsolescence markers + obsoleted 1 changesets + +third pull: + + $ hg -R ../client pull + pulling from ssh://user@dummy/server + searching for changes + OBSEXC: looking for common markers in 1 nodes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files (+1 heads) + 1 new obsolescence markers + obsoleted 1 changesets + new changesets c1f8d089020f (1 drafts) + (run 'hg heads' to see heads) + $ hg -R ../client log -G + o 3 c1f8d089020f A2 tip + | + o 0 1e4be0697311 root + diff -r a28f24828f62 -r 99123c3229b4 tests/test-discovery-obshashrange-cache.t --- a/tests/test-discovery-obshashrange-cache.t Wed Mar 25 17:44:08 2020 -0400 +++ b/tests/test-discovery-obshashrange-cache.t Fri Mar 27 04:30:22 2020 +0100 @@ -16,11 +16,9 @@ > verbose-obsolescence-exchange=1 > [ui] > logtemplate = "{rev} {node|short} {desc} {tags}\n" - > ssh=python "$RUNTESTDIR/dummyssh" + > ssh = "$PYTHON" "$RUNTESTDIR/dummyssh" > [alias] > debugobsolete=debugobsolete -d '0 0' - > [ui] - > ssh=$PYTHON "$RUNTESTDIR/dummyssh" > EOF $ hg init main diff -r a28f24828f62 -r 99123c3229b4 tests/test-discovery-obshashrange.t --- a/tests/test-discovery-obshashrange.t Wed Mar 25 17:44:08 2020 -0400 +++ b/tests/test-discovery-obshashrange.t Fri Mar 27 04:30:22 2020 +0100 @@ -18,7 +18,7 @@ > verbose-obsolescence-exchange=1 > [ui] > logtemplate = "{rev} {node|short} {desc} {tags}\n" - > ssh=python "$RUNTESTDIR/dummyssh" + > ssh = "$PYTHON" "$RUNTESTDIR/dummyssh" > [alias] > debugobsolete=debugobsolete -d '0 0' > EOF @@ -193,7 +193,7 @@ could not import hgext.hgext3rd.evolve (No module named hgext3rd.evolve): trying hgext3rd.hgext3rd.evolve (?) could not import hgext3rd.hgext3rd.evolve (No module named hgext3rd.evolve): trying hgext3rd.evolve (?) pushing to ssh://user@dummy/server - running python "*/dummyssh" *user@dummy* *hg -R server serve --stdio* (glob) + running "*python*" "*/dummyssh" *user@dummy* *hg -R server serve --stdio* (glob) sending hello command sending between command remote: * (glob) @@ -324,7 +324,7 @@ * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obscache in *.???? seconds (0r, 1o) (glob) * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobsolete ffffffffffffffffffffffffffffffffffffffff 45f8b879de922f6a6e620ba04205730335b6fc7e exited 0 after *.?? seconds (glob) * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> push -f --debug (glob) - * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> running python "*/dummyssh" *user@dummy* *hg -R server serve --stdio* (glob) + * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> running "*python*" "*/dummyssh" *user@dummy* *hg -R server serve --stdio* (glob) * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> sending hello command (glob) * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> sending between command (glob) * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> remote: * (glob) diff -r a28f24828f62 -r 99123c3229b4 tests/test-evolve-issue5832.t --- a/tests/test-evolve-issue5832.t Wed Mar 25 17:44:08 2020 -0400 +++ b/tests/test-evolve-issue5832.t Fri Mar 27 04:30:22 2020 +0100 @@ -117,7 +117,7 @@ move:[2] added b atop:[5] added a move:[4] merge commit - ancestor '7235ef625ea3' split over multiple topological branches. + ancestor of '7235ef625ea3' split over multiple topological branches. choose an evolve destination: 1: [62fb70414f99] added c 2: [5841d7cf9893] added d @@ -257,7 +257,7 @@ move:[2] added b atop:[6] added a move:[4] merge commit - ancestor 'cdf2ea1b9312' split over multiple topological branches. + ancestor of 'cdf2ea1b9312' split over multiple topological branches. choose an evolve destination: 1: [62fb70414f99] added c 2: [5841d7cf9893] added d @@ -402,7 +402,7 @@ > EOF move:[2] added b atop:[6] added a - ancestor 'b9b387427a53' split over multiple topological branches. + ancestor of 'b9b387427a53' split over multiple topological branches. choose an evolve destination: 1: [62fb70414f99] added c 2: [5841d7cf9893] added d diff -r a28f24828f62 -r 99123c3229b4 tests/test-evolve-orphan-split.t --- a/tests/test-evolve-orphan-split.t Wed Mar 25 17:44:08 2020 -0400 +++ b/tests/test-evolve-orphan-split.t Fri Mar 27 04:30:22 2020 +0100 @@ -193,7 +193,7 @@ $ hg evolve --dry-run < 1 > EOF - ancestor 'd48a30875f01' split over multiple topological branches. + ancestor of 'd48a30875f01' split over multiple topological branches. choose an evolve destination: 1: [f2632392aefe] added a b c 2: [7f87764e5b64] added a b c @@ -206,7 +206,7 @@ $ hg evolve --dry-run < 2 > EOF - ancestor 'd48a30875f01' split over multiple topological branches. + ancestor of 'd48a30875f01' split over multiple topological branches. choose an evolve destination: 1: [f2632392aefe] added a b c 2: [7f87764e5b64] added a b c @@ -222,7 +222,7 @@ $ hg evolve --all < foo > EOF - ancestor 'd48a30875f01' split over multiple topological branches. + ancestor of 'd48a30875f01' split over multiple topological branches. choose an evolve destination: 1: [f2632392aefe] added a b c 2: [7f87764e5b64] added a b c @@ -234,7 +234,7 @@ $ hg evolve --all < 4 > EOF - ancestor 'd48a30875f01' split over multiple topological branches. + ancestor of 'd48a30875f01' split over multiple topological branches. choose an evolve destination: 1: [f2632392aefe] added a b c 2: [7f87764e5b64] added a b c @@ -246,7 +246,7 @@ $ hg evolve --all < -1 > EOF - ancestor 'd48a30875f01' split over multiple topological branches. + ancestor of 'd48a30875f01' split over multiple topological branches. choose an evolve destination: 1: [f2632392aefe] added a b c 2: [7f87764e5b64] added a b c @@ -258,7 +258,7 @@ $ hg evolve --all < q > EOF - ancestor 'd48a30875f01' split over multiple topological branches. + ancestor of 'd48a30875f01' split over multiple topological branches. choose an evolve destination: 1: [f2632392aefe] added a b c 2: [7f87764e5b64] added a b c @@ -271,7 +271,7 @@ $ hg evolve --all < 1 > EOF - ancestor 'd48a30875f01' split over multiple topological branches. + ancestor of 'd48a30875f01' split over multiple topological branches. choose an evolve destination: 1: [f2632392aefe] added a b c 2: [7f87764e5b64] added a b c diff -r a28f24828f62 -r 99123c3229b4 tests/test-evolve-serveronly-bundle2.t --- a/tests/test-evolve-serveronly-bundle2.t Wed Mar 25 17:44:08 2020 -0400 +++ b/tests/test-evolve-serveronly-bundle2.t Fri Mar 27 04:30:22 2020 +0100 @@ -8,7 +8,7 @@ > push_ssl = false > allow_push = * > [ui] - > ssh=python "$RUNTESTDIR/dummyssh" + > ssh = "$PYTHON" "$RUNTESTDIR/dummyssh" > [phases] > publish = False > [experimental] diff -r a28f24828f62 -r 99123c3229b4 tests/test-evolve-split.t --- a/tests/test-evolve-split.t Wed Mar 25 17:44:08 2020 -0400 +++ b/tests/test-evolve-split.t Fri Mar 27 04:30:22 2020 +0100 @@ -59,3 +59,56 @@ $ hg evolve --rev "0::" move:[2] add uu atop:[4] _pp + + $ cd .. + $ hg init split-merged + $ cd split-merged + $ mkcommit aa + +Split the changeset such that the successors don't have a single root and there's an unrelated changeset in between + $ printf "oo" > oo; + $ printf "pp" > pp; + $ printf "qq" > qq; + $ hg add oo pp qq + $ hg commit -m "oo+pp+qq" + $ mkcommit uu + $ hg up 0 + 0 files updated, 0 files merged, 4 files removed, 0 files unresolved + $ printf "oo" > oo; + $ hg add oo + $ hg commit -m "_oo" + created new head + $ hg up 0 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ printf "pp" > pp; + $ hg add pp + $ hg commit -m "_pp" + created new head + $ hg merge 3 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg ci -m 'merge oo and pp' + $ printf "qq" > qq; + $ hg add qq + $ hg commit -m "_qq" + $ hg prune --successor "desc(_oo) + desc(_pp) + desc(_qq)" -r "desc('oo+pp+qq')" --split + 1 changesets pruned + 1 new orphan changesets + $ hg log -G + @ 6:ea5b1e180c04@default(draft) _qq + | + o 5:bf7c32161b4b@default(draft) merge oo and pp + |\ + | o 4:ece0aaa22eb7@default(draft) _pp + | | + o | 3:a7fdfda64c08@default(draft) _oo + |/ + | * 2:cc56c47d84b3@default(draft) add uu + | | + | x 1:575a7380a87d@default(draft) oo+pp+qq + |/ + o 0:58663bb03074@default(draft) add aa + + $ hg evolve --rev "0::" + move:[2] add uu + atop:[6] _qq diff -r a28f24828f62 -r 99123c3229b4 tests/test-push-checkheads-pruned-B5.t --- a/tests/test-push-checkheads-pruned-B5.t Wed Mar 25 17:44:08 2020 -0400 +++ b/tests/test-push-checkheads-pruned-B5.t Fri Mar 27 04:30:22 2020 +0100 @@ -27,11 +27,11 @@ .. .. graph-summary: .. -.. B ⊗ +.. C ⊗ .. | -.. A ø⇠◔ A' +.. B ø⇠◔ B' .. | | -.. B ⊗ | +.. A ⊗ | .. |/ .. ● diff -r a28f24828f62 -r 99123c3229b4 tests/test-topic-push-concurrent-on.t --- a/tests/test-topic-push-concurrent-on.t Wed Mar 25 17:44:08 2020 -0400 +++ b/tests/test-topic-push-concurrent-on.t Fri Mar 27 04:30:22 2020 +0100 @@ -5,7 +5,7 @@ $ cat << EOF >> $HGRCPATH > [ui] > logtemplate = {rev} {branch} {get(namespaces, "topics")} {phase} {desc|firstline}\n - > ssh =python "$RUNTESTDIR/dummyssh" + > ssh = "$PYTHON" "$RUNTESTDIR/dummyssh" > [server] > concurrent-push-mode=check-related > EOF diff -r a28f24828f62 -r 99123c3229b4 tests/test-topic-push.t --- a/tests/test-topic-push.t Wed Mar 25 17:44:08 2020 -0400 +++ b/tests/test-topic-push.t Fri Mar 27 04:30:22 2020 +0100 @@ -3,7 +3,7 @@ $ cat << EOF >> $HGRCPATH > [ui] > logtemplate = {rev} {branch} {get(namespaces, "topics")} {phase} {desc|firstline}\n - > ssh =python "$RUNTESTDIR/dummyssh" + > ssh = "$PYTHON" "$RUNTESTDIR/dummyssh" > EOF $ hg init main diff -r a28f24828f62 -r 99123c3229b4 tests/test-wireproto-bundle1.t --- a/tests/test-wireproto-bundle1.t Wed Mar 25 17:44:08 2020 -0400 +++ b/tests/test-wireproto-bundle1.t Fri Mar 27 04:30:22 2020 +0100 @@ -3,7 +3,7 @@ > [defaults] > amend=-d "0 0" > [ui] - > ssh=python "$RUNTESTDIR/dummyssh" + > ssh = "$PYTHON" "$RUNTESTDIR/dummyssh" > [phases] > publish = False > [extensions] diff -r a28f24828f62 -r 99123c3229b4 tests/test-wireproto.t --- a/tests/test-wireproto.t Wed Mar 25 17:44:08 2020 -0400 +++ b/tests/test-wireproto.t Fri Mar 27 04:30:22 2020 +0100 @@ -6,7 +6,7 @@ > obsmarkers-exchange-debug=true > bundle2-exp=true > [ui] - > ssh=python "$RUNTESTDIR/dummyssh" + > ssh = "$PYTHON" "$RUNTESTDIR/dummyssh" > [phases] > publish = False > [extensions]