From patchwork Wed Oct 10 11:11:21 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [1, of, 2] streamclone: include obsstore file into stream bundle if client can read it From: Anton Shestakov X-Patchwork-Id: 35599 Message-Id: To: mercurial-devel@mercurial-scm.org Date: Wed, 10 Oct 2018 19:11:21 +0800 # HG changeset patch # User Anton Shestakov # Date 1538753237 -28800 # Fri Oct 05 23:27:17 2018 +0800 # Node ID f4183e8094c8f06ebb007b5e0b03a618f288c8d6 # Parent 7a347d362a455d84bccf34347171d89724b9c9df # EXP-Topic stream-obsmarkers streamclone: include obsstore file into stream bundle if client can read it diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py --- a/mercurial/bundle2.py +++ b/mercurial/bundle2.py @@ -1687,7 +1687,12 @@ def addpartbundlestream2(bundler, repo, # to avoid compression to consumers of the bundle. bundler.prefercompressed = False - filecount, bytecount, it = streamclone.generatev2(repo) + includeobsmarkers = False + if repo.obsstore: + remoteversions = obsmarkersversion(bundler.capabilities) + if repo.obsstore._version in remoteversions: + includeobsmarkers = True + filecount, bytecount, it = streamclone.generatev2(repo, includeobsmarkers) requirements = _formatrequirementsspec(repo.requirements) part = bundler.newpart('stream2', data=it) part.addparam('bytecount', '%d' % bytecount, mandatory=True) diff --git a/mercurial/streamclone.py b/mercurial/streamclone.py --- a/mercurial/streamclone.py +++ b/mercurial/streamclone.py @@ -531,7 +531,7 @@ def _emit2(repo, entries, totalfilesize) finally: fp.close() -def generatev2(repo): +def generatev2(repo, includeobsmarkers): """Emit content for version 2 of a streaming clone. the data stream consists the following entries: @@ -558,6 +558,9 @@ def generatev2(repo): if repo.svfs.exists(name): totalfilesize += repo.svfs.lstat(name).st_size entries.append((_srcstore, name, _filefull, None)) + if includeobsmarkers and repo.svfs.exists('obsstore'): + totalfilesize += repo.svfs.lstat('obsstore').st_size + entries.append((_srcstore, 'obsstore', _filefull, None)) for name in cacheutil.cachetocopy(repo): if repo.cachevfs.exists(name): totalfilesize += repo.cachevfs.lstat(name).st_size diff --git a/tests/test-clone-uncompressed.t b/tests/test-clone-uncompressed.t --- a/tests/test-clone-uncompressed.t +++ b/tests/test-clone-uncompressed.t @@ -514,3 +514,48 @@ stream v1 unsuitable for non-publishing #endif $ killdaemons.py + +#if stream-legacy + +With v1 of the stream protocol, changeset are always cloned as public. There's +no obsolescence markers exchange in stream v1. + +#endif +#if stream-bundle2 + +Stream repository with obsolescence +----------------------------------- + +Clone non-publishing with obsolescence + + $ cat >> $HGRCPATH << EOF + > [experimental] + > evolution=all + > EOF + + $ cd server + $ echo foo > foo + $ hg -q commit -m 'about to be pruned' + $ hg debugobsolete `hg log -r . -T '{node}'` -d '0 0' -u test --record-parents + obsoleted 1 changesets + $ hg up null -q + $ hg log -T '{rev}: {phase}\n' + 1: draft + 0: draft + $ hg serve -p $HGPORT -d --pid-file=hg.pid + $ cat hg.pid > $DAEMON_PIDS + $ cd .. + + $ hg clone -U --stream http://localhost:$HGPORT with-obsolescence + streaming all changes + 1035 files to transfer, 97.1 KB of data + transferred 97.1 KB in * seconds (* */sec) (glob) + $ hg -R with-obsolescence log -T '{rev}: {phase}\n' + 1: draft + 0: draft + $ hg debugobsolete -R with-obsolescence + 50382b884f66690b7045cac93a540cba4d4c906f 0 {c17445101a72edac06facd130d14808dfbd5c7c2} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} + + $ killdaemons.py + +#endif