# HG changeset patch # User Pierre-Yves David # Date 1357575805 -3600 # Node ID a55b06885cda861cf989c987beac66cf49d5b15b # Parent 59a9f18d458788b5829a0c43b69c8118a62e4ddb branchmap: allow to use cache of subset Filtered repository are *subset* of unfiltered repository. This means that a filtered branchmap could be use to compute the unfiltered version. And filtered version happen to be subset of each other: - "all() - unserved()" is a subset of "all() - hidden()" - "all() - hidden()" is a subset of "all()" This means that branchmap with "unfiltered" filter can be used as a base for "hidden" branchmap that itself could be used as a base for unfiltered branchmap. unserved < hidden < None This changeset implements this mechanism. If the on disk branchcache is not valid we use the branchcache of the nearest subset as base instead of computing it from scratch. Such fallback can be cascaded multiple time is necessary. Note that both "hidden" and "unserved" set are a bit volatile. We will add more stable filtering in next changesets. This changeset enables collaboration between no filtering and "unserved" filtering. Fixing performance regression introduced by 47f00b0de337 diff -r 59a9f18d4587 -r a55b06885cda mercurial/branchmap.py --- a/mercurial/branchmap.py Mon Jan 07 17:16:24 2013 +0100 +++ b/mercurial/branchmap.py Mon Jan 07 17:23:25 2013 +0100 @@ -7,7 +7,7 @@ from node import bin, hex, nullid, nullrev import encoding -import util +import util, repoview def _filename(repo): """name of a branchcache file for a given repo or repoview""" @@ -63,16 +63,24 @@ filtername = repo.filtername partial = repo._branchcaches.get(filtername) + revs = [] if partial is None or not partial.validfor(repo): partial = read(repo) if partial is None: - partial = branchcache() - - revs = list(cl.revs(start=partial.tiprev +1)) + subsetname = repoview.subsettable.get(filtername) + if subsetname is None: + partial = branchcache() + else: + subset = repo.filtered(subsetname) + partial = subset.branchmap().copy() + extrarevs = subset.changelog.filteredrevs - cl.filteredrevs + revs.extend(r for r in extrarevs if r <= partial.tiprev) + revs.extend(cl.revs(start=partial.tiprev + 1)) if revs: ctxgen = (repo[r] for r in revs) partial.update(repo, ctxgen) partial.write(repo) + assert partial.validfor(repo) repo._branchcaches[repo.filtername] = partial class branchcache(dict): diff -r 59a9f18d4587 -r a55b06885cda tests/test-acl.t --- a/tests/test-acl.t Mon Jan 07 17:16:24 2013 +0100 +++ b/tests/test-acl.t Mon Jan 07 17:23:25 2013 +0100 @@ -140,6 +140,7 @@ query 1; heads searching for changes all remote heads known locally + invalid branchheads cache (unserved): tip differs listing keys for "bookmarks" 3 changesets found list of changesets: @@ -201,6 +202,7 @@ query 1; heads searching for changes all remote heads known locally + invalid branchheads cache (unserved): tip differs listing keys for "bookmarks" 3 changesets found list of changesets: @@ -272,6 +274,7 @@ query 1; heads searching for changes all remote heads known locally + invalid branchheads cache (unserved): tip differs listing keys for "bookmarks" 3 changesets found list of changesets: @@ -770,6 +773,7 @@ query 1; heads searching for changes all remote heads known locally + invalid branchheads cache (unserved): tip differs listing keys for "bookmarks" 3 changesets found list of changesets: @@ -1087,6 +1091,7 @@ query 1; heads searching for changes all remote heads known locally + invalid branchheads cache (unserved): tip differs listing keys for "bookmarks" 3 changesets found list of changesets: @@ -1162,6 +1167,7 @@ query 1; heads searching for changes all remote heads known locally + invalid branchheads cache (unserved): tip differs listing keys for "bookmarks" 3 changesets found list of changesets: @@ -1313,6 +1319,7 @@ query 1; heads searching for changes all remote heads known locally + invalid branchheads cache (unserved): tip differs listing keys for "bookmarks" 3 changesets found list of changesets: @@ -1510,6 +1517,7 @@ query 1; heads searching for changes all remote heads known locally + invalid branchheads cache (unserved): tip differs listing keys for "bookmarks" 4 changesets found list of changesets: @@ -1821,6 +1829,7 @@ query 1; heads searching for changes all remote heads known locally + invalid branchheads cache (unserved): tip differs listing keys for "bookmarks" 4 changesets found list of changesets: @@ -1908,6 +1917,7 @@ query 1; heads searching for changes all remote heads known locally + invalid branchheads cache (unserved): tip differs listing keys for "bookmarks" 4 changesets found list of changesets: @@ -2063,6 +2073,7 @@ query 1; heads searching for changes all remote heads known locally + invalid branchheads cache (unserved): tip differs listing keys for "bookmarks" 4 changesets found list of changesets: diff -r 59a9f18d4587 -r a55b06885cda tests/test-fncache.t --- a/tests/test-fncache.t Mon Jan 07 17:16:24 2013 +0100 +++ b/tests/test-fncache.t Mon Jan 07 17:23:25 2013 +0100 @@ -70,7 +70,7 @@ .hg/00changelog.i .hg/00manifest.i .hg/cache - .hg/cache/branchheads + .hg/cache/branchheads-unserved .hg/data .hg/data/tst.d.hg .hg/data/tst.d.hg/foo.i @@ -98,7 +98,7 @@ .hg .hg/00changelog.i .hg/cache - .hg/cache/branchheads + .hg/cache/branchheads-unserved .hg/dirstate .hg/last-message.txt .hg/requires diff -r 59a9f18d4587 -r a55b06885cda tests/test-hardlinks.t --- a/tests/test-hardlinks.t Mon Jan 07 17:16:24 2013 +0100 +++ b/tests/test-hardlinks.t Mon Jan 07 17:23:25 2013 +0100 @@ -196,7 +196,7 @@ $ nlinksdir r4 2 r4/.hg/00changelog.i 2 r4/.hg/branch - 2 r4/.hg/cache/branchheads + 2 r4/.hg/cache/branchheads-unserved 2 r4/.hg/dirstate 2 r4/.hg/hgrc 2 r4/.hg/last-message.txt @@ -226,7 +226,7 @@ $ nlinksdir r4 2 r4/.hg/00changelog.i 1 r4/.hg/branch - 2 r4/.hg/cache/branchheads + 2 r4/.hg/cache/branchheads-unserved 1 r4/.hg/dirstate 2 r4/.hg/hgrc 2 r4/.hg/last-message.txt diff -r 59a9f18d4587 -r a55b06885cda tests/test-inherit-mode.t --- a/tests/test-inherit-mode.t Mon Jan 07 17:16:24 2013 +0100 +++ b/tests/test-inherit-mode.t Mon Jan 07 17:23:25 2013 +0100 @@ -66,7 +66,7 @@ 00700 ./.hg/ 00600 ./.hg/00changelog.i 00770 ./.hg/cache/ - 00660 ./.hg/cache/branchheads + 00660 ./.hg/cache/branchheads-unserved 00660 ./.hg/dirstate 00660 ./.hg/last-message.txt 00600 ./.hg/requires @@ -111,7 +111,7 @@ 00770 ../push/.hg/ 00660 ../push/.hg/00changelog.i 00770 ../push/.hg/cache/ - 00660 ../push/.hg/cache/branchheads + 00660 ../push/.hg/cache/branchheads-unserved 00660 ../push/.hg/requires 00770 ../push/.hg/store/ 00660 ../push/.hg/store/00changelog.i diff -r 59a9f18d4587 -r a55b06885cda tests/test-keyword.t --- a/tests/test-keyword.t Mon Jan 07 17:16:24 2013 +0100 +++ b/tests/test-keyword.t Mon Jan 07 17:23:25 2013 +0100 @@ -747,7 +747,9 @@ Commit with multi-line message and custom expansion $ hg --debug commit -l log -d '2 0' -u 'User Name ' + invalid branchheads cache: tip differs a + invalid branchheads cache: tip differs overwriting a expanding keywords committed changeset 2:bb948857c743469b22bbf51f7ec8112279ca5d83 $ rm log @@ -789,6 +791,8 @@ $ hg debugrebuildstate $ hg remove a $ hg --debug commit -m rma + invalid branchheads cache: tip differs + invalid branchheads cache: tip differs committed changeset 3:d14c712653769de926994cf7fbb06c8fbd68f012 $ hg status ? c @@ -899,8 +903,10 @@ [255] $ cd x $ hg --debug commit -m xa -d '3 0' -u 'User Name ' + invalid branchheads cache: tip differs x/a x/a: copy a:779c764182ce5d43e2b1eb66ce06d7b47bfe342e + invalid branchheads cache: tip differs overwriting x/a expanding keywords committed changeset 3:b4560182a3f9a358179fd2d835c15e9da379c1e4 $ cat a diff -r 59a9f18d4587 -r a55b06885cda tests/test-newbranch.t --- a/tests/test-newbranch.t Mon Jan 07 17:16:24 2013 +0100 +++ b/tests/test-newbranch.t Mon Jan 07 17:23:25 2013 +0100 @@ -1,5 +1,15 @@ $ branchcache=.hg/cache/branchheads + $ listbranchcaches() { + > for f in .hg/cache/branchheads*; + > do echo === $f ===; + > cat $f; + > done; + > } + $ purgebranchcaches() { + > rm .hg/cache/branchheads* + > } + $ hg init t $ cd t @@ -112,7 +122,7 @@ repository tip rolled back to revision 4 (undo commit) working directory now based on revisions 4 and 3 - $ cp $branchcache .hg/bc-invalid + $ cp ${branchcache}-unserved .hg/bc-invalid $ hg log -r foo changeset: 4:adf1a74a7f7b @@ -142,13 +152,16 @@ modify a branch - $ rm $branchcache + $ purgebranchcaches $ echo corrupted > $branchcache $ hg log -qr foo 4:adf1a74a7f7b - $ cat $branchcache + $ listbranchcaches + === .hg/cache/branchheads === + corrupted + === .hg/cache/branchheads-unserved === adf1a74a7f7b4cd193d12992f5d0d6a004ed21d6 4 1c28f494dae69a2f8fc815059d257eccf3fcfe75 default adf1a74a7f7b4cd193d12992f5d0d6a004ed21d6 foo @@ -162,7 +175,8 @@ $ hg push -qr 0 ../target - $ cat ../target/$branchcache + $ (cd ../target/; listbranchcaches) + === .hg/cache/branchheads-unserved === db01e8ea3388fd3c7c94e1436ea2bd6a53d581c5 0 db01e8ea3388fd3c7c94e1436ea2bd6a53d581c5 default @@ -170,7 +184,8 @@ $ hg push -qf ../target - $ cat ../target/$branchcache + $ (cd ../target/; listbranchcaches) + === .hg/cache/branchheads-unserved === adf1a74a7f7b4cd193d12992f5d0d6a004ed21d6 4 1c28f494dae69a2f8fc815059d257eccf3fcfe75 default adf1a74a7f7b4cd193d12992f5d0d6a004ed21d6 foo diff -r 59a9f18d4587 -r a55b06885cda tests/test-obsolete-divergent.t --- a/tests/test-obsolete-divergent.t Mon Jan 07 17:16:24 2013 +0100 +++ b/tests/test-obsolete-divergent.t Mon Jan 07 17:23:25 2013 +0100 @@ -62,6 +62,7 @@ $ newcase direct $ hg debugobsolete `getid A_0` `getid A_1` $ hg debugobsolete `getid A_0` `getid A_2` + invalid branchheads cache (unserved): tip differs $ hg log -G --hidden o 3:392fd25390da A_2 | @@ -103,6 +104,7 @@ $ newcase indirect_known $ hg debugobsolete `getid A_0` `getid A_1` $ hg debugobsolete `getid A_0` `getid A_2` + invalid branchheads cache (unserved): tip differs $ mkcommit A_3 created new head $ hg debugobsolete `getid A_2` `getid A_3` @@ -141,6 +143,7 @@ $ newcase indirect_unknown $ hg debugobsolete `getid A_0` aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa $ hg debugobsolete aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa `getid A_1` + invalid branchheads cache (unserved): tip differs $ hg debugobsolete `getid A_0` `getid A_2` $ hg log -G --hidden o 3:392fd25390da A_2 @@ -172,6 +175,7 @@ $ newcase final-unknown $ hg debugobsolete `getid A_0` `getid A_1` $ hg debugobsolete `getid A_1` `getid A_2` + invalid branchheads cache (unserved): tip differs $ hg debugobsolete `getid A_0` bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb $ hg debugobsolete bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb cccccccccccccccccccccccccccccccccccccccc $ hg debugobsolete `getid A_1` dddddddddddddddddddddddddddddddddddddddd @@ -188,6 +192,7 @@ $ newcase converged_divergence $ hg debugobsolete `getid A_0` `getid A_1` $ hg debugobsolete `getid A_0` `getid A_2` + invalid branchheads cache (unserved): tip differs $ mkcommit A_3 created new head $ hg debugobsolete `getid A_1` `getid A_3` @@ -434,6 +439,7 @@ $ newcase subset $ hg debugobsolete `getid A_0` `getid A_2` $ hg debugobsolete `getid A_0` `getid A_1` `getid A_2` + invalid branchheads cache (unserved): tip differs $ hg debugsuccessorssets 'desc('A_0')' 007dc284c1f8 82623d38b9ba 392fd25390da diff -r 59a9f18d4587 -r a55b06885cda tests/test-rebase-collapse.t --- a/tests/test-rebase-collapse.t Mon Jan 07 17:16:24 2013 +0100 +++ b/tests/test-rebase-collapse.t Mon Jan 07 17:23:25 2013 +0100 @@ -274,7 +274,7 @@ 7:c65502d4178782309ce0574c5ae6ee9485a9bafa default 6:c772a8b2dc17629cec88a19d09c926c4814b12c7 default - $ cat $TESTTMP/b2/.hg/cache/branchheads + $ cat $TESTTMP/b2/.hg/cache/branchheads-unserved c65502d4178782309ce0574c5ae6ee9485a9bafa 7 c772a8b2dc17629cec88a19d09c926c4814b12c7 default c65502d4178782309ce0574c5ae6ee9485a9bafa default