diff --git a/.hgsigs b/.hgsigs --- a/.hgsigs +++ b/.hgsigs @@ -219,3 +219,4 @@ 86a60679cf619e14cee9442f865fcf31b142cb9f 750920b18aaaddd654756be40dec59d90f2643be 0 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 diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -232,3 +232,4 @@ 86a60679cf619e14cee9442f865fcf31b142cb9f 750920b18aaaddd654756be40dec59d90f2643be 5.9.2 6ee0244fc1cf889ae543d2ce0ec45201ae0be6e1 5.9.3 a44bb185f6bdbecc754996d8386722e2f0123b0a 6.0rc0 +5d08b289e2e526259d7d5ea32b70fe76d5b327d7 6.0 diff --git a/contrib/packaging/dockerrpm b/contrib/packaging/dockerrpm --- a/contrib/packaging/dockerrpm +++ b/contrib/packaging/dockerrpm @@ -18,13 +18,8 @@ DOCKER=$($BUILDDIR/hg-docker docker-path CONTAINER=hg-docker-$PLATFORM -if [[ -z "${HG_DOCKER_OWN_USER}" ]]; then - DOCKERUID=1000 - DOCKERGID=1000 -else - DOCKERUID=$(id -u) - DOCKERGID=$(id -g) -fi +DOCKERUID=$(id -u) +DOCKERGID=$(id -g) $BUILDDIR/hg-docker build \ --build-arg UID=$DOCKERUID \ diff --git a/contrib/packaging/mercurial.spec b/contrib/packaging/mercurial.spec --- a/contrib/packaging/mercurial.spec +++ b/contrib/packaging/mercurial.spec @@ -27,6 +27,7 @@ Name: mercurial Version: snapshot Release: 0 License: GPLv2+ +Prefix: / Group: Development/Tools URL: https://mercurial-scm.org/ Source0: %{name}-%{version}-%{release}.tar.gz diff --git a/hgext/fsmonitor/__init__.py b/hgext/fsmonitor/__init__.py --- a/hgext/fsmonitor/__init__.py +++ b/hgext/fsmonitor/__init__.py @@ -336,7 +336,7 @@ def overridewalk(orig, self, match, subr nonnormalset = { f for f, e in self._map.items() - if e.v1_state() != "n" or e.v1_mtime() == -1 + if e.v1_state() != b"n" or e.v1_mtime() == -1 } copymap = self._map.copymap diff --git a/hgext/fsmonitor/pywatchman/bser.c b/hgext/fsmonitor/pywatchman/bser.c --- a/hgext/fsmonitor/pywatchman/bser.c +++ b/hgext/fsmonitor/pywatchman/bser.c @@ -28,6 +28,7 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWI OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#define PY_SSIZE_T_CLEAN #include #include #ifdef _MSC_VER @@ -1052,7 +1053,7 @@ static int pdu_info_helper( int64_t* total_len_out) { const char* start = NULL; const char* data = NULL; - int datalen = 0; + Py_ssize_t datalen = 0; const char* end; int64_t expected_len; off_t position; @@ -1101,7 +1102,7 @@ static PyObject* bser_pdu_len(PyObject* static PyObject* bser_loads(PyObject* self, PyObject* args, PyObject* kw) { const char* data = NULL; - int datalen = 0; + Py_ssize_t datalen = 0; const char* start; const char* end; int64_t expected_len; diff --git a/mercurial/cext/pathencode.c b/mercurial/cext/pathencode.c --- a/mercurial/cext/pathencode.c +++ b/mercurial/cext/pathencode.c @@ -176,7 +176,7 @@ PyObject *encodedir(PyObject *self, PyOb if (newobj) { assert(PyBytes_Check(newobj)); - Py_SIZE(newobj)--; + Py_SET_SIZE(newobj, Py_SIZE(newobj) - 1); _encodedir(PyBytes_AS_STRING(newobj), newlen, path, len + 1); } @@ -791,7 +791,7 @@ PyObject *pathencode(PyObject *self, PyO if (newobj) { assert(PyBytes_Check(newobj)); - Py_SIZE(newobj)--; + Py_SET_SIZE(newobj, Py_SIZE(newobj) - 1); basicencode(PyBytes_AS_STRING(newobj), newlen, path, len + 1); } diff --git a/mercurial/revlogutils/nodemap.py b/mercurial/revlogutils/nodemap.py --- a/mercurial/revlogutils/nodemap.py +++ b/mercurial/revlogutils/nodemap.py @@ -147,7 +147,7 @@ def delete_nodemap(tr, repo, revlog): if revlog._nodemap_file is None: msg = "calling persist nodemap on a revlog without the feature enabled" raise error.ProgrammingError(msg) - repo.svfs.unlink(revlog._nodemap_file) + repo.svfs.tryunlink(revlog._nodemap_file) def persist_nodemap(tr, revlog, pending=False, force=False): diff --git a/mercurial/upgrade_utils/actions.py b/mercurial/upgrade_utils/actions.py --- a/mercurial/upgrade_utils/actions.py +++ b/mercurial/upgrade_utils/actions.py @@ -94,6 +94,9 @@ class improvement(object): # Whether this improvement changes repository requirements touches_requirements = True + # Whether this improvement changes working copy requirements + touches_wc_requirements = True + # Whether this improvement touches the dirstate touches_dirstate = False @@ -188,7 +191,8 @@ class dirstatev2(requirementformatvarian touches_filelogs = False touches_manifests = False touches_changelog = False - touches_requirements = True + touches_requirements = False + touches_wc_requirements = True touches_dirstate = True @@ -719,10 +723,24 @@ class UpgradeOperation(object): return set([a.name for a in self.upgrade_actions]) @property + def wc_requirements_only(self): + # does the operation only touches repository requirement + return ( + self.touches_wc_requirements + and not self.touches_requirements + and not self.touches_filelogs + and not self.touches_manifests + and not self.touches_changelog + and not self.touches_dirstate + ) + + @property def requirements_only(self): # does the operation only touches repository requirement return ( - self.touches_requirements + (self.touches_requirements + or self.touches_wc_requirements + ) and not self.touches_filelogs and not self.touches_manifests and not self.touches_changelog @@ -769,6 +787,19 @@ class UpgradeOperation(object): return False @property + def touches_wc_requirements(self): + for a in self.upgrade_actions: + # optimisations are used to re-process revlogs and does not result + # in a requirement being added or removed + if a.type == OPTIMISATION: + pass + elif a.touches_wc_requirements: + return True + for a in self.removed_actions: + if a.touches_wc_requirements: + return True + + @property def touches_requirements(self): for a in self.upgrade_actions: # optimisations are used to re-process revlogs and does not result diff --git a/mercurial/upgrade_utils/engine.py b/mercurial/upgrade_utils/engine.py --- a/mercurial/upgrade_utils/engine.py +++ b/mercurial/upgrade_utils/engine.py @@ -7,6 +7,7 @@ from __future__ import absolute_import +import errno import stat from ..i18n import _ @@ -633,16 +634,29 @@ def upgrade_dirstate(ui, srcrepo, upgrad util.copyfile( srcrepo.vfs.join(b'requires'), backupvfs.join(b'requires') ) - util.copyfile( - srcrepo.vfs.join(b'dirstate'), backupvfs.join(b'dirstate') - ) + try: + util.copyfile( + srcrepo.vfs.join(b'dirstate'), backupvfs.join(b'dirstate') + ) + except (IOError, OSError) as e: + # The dirstate does not exist on an empty repo or a repo with no + # revision checked out + if e.errno != errno.ENOENT: + raise assert srcrepo.dirstate._use_dirstate_v2 == (old == b'v2') srcrepo.dirstate._map.preload() srcrepo.dirstate._use_dirstate_v2 = new == b'v2' srcrepo.dirstate._map._use_dirstate_v2 = srcrepo.dirstate._use_dirstate_v2 srcrepo.dirstate._dirty = True - srcrepo.vfs.unlink(b'dirstate') + try: + srcrepo.vfs.unlink(b'dirstate') + except (IOError, OSError) as e: + # The dirstate does not exist on an empty repo or a repo with no + # revision checked out + if e.errno != errno.ENOENT: + raise + srcrepo.dirstate.write(None) scmutil.writereporequirements(srcrepo, upgrade_op.new_requirements) diff --git a/tests/test-fix.t b/tests/test-fix.t --- a/tests/test-fix.t +++ b/tests/test-fix.t @@ -1795,10 +1795,10 @@ fixed. > --config "fix.log:pattern=glob:**.log" $ cat $LOGFILE | sort | uniq -c - 4 bar.log - 4 baz.log - 3 foo.log - 2 qux.log + \s*4 bar.log (re) + \s*4 baz.log (re) + \s*3 foo.log (re) + \s*2 qux.log (re) $ cd .. diff --git a/tests/test-upgrade-repo.t b/tests/test-upgrade-repo.t --- a/tests/test-upgrade-repo.t +++ b/tests/test-upgrade-repo.t @@ -1634,30 +1634,24 @@ Demonstrate that nothing to perform upgr $ hg debugupgraderepo --run nothing to do -#if rust +#if no-rust + + $ cat << EOF >> $HGRCPATH + > [storage] + > dirstate-v2.slow-path = allow + > EOF + +#endif Upgrade to dirstate-v2 - $ hg debugformat -v --config format.exp-rc-dirstate-v2=1 - format-variant repo config default - fncache: yes yes yes + $ hg debugformat -v --config format.exp-rc-dirstate-v2=1 | grep dirstate-v2 dirstate-v2: no yes no - dotencode: yes yes yes - generaldelta: yes yes yes - share-safe: no no no - sparserevlog: yes yes yes - persistent-nodemap: yes yes no - copies-sdc: no no no - revlog-v2: yes yes no - changelog-v2: no no no - plain-cl-delta: yes yes yes - compression: zstd zstd zstd - compression-level: default default default $ hg debugupgraderepo --config format.exp-rc-dirstate-v2=1 --run upgrade will perform the following actions: requirements - preserved: dotencode, exp-revlogv2.2, fncache, generaldelta, persistent-nodemap, revlog-compression-zstd, sparserevlog, store + preserved: * (glob) added: dirstate-v2 dirstate-v2 @@ -1677,23 +1671,10 @@ Upgrade to dirstate-v2 removing temporary repository $TESTTMP/sparserevlogrepo/.hg/upgrade.* (glob) $ ls .hg/upgradebackup.*/dirstate .hg/upgradebackup.*/dirstate (glob) - $ hg debugformat -v - format-variant repo config default - fncache: yes yes yes + $ hg debugformat -v | grep dirstate-v2 dirstate-v2: yes no no - dotencode: yes yes yes - generaldelta: yes yes yes - share-safe: no no no - sparserevlog: yes yes yes - persistent-nodemap: yes yes no - copies-sdc: no no no - revlog-v2: yes yes no - changelog-v2: no no no - plain-cl-delta: yes yes yes - compression: zstd zstd zstd - compression-level: default default default $ hg status - $ dd status=none bs=12 count=1 if=.hg/dirstate + $ dd bs=12 count=1 if=.hg/dirstate 2> /dev/null dirstate-v2 Downgrade from dirstate-v2 @@ -1702,7 +1683,7 @@ Downgrade from dirstate-v2 upgrade will perform the following actions: requirements - preserved: dotencode, exp-revlogv2.2, fncache, generaldelta, persistent-nodemap, revlog-compression-zstd, sparserevlog, store + preserved: * (glob) removed: dirstate-v2 processed revlogs: @@ -1717,21 +1698,69 @@ Downgrade from dirstate-v2 downgrading from dirstate-v2 to v1 replaced files will be backed up at $TESTTMP/sparserevlogrepo/.hg/upgradebackup.* (glob) removing temporary repository $TESTTMP/sparserevlogrepo/.hg/upgrade.* (glob) - $ hg debugformat -v - format-variant repo config default - fncache: yes yes yes + $ hg debugformat -v | grep dirstate-v2 dirstate-v2: no no no - dotencode: yes yes yes - generaldelta: yes yes yes - share-safe: no no no - sparserevlog: yes yes yes - persistent-nodemap: yes yes no - copies-sdc: no no no - revlog-v2: yes yes no - changelog-v2: no no no - plain-cl-delta: yes yes yes - compression: zstd zstd zstd - compression-level: default default default $ hg status -#endif + $ cd .. + +dirstate-v2: upgrade and downgrade from and empty repository: +------------------------------------------------------------- + + $ hg init --config format.exp-rc-dirstate-v2=no dirstate-v2-empty + $ cd dirstate-v2-empty + $ hg debugformat | grep dirstate-v2 + dirstate-v2: no + +upgrade + + $ hg debugupgraderepo --run --config format.exp-rc-dirstate-v2=yes + upgrade will perform the following actions: + + requirements + preserved: * (glob) + added: dirstate-v2 + + dirstate-v2 + "hg status" will be faster + + processed revlogs: + - all-filelogs + - changelog + - manifest + + beginning upgrade... + repository locked and read-only + creating temporary repository to stage upgraded data: $TESTTMP/dirstate-v2-empty/.hg/upgrade.* (glob) + (it is safe to interrupt this process any time before data migration completes) + upgrading to dirstate-v2 from v1 + replaced files will be backed up at $TESTTMP/dirstate-v2-empty/.hg/upgradebackup.* (glob) + removing temporary repository $TESTTMP/dirstate-v2-empty/.hg/upgrade.* (glob) + $ hg debugformat | grep dirstate-v2 + dirstate-v2: yes + +downgrade + + $ hg debugupgraderepo --run --config format.exp-rc-dirstate-v2=no + upgrade will perform the following actions: + + requirements + preserved: * (glob) + removed: dirstate-v2 + + processed revlogs: + - all-filelogs + - changelog + - manifest + + beginning upgrade... + repository locked and read-only + creating temporary repository to stage upgraded data: $TESTTMP/dirstate-v2-empty/.hg/upgrade.* (glob) + (it is safe to interrupt this process any time before data migration completes) + downgrading from dirstate-v2 to v1 + replaced files will be backed up at $TESTTMP/dirstate-v2-empty/.hg/upgradebackup.* (glob) + removing temporary repository $TESTTMP/dirstate-v2-empty/.hg/upgrade.* (glob) + $ hg debugformat | grep dirstate-v2 + dirstate-v2: no + + $ cd ..