--- a/hgext/infinitepush/store.py Thu Jul 30 01:10:10 2020 +0200
+++ b/hgext/infinitepush/store.py Fri Jul 31 17:09:31 2020 +0530
@@ -8,7 +8,6 @@
import abc
import os
import subprocess
-import tempfile
from mercurial.pycompat import open
from mercurial import (
--- a/hgext/rebase.py Thu Jul 30 01:10:10 2020 +0200
+++ b/hgext/rebase.py Fri Jul 31 17:09:31 2020 +0530
@@ -1442,6 +1442,10 @@
if b'branch' in extra:
branch = extra[b'branch']
+ # FIXME: We call _compact() because it's required to correctly detect
+ # changed files. This was added to fix a regression shortly before the 5.5
+ # release. A proper fix will be done in the default branch.
+ wctx._compact()
memctx = wctx.tomemctx(
commitmsg,
date=date,
--- a/mercurial/context.py Thu Jul 30 01:10:10 2020 +0200
+++ b/mercurial/context.py Fri Jul 31 17:09:31 2020 +0530
@@ -2530,6 +2530,43 @@
def clean(self):
self._cache = {}
+ def _compact(self):
+ """Removes keys from the cache that are actually clean, by comparing
+ them with the underlying context.
+
+ This can occur during the merge process, e.g. by passing --tool :local
+ to resolve a conflict.
+ """
+ keys = []
+ # This won't be perfect, but can help performance significantly when
+ # using things like remotefilelog.
+ scmutil.prefetchfiles(
+ self.repo(),
+ [
+ (
+ self.p1().rev(),
+ scmutil.matchfiles(self.repo(), self._cache.keys()),
+ )
+ ],
+ )
+
+ for path in self._cache.keys():
+ cache = self._cache[path]
+ try:
+ underlying = self._wrappedctx[path]
+ if (
+ underlying.data() == cache[b'data']
+ and underlying.flags() == cache[b'flags']
+ ):
+ keys.append(path)
+ except error.ManifestLookupError:
+ # Path not in the underlying manifest (created).
+ continue
+
+ for path in keys:
+ del self._cache[path]
+ return keys
+
def _markdirty(
self, path, exists, data=None, date=None, flags=b'', copied=None
):
--- a/mercurial/exchange.py Thu Jul 30 01:10:10 2020 +0200
+++ b/mercurial/exchange.py Fri Jul 31 17:09:31 2020 +0530
@@ -905,32 +905,27 @@
# if repo.obsstore == False --> no obsolete
# then, save the iteration
if unfi.obsstore:
- obsoletes = []
- unstables = []
- for node in outgoing.missing:
+ # this message are here for 80 char limit reason
+ mso = _(b"push includes obsolete changeset: %s!")
+ mspd = _(b"push includes phase-divergent changeset: %s!")
+ mscd = _(b"push includes content-divergent changeset: %s!")
+ mst = {
+ b"orphan": _(b"push includes orphan changeset: %s!"),
+ b"phase-divergent": mspd,
+ b"content-divergent": mscd,
+ }
+ # If we are to push if there is at least one
+ # obsolete or unstable changeset in missing, at
+ # least one of the missinghead will be obsolete or
+ # unstable. So checking heads only is ok
+ for node in outgoing.ancestorsof:
ctx = unfi[node]
if ctx.obsolete():
- obsoletes.append(ctx)
+ raise error.Abort(mso % ctx)
elif ctx.isunstable():
- unstables.append(ctx)
- if obsoletes or unstables:
- msg = b""
- if obsoletes:
- msg += _(b"push includes obsolete changesets:\n")
- msg += b"\n".join(b' %s' % ctx for ctx in obsoletes)
- if unstables:
- if msg:
- msg += b"\n"
- msg += _(b"push includes unstable changesets:\n")
- msg += b"\n".join(
- b' %s (%s)'
- % (
- ctx,
- b", ".join(_(ins) for ins in ctx.instabilities()),
- )
- for ctx in unstables
- )
- raise error.Abort(msg)
+ # TODO print more than one instability in the abort
+ # message
+ raise error.Abort(mst[ctx.instabilities()[0]] % ctx)
discovery.checkheads(pushop)
return True
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/relnotes/5.5 Fri Jul 31 17:09:31 2020 +0530
@@ -0,0 +1,80 @@
+== New Features ==
+
+ * clonebundles can be annotated with the expected memory requirements
+ using the `REQUIREDRAM` option. This allows clients to skip
+ bundles created with large zstd windows and fallback to larger, but
+ less demanding bundles.
+
+ * The `phabricator` extension now provides more functionality of the
+ arcanist CLI like changing the status of a differential.
+
+ * Phases processing is much faster, especially for repositories with
+ old non-public changesets.
+
+
+== New Experimental Features ==
+
+ * The core of some hg operations have been (and are being)
+ implemented in rust, for speed. `hg status` on a repository with
+ 300k tracked files goes from 1.8s to 0.6s for instance.
+ This has currently been tested only on linux, and does not build on
+ windows. See rust/README.rst in the mercurial repository for
+ instructions to opt into this.
+
+ * An experimental config `rewrite.empty-successor` was introduced to control
+ what happens when rewrite operations result in empty changesets.
+
+
+== Bug Fixes ==
+
+ * For the case when connected to a TTY, stdout was fixed to be line-buffered
+ on Python 3 (where it was block-buffered before, causing the process to seem
+ hanging) and Windows on Python 2 (where it was unbuffered before).
+
+ * Subversion sources of the convert extension were fixed to work on Python 3.
+
+ * Subversion sources of the convert extension now interpret the encoding of
+ URLs like Subversion. Previously, there were situations where the convert
+ extension recognized a repository as present but Subversion did not, and
+ vice versa.
+
+ * The empty changeset check of in-memory rebases was fixed to match that of
+ normal rebases (and that of the commit command).
+
+ * The push command now checks the correct set of outgoing changesets for
+ obsolete and unstable changesets. Previously, it could happen that the check
+ prevented pushing changesets which were already on the server.
+
+
+== Backwards Compatibility Changes ==
+
+ * Mercurial now requires at least Python 2.7.9 or a Python version that
+ backported modern SSL/TLS features (as defined in PEP 466), and that Python
+ was compiled against a OpenSSL version supporting TLS 1.1 or TLS 1.2
+ (likely this requires the OpenSSL version to be at least 1.0.1).
+
+ * The `hg perfwrite` command from contrib/perf.py was made more flexible and
+ changed its default behavior. To get the previous behavior, run `hg perfwrite
+ --nlines=100000 --nitems=1 --item='Testing write performance' --batch-line`.
+
+ * The absorb extension now preserves changesets with no file changes that can
+ be created by the commit command (those which change the branch name
+ compared to the parent and those closing a branch head).
+
+
+== Internal API Changes ==
+
+ * logcmdutil.diffordiffstat() now takes contexts instead of nodes.
+
+ * The `mergestate` class along with some related methods and constants have
+ moved from `mercurial.merge` to a new `mercurial.mergestate` module.
+
+ * The `phasecache` class now uses sparse dictionaries for the phase data.
+ New accessors are provided to detect if any non-public changeset exists
+ (`hasnonpublicphases`) and get the correponsponding root set
+ (`nonpublicphaseroots`).
+
+ * The `stdin`, `stdout` and `stderr` attributes of the `mercurial.pycompat`
+ module were removed. Instead, the attributes of same name from the
+ `mercurial.utils.procutil` module should be used, which provide more
+ consistent behavior across Python versions and platforms.
--- a/relnotes/next Thu Jul 30 01:10:10 2020 +0200
+++ b/relnotes/next Fri Jul 31 17:09:31 2020 +0530
@@ -1,80 +1,18 @@
== New Features ==
- * clonebundles can be annotated with the expected memory requirements
- using the `REQUIREDRAM` option. This allows clients to skip
- bundles created with large zstd windows and fallback to larger, but
- less demanding bundles.
-
- * The `phabricator` extension now provides more functionality of the
- arcanist CLI like changing the status of a differential.
-
- * Phases processing is much faster, especially for repositories with
- old non-public changesets.
== New Experimental Features ==
- * The core of some hg operations have been (and are being)
- implemented in rust, for speed. `hg status` on a repository with
- 300k tracked files goes from 1.8s to 0.6s for instance.
- This has currently been tested only on linux, and does not build on
- windows. See rust/README.rst in the mercurial repository for
- instructions to opt into this.
-
- * An experimental config `rewrite.empty-successor` was introduced to control
- what happens when rewrite operations result in empty changesets.
== Bug Fixes ==
- * For the case when connected to a TTY, stdout was fixed to be line-buffered
- on Python 3 (where it was block-buffered before, causing the process to seem
- hanging) and Windows on Python 2 (where it was unbuffered before).
-
- * Subversion sources of the convert extension were fixed to work on Python 3.
-
- * Subversion sources of the convert extension now interpret the encoding of
- URLs like Subversion. Previously, there were situations where the convert
- extension recognized a repository as present but Subversion did not, and
- vice versa.
-
- * The empty changeset check of in-memory rebases was fixed to match that of
- normal rebases (and that of the commit command).
-
- * The push command now checks the correct set of outgoing changesets for
- obsolete and unstable changesets. Previously, it could happen that the check
- prevented pushing changesets which were already on the server.
== Backwards Compatibility Changes ==
- * Mercurial now requires at least Python 2.7.9 or a Python version that
- backported modern SSL/TLS features (as defined in PEP 466), and that Python
- was compiled against a OpenSSL version supporting TLS 1.1 or TLS 1.2
- (likely this requires the OpenSSL version to be at least 1.0.1).
-
- * The `hg perfwrite` command from contrib/perf.py was made more flexible and
- changed its default behavior. To get the previous behavior, run `hg perfwrite
- --nlines=100000 --nitems=1 --item='Testing write performance' --batch-line`.
-
- * The absorb extension now preserves changesets with no file changes that can
- be created by the commit command (those which change the branch name
- compared to the parent and those closing a branch head).
== Internal API Changes ==
- * logcmdutil.diffordiffstat() now takes contexts instead of nodes.
-
- * The `mergestate` class along with some related methods and constants have
- moved from `mercurial.merge` to a new `mercurial.mergestate` module.
-
- * The `phasecache` class now uses sparse dictionaries for the phase data.
- New accessors are provided to detect if any non-public changeset exists
- (`hasnonpublicphases`) and get the correponsponding root set
- (`nonpublicphaseroots`).
-
- * The `stdin`, `stdout` and `stderr` attributes of the `mercurial.pycompat`
- module were removed. Instead, the attributes of same name from the
- `mercurial.utils.procutil` module should be used, which provide more
- consistent behavior across Python versions and platforms.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-obsolete-check-push.t Fri Jul 31 17:09:31 2020 +0530
@@ -0,0 +1,236 @@
+=======================================================
+Test check for obsolescence and instability during push
+=======================================================
+
+ $ . $TESTDIR/testlib/obsmarker-common.sh
+
+ $ cat >> $HGRCPATH << EOF
+ > [phases]
+ > publish=false
+ > [experimental]
+ > evolution = all
+ > EOF
+
+
+Tests that pushing orphaness to the server is detected
+======================================================
+
+initial setup
+
+ $ mkdir base
+ $ cd base
+ $ hg init server
+ $ cd server
+ $ mkcommit root
+ $ hg phase --public .
+ $ mkcommit commit_A0_
+ $ mkcommit commit_B0_
+ $ cd ..
+ $ hg init client
+ $ cd client
+ $ echo '[paths]' >> .hg/hgrc
+ $ echo 'default=../server' >> .hg/hgrc
+ $ hg pull
+ pulling from $TESTTMP/base/server
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 3 files
+ new changesets 1e4be0697311:c09d8ab29fda (2 drafts)
+ (run 'hg update' to get a working copy)
+ $ hg up 'desc("root")'
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+(having some unrelated change affects discovery result, we should ideally test both case)
+ $ hg branch unrelated --quiet
+ $ mkcommit unrelated
+ $ hg up null
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg log -G
+ o changeset: 3:16affbe0f986
+ | branch: unrelated
+ | tag: tip
+ | parent: 0:1e4be0697311
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: unrelated
+ |
+ | o changeset: 2:c09d8ab29fda
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: commit_B0_
+ | |
+ | o changeset: 1:37624bf21024
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: commit_A0_
+ |
+ o changeset: 0:1e4be0697311
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: root
+
+ $ cd ..
+ $ cd ..
+
+
+Orphan from pruning
+-------------------
+
+Setup
+
+ $ cp -R base check-pruned
+ $ cd check-pruned/client
+ $ hg debugobsolete --record-parents `getid 'desc("commit_A0_")'`
+ 1 new obsolescence markers
+ obsoleted 1 changesets
+ 1 new orphan changesets
+ $ hg log -G
+ o changeset: 3:16affbe0f986
+ | branch: unrelated
+ | tag: tip
+ | parent: 0:1e4be0697311
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: unrelated
+ |
+ | * changeset: 2:c09d8ab29fda
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | instability: orphan
+ | | summary: commit_B0_
+ | |
+ | x changeset: 1:37624bf21024
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | obsolete: pruned
+ | summary: commit_A0_
+ |
+ o changeset: 0:1e4be0697311
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: root
+
+
+Pushing the result is prevented with a message
+
+ $ hg push --new-branch
+ pushing to $TESTTMP/check-pruned/server
+ searching for changes
+ abort: push includes orphan changeset: c09d8ab29fda!
+ [255]
+
+ $ cd ../..
+
+
+Orphan from superseding
+-----------------------
+
+Setup
+
+ $ cp -R base check-superseded
+ $ cd check-superseded/client
+ $ hg up 'desc("commit_A0_")'
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch other
+ marked working directory as branch other
+ $ hg commit --amend -m commit_A1_
+ 1 new orphan changesets
+ $ hg log -G
+ @ changeset: 4:df9b82a99e21
+ | branch: other
+ | tag: tip
+ | parent: 0:1e4be0697311
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: commit_A1_
+ |
+ | o changeset: 3:16affbe0f986
+ |/ branch: unrelated
+ | parent: 0:1e4be0697311
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: unrelated
+ |
+ | * changeset: 2:c09d8ab29fda
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | instability: orphan
+ | | summary: commit_B0_
+ | |
+ | x changeset: 1:37624bf21024
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | obsolete: rewritten using amend as 4:df9b82a99e21
+ | summary: commit_A0_
+ |
+ o changeset: 0:1e4be0697311
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: root
+
+
+Pushing the result is prevented with a message
+
+ $ hg push --new-branch
+ pushing to $TESTTMP/check-superseded/server
+ searching for changes
+ abort: push includes orphan changeset: c09d8ab29fda!
+ [255]
+
+ $ cd ../..
+
+Tests that user get warned if it is about to publish obsolete/unstable content
+------------------------------------------------------------------------------
+
+Orphan from pruning
+-------------------
+
+Make sure the only difference is phase:
+
+ $ cd check-pruned/client
+ $ hg push --force --rev 'not desc("unrelated")'
+ pushing to $TESTTMP/check-pruned/server
+ searching for changes
+ no changes found
+ 1 new obsolescence markers
+ obsoleted 1 changesets
+ 1 new orphan changesets
+ [1]
+
+Check something prevents a silent publication of the obsolete changeset
+
+ $ hg push --publish --new-branch
+ pushing to $TESTTMP/check-pruned/server
+ searching for changes
+ abort: push includes orphan changeset: c09d8ab29fda!
+ [255]
+
+ $ cd ../..
+
+Orphan from superseding
+-----------------------
+
+Make sure the only difference is phase:
+
+ $ cd check-superseded/client
+ $ hg push --force --rev 'not desc("unrelated")'
+ pushing to $TESTTMP/check-superseded/server
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 0 changes to 0 files (+1 heads)
+ 1 new obsolescence markers
+ obsoleted 1 changesets
+ 1 new orphan changesets
+
+Check something prevents a silent publication of the obsolete changeset
+
+ $ hg push --publish --new-branch
+ pushing to $TESTTMP/check-superseded/server
+ searching for changes
+ abort: push includes orphan changeset: c09d8ab29fda!
+ [255]
+
+ $ cd ../..
--- a/tests/test-obsolete-divergent.t Thu Jul 30 01:10:10 2020 +0200
+++ b/tests/test-obsolete-divergent.t Fri Jul 31 17:09:31 2020 +0530
@@ -118,9 +118,7 @@
$ hg push ../other
pushing to ../other
searching for changes
- abort: push includes unstable changesets:
- 82623d38b9ba (content-divergent)
- 392fd25390da (content-divergent)
+ abort: push includes content-divergent changeset: 392fd25390da!
[255]
$ cd ..
--- a/tests/test-obsolete.t Thu Jul 30 01:10:10 2020 +0200
+++ b/tests/test-obsolete.t Fri Jul 31 17:09:31 2020 +0530
@@ -251,8 +251,7 @@
$ hg push ../tmpa
pushing to ../tmpa
searching for changes
- abort: push includes unstable changesets:
- 5601fb93a350 (phase-divergent)
+ abort: push includes phase-divergent changeset: 5601fb93a350!
[255]
Fixing "bumped" situation
@@ -617,8 +616,7 @@
$ hg push ../tmpc/ -r 'desc("original_d")'
pushing to ../tmpc/
searching for changes
- abort: push includes obsolete changesets:
- 94b33453f93b
+ abort: push includes obsolete changeset: 94b33453f93b!
[255]
refuse to push unstable changeset
@@ -626,10 +624,7 @@
$ hg push ../tmpc/
pushing to ../tmpc/
searching for changes
- abort: push includes obsolete changesets:
- 94b33453f93b
- push includes unstable changesets:
- cda648ca50f5 (orphan)
+ abort: push includes orphan changeset: cda648ca50f5!
[255]
with --force it will work anyway
@@ -652,26 +647,6 @@
no changes found
[1]
-pushing should work even if the outgoing changes contain an unrelated changeset
-(neither obsolete nor unstable) (issue6372)
-
- $ hg up 1 -q
- $ hg branch new -q
- $ mkcommit c
-
- $ hg push ../tmpc/ --new-branch
- pushing to ../tmpc/
- searching for changes
- adding changesets
- adding manifests
- adding file changes
- added 1 changesets with 1 changes to 1 files (+1 heads)
-
-make later tests work unmodified
-
- $ hg --config extensions.strip= strip tip -q
- $ hg up 5 -q
-
Test that extinct changeset are properly detected
$ hg log -r 'extinct()'
@@ -1221,14 +1196,6 @@
phase-divergent: immutable predecessor 245b
content-divergent: predecessor 245b
- $ hg push ../tmpf -r 50c51b361e60
- pushing to ../tmpf
- searching for changes
- abort: push includes unstable changesets:
- 50c51b361e60 (orphan, phase-divergent, content-divergent)
- [255]
-
-
#if serve
$ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
--- a/tests/test-phases.t Thu Jul 30 01:10:10 2020 +0200
+++ b/tests/test-phases.t Fri Jul 31 17:09:31 2020 +0530
@@ -896,13 +896,11 @@
$ hg --config "phases.new-commit=internal" commit -m "my test internal commit" 2>&1 | grep ProgrammingError
** ProgrammingError: this repository does not support the internal phase
raise error.ProgrammingError(msg)
- mercurial.error.ProgrammingError: this repository does not support the internal phase (no-chg !)
- ProgrammingError: this repository does not support the internal phase (chg !)
+ *ProgrammingError: this repository does not support the internal phase (glob)
$ hg --config "phases.new-commit=archived" commit -m "my test archived commit" 2>&1 | grep ProgrammingError
** ProgrammingError: this repository does not support the archived phase
raise error.ProgrammingError(msg)
- mercurial.error.ProgrammingError: this repository does not support the archived phase (no-chg !)
- ProgrammingError: this repository does not support the archived phase (chg !)
+ *ProgrammingError: this repository does not support the archived phase (glob)
$ cd ..
--- a/tests/test-rebase-inmemory.t Thu Jul 30 01:10:10 2020 +0200
+++ b/tests/test-rebase-inmemory.t Fri Jul 31 17:09:31 2020 +0530
@@ -963,3 +963,21 @@
|/
o 0: d20a80d4def3 'base'
+
+ $ cd ..
+
+Test (virtual) working directory without changes, created by merge conflict
+resolution. There was a regression where the file was incorrectly detected as
+changed although the file contents were the same as in the parent.
+
+ $ hg init nofilechanges
+ $ cd nofilechanges
+ $ echo a > a; hg add a; hg ci -m a
+ $ echo foo > test; hg add test; hg ci -m b
+ $ hg up 0 -q
+ $ echo bar > test; hg add test; hg ci -m c
+ created new head
+ $ hg rebase -d 2 -d 1 --tool :local
+ rebasing 2:ca2749322ee5 "c" (tip)
+ note: not rebasing 2:ca2749322ee5 "c" (tip), its destination already has all its changes
+ saved backup bundle to $TESTTMP/nofilechanges/.hg/strip-backup/ca2749322ee5-6dc7e94b-rebase.hg