# HG changeset patch # User Anton Shestakov # Date 1696439080 10800 # Node ID 279c01842ecab361dad30e0589ddbc2f3306d25e # Parent 50f55918b417f25088a535cc057f78c2d9e430b6 serverminitopic: remove this extension, please use regular topic extension With the introduction of topic namespaces, it seems no longer viable to add features and cover them by tests in multiple extensions (i.e. both topic and serverminitopic). We suggest users switch to the regular evolve and topic extensions on the server side. diff -r 50f55918b417 -r 279c01842eca hgext3rd/serverminitopic.py --- a/hgext3rd/serverminitopic.py Tue Sep 12 11:45:49 2023 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,261 +0,0 @@ -"""enable a minimal verison of topic for server (DEPRECATED) - -! This extensions is not actively maintained -! We recommand using the main topic extension instead - -Non publishing repository will see topic as "branch:topic" in the branch field. - -In addition to adding the extensions, the feature must be manually enabled in the config: - - [experimental] - server-mini-topic = yes -""" -import hashlib -import contextlib - -from mercurial import ( - branchmap, - context, - encoding, - extensions, - node, - registrar, - util, -) - -from mercurial import wireprotov1server - -if util.safehasattr(registrar, 'configitem'): - - configtable = {} - configitem = registrar.configitem(configtable) - configitem(b'experimental', b'server-mini-topic', - default=False, - ) - -# nodemap.get and index.[has_node|rev|get_rev] -# hg <= 5.2 (02802fa87b74) -def getgetrev(cl): - """Returns index.get_rev or nodemap.get (for pre-5.3 Mercurial).""" - if util.safehasattr(cl.index, 'get_rev'): - return cl.index.get_rev - return cl.nodemap.get - -# hg <= 5.4 (e2d17974a869) -def nonpublicphaseroots(repo): - if util.safehasattr(repo._phasecache, 'nonpublicphaseroots'): - return repo._phasecache.nonpublicphaseroots(repo) - return set().union( - *[roots for roots in repo._phasecache.phaseroots[1:] if roots] - ) - -def hasminitopic(repo): - """true if minitopic is enabled on the repository - - (The value is cached on the repository) - """ - enabled = getattr(repo, '_hasminitopic', None) - if enabled is None: - enabled = (repo.ui.configbool(b'experimental', b'server-mini-topic') - and not repo.publishing()) - repo._hasminitopic = enabled - return enabled - -### make topic visible though "ctx.branch()" - -def topicbranch(orig, self): - branch = orig(self) - if hasminitopic(self._repo) and self.phase(): - topic = self._changeset.extra.get(b'topic') - if topic is not None: - topic = encoding.tolocal(topic) - branch = b'%s:%s' % (branch, topic) - return branch - -### avoid caching topic data in rev-branch-cache - -class revbranchcacheoverlay(object): - """revbranch mixin that don't use the cache for non public changeset""" - - def _init__(self, *args, **kwargs): - super(revbranchcacheoverlay, self).__init__(*args, **kwargs) - if r'branchinfo' in vars(self): - del self.branchinfo - - def branchinfo(self, rev, changelog=None): - """return branch name and close flag for rev, using and updating - persistent cache.""" - phase = self._repo._phasecache.phase(self._repo, rev) - if phase: - ctx = self._repo[rev] - return ctx.branch(), ctx.closesbranch() - return super(revbranchcacheoverlay, self).branchinfo(rev) - -def reposetup(ui, repo): - """install a repo class with a special revbranchcache""" - - if hasminitopic(repo): - repo = repo.unfiltered() - - class minitopicrepo(repo.__class__): - """repository subclass that install the modified cache""" - - def revbranchcache(self): - if self._revbranchcache is None: - cache = super(minitopicrepo, self).revbranchcache() - - class topicawarerbc(revbranchcacheoverlay, cache.__class__): - pass - cache.__class__ = topicawarerbc - if r'branchinfo' in vars(cache): - del cache.branchinfo - self._revbranchcache = cache - return self._revbranchcache - - repo.__class__ = minitopicrepo - -### topic aware branch head cache - -def _phaseshash(repo, maxrev): - """uniq ID for a phase matching a set of rev""" - revs = set() - cl = repo.changelog - fr = cl.filteredrevs - getrev = getgetrev(cl) - for n in nonpublicphaseroots(repo): - r = getrev(n) - if r not in fr and r < maxrev: - revs.add(r) - key = node.nullid - revs = sorted(revs) - if revs: - s = hashlib.sha1() - for rev in revs: - s.update(b'%d;' % rev) - key = s.digest() - return key - -# needed to prevent reference used for 'super()' call using in branchmap.py to -# no go into cycle. (yes, URG) -_oldbranchmap = branchmap.branchcache - -@contextlib.contextmanager -def oldbranchmap(): - previous = branchmap.branchcache - try: - branchmap.branchcache = _oldbranchmap - yield - finally: - branchmap.branchcache = previous - -_publiconly = set([ - b'base', - b'immutable', -]) - -def mighttopic(repo): - return hasminitopic(repo) and repo.filtername not in _publiconly - -class _topiccache(branchmap.branchcache): # combine me with branchmap.branchcache - @classmethod - def fromfile(cls, repo): - orig = super(_topiccache, cls).fromfile - return wrapread(orig, repo) - - def __init__(self, *args, **kwargs): - # super() call may fail otherwise - with oldbranchmap(): - super(_topiccache, self).__init__(*args, **kwargs) - self.phaseshash = None - - def copy(self): - """return an deep copy of the branchcache object""" - if util.safehasattr(self, '_entries'): - _entries = self._entries - else: - # hg <= 4.9 (624d6683c705+b137a6793c51) - _entries = self - args = (_entries, self.tipnode, self.tiprev, self.filteredhash, - self._closednodes) - if util.safehasattr(self, '_repo'): - # hg <= 5.7 (6266d19556ad) - args = (self._repo,) + args - new = self.__class__(*args) - new.phaseshash = self.phaseshash - return new - - def validfor(self, repo): - """Is the cache content valid regarding a repo - - - False when cached tipnode is unknown or if we detect a strip. - - True when cache is up to date or a subset of current repo.""" - valid = super(_topiccache, self).validfor(repo) - if not valid: - return False - elif self.phaseshash is None: - # phasehash at None means this is a branchmap - # coming from a public only set - return True - else: - try: - valid = self.phaseshash == _phaseshash(repo, self.tiprev) - return valid - except IndexError: - return False - - def write(self, repo): - # we expect (hope) mutable set to be small enough to be that computing - # it all the time will be fast enough - if not mighttopic(repo): - super(_topiccache, self).write(repo) - - def update(self, repo, revgen): - """Given a branchhead cache, self, that may have extra nodes or be - missing heads, and a generator of nodes that are strictly a superset of - heads missing, this function updates self to be correct. - """ - super(_topiccache, self).update(repo, revgen) - if mighttopic(repo): - self.phaseshash = _phaseshash(repo, self.tiprev) - -def wrapread(orig, repo): - # Avoiding to write cache for filter where topic applies is a good step, - # but we need to also avoid reading it. Existing branchmap cache might - # exists before the turned the feature on. - if mighttopic(repo): - return None - return orig(repo) - -# advertise topic capabilities - -def wireprotocaps(orig, repo, proto): - caps = orig(repo, proto) - if hasminitopic(repo): - caps.append(b'topics') - return caps - -# wrap the necessary bit - -def wrapclass(container, oldname, new): - old = getattr(container, oldname) - if not issubclass(old, new): - targetclass = new - # check if someone else already wrapped the class and handle that - if not issubclass(new, old): - class targetclass(new, old): - pass - setattr(container, oldname, targetclass) - current = getattr(container, oldname) - assert issubclass(current, new), (current, new, targetclass) - -def uisetup(ui): - wrapclass(branchmap, 'branchcache', _topiccache) - try: - # hg <= 4.9 (3461814417f3) - extensions.wrapfunction(branchmap, 'read', wrapread) - except AttributeError: - # Mercurial 5.0; branchcache.fromfile now takes care of this - # which is alredy defined on _topiccache - pass - extensions.wrapfunction(wireprotov1server, '_capabilities', wireprotocaps) - extensions.wrapfunction(context.changectx, 'branch', topicbranch) diff -r 50f55918b417 -r 279c01842eca setup.py --- a/setup.py Tue Sep 12 11:45:49 2023 -0400 +++ b/setup.py Wed Oct 04 14:04:40 2023 -0300 @@ -18,9 +18,6 @@ '''Read version info from a file without importing it''' return get_metadata()['minimumhgversion'] -py_modules = [ - 'hgext3rd.serverminitopic', -] py_packages = [ 'hgext3rd', 'hgext3rd.evolve', @@ -45,7 +42,6 @@ long_description=open(join(dirname(__file__), 'README.rst')).read(), keywords='hg mercurial', license='GPLv2+', - py_modules=py_modules, packages=py_packages, package_dir=py_packagedir, python_requires=py_versions diff -r 50f55918b417 -r 279c01842eca tests/test-check-sdist.t --- a/tests/test-check-sdist.t Tue Sep 12 11:45:49 2023 -0400 +++ b/tests/test-check-sdist.t Wed Oct 04 14:04:40 2023 -0300 @@ -37,7 +37,7 @@ $ egrep '^tests/test-.*\.(t|py)$' files > test-files $ egrep -v '^tests/test-.*\.(t|py)$' files > other-files $ wc -l other-files - 150 other-files + 149 other-files $ wc -l test-files ??? test-files (glob) $ fgrep debian files diff -r 50f55918b417 -r 279c01842eca tests/test-check-tag.t --- a/tests/test-check-tag.t Tue Sep 12 11:45:49 2023 -0400 +++ b/tests/test-check-tag.t Wed Oct 04 14:04:40 2023 -0300 @@ -23,7 +23,6 @@ > fi > # Here we skip: > # - pullbundle because it usually has no changes (so no version bump) - > # - serverminitopic because it's not actively maintained > if hg grep --rev $node '^__version__ = .*\.dev' hgext3rd/evolve/ hgext3rd/topic/; then > echo "Versions should not end with .dev at tagged revision $node" > fi diff -r 50f55918b417 -r 279c01842eca tests/test-minitopic.t --- a/tests/test-minitopic.t Tue Sep 12 11:45:49 2023 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,240 +0,0 @@ - $ . $TESTDIR/testlib/common.sh - -setup - $ cat >> $HGRCPATH << EOF - > [extensions] - > share= - > blackbox= - > [web] - > allow_push = * - > push_ssl = no - > [phases] - > publish = False - > [paths] - > enabled = http://localhost:$HGPORT/ - > disabled = http://localhost:$HGPORT2/ - > EOF - - $ hg init ./server-enabled - $ cat >> server-enabled/.hg/hgrc << EOF - > [extensions] - > serverminitopic= - > [experimental] - > server-mini-topic = yes - > EOF - - $ hg share ./server-enabled ./server-disabled - updating working directory - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - $ cat >> server-disabled/.hg/hgrc << EOF - > [extensions] - > serverminitopic= - > [experimental] - > server-mini-topic = no - > EOF - - $ hg init client-disabled - $ hg init client-enabled - $ cat >> client-enabled/.hg/hgrc << EOF - > [extensions] - > topic= - > EOF - - $ hg serve -R server-enabled -p $HGPORT -d --pid-file hg1.pid --errorlog hg1.error - $ cat hg1.pid > $DAEMON_PIDS - $ hg serve -R server-disabled -p $HGPORT2 -d --pid-file hg2.pid --errorlog hg2.error - $ cat hg2.pid >> $DAEMON_PIDS - - $ hg debugdownload http://localhost:$HGPORT/?cmd=capabilities | grep -o topics - topics - $ hg debugdownload http://localhost:$HGPORT2/?cmd=capabilities | grep -o topics - [1] - -Pushing first changesets to the servers --------------------------------------- - - $ cd client-enabled - $ mkcommit c_A0 - $ hg push enabled - pushing to http://localhost:$HGPORT/ - searching for changes - remote: adding changesets - remote: adding manifests - remote: adding file changes - remote: added 1 changesets with 1 changes to 1 files - $ mkcommit c_B0 - $ hg push disabled - pushing to http://localhost:$HGPORT2/ - searching for changes - remote: adding changesets - remote: adding manifests - remote: adding file changes - remote: added 1 changesets with 1 changes to 1 files - - $ cat $TESTTMP/hg1.error - $ cat $TESTTMP/hg2.error - -Pushing new head ----------------- - - $ hg up 'desc("c_A0")' - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ mkcommit c_C0 - created new head - (consider using topic for lightweight branches. See 'hg help topic') - $ hg push enabled - pushing to http://localhost:$HGPORT/ - searching for changes - abort: push creates new remote head 22c9514ed811 - (merge or see 'hg help push' for details about pushing new heads) - [20] - $ hg push disabled - pushing to http://localhost:$HGPORT2/ - searching for changes - abort: push creates new remote head 22c9514ed811 - (merge or see 'hg help push' for details about pushing new heads) - [20] - - $ hg debugdownload http://localhost:$HGPORT/?cmd=branchmap | sort - default 0ab6d544d0efd629fda056601cfe95e73d1af210 - $ hg debugdownload http://localhost:$HGPORT2/?cmd=branchmap | sort - default 0ab6d544d0efd629fda056601cfe95e73d1af210 - $ cat $TESTTMP/hg1.error - $ cat $TESTTMP/hg2.error - -Pushing new topic ------------------ - - $ hg merge - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - (branch merge, don't forget to commit) - $ mkcommit c_D0 - $ hg log -G - @ changeset: 3:9c660cf97499 - |\ tag: tip - | | parent: 2:22c9514ed811 - | | parent: 1:0ab6d544d0ef - | | user: test - | | date: Thu Jan 01 00:00:00 1970 +0000 - | | summary: c_D0 - | | - | o changeset: 2:22c9514ed811 - | | parent: 0:14faebcf9752 - | | user: test - | | date: Thu Jan 01 00:00:00 1970 +0000 - | | summary: c_C0 - | | - o | changeset: 1:0ab6d544d0ef - |/ user: test - | date: Thu Jan 01 00:00:00 1970 +0000 - | summary: c_B0 - | - o changeset: 0:14faebcf9752 - user: test - date: Thu Jan 01 00:00:00 1970 +0000 - summary: c_A0 - - $ hg push enabled - pushing to http://localhost:$HGPORT/ - searching for changes - remote: adding changesets - remote: adding manifests - remote: adding file changes - remote: added 2 changesets with 2 changes to 2 files - $ hg up 'desc("c_C0")' - 0 files updated, 0 files merged, 2 files removed, 0 files unresolved - $ hg topic topic_A - marked working directory as topic: topic_A - $ mkcommit c_E0 - active topic 'topic_A' grew its first changeset - (see 'hg help topics' for more information) - $ hg push disabled - pushing to http://localhost:$HGPORT2/ - searching for changes - abort: push creates new remote head f31af349535e - (merge or see 'hg help push' for details about pushing new heads) - [20] - $ hg push enabled - pushing to http://localhost:$HGPORT/ - searching for changes - remote: adding changesets - remote: adding manifests - remote: adding file changes - remote: added 1 changesets with 1 changes to 1 files (+1 heads) - - $ hg debugdownload http://localhost:$HGPORT/?cmd=branchmap | sort - default 9c660cf97499ae01ccb6894880455c6ffa4b19cf - default%3Atopic_A f31af349535e413b6023f11b51a6afccf4139180 - $ hg debugdownload http://localhost:$HGPORT2/?cmd=branchmap | sort - default 9c660cf97499ae01ccb6894880455c6ffa4b19cf f31af349535e413b6023f11b51a6afccf4139180 - $ cat $TESTTMP/hg1.error - $ cat $TESTTMP/hg2.error - -Pushing new head to a topic ---------------------------- - - $ hg up 'desc("c_D0")' - 2 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ hg topic topic_A - marked working directory as topic: topic_A - $ mkcommit c_F0 - $ hg log -G - @ changeset: 5:82c5842e0472 - | tag: tip - | topic: topic_A - | parent: 3:9c660cf97499 - | user: test - | date: Thu Jan 01 00:00:00 1970 +0000 - | summary: c_F0 - | - | o changeset: 4:f31af349535e - | | topic: topic_A - | | parent: 2:22c9514ed811 - | | user: test - | | date: Thu Jan 01 00:00:00 1970 +0000 - | | summary: c_E0 - | | - o | changeset: 3:9c660cf97499 - |\| parent: 2:22c9514ed811 - | | parent: 1:0ab6d544d0ef - | | user: test - | | date: Thu Jan 01 00:00:00 1970 +0000 - | | summary: c_D0 - | | - | o changeset: 2:22c9514ed811 - | | parent: 0:14faebcf9752 - | | user: test - | | date: Thu Jan 01 00:00:00 1970 +0000 - | | summary: c_C0 - | | - o | changeset: 1:0ab6d544d0ef - |/ user: test - | date: Thu Jan 01 00:00:00 1970 +0000 - | summary: c_B0 - | - o changeset: 0:14faebcf9752 - user: test - date: Thu Jan 01 00:00:00 1970 +0000 - summary: c_A0 - - $ hg push enabled - pushing to http://localhost:$HGPORT/ - searching for changes - abort: push creates new remote head 82c5842e0472 on branch 'default//topic_A' - (merge or see 'hg help push' for details about pushing new heads) - [20] - $ hg push disabled - pushing to http://localhost:$HGPORT2/ - searching for changes - remote: adding changesets - remote: adding manifests - remote: adding file changes - remote: added 1 changesets with 1 changes to 1 files - - $ hg debugdownload http://localhost:$HGPORT/?cmd=branchmap | sort - default 9c660cf97499ae01ccb6894880455c6ffa4b19cf - default%3Atopic_A f31af349535e413b6023f11b51a6afccf4139180 82c5842e047215160763f81ae93ae42c65b20a63 - $ hg debugdownload http://localhost:$HGPORT2/?cmd=branchmap | sort - default f31af349535e413b6023f11b51a6afccf4139180 82c5842e047215160763f81ae93ae42c65b20a63 - $ cat $TESTTMP/hg1.error - $ cat $TESTTMP/hg2.error