Submitter | Siddharth Agarwal |
---|---|
Date | Aug. 21, 2014, 11:14 p.m. |
Message ID | <6d32371f9e61e51be2ea.1408662894@devbig136.prn2.facebook.com> |
Download | mbox | patch |
Permalink | /patch/5550/ |
State | Superseded |
Commit | 4bc1fd86e915d15c9bcef04f9f29bd92915a85ef |
Headers | show |
Comments
On Thu, Aug 21, 2014 at 04:14:54PM -0700, Siddharth Agarwal wrote: > # HG changeset patch > # User Siddharth Agarwal <sid0@fb.com> > # Date 1408662329 25200 > # Thu Aug 21 16:05:29 2014 -0700 > # Node ID 6d32371f9e61e51be2eaea1319dc0abb8066cfba > # Parent bca131b8416bef570f2d72e50100e26d451a691c > clone: for local clones, copy over filtered branchcaches as well (issue4286) queued, thanks > > Local clones copy/hardlink over files directly, so the branchcaches should all > be valid. There's a slight chance that a read operation would update one of the > branchcaches, but we hold a lock over the source repo so they shouldn't cause > an invalid branchcache to be copied over, just a different, valid one. > > diff --git a/mercurial/hg.py b/mercurial/hg.py > --- a/mercurial/hg.py > +++ b/mercurial/hg.py > @@ -11,7 +11,7 @@ > from node import hex, nullid > import localrepo, bundlerepo, unionrepo, httppeer, sshpeer, statichttprepo > import bookmarks, lock, util, extensions, error, node, scmutil, phases, url > -import cmdutil, discovery > +import cmdutil, discovery, repoview > import merge as mergemod > import verify as verifymod > import errno, os, shutil > @@ -366,13 +366,20 @@ > > # Recomputing branch cache might be slow on big repos, > # so just copy it > + def copybranchcache(fname): > + srcbranchcache = srcrepo.join('cache/%s' % fname) > + dstbranchcache = os.path.join(dstcachedir, fname) > + if os.path.exists(srcbranchcache): > + if not os.path.exists(dstcachedir): > + os.mkdir(dstcachedir) > + util.copyfile(srcbranchcache, dstbranchcache) > + > dstcachedir = os.path.join(destpath, 'cache') > - srcbranchcache = srcrepo.join('cache/branch2') > - dstbranchcache = os.path.join(dstcachedir, 'branch2') > - if os.path.exists(srcbranchcache): > - if not os.path.exists(dstcachedir): > - os.mkdir(dstcachedir) > - util.copyfile(srcbranchcache, dstbranchcache) > + # In local clones we're copying all nodes, not just served > + # ones. Therefore copy all branchcaches over. > + copybranchcache('branch2') > + for cachename in repoview.filtertable: > + copybranchcache('branch2-%s' % cachename) > > # we need to re-init the repo after manually copying the data > # into it > diff --git a/tests/test-clone.t b/tests/test-clone.t > --- a/tests/test-clone.t > +++ b/tests/test-clone.t > @@ -25,12 +25,25 @@ > .hg/store/data/b.d > .hg/store/data/b.i > > +Trigger branchcache creation: > + > + $ hg branches > + default 10:a7949464abda > + $ ls .hg/cache > + branch2-served > + > Default operation: > > $ hg clone . ../b > updating to branch default > 2 files updated, 0 files merged, 0 files removed, 0 files unresolved > $ cd ../b > + > +Ensure branchcache got copied over: > + > + $ ls .hg/cache > + branch2-served > + > $ cat a > a > $ hg verify > @@ -58,6 +71,12 @@ > listing keys for "bookmarks" > #endif > $ cd ../c > + > +Ensure branchcache got copied over: > + > + $ ls .hg/cache > + branch2-served > + > $ cat a 2>/dev/null || echo "a not present" > a not present > $ hg verify > _______________________________________________ > Mercurial-devel mailing list > Mercurial-devel@selenic.com > http://selenic.com/mailman/listinfo/mercurial-devel
Patch
diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -11,7 +11,7 @@ from node import hex, nullid import localrepo, bundlerepo, unionrepo, httppeer, sshpeer, statichttprepo import bookmarks, lock, util, extensions, error, node, scmutil, phases, url -import cmdutil, discovery +import cmdutil, discovery, repoview import merge as mergemod import verify as verifymod import errno, os, shutil @@ -366,13 +366,20 @@ # Recomputing branch cache might be slow on big repos, # so just copy it + def copybranchcache(fname): + srcbranchcache = srcrepo.join('cache/%s' % fname) + dstbranchcache = os.path.join(dstcachedir, fname) + if os.path.exists(srcbranchcache): + if not os.path.exists(dstcachedir): + os.mkdir(dstcachedir) + util.copyfile(srcbranchcache, dstbranchcache) + dstcachedir = os.path.join(destpath, 'cache') - srcbranchcache = srcrepo.join('cache/branch2') - dstbranchcache = os.path.join(dstcachedir, 'branch2') - if os.path.exists(srcbranchcache): - if not os.path.exists(dstcachedir): - os.mkdir(dstcachedir) - util.copyfile(srcbranchcache, dstbranchcache) + # In local clones we're copying all nodes, not just served + # ones. Therefore copy all branchcaches over. + copybranchcache('branch2') + for cachename in repoview.filtertable: + copybranchcache('branch2-%s' % cachename) # we need to re-init the repo after manually copying the data # into it diff --git a/tests/test-clone.t b/tests/test-clone.t --- a/tests/test-clone.t +++ b/tests/test-clone.t @@ -25,12 +25,25 @@ .hg/store/data/b.d .hg/store/data/b.i +Trigger branchcache creation: + + $ hg branches + default 10:a7949464abda + $ ls .hg/cache + branch2-served + Default operation: $ hg clone . ../b updating to branch default 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cd ../b + +Ensure branchcache got copied over: + + $ ls .hg/cache + branch2-served + $ cat a a $ hg verify @@ -58,6 +71,12 @@ listing keys for "bookmarks" #endif $ cd ../c + +Ensure branchcache got copied over: + + $ ls .hg/cache + branch2-served + $ cat a 2>/dev/null || echo "a not present" a not present $ hg verify