Manuel Jacob <me@manueljacob.de> [Mon, 01 Jun 2020 09:55:31 +0200] rev 45125
absorb: make it explicit if empty changeset was created
If the config rewrite.empty-successor=skip is set, a message "became empty and
was dropped" is shown if the changeset became empty. If the config
rewrite.empty-successor=keep is set, absorb may create changesets even if they
became empty. It’s probably a good idea to make that explicit. Therefore the
message is changed to be a combination of both: "became empty and became ...".
Repeating the word "became" is not very elegant. This results from the fact
that "became" was and is overloaded to indicate both the change from non-empty
to empty and the successor relation. In the combinated message, both meanings
are used in one sentence.
Manuel Jacob <me@manueljacob.de> [Mon, 01 Jun 2020 09:42:41 +0200] rev 45124
absorb: consider rewrite.empty-successor configuration
This adds support for the recently added rewrite.empty-successor configuration.
Manuel Jacob <me@manueljacob.de> [Mon, 01 Jun 2020 08:38:42 +0200] rev 45123
rebase: consider rewrite.empty-successor configuration
This adds support for the recently added rewrite.empty-successor configuration.
Manuel Jacob <me@manueljacob.de> [Sun, 12 Jul 2020 06:06:06 +0200] rev 45122
rewriteutil: add utility to check whether empty successors should be skipped
Manuel Jacob <me@manueljacob.de> [Sat, 11 Jul 2020 23:53:27 +0200] rev 45121
config: add option to control creation of empty successors during rewrite
The default for many history-rewriting commands (e.g. rebase and absorb) is
that changesets which would become empty are not created in the target branch.
This makes sense if the source branch consists of small fix-up changes. For
more advanced workflows that make heavy use of history-editing to create
curated patch series, dropping empty changesets is not as important or even
undesirable.
Some users want to keep the meta-history, e.g. to make finding comments in a
code review tool easier or to avoid that divergent bookmarks are created. For
that, obsmarkers from the (to-be) empty changeset to the changeset(s) that
already made the changes should be added. If a to-be empty changeset is pruned
without a successor, adding the obsmarkers is hard because the changeset has to
be found within the hidden part of the history.
If rebasing in TortoiseHg, it’s easy to miss the fact that the to-be empty
changeset was pruned. An empty changeset will function as a reminder that
obsmarkers should be added.
Martin von Zweigbergk mentioned another advantage. Stripping the successor will
de-obsolete the predecessor. If no (empty) successor is created, this won’t be
possible.
In the future, we may want to consider other behaviors, like e.g. creating the
empty successor, but pruning it right away. Therefore this configuration
accepts 'skip' and 'keep' instead of being a boolean configuration.
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 31 Aug 2019 14:33:26 +0200] rev 45120
commands: use any() instead of `if a or b or c`
Small cleanup for future when we have an option to show configs from shared rc.
Differential Revision: https://phab.mercurial-scm.org/D8658
Joerg Sonnenberger <joerg@bec.de> [Mon, 06 Jul 2020 14:49:19 +0200] rev 45119
manifest: use the same logic for handling flags in _parse as elsewhere
Differential Revision: https://phab.mercurial-scm.org/D8684
Joerg Sonnenberger <joerg@bec.de> [Mon, 06 Jul 2020 03:43:32 +0200] rev 45118
manifest: tigher manifest parsing and flag use
In the manifest line, flags are put directly after the hash, so the
parser has been guessing the presence of flags based on the length of
the hash. Replace this assumption by an enumeration of the valid flags
and removing them from the hash first as they are distinct input values.
Consistently handle the expected 256bit length of the SHA1-replacement
in the pure Python parser. Check that setting flags will use one of the
blessed values.
Extend write logic in the C version to handle 256bit hashes as well.
Verify that hashes always have exactly the expected length. Since
1070df141718 we should no longer depend on the old extra-byte hack.
Differential Revision: https://phab.mercurial-scm.org/D8679
Joerg Sonnenberger <joerg@bec.de> [Wed, 08 Jul 2020 00:15:15 +0200] rev 45117
phases: sparsify phase lists
When the internal and archived phase was added, allphase became a large,
sparsely populated list. This dramatically increased the number of
lookup operations for public relations in `phasecache.phase`. As a first
step, define allphases and related lists explicitly to contain only the
actual phases. Make phasenames a dictionary and create corresponding
dictionaries for mapping phase names back to numbers. Adjust various
list to be sparse as well with the exception of phaseroots and phasesets
members of phasecache. Keep those as a separate step as it involves
changes to the C module.
Differential Revision: https://phab.mercurial-scm.org/D8697
Joerg Sonnenberger <joerg@bec.de> [Tue, 07 Jul 2020 22:00:02 +0200] rev 45116
phases: updatephases should not skip internal phase
Historically, updatephases used to skip the secret phase, but wasn't
updated when archived and internal were added.
Differential Revision: https://phab.mercurial-scm.org/D8696
Joerg Sonnenberger <joerg@bec.de> [Sun, 28 Jun 2020 01:08:13 +0200] rev 45115
repoview: use the phasecache directly to determine mutable revisions
This speeds up no-change updates from 1.3s to 0.85s for my NetBSD test
repository.
Differential Revision: https://phab.mercurial-scm.org/D8670
Joerg Sonnenberger <joerg@bec.de> [Tue, 07 Jul 2020 21:45:10 +0200] rev 45114
phases: provide a test and accessor for non-public phase roots
This decouples users from the implementation details of the phasecache.
Also document a historic artifact about the stored phaseroots.
Differential Revision: https://phab.mercurial-scm.org/D8694
Raphaël Gomès <rgomes@octobus.net> [Wed, 24 Jun 2020 17:53:44 +0200] rev 45113
hg-core: define a `dirstate_status` `Operation`
This is 3/3 in a series of patches to improve dirstate status' code.
Following in the footsteps of
a46e36b82461, we move the main status
functionality to an `Operation`. This will most likely be subject to change in
the future (what function signature, what parameters, etc., but we will see
when `rhg` gets `hg status` support.
Differential Revision: https://phab.mercurial-scm.org/D8663
Raphaël Gomès <rgomes@octobus.net> [Wed, 24 Jun 2020 17:20:39 +0200] rev 45112
rust-status: improve documentation and readability
This patch is 2/3 in the series to improve the dirstate status code. It adds a
number of common type aliases to add more obvious semantics to function
signatures, improves/adds documentation where necessary and improves one or two
patterns to be more idiomatic.
Differential Revision: https://phab.mercurial-scm.org/D8662
Raphaël Gomès <rgomes@octobus.net> [Wed, 24 Jun 2020 16:12:45 +0200] rev 45111
rust-status: refactor status into a struct
The code for `dirstate/status` has grown too large for comfort, this is the
first of three patches that try to improve maintainability.
In this patch, refactoring dirstate's status into a struct allows for slimming
down function signatures drastically, keeping the mental (and maintenance)
burden lower, since pretty much all of them shared a few common arguments.
This had the pleasant side-effect of simplifying lifetimes a little. This has
no observable impact on performance.
The next patch will add/improve documentation and refactor some types. I tried
to keep new code down to a minimum in this patch because it's already pretty
big.
Differential Revision: https://phab.mercurial-scm.org/D8661
Martin von Zweigbergk <martinvonz@google.com> [Fri, 13 Dec 2019 22:20:03 -0800] rev 45110
tests: avoid "magic" nodeids in test-rebase-legacy.t
This helps with readability.
Differential Revision: https://phab.mercurial-scm.org/D8735
Martin von Zweigbergk <martinvonz@google.com> [Fri, 13 Dec 2019 22:08:18 -0800] rev 45109
tests: avoid a "magic" nodeid in test-wireproto-command-lookup.t
This helps with readability.
Differential Revision: https://phab.mercurial-scm.org/D8734
Pulkit Goyal <7895pulkit@gmail.com> [Mon, 22 Jun 2020 13:51:48 +0530] rev 45108
run-tests: replace '#' with '-' in temp path of repos created for tests
If we have multiple cases in a test, that leads us to a temp path of
format "<temp-path>-<case1>#<case2>".
This leads to hg.parseurl() parsing the path and take part
after `#` as a branch name.
I encountered this bug while adding support for share-safe case in next patch.
Differential Revision: https://phab.mercurial-scm.org/D8647
Pulkit Goyal <7895pulkit@gmail.com> [Tue, 14 Apr 2020 17:06:11 +0530] rev 45107
debugcommands: introduce new debugrequirements command
This for now just prints out the list of current requirements. In future this
will be helpful in reading requirements from couple of sources, and checking
which requirement comes from where.
Differential Revision: https://phab.mercurial-scm.org/D8632
Pulkit Goyal <7895pulkit@gmail.com> [Tue, 14 Apr 2020 16:43:54 +0530] rev 45106
scmutil: add writereporequirements() and route requires writing through it
In upcoming patches, to implement Share Safe plan we will be introducing
requires file in store. We need to route all callers to a single function
to check for a share-safe requirement and if present, write requirements to
.hg/store/requires instead.
After this patch, callers directly calling scmutil.writerequires() are only
those where we don't have the repo object, for example when initializing
the repository object itself.
Differential Revision: https://phab.mercurial-scm.org/D8631
Martin von Zweigbergk <martinvonz@google.com> [Tue, 14 Jul 2020 11:28:06 -0700] rev 45105
extensions: make `hg nonexistent` not crash with PyOxidizer
When running `hg nonexistent`, we try to look for extensions that
provide that command. We do that by looking for files in the
`hgext.__file__` directory. However, PyOxidizer doesn't provide a
`__file__`, so we crash when running with PyOxidizer.
We should be able to look for the command in built-in extensions, but
we seem to already have code for skipping the scan when running in a
frozen binary, so I just modified that code instead.
By the way, it also seems like we should be able to search for
extensions in the `hgext3rd` module, but we don't do that yet either
(before or after this patch).
Differential Revision: https://phab.mercurial-scm.org/D8750
Manuel Jacob <me@manueljacob.de> [Thu, 09 Jul 2020 12:52:04 +0200] rev 45104
procutil: avoid use of deprecated tempfile.mktemp()
In the previous version, I used tempfile.mktemp() because it seemed to be the
only way to open a file from two processes (the Python documentation says the
file backing NamedTemporaryFile can’t be opened a second time on Windows).
However, it’s possible when passing the O_TEMPORARY flag to the second open.
Source: https://stackoverflow.com/a/
15235559/6366251
Manuel Jacob <me@manueljacob.de> [Wed, 15 Jul 2020 15:09:21 +0200] rev 45103
procutil: make _make_write_all() function private
Because this function isn’t meant for general use (e.g., it’s Python 2-only),
make in a module-private function by prefixing it with `_`.
Yuya Nishihara <yuya@tcha.org> [Mon, 13 Jul 2020 21:14:20 +0900] rev 45102
dispatch: handle late KeyboardInterrupt occurred in run()
User can press Ctrl+C while flushing streams in dispatch.run(). In such case,
I think exiting with 255 is better than printing Python traceback and exiting
with 1.
Yuya Nishihara <yuya@tcha.org> [Mon, 13 Jul 2020 21:06:34 +0900] rev 45101
dispatch: indent run() function
I'll add KeyboardInterrupt handling there.
Yuya Nishihara <yuya@tcha.org> [Thu, 09 Jul 2020 19:16:52 +0900] rev 45100
debuginstall: don't translate encoding messages
While Microsoft trained us to read mojibake text, it doesn't make sense
to print mojibake messages when debugging the exact issue.
Augie Fackler <augie@google.com> [Wed, 15 Jul 2020 10:34:59 -0400] rev 45099
merge with stable
Pulkit Goyal <7895pulkit@gmail.com> [Mon, 06 Jul 2020 15:31:53 +0530] rev 45098
patch: refactor content diffing part in separate fn so extensions can wrap
Right now extdiff uses it's own logic using archival to diff two versions of
file using external diff tools. This makes the extdiff functionality
non-extensible.
This series is an attempt to refactor core patch and diff functionality so that
extdiff can wrap and reuse it. This will help us in using external diffing tools
at more places and not just extdiff command only then.
Differential Revision: https://phab.mercurial-scm.org/D8685
Manuel Jacob <me@manueljacob.de> [Thu, 09 Jul 2020 12:52:04 +0200] rev 45097
tests: check that procutil.std{out,err}.write() returns correct result
On Windows, we currently don’t fully test the case when the stream is connected
to a TTY, but we test the child process side by connecting them to NUL, which
is recognized as a TTY by Python. To make the large write test a bit more
useful besides checking that it doesn’t crash, we can check that the write()
method returns the correct result.
Manuel Jacob <me@manueljacob.de> [Thu, 09 Jul 2020 12:52:42 +0200] rev 45096
tests: add tests for when stdout or stderr is connected to `os.devnull`
The original motivation was that creating PTYs on Windows is not possible, but
`NUL` is recognized as a TTY, so we can have at least some test coverage for
the TTY case. I think it doesn’t hurt to run the test cases on all systems.
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 12:27:58 +0200] rev 45095
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Python 3 offers different kind of streams and it’s not guaranteed for all of
them that calling write() writes all bytes.
When Python is started in unbuffered mode, sys.std{out,err}.buffer are
instances of io.FileIO, whose write() can write less bytes for
platform-specific reasons (e.g. Linux has a 0x
7ffff000 bytes maximum and could
write less if interrupted by a signal; when writing to Windows consoles, it’s
limited to 32767 bytes to avoid the "not enough space" error). This can lead to
silent loss of data, both when using sys.std{out,err}.buffer (which may in fact
not be a buffered stream) and when using the text streams sys.std{out,err}
(I’ve created a CPython bug report for that:
https://bugs.python.org/
issue41221).
Python may fix the problem at some point. For now, we implement our own wrapper
for procutil.std{out,err} that calls the raw stream’s write() method until all
bytes have been written. We don’t use sys.std{out,err} for larger writes, so I
think it’s not worth the effort to patch them.
Manuel Jacob <me@manueljacob.de> [Sat, 11 Jul 2020 07:47:04 +0200] rev 45094
procutil: move assignments
This should probably be part of the previous patch, but folding it results in a
less useful word diff, so I decided to keep it separate for review.
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 10:12:04 +0200] rev 45093
procutil: distribute code for stdout
It makes sense to have the distinction between Python 2 and 3 at the top level,
as we have to fight a different kind of battle on each: On Python 3, we get
consistent behavior on all platforms, but need to create correctly-behaving
binary streams. On Python 2, we have to account for platform differences.
Manuel Jacob <me@manueljacob.de> [Tue, 14 Jul 2020 10:25:41 +0200] rev 45092
convert: use bytes for value in extra dict
The keys and values of the extra dict are expected to be bytes. Before this
fix, there was a crash in mercurial.changelog.encodeextra().
Manuel Jacob <me@manueljacob.de> [Sat, 11 Jul 2020 03:17:42 +0200] rev 45091
overlayworkingctx: remove unused `nofilechanges()` and `_compact()` methods
Differential Revision: https://phab.mercurial-scm.org/D8733
Manuel Jacob <me@manueljacob.de> [Sat, 11 Jul 2020 03:10:23 +0200] rev 45090
rebase: correctly check for empty commit in in-memory mode
The new code has a small overhead in the empty commit case, as a `memctx` object
is always created, but I don’t think it’s justified here to duplicate code
to optimize a relatively unlikely code path.
Differential Revision: https://phab.mercurial-scm.org/D8732
Manuel Jacob <me@manueljacob.de> [Sat, 11 Jul 2020 02:13:19 +0200] rev 45089
memctx: make `parents()` return list of one element if it’s not a merge
It is part of the contract of `parents()` that non-merges return a list of one
element. `self._parents` is always a list of two elements in `memctx`.
Differential Revision: https://phab.mercurial-scm.org/D8731
Manuel Jacob <me@manueljacob.de> [Sat, 11 Jul 2020 01:14:00 +0200] rev 45088
commit: factor out empty commit check to `basectx.isempty()`
This enables reuse in other places, e.g. those dealing with `memctx`.
Differential Revision: https://phab.mercurial-scm.org/D8729
Manuel Jacob <me@manueljacob.de> [Sat, 11 Jul 2020 00:53:34 +0200] rev 45087
overlayworkingctx: rename misleadingly named `isempty()` method
This method is only about whether there are file changes, not about whether the
commit will be empty or not.
One user of the method was incorrectly assuming the latter meaning, leading to
the bug for which a test case was added in D8727. I’ve added a FIXME to the
code.
The original motivation for the rename was that I want to add
`committablectx.isempty()`, that properly checks if a commit will be empty,
using the exact same logic as in `repo.commit()`, and I wanted to avoid a name
clash.
Differential Revision: https://phab.mercurial-scm.org/D8728
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 01:36:19 +0200] rev 45086
rebase: add test case that shows that inmemory rebase does not preserve merges
Differential Revision: https://phab.mercurial-scm.org/D8727
Manuel Jacob <me@manueljacob.de> [Thu, 09 Jul 2020 07:00:32 +0200] rev 45085
rebase: remove now unnecessary logic to allow empty commit when branch changes
This was a workaround for a bug in the empty commit check in repo.commit(),
where the parent branch name was incorrectly compared with the wdir branch name
instead of the branch name passed via `extra`. The bug was fixed in D8724.
The workaround was introduced in
b2415e94b2f5.
Differential Revision: https://phab.mercurial-scm.org/D8725
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 00:44:18 +0200] rev 45084
commit: check branch change on to-be-committed changeset
This makes a difference when a branch name is passed via the `extra` argument,
which will be used as the branch name for the created changeset. The empty
commit check should use that branch name instead of whatever was set on the
working directory.
Besides fixing the bug for which a test case was extended, it enables to remove
a workaround in the rebase extension, which will be done in a follow-up patch
(D8725).
Differential Revision: https://phab.mercurial-scm.org/D8724
Augie Fackler <augie@google.com> [Mon, 13 Jul 2020 13:06:12 -0400] rev 45083
merge with stable
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 10:12:56 +0200] rev 45082
procutil: move comment closer to relevant code
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 10:03:05 +0200] rev 45081
procutil: use mercurial.windows.winstdout only on Python 2 and TTYs
Python 3 already works around the bug. The workaround is only needed when
writing to consoles. If stdout is a console, sys.stdout.isatty() is true.
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 09:59:36 +0200] rev 45080
procutil: split if condition
This prepares the code for subsequent changes where we need to differentiate
between the two cases.
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 09:55:38 +0200] rev 45079
procutil: explain better why line buffering is not possible
The sentence “On Python 3, buffered binary streams can't be set line-buffered.”
was imprecise, as all streams are just Python classes and we can implement our
own (which we did).
Manuel Jacob <me@manueljacob.de> [Tue, 07 Jul 2020 12:13:40 +0200] rev 45078
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de> [Sat, 11 Jul 2020 06:03:22 +0200] rev 45077
procutil: back out
8403cc54bc83 (make ....procutil.stderr unbuffered)
Changeset
8403cc54bc83 introduced code that opens a second file object
referring to the stderr file descriptor. This broke tests on Windows. The
reason is that on Windows, sys.stderr is buffered and procutil.stderr closed
the file descriptor when it got garbage collected before sys.stderr had the
chance to flush buffered data.
`procutil.stdout` had the same problem for a long time, but we didn’t realize,
as in CI test runs, stdout is not a TTY and in this case no second file object
is opened.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 09 Jul 2020 02:16:26 +0200] rev 45076
test-clone-uncompressed: use config to silence the lock warning
The ui.timeout.warn option can solve the
issue6237 in a cleaner way than what
was done in
752da6863e39. That way, possible other unexpected error output will
not be silenced.
Differential Revision: https://phab.mercurial-scm.org/D8726
Joerg Sonnenberger <joerg@bec.de> [Thu, 21 May 2020 18:18:50 +0200] rev 45075
hooklib: fix detection of successors for changeset_obsoleted
Provide a hook for obsutil.getobsolete to be used with either a
transaction or the changes item of the transaction, since hooks only
have access to the latter. Use that to find the correct list of
revisions with obsmarkers, even new ones, and then filter out revisions
with known successors.
Move the processing from pretxnclose to txnclose as the transaction
access itself is no longer necessary. This is more in line with notify
and ensures that sanity checks can abort the transaction first.
Differential Revision: https://phab.mercurial-scm.org/D8575
Rodrigo Damazio Bovendorp <rdamazio@google.com> [Thu, 09 Jul 2020 20:46:52 -0700] rev 45074
fix: prefetch file contents
This prevents the worker subprocesses from contacting the server individually,
which is either inefficient, or leads to problems if the connection is shared
among them.
Differential Revision: https://phab.mercurial-scm.org/D8723
Rodrigo Damazio Bovendorp <rdamazio@google.com> [Thu, 09 Jul 2020 20:45:35 -0700] rev 45073
fix: obtain base paths before starting workers
This moves calculation of base paths to before work is dispatched.
While this does mean that copy tracing will be serialized instead of
parallel, it is necessary to be able to prefetch the base contents
in a batch, which will likely be more efficient.
Differential Revision: https://phab.mercurial-scm.org/D8722
Rodrigo Damazio Bovendorp <rdamazio@google.com> [Thu, 09 Jul 2020 18:48:55 -0700] rev 45072
scmutil: allowing different files to be prefetched per revision
The old API takes a list of revision separate from the file matcher, and thus
provides no way to fetch different sets of files from each revision. In
preparation for adding one such usage, I'm changing the API to take a list of
(revision, file matcher) tuples instead.
Differential Revision: https://phab.mercurial-scm.org/D8721
Pulkit Goyal <7895pulkit@gmail.com> [Sat, 11 Jul 2020 00:31:21 +0530] rev 45071
tests: update test-devel-warnings.t output with chg
Manuel Jacob <me@manueljacob.de> [Tue, 07 Jul 2020 11:10:07 +0200] rev 45070
tests: make names in test-stdio.py more distinctive
This way, more tests can be added without name clashes.