Pulkit Goyal <7895pulkit@gmail.com> [Fri, 24 Jul 2020 16:23:55 +0530] rev 45304
merge: add removefile() to mergeresult object
There are cases where some further calculation makes the file not needing to be
merged anymore and hence needs to be dropped in mergeresult object. This adds a
function for that.
Differential Revision: https://phab.mercurial-scm.org/D8821
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 24 Jul 2020 16:18:39 +0530] rev 45303
merge: introduce mergeresult.addfile() and use it
We want to use mergeresult object at more and more places instead of this
actions dict to simplify code and further add new APIs to mergeresult object.
This patch introduces `addfile()` which adds a new file to the internal actions
dict for now.
Differential Revision: https://phab.mercurial-scm.org/D8820
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 24 Jul 2020 15:56:11 +0530] rev 45302
merge: make mergeresult constructor initialize empty object
In future patches, we will be going to update mergeresult object
instead of building an actions dict and then setting it in the object.
Differential Revision: https://phab.mercurial-scm.org/D8819
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 24 Jul 2020 15:15:20 +0530] rev 45301
merge: improve documentation of fbid dict used for merge bid
I improved the comments explaning what the dict contains meanwhile organizing
the comment structure which prevents some confusion.
Due to formatting issues, the empty dict was wrapped in `()` which might decieve
in thinking that it's a tuple of dict until you decide to find a comma.
Differential Revision: https://phab.mercurial-scm.org/D8818
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 24 Jul 2020 14:45:00 +0530] rev 45300
merge: move conversion of file-key dict to action-key dict in mergeresult
Initially the actions dict which we get has file has keys, but later we want a
dict which has actions as keys. This patch moves code computing that to
mergeresult class as that's where it should be anyway.
Differential Revision: https://phab.mercurial-scm.org/D8817
Pulkit Goyal <7895pulkit@gmail.com> [Sun, 02 Aug 2020 10:12:21 -0700] rev 45299
merge: introduce hasconflicts() on mergeresult object
This and upcoming patches will improve the mergeresult object making it more
powerful and provide clean APIs for various things. Doing this will clean up the
core merge code which is present in `update()` a bit.
Differential Revision: https://phab.mercurial-scm.org/D8816
Pulkit Goyal <7895pulkit@gmail.com> [Tue, 14 Jul 2020 16:40:28 +0530] rev 45298
merge: remove no longer required ACTION_GET_OTHER_AND_STORE
In 1b8fd4af33189c84feadb47c74d659ec31cde3b9 I (ab)used merge actions to pass
info from manifestmerge() to applyupdates() and store info in mergestate.
In previous patches, we introduced a separate return value from manifestmerge()
and calculateupdates() and an argument to applyupdates() which achieved the same
thing.
Let's remove this no longer required messy code.
Differential Revision: https://phab.mercurial-scm.org/D8744
Pulkit Goyal <7895pulkit@gmail.com> [Tue, 14 Jul 2020 16:31:52 +0530] rev 45297
merge: pass commitinfo to applyupdates() and get it stored in mergestate
This patch passes the commitinfo calulcated in manifestmerge() to applyupdates()
so that it can be read there and stored in mergestate. On commit, we can read
mergestate for such information and act accordingly.
This patch also makes ACTION_GET_OTHER_AND_STORE not required anymore. Next
patch will remove the messy code surrounding it.
Differential Revision: https://phab.mercurial-scm.org/D8743
Pulkit Goyal <7895pulkit@gmail.com> [Tue, 14 Jul 2020 16:21:08 +0530] rev 45296
merge: introduce 'commitinfo' in mergeresult
commitinfo will be used to pass information which is required on commit phase
from the merge phase.
One common example is, merge chooses filenode from second parent and we need to
tell commit to choose that. Right now this one and related cases are not very
neatly implement and there is no clear line on how to pass on such information.
Upcoming patches will try to work on in this area and make things easier.
Differential Revision: https://phab.mercurial-scm.org/D8742
Pulkit Goyal <7895pulkit@gmail.com> [Thu, 23 Jul 2020 18:03:14 +0530] rev 45295
merge: return a mergeresult obj from manifestmerge(), calculateupdates() (API)
Earlier, manifestmerge() and calculateupdates() returns a tuple of three things.
I wanted to add one more thing to return value.
Introducing a special class which represents results of a merge will help
understand better and also ease adding new return values.
Differential Revision: https://phab.mercurial-scm.org/D8799
Martin von Zweigbergk <martinvonz@google.com> [Thu, 30 Jul 2020 22:49:51 -0700] rev 45294
packaging: delete unnecessary updating of `dirs` list
The `dirs` list is not used and it seems it also wasn't used when this
code was added in 395b0e132836 (Don't copy hidden files/directories
during `setup.py install`, 2009-07-14).
Differential Revision: https://phab.mercurial-scm.org/D8857
Martin von Zweigbergk <martinvonz@google.com> [Sun, 02 Aug 2020 10:08:18 -0700] rev 45293
packaging: make "mercurial.defaultrc" a key in package_data
Before this patch, we had a `mercurial` key with a `defaultrc/*.rc`
value. It seems more correct to have a `mercurial.defaultrc` key with
a `*.rc` value since `mercurial.defaultrc` it became a pacakge in
1390bb81163e (help: get helptext/ data from `resources` module if
available, 2019-12-12).
Differential Revision: https://phab.mercurial-scm.org/D8856
Martin von Zweigbergk <martinvonz@google.com> [Thu, 30 Jul 2020 12:22:41 -0700] rev 45292
templatespec: use new factory functions in hooklib
Differential Revision: https://phab.mercurial-scm.org/D8853
Martin von Zweigbergk <martinvonz@google.com> [Mon, 20 Jul 2020 22:43:33 -0700] rev 45291
templatespec: use new factory functions in logcmdutil
Differential Revision: https://phab.mercurial-scm.org/D8848
Martin von Zweigbergk <martinvonz@google.com> [Mon, 20 Jul 2020 21:33:28 -0700] rev 45290
templatespec: move check for non-unicode to lower-level function
Now that we have the factory functions, it makes sense to have the
check there.
Differential Revision: https://phab.mercurial-scm.org/D8847
Martin von Zweigbergk <martinvonz@google.com> [Mon, 20 Jul 2020 21:32:10 -0700] rev 45289
templatespec: logcmdutil.templatespec() gets either template or mapfile
The callers of the function already never pass (non-`None`) values for
both, so let's check that and call the new factory functions.
Differential Revision: https://phab.mercurial-scm.org/D8846
Martin von Zweigbergk <martinvonz@google.com> [Thu, 16 Jul 2020 13:33:46 -0700] rev 45288
templatespec: create a factory function for each type there is
Most of the arguments to the `templatespec` constructor are mutually
exclusive, so each combination creates a different type of
templatespec. Let's clarify that by creating factory functions.
I've left the callers in `logcmdutil` unchanged for now because they
are more complex and `logcmdutil.templatespec()` is slightly higher
level in that it is specific to changesets.
My larger goal is to add support frozen binaries (specifically
PyOxidizer) by adding a specific type of `templatespec` for built-in
templates. That will get its own factory function.
Differential Revision: https://phab.mercurial-scm.org/D8845
Martin von Zweigbergk <martinvonz@google.com> [Wed, 29 Jul 2020 10:42:09 -0700] rev 45287
templater: stop accepting a single style to stylemap()
The code seems to have been for compatibility across d3dbdca92458
(hgweb: don't choke when an inexistent style is requested (issue1901),
2009-11-12).
Differential Revision: https://phab.mercurial-scm.org/D8844
Martin von Zweigbergk <martinvonz@google.com> [Thu, 23 Jul 2020 10:20:48 -0700] rev 45286
formatter: inline a variable assigned from `templater.templater.frommapfile`
The variable doesn't get reused and it doesn't help formatting, so I
don't see any reason for it.
Differential Revision: https://phab.mercurial-scm.org/D8807
Martin von Zweigbergk <martinvonz@google.com> [Wed, 22 Jul 2020 21:23:46 -0700] rev 45285
templater: don't normalize path separators to '/' when interacting with OS
`_readmapfile()` is about reading a map file from the file system, so
we shouldn't use our `util.normpath()`, which also normalizes `os.sep`
to '/'.
Differential Revision: https://phab.mercurial-scm.org/D8806
Martin von Zweigbergk <martinvonz@google.com> [Thu, 23 Jul 2020 22:50:20 -0700] rev 45284
formatter: remove now-unnecessary check for file-ness
`templater.templatepath()` now returns non-`None` only for files, so
the caller doesn't have to check.
Differential Revision: https://phab.mercurial-scm.org/D8805
Martin von Zweigbergk <martinvonz@google.com> [Thu, 23 Jul 2020 22:47:55 -0700] rev 45283
templater: make templatepath() not return directory paths
The previous patch added a test showing an unusal error message. This
make it more like other error messages.
Differential Revision: https://phab.mercurial-scm.org/D8804
Martin von Zweigbergk <martinvonz@google.com> [Thu, 23 Jul 2020 22:44:18 -0700] rev 45282
tests: show unusual error message for `hg log --style coal`
It turns out that we show the full path when the given style name
matches a subdirectory of `mercurial/templates/`.
Differential Revision: https://phab.mercurial-scm.org/D8803
Martin von Zweigbergk <martinvonz@google.com> [Wed, 22 Jul 2020 10:34:24 -0700] rev 45281
config: remove now-unused `abs` argument from `include` callback
Differential Revision: https://phab.mercurial-scm.org/D8796
Martin von Zweigbergk <martinvonz@google.com> [Wed, 22 Jul 2020 10:32:28 -0700] rev 45280
config: re-calculate absolute %include path in `include` callback
This removes the last user of the `abs` argument for the `include`
callback. The next patch will remove the argument.
Differential Revision: https://phab.mercurial-scm.org/D8795
Martin von Zweigbergk <martinvonz@google.com> [Wed, 22 Jul 2020 10:25:28 -0700] rev 45279
subrepoutil: use relative path for looking up config `%include`s
The code was already working with relative paths in practice, since it
passed in a (repo-)relative path into its local `read()` function. So
all that this patch actually does is to switch to rename variables so
we use the same path by a different name. This gets us closer to
removing the "absolute" path from the `include` callback.
Differential Revision: https://phab.mercurial-scm.org/D8794
Martin von Zweigbergk <martinvonz@google.com> [Wed, 22 Jul 2020 00:13:02 -0700] rev 45278
config: remove now-unused support for "includepaths"
This effectively undoes 081b08e4ea13 (templater: look for mapfiles in
template paths, 2015-05-15).
Differential Revision: https://phab.mercurial-scm.org/D8793
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 25 Jul 2020 15:37:05 +0200] rev 45277
commitctx: gather more code dealing with copy-in-extra
Now that we have a function that deal with the copy-in-extra special case, we
can gather more code meant to deal with this special case. Making the rest of
the code simpler.
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 25 Jul 2020 15:33:45 +0200] rev 45276
commitctx: rename files to touched in a couple of place
This is a clearer word that we will use increasingly over this series. It also
make the old variable name available to another usage :-)
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 25 Jul 2020 15:13:25 +0200] rev 45275
commitctx: extract copy information encoding into extra into commit.py
The encoding of copy information into extra has multiple subcases and become
quite complicated (eg: empty list can be explicitly or implicitly stored for
example). In addition, it is niche experimental feature since as it affect the
hash, it is only suitable for user who don't mercurial for storage server side
(ie: Google).
Having this complexity part of the changelog will get in the way of further
cleanup. We could have to either move more of that logic into the changelog or
to move or extract more of the logic at the higher level. We take the second
approach and start gather logic in dedicated function in commit.py.
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 25 Jul 2020 14:59:55 +0200] rev 45274
commitctx: create the new extra dict on its own line
A trivial move to make the next changeset easier to read.
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Jul 2020 15:40:13 +0200] rev 45273
commitctx: explicitly pass `manifest` to _commit_manifest
As pointed out by Yuya Nishihara.
Ian Moody <moz-ian@perix.co.uk> [Thu, 30 Jul 2020 16:58:38 +0100] rev 45272
phabricator: unconditionally pop `test_vcr` to fix debugcallconduit
11592ce6a711 / D8525 accidentally broke debugcallconduit in non-test scenarios
because it stopped popping `test_vcr` from `kwargs` unconditionally, so when
`--test-vcr` isn't set the empty string still gets passed down as the value of
`test_vcr` in `kwargs`. However unlike all the other commands debugcallconduit
doesn't have an `**opts` argument to receive it, so it aborts because of
invalid arguments.
Differential Revision: https://phab.mercurial-scm.org/D8852
Ian Moody <moz-ian@perix.co.uk> [Thu, 30 Jul 2020 16:52:12 +0100] rev 45271
phabricator: demonstrate debugcallconduit being broken without --test-vcr
This was accidentally broken by 11592ce6a711 / D8525
Differential Revision: https://phab.mercurial-scm.org/D8851
Martin von Zweigbergk <martinvonz@google.com> [Tue, 28 Jul 2020 11:11:14 -0700] rev 45270
cleanup: fix bad formatting of state.py from D8811
`test-check-format.t` was failing for me. Do I just have the wrong
version?
Differential Revision: https://phab.mercurial-scm.org/D8841
Joerg Sonnenberger <joerg@bec.de> [Thu, 30 Jul 2020 16:13:17 +0200] rev 45269
dirstate: restore original estimation and update comment
The former comment didn't reflect the content of the dirstate entries,
the two nodes are a fixed header in the file and not per-entry. Split
the documented entry into the path part and the fixed header. The
heuristic itself is still valid, e.g. for the NetBSD src tree a maximum
path size of 142 and an average of 49, resulting in 66 bytes per entry
on average.
Differential Revision: https://phab.mercurial-scm.org/D8850
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 31 Jul 2020 17:09:31 +0530] rev 45268
merge stable in default
Joerg Sonnenberger <joerg@bec.de> [Thu, 30 Jul 2020 01:10:10 +0200] rev 45267
dirstate: revert change to Rust binding
The Rust binding uses its own class and is not derived from the regular
implementation. As such, it didn't get _nodelen.
Differential Revision: https://phab.mercurial-scm.org/D8849
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 23 Jul 2020 23:52:31 +0200] rev 45266
commitctx: extract all the file preparation logic in a new function
Before we actually start to create a new commit we have a large block of logic
that do the necessary file and manifest commit and that determine which files
are been affected by the commit (and how).
This is a complex process on its own. It return a "simple" output that can be
fed to the next step. The output itself is not that simple as we return a lot of
individual items (files, added, removed, ...). My next step (and actual goal for
this cleanup) will be to simplify the return by returning a richer object that
will be more suited for the variation of data we want to store.
After this changeset the `commitctx` is a collection of smaller function with
limited scope. The largest one is still `_filecommit` without about 100 lines of
code.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 23 Jul 2020 23:58:23 +0200] rev 45265
commitctx: gather more preparation code within the lock context
This is a small change that exist mostly for clarification. I am about to move a
large amount of code in its own function. having all that code next to each
other will make the next changeset clearer.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 23 Jul 2020 23:40:59 +0200] rev 45264
commitctx: move a special case about files earlier
Same logic as a changeset a bit earlier, the `writefilecopymeta` section is more
a post processing details so we move the conditional about `files` value closer
to the rest of the code computing `files` value.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 23 Jul 2020 18:25:45 +0200] rev 45263
commitctx: extract all the manual logic to process the files
That branch of the if is significantly more complicated than the other two.
Moving it to its own function make it simple to keep the scope limited and to
read to the higher level function.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 23 Jul 2020 23:08:00 +0200] rev 45262
commitctx: treat `filesadded` more like `filesremoved`
Accumulating the filename in a list will have a negligible cost and deal with
the list of added files like the other ones will make is code cleaning simpler.
The two variable with very close name is not great, but my plan is to split most
of the code in a separated function which will make the "problem" go away by
itself.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 23 Jul 2020 22:58:29 +0200] rev 45261
commitctx: move `writechangesetcopy` business at the end a code section
This code is to handle a specific subcase so we move it a the end. This allow
to gather the rest of the "core" code closer to the related logic.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 23 Jul 2020 21:09:42 +0200] rev 45260
commitctx: move copy meta config reading in a dedicated function
The logic is non trivial, make it contained in a function is clearer. It also
unlock easy re-use of that logic without having the pass the value around.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 23 Jul 2020 21:03:30 +0200] rev 45259
commitctx: no longer use the `writecopiesto` variable in the function
The `writefilecopymeta` variable already carry the same information, so we can
use `writefilecopymeta` in the one conditional where `writecopiesto` was used.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 23 Jul 2020 14:58:21 +0200] rev 45258
commitctx: extract the function that commit a new manifest
The logic is large enough and isolated enough to be extracted, this reduce the
size of the main function, making it simpler to follow.
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 24 Jul 2020 12:52:32 +0200] rev 45257
commitctx: stop using weakref proxy for transaction
This weakref proxy was introduced in 2007 by 30d4d8985dd8.
If I understand it correctly, the logic at that time was relying on the
transaction destructor, triggered at garbage collection time to rollback failed
transaction. passing the object to sub function directly mean it would live in
the function scope and be trapped in the traceback on exception, leading to the
transaction rollback too late in some case.
Modern transaction usage use explicit opening and closing of transaction and no
longer rely on some internal reference counting details. So this weakref proxy
is no longer necessary. Absolutely no test are affected when we drop it.
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 22 Jul 2020 16:10:33 +0200] rev 45256
commitctx: document the None return for "touched" value
Martin von Zweigbergk <martinvonz@google.com> [Thu, 23 Jul 2020 22:06:36 -0700] rev 45255
tests: add tests trying to use dir as style, as %include, and as __base__
Differential Revision: https://phab.mercurial-scm.org/D8800
Martin von Zweigbergk <martinvonz@google.com> [Thu, 23 Jul 2020 22:06:31 -0700] rev 45254
tests: fix mistaken copy&paste from commit 4489e9a22763
Differential Revision: https://phab.mercurial-scm.org/D8802
Joerg Sonnenberger <joerg@bec.de> [Mon, 06 Jul 2020 15:10:53 +0200] rev 45253
manifest: kill one more instance of the old merge hash hack
Differential Revision: https://phab.mercurial-scm.org/D8766
Joerg Sonnenberger <joerg@bec.de> [Sat, 25 Jul 2020 04:29:17 +0200] rev 45252
dirstate: isolate node len dependency for the pure version
When switching to a 256bit hash function, this still needs adjustment,
but concentrates the change in one place.
Differential Revision: https://phab.mercurial-scm.org/D8815
Martin von Zweigbergk <martinvonz@google.com> [Fri, 24 Jul 2020 08:38:19 -0700] rev 45251
fix: update documentation to reflect preference for --source over --rev
I should have updated the documentation in 5205b46bd887 (fix: add a -s
option to format a revision and its descendants, 2020-03-13) and/or
a6ef1e8e2f6d (fix: mark -r as advanced, 2020-03-13)...
Differential Revision: https://phab.mercurial-scm.org/D8808
Kyle Lippincott <spectral@google.com> [Fri, 24 Jul 2020 16:32:45 -0700] rev 45250
tests: make check-py3-compat.py actually load the specified files correctly
For most uses, this change is essentially a no-op, as this script is generally
only run by test-check-py3-compat.t, which will already put `$TESTDIR/..` in
`$PYTHONPATH`.
When running outside of tests, however, `$PYTHONPATH` is likely not set, causing
check-py3-compat.py to parse the file from the repo, but then import the
installed version, and raise any errors about the installed version, not the one
currently in the repo.
Additionally, this helps users (like me) who have a strange set up where their
home directory (and thus their hg repos) happen to be in a subdirectory of
sys.prefix (which is /usr on my system). Since the '.' entry added to sys.path
takes precedence over the absolute path of `$TESTDIR/..` in `$PYTHONPATH`, the
path to the modules that it imports (and that show up in any stack trace) are
*relative*, meaning that we don't detect them as starting with `sys.prefix`.
Sample non-test invocation, and the difference this change makes (the path for
'error at <path>:<line>' is correct now)::
Before:
```
$ python3 contrib/check-py3-compat.py mercurial/win*.py
mercurial/win32.py: error importing: <ValueError> _type_ 'v' not supported (error at check-py3-compat.py:65)
mercurial/windows.py: error importing: <ModuleNotFoundError> No module named 'msvcrt' (error at check-py3-compat.py:65)
```
After:
```
$ python3 contrib/check-py3-compat.py mercurial/win*.py
mercurial/win32.py: error importing: <ValueError> _type_ 'v' not supported (error at win32.py:11)
mercurial/windows.py: error importing: <ModuleNotFoundError> No module named 'msvcrt' (error at windows.py:12)
```
Differential Revision: https://phab.mercurial-scm.org/D8814
Kyle Lippincott <spectral@google.com> [Fri, 24 Jul 2020 12:13:10 -0700] rev 45249
tests: virtualenv is only used on py2, rename and conditionalize
If I have I have the Debian `python3-virtualenv` package installed on my
machine, the import succeeds but then I receive an AttributeError because the
package is essentially completely different between py2 and py3, and
test-hghave fails.
Differential Revision: https://phab.mercurial-scm.org/D8812
Kyle Lippincott <spectral@google.com> [Thu, 23 Jul 2020 13:31:45 -0700] rev 45248
morestatus: mention --stop even if not using --verbose
Differential Revision: https://phab.mercurial-scm.org/D8811
Martin von Zweigbergk <martinvonz@google.com> [Fri, 24 Jul 2020 11:24:59 -0700] rev 45247
templater: handle None returned from templatedir()
My recent 91aa9bba3dc9 (templater: make templatepaths() return a
single path, or None, 2020-07-21) didn't account for the fact that
`templatedir()` returns `None` in frozen binaries. That is ironic,
since the reason I'm working on this is to add support for built-in
mapfiles in frozen binaries. This patch updates the callers to handle
the `None` case. It's somewhat ugly, but I will have to revisit this
soon anyway, since my goal is to make all callers handle that case by
trying to read the map file using the resources API instead.
Differential Revision: https://phab.mercurial-scm.org/D8810
Martin von Zweigbergk <martinvonz@google.com> [Wed, 22 Jul 2020 00:09:17 -0700] rev 45246
templater: do search for include of unqualified builtin outside of config code
Commit 081b08e4ea13 (templater: look for mapfiles in template paths,
2015-05-15) added support for using things like `%include
map-cmdline.default` to include built-in map files without using a
valid path to them. This patch rewrites that support by moving it into
`_readmapfile()` so it can later be adapted for reading from a
non-file resource.
Differential Revision: https://phab.mercurial-scm.org/D8792
Martin von Zweigbergk <martinvonz@google.com> [Tue, 21 Jul 2020 21:59:12 -0700] rev 45245
templater: switch to lower-level config.parse() in _readmapfile()
I hope to modify this code to also work with resources loaded from
memory (for PyOxidizer support). For that, we'll need to handle the
lookup of relative `%include` path (not joined with the base directory
of the containing file). This patch prepares for that by using
`config.parse()` instead of `config.read()`, since the latter expects
a file in the file system.
As it happens, this change also lets us clean up the `config` class to
not need the `_includepaths` field. That will happen next.
Differential Revision: https://phab.mercurial-scm.org/D8791