Matt Harbison <matt_harbison@yahoo.com> [Fri, 28 Nov 2014 14:21:02 -0500] rev 23658
largefiles: eliminate a duplicate message when removing files in verbose mode
There is no --after for addremove, so the printing for addremove can be hoisted
out of the 'not after' check. The difference between the two remove messages
reflects the existing difference between core remove and core addremove styles
for printing the file.
There are still some pre-existing issues here. Core addremove only prints on
inexact matches or when verbose. But since the largefiles that are being
removed are passed to removelargefiles() as a pattern list, there is never an
inexact match, which would keep the largefiles from being printed at all unless
verbose is specified. Therefore, the output is a little more aggressive than
core. The addremove print style here is also inconsistent with core- it should
use matcher.uipath(f) instead of f. These can be fixed once a matcher is passed
in.
Matt Harbison <matt_harbison@yahoo.com> [Wed, 17 Dec 2014 21:51:09 -0500] rev 23657
largefiles: ensure that the standin files are available in getlfilestoupload()
The function only adds the hash content of the file to the set to upload if the
file in the ctx is a standin. It is called by overrides.summaryremotehook(),
which is called in the summary method. The largefiles extension switches
'lfstatus' on in summary, so the standins shouldn't be visible when obtaining a
context there.
The reason this wasn't noticed before is that the 'lfstatus' attribute is only
being set on the unfiltered repo because of how repoview delegates attribute
assignment. Therefore any filtered view will return a context containing
standins, whether or not 'lfstatus' was set in the various overrides methods.
That will be fixed in the next patch. But without this change, the next patch
would have test failures for 'summary --large' stating there are no files to
upload.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 18 Dec 2014 09:22:09 -0800] rev 23656
merge: move checking of unknown files out of manifestmerge()
This moves most reading of filelogs out of manifestmerge, making it
easy for a narrow clone extension to filter out or translate unwanted
actions before any filelogs are read. The only call left is inside of
copies.mergecopies(), which can be overridden separately at a lower
level.
Martin von Zweigbergk <martinvonz@google.com> [Sat, 13 Dec 2014 23:52:22 -0800] rev 23655
merge: extract method for checking for conflicting untracked file
Now that the functionality is collected in one place, let's extract it
to a method.
Martin von Zweigbergk <martinvonz@google.com> [Mon, 15 Dec 2014 16:45:19 -0800] rev 23654
merge: create 'cm' action for 'get or merge' case
We still have one case of a call to _checkunknownfile() in
manifestmerge(): when force=True and branchmerge=True and the remote
side has a file that the local side doesn't. This combination of
arguments is used by 'hg merge --force', but also by rebase and
unshelve. In this scenario, we try to create the file from the
contents from the remote, but if there is already a local untracked
file in place, we merge it instead.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 12 Dec 2014 23:18:36 -0800] rev 23653
merge: don't overwrite untracked file at directory rename target
When a directory was renamed and a new untracked file was added in the
new directory and the remote directory added a file by the same name
in the old directory, the local untracked file gets overwritten, as
demonstrated by the broken test case in test-rename-dir-merge.
Fix by checking for unknown files for 'dg' actions too. Since
_checkunknownfile() currently expects the same filename in both
contexts, we need to add a new parameter for the remote filename to
it.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 18 Nov 2014 20:29:25 -0800] rev 23652
merge: remove constant tuple element from 'aborts'
The second element of the tuples in the 'aborts' list is always 'ud',
so let's remove it.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 19 Nov 2014 11:51:31 -0800] rev 23651
merge: collect checking for unknown files at end of manifestmerge()
The 'c' and 'dc' actions include creating a file on disk and we need
to check that no conflicting file exists unless force=True. Move two
of the calls to _checkunknownfile() to a single place at the end of
manifestmerge(). This removes some of the reading of filelogs from the
heart of manifestmerge() and collects it in one place close to where
its output (entries in the 'aborts' list) is used.
Note that this removes the unnecessary call to _checkunknownfile()
when force=True in one of the code paths.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 19 Nov 2014 11:48:30 -0800] rev 23650
merge: introduce 'c' action like 'g', but with additional safety
_checkunknownfile() reads the filelog of the remote side's file. For
narrow clones, the filelog will not exist for all files and we need a
way to avoid reading them. While it would be easier for the narrow
extension to just override _checkunknownfile() and make it ignore
files outside the narrow clone, it seems cleaner to have
manifestmerge() not care about filelogs (considering its
name).
In order to move the calls to _checkunknownfile() out, we need to be
able to tell in which cases we should check for unknown files. Let's
start by introducing a new action distinct from 'g' for this
purpose. Specifically, the new action will be just like 'g' except
that it will check that for conflicting unknown files first. For now,
just add the new action type and convert it to 'g'.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 19 Nov 2014 11:44:00 -0800] rev 23649
merge: structure 'remote created' code to match table
This does duplicate the call to _checkunknownfile(), but it will
simplify future patches.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 22 Dec 2014 15:48:39 -0800] rev 23648
pushkey: run hook after the lock release
The pushkey operation used to be in its own wireprotocol command and (in
practice) always be lock free when running the hook. With bundle2, it happen in
a greater scheme and a hook running locking command would get stuck. We now run
such hooks after the lock release as similar hook do.
Bundle2 test are altered to ensure we are lockfree at hook running time.
Siddharth Agarwal <sid0@fb.com> [Fri, 12 Dec 2014 15:31:28 -0800] rev 23647
setup: use changes since latest tag instead of just distance
For a Mercurial built on the merge from stable into default right after 3.2.2
was released --
19ebd2f88fc7 -- the version number produced was "3.2.2+4". This
is potentially misleading, since in reality the built Mercurial includes many
more changes compared to 3.2.2.
Change the versioning scheme so that we take into consideration all the changes
present in the current revision that aren't present in the latest tag. For
19ebd2f88fc7 the new versioning scheme results in a version number of
"3.2.2+256". This gives users a much better idea of how many changes have
actually happened since the latest release.
Since changessincelatesttag is always greater than or equal to the
latesttagdistance, this will produce version numbers that are always greater
than or equal to the old scheme. Thus there's minimal compatibility risk.
Siddharth Agarwal <sid0@fb.com> [Fri, 12 Dec 2014 15:29:39 -0800] rev 23646
setup: use changessincelatesttag from archive if present
changessincelatesttag gives one a better idea of how much the code has changed
since. Since changessincelatesttag is always greater than or equal to the
latesttagdistance (see previous patch for why), this will always produce
version numbers greater than or equal to the previous scheme.
Siddharth Agarwal <sid0@fb.com> [Fri, 12 Dec 2014 15:27:13 -0800] rev 23645
archive: store number of changes since latest tag as well
This is different from latesttagdistance in that while latesttagdistance is
defined to be the length of the longest path to the latest tag,
changessincelatesttag is the number of changes contained in @ that aren't
contained in the latest tag. So, if 't' is the latest tag in the repository
below:
t
|
v
--o--o----o
\ \
..o..o..@
then latesttagdistance is 2, but changessincelatesttag is 4.
Note that changessincelatesttag is always greater than or equal to the
latesttagdistance -- that's because changessincelatesttag counts all the
changes in the longest path since the latest tag, and possibly others. This is
an important fact that we'll take advantage of in upcoming patches.
Matt Mackall <mpm@selenic.com> [Mon, 22 Dec 2014 17:26:21 -0600] rev 23644
merge with stable
Augie Fackler <raf@durin42.com> [Mon, 22 Dec 2014 17:27:31 -0500] rev 23643
demandimport: blacklist distutils.msvc9compiler (
issue4475)
This module depends on _winreg, which is windows-only. Recent versions
of setuptools load distutils.msvc9compiler and expect it to
ImportError immediately when on non-Windows platforms, so we need to
let them do that. This breaks in an especially mystifying way, because
setuptools uses vars() on the imported module. We then throw an
exception, which vars doesn't pick up on well. For example:
In [3]: class wat(object):
...: @property
...: def __dict__(self):
...: assert False
...:
In [4]: vars(wat())
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-
2781ada5ffe6> in <module>()
----> 1 vars(wat())
TypeError: vars() argument must have __dict__ attribute
Which is similar to the problem we run into.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 11 Dec 2014 22:51:29 -0800] rev 23642
largefiles: don't duplicate 'actions' into 'actionbyfile'
Martin von Zweigbergk <martinvonz@google.com> [Thu, 11 Dec 2014 22:07:41 -0800] rev 23641
merge: make calculateupdates() return file->action dict
This simplifies largefiles' overridecalculateupdates(), which no
longer has to do the conversion it started doing in
38e55e55ae4d
(largefiles: rewrite merge code using dictionary with entry per file,
2014-12-09).
To keep this patch small, we'll leave the name 'actionbyfile' in
overrides.py. It will be renamed in the next patch.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 11 Dec 2014 21:58:49 -0800] rev 23640
merge: let _forgetremoved() work on the file->action dict
By moving the conversion from the file->action dict after
_forgetremoved(), we make that method shorter by removing the need for
the confusing 'xactions' variable.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 11 Dec 2014 21:06:16 -0800] rev 23639
merge: let _resolvetrivial() work on the file->action dict
By moving the conversion from the file->action dict after
_resolvetrivial(), we greatly simplify and clarify that method.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 11 Dec 2014 20:56:53 -0800] rev 23638
merge: let bid merge work on the file->action dict
By moving the conversion from the file->action dict after the bid
merge code, bid merge can be simplified a little.
A few tests are affected by this change. Where we used to iterate over
the actions first in order of the action type ('g', 'r', etc.) [1], we
now iterate in order of filename. This difference affects the order of
debug log statements.
[1] And then in the non-deterministic order of files in the manifest
dictionary (the order returned from manifest.diff()).
Martin von Zweigbergk <martinvonz@google.com> [Mon, 08 Dec 2014 13:24:10 -0800] rev 23637
merge: write manifestmerge() using dictionary with entry per file
In the same vein as
38e55e55ae4d (largefiles: rewrite merge code using
dictionary with entry per file, 2014-12-09), rewrite manifestmerge()
itself as dictionary with the filename as key. This will let us
simplify some of the other code in merge.py and eventually drop the
conversion in the largefiles code.
No difference in speed could be detected (well within the noise level
when run in Mozilla repo).
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Dec 2014 12:21:07 -0800] rev 23636
repoview: backout
ced3ecfc2e57
Monkey patching repoview does not really work and making it really work will
be really hard. So we better have it broken without complexity than broken with
extra complexity.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Dec 2014 12:19:33 -0800] rev 23635
largefile: explain why no monkey patching on a repoview
The comment requested for investigations, here they are.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Dec 2014 12:10:16 -0800] rev 23634
largefile: backout
ca54fb3d71ce
The hack for method monkey patching on repoview has been ruled out as
fragile, so we are rolling it back. We'll expand the explanation in the next
changeset.
Eric Sumner <ericsumner@fb.com> [Thu, 18 Dec 2014 12:33:17 -0800] rev 23633
incoming: handle phases the same as pull
Now that bundlerepo can move phases safely, 'hg incoming' can share its phase
handling code with pull to better reflect what would actually show up.
Eric Sumner <ericsumner@fb.com> [Thu, 18 Dec 2014 12:22:43 -0800] rev 23632
bundlerepo: retract phase boundary
This patch makes bundrepo retract the phase boundary for new commits to 'draft'
status, which is consistent with the behavior of 'hg unbundle'. The old
behavior was for commits to appear with the same phase as their nearest
ancestor in the base repository.
This affects several classes of operation:
* Inspecting a bundle with the -B flag
* Treating a bundle file as a peer (old: everything public, new: everything draft)
* Incoming command (neither old or new behavior is sensible -- fixed in next patch)
Eric Sumner <ericsumner@fb.com> [Thu, 18 Dec 2014 11:38:48 -0800] rev 23631
bundlerepo: implement safe phasecache
This patch makes bundlerepo use a subclass of phasecache that will allow phase
boundaries to be moved around, but will never write them to the underlying
repository.
Eric Sumner <ericsumner@fb.com> [Thu, 18 Dec 2014 11:30:10 -0800] rev 23630
localrepo.__getitem__: add slicing support
This allows the python slice syntax to be used with revision numbers when
indexing into a repository, such as repo[8:]
Siddharth Agarwal <sid0@fb.com> [Tue, 16 Dec 2014 14:34:53 -0800] rev 23629
ignore: resolve ignore files relative to repo root (
issue4473) (BC)
Previously these would be considered to be relative to the current working
directory. That behavior is both undocumented and doesn't really make sense.
There are two reasonable options for how to resolve relative paths:
- relative to the repo root
- relative to the config file
Resolving these files relative to the repo root matches existing behavior with
hooks. An earlier discussion about this is available at
http://mercurial.markmail.org/thread/tvu7yhzsiywgkjzl.
Thanks to Isaac Jurado <diptongo@gmail.com> for the initial patchset that
spurred the discussion.
Siddharth Agarwal <sid0@fb.com> [Wed, 17 Dec 2014 18:53:38 -0800] rev 23628
test-hgignore: add testing for ui.ignore
I couldn't find any tests for this, and we're going to make changes here in
upcoming patches.
Matt Harbison <matt_harbison@yahoo.com> [Wed, 10 Dec 2014 22:09:46 -0500] rev 23627
tests: add missing globs for Windows
I couldn't figure out how to glob the first chunk for Windows, so it's been
conditionalized.
Matt Harbison <matt_harbison@yahoo.com> [Thu, 18 Dec 2014 23:24:17 -0500] rev 23626
share: use the 'sharedpath' attr on repo instead of reloading from the file
Seems like a useful optimization, and now the exact file content is not a
concern.
Matt Harbison <matt_harbison@yahoo.com> [Thu, 18 Dec 2014 23:16:37 -0500] rev 23625
share: fix source repo lookup on Windows
The stored path contains platform specific separators, so splitting on '/.hg'
returned the string unmodified on Windows. The source was then looked for in
$source/.hg/.hg, which obviously fails. This caused cascading errors in
test-share.t relating to the recent bookmark support.
Chingis Dugarzhapov <chingis.dug@gmail.com> [Mon, 22 Dec 2014 03:20:50 +0100] rev 23624
help: suggest '-v -e' to get built-in aliases for extensions (
issue4461)
If extension name matches one of command names, suggest user to type
'hg help -v -e <extension>' to get full list of built-in aliases
Martin von Zweigbergk <martinvonz@google.com> [Thu, 18 Dec 2014 10:11:38 -0800] rev 23623
test-check-commit-hg: clarify misleading "commit message rules" error
The test case doesn't only check the commit message, but also the
patch, which can result in confusing output like
+ Revision
df6f06d17100 does not comply to commit message rules
+ ------------------------------------------------------
+ 32: adds double empty line
+
+
even when there are no double blank lines in the commit message. Drop
the "commit message" part to make it less confusing.
Christian Ebert <blacktrash@gmx.net> [Sun, 21 Dec 2014 13:02:59 +0000] rev 23622
keyword: handle resolve to either parent
Merged files are considered modified at commit time even if only 1 parent
differs. In this case we must use the change context of this parent for
expansion.
The issue went unnoticed for long because it is only apparent until the next
update to the merge revision - except in test-keyword where it was always
staring us in the face.
Christian Ebert <blacktrash@gmx.net> [Sun, 21 Dec 2014 12:53:57 +0000] rev 23621
keyword: update test file syntax
Matt Mackall <mpm@selenic.com> [Mon, 22 Dec 2014 14:49:05 -0600] rev 23620
branches: deprecate -a
Matt Harbison <matt_harbison@yahoo.com> [Sun, 21 Dec 2014 15:06:54 -0500] rev 23619
largefiles: fix a spurious missing file warning with forget (
issue4053)
If an uncommitted and deleted file was forgotten, a warning would be emitted,
even though the operation was successful. See the previous patch for
'remove -A' for the exact circumstances, and details about the cause.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 21 Dec 2014 15:04:13 -0500] rev 23618
largefiles: fix a spurious missing file warning with 'remove -A' (
issue4053)
The bug report doesn't mention largefiles, but the given recipe doesn't fail
unless the largefiles extension is loaded. The problem only affected normal
files, whether or not any largefiles are committed, and only files that have
not been committed yet. (Files with an 'a' state are dropped from dirstate,
not marked removed.) Further, if the named normal file never existed, the
warning would be printed out twice.
The problem is that the core implementation of remove() calls repo.status(),
which eventually triggers a dirstate.walk(). When the file isn't seen in the
filesystem during the walk, the exception handling finds the file in
dirstate, so it doesn't complain. However, the largefiles implementation
called status() again with all of the original files (including the normal
ones, just dropped). This time, the exception handler doesn't find the file
in dirstate and does complain. This simply excludes the normal files from
the second repo.status() call, which the largefiles extension has no interest
is processing anyway.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 21 Dec 2014 14:42:46 -0500] rev 23617
largefiles: introduce the 'composelargefilematcher()' method
This is a copy/paste (with the necessary tweaks) of the composenormalfilematcher
method currently on default, which does the inverse- this trims the normal files
out of the matcher. It will be used in the next patch.
Durham Goode <durham@fb.com> [Thu, 18 Dec 2014 09:37:14 -0800] rev 23616
context: return dirstate parents in workingctx.ancestors()
workingctx.ancestors() was not returning the dirstate parents as part of the
result set. The only place this function is used is for copy detection when
committing a file, and that code already checks the parents manually, so this
change has no affect at the moment.
I found it while playing around with changing how copy detection works.
Mateusz Kwapich <mitrandir@fb.com> [Wed, 17 Dec 2014 17:26:12 -0800] rev 23615
backout: add --commit option
Mercurial backout command makes a commmit by default only when the backed out
revision is the parent of working directory and doesn't commit in any other
case.
The --commit option changes behaviour of backout to make a commit whenever
possible (i.e. there is no unresolved conflicts). This behaviour seems more
intuitive to many use (especially git users migrating to hg).
Ryan McElroy <rmcelroy@fb.com> [Sat, 13 Dec 2014 11:32:46 -0800] rev 23614
share: add option to share bookmarks
This patch adds the -B/--bookmarks option to the share command added by the
share extension. All it does for now is create a marker, 'bookmarks.shared',
that will be used by future code to implement the sharing functionality.
Matt Mackall <mpm@selenic.com> [Wed, 17 Dec 2014 13:25:24 -0600] rev 23613
highlight: ignore Unicode's extra linebreaks (
issue4291)
Unicode and Python's unicode.splitlines() treat several extra legacy
ASCII codepoints as linebreaks, even though the vast bulk of computing
and Python's own str.splitlines() do not. Rather than introduce line
numbering confusion, we filter them out when highlighting.
André Sintzoff <andre.sintzoff@gmail.com> [Thu, 18 Dec 2014 21:53:55 +0100] rev 23612
test: fix typo in test-help.t
Sean Farley <sean.michael.farley@gmail.com> [Mon, 15 Dec 2014 09:40:02 -0800] rev 23611
templatekw: remove unneeded showtags
Now that we have the machinery of namespaces in-place, we use that instead of
hand-rolling our own template function.
Note, this can only be used for tags because both branches and bookmarks have
special case logic for 'default' and the current bookmark (which is something
outside the namespace api for now).
Sean Farley <sean.michael.farley@gmail.com> [Thu, 16 Oct 2014 23:19:09 -0700] rev 23610
namespaces: generate template keyword when registering a namespace
For any namespace, we generate a template keyword. For example, given a
namespace 'babar', we automatically have the ability to use it in a template:
hg log -r . -T '{babars % "King: {babar}\n"}'
Furthermore, we only generate this keyword for a namespace if one doesn't
already exist. This is necessary for 'branches' and 'bookmarks' since both of
those have concepts of 'current' (something outside the namespace api) and also
allows extensions to override default behavior if desired.
Sean Farley <sean.michael.farley@gmail.com> [Sun, 14 Dec 2014 19:15:37 -0800] rev 23609
templatekw: add helper method to generate a template keyword for a namespace
This marks our second feature of the namespace api: automatic template keyword.
This patch adds a method that takes in a namespace and uses the node-to-name
map to output the list of names.
Sean Farley <sean.michael.farley@gmail.com> [Sun, 14 Dec 2014 18:54:50 -0800] rev 23608
namespaces: add names method to return list of names for a given node
In the previous patch, we added a node-to-name map property. This patch just
exposes that interface to the api.
Sean Farley <sean.michael.farley@gmail.com> [Mon, 15 Dec 2014 00:24:23 -0800] rev 23607
namespaces: add nodemap property
This patch adds a node-to-name map property to the namespace. This is necessary
because we cannot simply invert the name-to-node map because we do not assume
the name-to-node map to be unique (for example, consider named branches: many
nodes have one branch name).
The node-to-name is helpful in log commands where we are already iterating over
a set of nodes and want to display some kind of naming information to the user.
Sean Farley <sean.michael.farley@gmail.com> [Sun, 14 Dec 2014 19:12:27 -0800] rev 23606
namespaces: add method to get template name of namespace
This patch adds the public api for getting the template name of a namespace so
that the next patch can use it to generate a template keyword automatically.
Sean Farley <sean.michael.farley@gmail.com> [Mon, 15 Dec 2014 00:09:52 -0800] rev 23605
namespaces: add template name of a namespace
The template name property will be used in upcoming patches to automatically
generate a template keyword. For example, given a namespace called 'babars', we
will automatically generate a template keyword 'babar' such that we can use it
in the following way,
$ hg log -r . -T '{babars % "King: {babar}\n"}'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 19 Dec 2014 00:11:56 +0900] rev 23604
memctx: remove redundant test for
issue4470 from test-commit.t
Because:
- the test to avoid regression for
issue4470 was already added to
test-commit-amend.t by previous patch
It is also a part of test series about manifest calculation issues
of memctx in test-commit-amend.t.
- this is the only test using "commit --amend" in test-commit.t
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 19 Dec 2014 00:11:56 +0900] rev 23603
memctx: calculate manifest more efficiently
Before this patch, "memctx._manifest" updates all entries in the
(parent) manifest. But this is inefficiency, because almost all files
may be clean in that context.
On the other hand, just updating entries for changed "files" specified
at construction causes unexpected abortion, when there is at least one
newly removed file (see
issue4470 for detail).
To calculate manifest more efficiently, this patch replaces
"pman.iteritems()" for the loop by "self._status.modified" to avoid
updating entries for clean or removed files
Examination of removal is also omitted, because removed files aren't
treated in this loop (= "self[f]" returns not None always).
Matt Mackall <mpm@selenic.com> [Thu, 18 Dec 2014 16:41:59 -0600] rev 23602
merge with stable
Matt Mackall <mpm@selenic.com> [Thu, 18 Dec 2014 14:59:28 -0600] rev 23601
Added signature for changeset
6dad422ecc5a
Matt Mackall <mpm@selenic.com> [Thu, 18 Dec 2014 14:59:23 -0600] rev 23600
Added tag 3.2.3 for changeset
6dad422ecc5a
Matt Mackall <mpm@selenic.com> [Thu, 18 Dec 2014 14:18:28 -0600] rev 23599
pathauditor: check for Windows shortname aliases
Augie Fackler <raf@durin42.com> [Tue, 16 Dec 2014 13:08:17 -0500] rev 23598
pathauditor: check for codepoints ignored on OS X
Augie Fackler <raf@durin42.com> [Tue, 16 Dec 2014 13:07:10 -0500] rev 23597
darwin: omit ignorable codepoints when normcase()ing a file path
This lets us avoid some nasty case collision problems in OS X with
invisible codepoints.
Augie Fackler <raf@durin42.com> [Tue, 16 Dec 2014 13:06:41 -0500] rev 23596
encoding: add hfsignoreclean to clean out HFS-ignored characters
According to Apple Technote 1150 (unavailable from Apple as far as I
can tell, but archived in several places online), HFS+ ignores sixteen
specific unicode runes when doing path normalization. We need to
handle those cases, so this function lets us efficiently strip the
offending characters from a UTF-8 encoded string (which is the only
way it seems to matter on OS X.)
Augie Fackler <raf@durin42.com> [Thu, 11 Dec 2014 15:42:49 -0500] rev 23595
test-casefolding.t: demonstrate a bug with HFS+ ignoring some codepoints
Augie Fackler <augie@google.com> [Fri, 12 Dec 2014 13:40:44 -0500] rev 23594
manifest: disallow setting the node id of an entry to None
manifest.diff() uses None as a special value to denote the absence of
a file, so setting a file node to None means you then can't trust
manifest.diff().
This should also make future manifest work slightly easier.
Augie Fackler <augie@google.com> [Fri, 12 Dec 2014 15:29:54 -0500] rev 23593
context: stop setting None for modified or added nodes
Instead use a magic value, so that we can identify modified or added
nodes correctly when using manifest.diff().
Thanks to Martin von Zweigbergk for catching that we have to update
_buildstatus as well. That part eluded my debugging for some time.
Matt Harbison <matt_harbison@yahoo.com> [Sat, 13 Dec 2014 13:33:48 -0500] rev 23592
largefiles: don't actually remove largefiles in an addremove dry run
The addlargefiles() method already properly handled dry runs.
Eric Sumner <ericsumner@fb.com> [Wed, 17 Dec 2014 15:11:26 -0800] rev 23591
bundle2: lowercase part types
Since the capitalization no longer carries any meaning (previous diff), this
patch normalizes all of the bundle2 part type strings to lower case.
Eric Sumner <ericsumner@fb.com> [Wed, 17 Dec 2014 21:14:19 -0800] rev 23590
bundle2.bundlepart: make mandatory part flag explicit in API
This makes all bundle2 parts mandatory unless they are expressly made advisory
via the keyword parameter or the bundlepart.mandatory property.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 17 Dec 2014 15:09:43 +0900] rev 23589
memctx: calculate manifest correctly with newly-removed files (
issue4470)
Before this patch, "memctx._manifest" tries to get (and use normally)
filectx also for newly-removed files, even though "memctx.filectx()"
returns None for such files.
To calculate manifest correctly even with newly-removed files, this
patch does:
- replace "man.iteritems()" for the loop by "self._status.modified"
to avoid accessing itself to newly removed files
this also reduces loop cost for large manifest.
- remove files in "self._status.removed" from the manifest
In this patch, amending is confirmed twice to examine both (1) newly
removed files and (2) ones already removed in amended revision.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 17 Dec 2014 15:09:43 +0900] rev 23588
memctx: calculate manifest including newly added files correctly
Before this patch, "memctx._manifest" calculates the manifest
according to the 1st parent. This causes the disappearance
of newly added files from the manifest.
For example, if newly added files aren't listed up in manifest of
memctx, they aren't listed up in "added" field of "status" returned by
"ctx.status()", and "{diff()}" (= "patch.diff") in "committemplate"
shows nothing for them.
To calculate manifest including newly added files correctly, this
patch puts newly added files (= ones in "self._status.added") into the
manifest.
Some details of changes for "test-commit-amend.t" in this patch:
- "touch foo" is replaced by "echo foo > foo", because newly added
empty file can't be shown in "diff()" output without "diff.git"
configuration
- amending is confirmed twice to examine both (1) newly added files
and (2) ones already added in amended revision
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 17 Dec 2014 15:09:38 +0900] rev 23587
memctx: calculate exact status being committed from specified files
Before this patch, "memctx._status" is initialized by "(files, [], [],
[], [], [], [])" and this causes "memctx.modified" to include not
only modified files but also added and removed ones incorrectly.
This patch adds "_status" method to calculate exact status being
committed according to "files" specified at construction time.
Exact "_status" is useful to share/reuse logic of committablectx.
This patch is also preparation for issues fixed by subsequent patches.
Some details of changes for tests in this patch:
- some filename lines are omitted in "test-convert-svn-encoding.t",
because they are correctly listed up as "removed" files
those lines are written out in "localrepository.commitctx" for
"modified" and "added" files by "ui.note".
- "| fixbundle" filterring in "test-histedit-fold.t" is omitted to
check lines including "added" correctly
"fixbundle" discards all lines including "added".
Eric Sumner <ericsumner@fb.com> [Fri, 12 Dec 2014 12:31:41 -0800] rev 23586
bundle2._processpart: forcing lower-case compare is no longer necessary
Encoding whether or not a part is mandatory in the capitalization of the
parttype is unintuitive and error-prone. This sequence of patches separates
these concerns in the API to reduce programmer error and pave the way for
a potential change in how this information is transmitted over the wire.
Since the parttype and mandatory bit are separated in bundle2.unbundlepart
(see previous patch), there is no longer a need to remove the mandatory bit
before working with the parttype.
Eric Sumner <ericsumner@fb.com> [Fri, 12 Dec 2014 11:26:56 -0800] rev 23585
bundle2.unbundlepart: decouple mandatory from parttype
Encoding whether or not a part is mandatory in the capitalization of the
parttype is unintuitive and error-prone. This sequence of patches separates
these concerns in the API to reduce programmer error and pave the way for
a potential change in how this information is transmitted over the wire.
This patch separates the two pieces of information when reading the part header
so that it's unnecessary to know how they were combined during transmission.
Augie Fackler <augie@google.com> [Mon, 15 Dec 2014 15:00:54 -0500] rev 23584
memctx: fix manifest for removed files (
issue4470)
filectxfn returns None for removed files, so we have to check for None
before computing the new file content hash for the manifest.
Includes a test that proves this works, by demonstrating that we can
show the diff of an amended commit in the committemplate.
Augie Fackler <raf@durin42.com> [Fri, 12 Dec 2014 15:53:17 -0500] rev 23583
convert: on svn failure, note libsvn version (
issue4043)
We have our own fast-path logic to see if something passes a sniff
test for being a Subversion repository, but it's possible for a user
to svnsync a repo using svn 1.8 and then use svn 1.7 bindings (as in
the bug) to try and convert the repo. If we at least tell the user the
version of libsvn that we used, they might get enough of a hint to
check on their own for format incompatibilities between their
svn{admin,sync} and the libsvn used by hg.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 15 Dec 2014 13:32:34 -0800] rev 23582
vfs: add a 'split' method
This method has the same behavior as the 'os.path.split' function, but having
it in vfs will allow handling of tricky encoding situations in the future.
In the same patch, we replace the use of 'os.path.split' in the transaction code.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 15 Dec 2014 13:27:46 -0800] rev 23581
vfs: add a 'reljoin' function for joining relative paths
The vfs.join method only works for absolute paths. We need something
that works for relative paths too when transforming filenames. Since
os.path.join may misbehave in tricky encoding situations, encapsulate
the new join method in our vfs abstraction. The default implementation
remains os.path.join, but this opens the door to other VFSes doing
something more intelligent based on their needs.
In the same go, we replace the usage of 'os.path.join' in transaction code.
Matt Mackall <mpm@selenic.com> [Thu, 18 Dec 2014 12:07:03 -0600] rev 23580
subrepo: fix git subrepo ui argument
Matt Harbison <matt_harbison@yahoo.com> [Sat, 13 Dec 2014 19:44:55 -0500] rev 23579
subrepo: drop the 'ui' parameter to revert()
This no longer needs to be explicitly passed because the subrepo object tracks
the 'ui' reference since
fcbc66b5da6a. See the change to 'archive' for details
about the differences between the output level in the root repo and subrepo 'ui'
object.
The only use for 'ui' in revert is to emit status and warning messages, and to
check the verbose flag prior to printing the action to be performed on a file.
The local repo's ui was already being used to print a warning message in
wctx.forget() and for 'ui.slash' when walking dirstate in the repo.status()
call. Unlike other methods where the matcher is passed along and narrowed, a
new matcher is created in each repo, and therefore the bad() method already used
the local repo's ui.
Matt Harbison <matt_harbison@yahoo.com> [Sat, 13 Dec 2014 19:36:50 -0500] rev 23578
subrepo: drop the 'ui' parameter to removefiles()
This no longer needs to be explicitly passed because the subrepo object tracks
the 'ui' reference since
fcbc66b5da6a. See the change to 'archive' for details
about the differences between the output level in the root repo and subrepo 'ui'
object.
The only use for 'ui' in remove is to emit status and warning messages, and to
check the verbose flag prior to printing files to be removed. The bad() method
on the matcher still uses the root repo's ui, because narrowing the matcher
doesn't change the ui object.
The local repo's ui was already being used to print a warning message in
wctx.forget() and for 'ui.slash' when walking dirstate in the repo.status()
call.
Matt Harbison <matt_harbison@yahoo.com> [Sat, 13 Dec 2014 19:23:30 -0500] rev 23577
subrepo: drop the 'ui' parameter to forget()
This no longer needs to be explicitly passed because the subrepo object tracks
the 'ui' reference since
fcbc66b5da6a. See the change to 'archive' for details
about the differences between the output level in the root repo and subrepo 'ui'
object.
The only use for 'ui' in forget is to emit status and warning messages, and to
check the verbose flag prior to printing files to be forgotten. The bad()
method on the matcher still uses the root repo's ui, because narrowing the
matcher doesn't change the ui object.
The local repo's ui was already being used to print a warning message in
wctx.forget() and for 'ui.slash' when walking dirstate in the repo.status()
call.
Matt Harbison <matt_harbison@yahoo.com> [Sat, 13 Dec 2014 14:26:38 -0500] rev 23576
subrepo: drop the 'ui' parameter to cat()
This no longer needs to be explicitly passed because the subrepo object tracks
a 'ui' reference since
fcbc66b5da6a. See the change to 'archive' for details
about the differences between the output level in the root repo and subrepo 'ui'
object.
The only use for 'ui' in cat is to emit a status message when a subrepo is
missing. The bad() method on the matcher still uses the root repo's ui, because
narrowing the matcher doesn't change the ui object.
Matt Harbison <matt_harbison@yahoo.com> [Sat, 13 Dec 2014 14:53:46 -0500] rev 23575
subrepo: drop the 'ui' parameter to archive()
The current state of subrepo methods is to pass a 'ui' object to some methods,
which has the effect of overriding the subrepo configuration since it is the
root repo's 'ui' that is passed along as deep as there are subrepos. Other
subrepo method are *not* passed the root 'ui', and instead delegate to their
repo object's 'ui'. Even in the former case where the root 'ui' is available,
some methods are inconsistent in their use of both the root 'ui' and the local
repo's 'ui'. (Consider hg._incoming() uses the root 'ui' for path expansion
and some status messages, but also calls bundlerepo.getremotechanges(), which
eventually calls discovery.findcommonincoming(), which calls
setdiscovery.findcommonheads(), which calls status() on the local repo 'ui'.)
This inconsistency with respect to the configured output level is probably
always hidden, because --verbose, --debug and --quiet, along with their 'ui.xxx'
equivalents in the global and user level hgrc files are propagated from the
parent repo to the subrepo via 'baseui'. The 'ui.xxx' settings in the parent
repo hgrc file are not propagated, but that seems like an unusual thing to set
on a per repo config file. Any 'ui.xxx' options changed by --config are also
not propagated, because they are set on repo.ui by dispatch.py, not repo.baseui.
The goal here is to cleanup the subrepo methods by dropping the 'ui' parameter,
which in turn prevents mixing subtly different 'ui' instances on a given subrepo
level. Some methods use more than just the output level settings in 'ui' (add
for example ends up calling scmutil.checkportabilityalert() with both the root
and local repo's 'ui' at different points). This series just goes for the low
hanging fruit and switches methods that only use the output level.
If we really care about not letting a subrepo config override the root repo's
output level, we can propagate the verbose, debug and quiet settings to the
subrepo in the same way 'ui.commitsubrepos' is in hgsubrepo.__init__.
Archive only uses the 'ui' object to call its progress() method, and gitsubrepo
calls status().
Matt Harbison <matt_harbison@yahoo.com> [Sat, 13 Dec 2014 22:44:22 -0500] rev 23574
subrepo: use 'self.ui' instead of 'self._repo.ui'
They are now equivalent, but the former is slightly more readable.
Matt Harbison <matt_harbison@yahoo.com> [Sat, 13 Dec 2014 20:43:01 -0500] rev 23573
subrepo: reset 'self.ui' to the subrepo copy of 'ui' in the hgsubrepo class
Creation of the subrepo's '_repo' object creates a new 'ui' by combining the
parent repo's 'baseui' and reading in the subrepo's hgrc file. This simply
avoids 'self.ui' and 'self._repo.ui' pointing to different objects, which seems
like a potential source of bugs.
Git and Svn subrepos are unchanged, because they don't have their own ui, and
have always used their parent's for their configuration.
Matt Harbison <matt_harbison@yahoo.com> [Sat, 13 Dec 2014 15:19:38 -0500] rev 23572
subrepo: rename the '_ui' member to 'ui'
The localrepository class has a 'ui' member, so keeping the names the same will
allow for duck typing with subrepo instances when accessing 'ui'. Changing this
is easier than finding all of the localrepository instance uses and renaming
that to '_ui'.
Matt Harbison <matt_harbison@yahoo.com> [Sat, 13 Dec 2014 15:13:07 -0500] rev 23571
subrepo: drop the '_ui' member in the subrepo subclasses
This member has existed in the base class since
fcbc66b5da6a.
Augie Fackler <raf@durin42.com> [Tue, 09 Dec 2014 09:35:04 -0500] rev 23570
graphmod: attempt to clarify documentation of groupbranchiter()
Thanks to Pierre-Yves for checking my cleanups here and helping me
understand the algorithm well enough to help document it.
Augie Fackler <raf@durin42.com> [Mon, 08 Dec 2014 15:20:28 -0500] rev 23569
graphmod: rename graph-topological config to graph-group-branches
The latter suggests what the change is slightly better.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 04 Sep 2014 19:28:17 +0200] rev 23568
groupbranchiter: allow callers to select the first branch
Instead of just bootstrapping the algorithm with the first revision we
see, allow callers to pass revs that should be displayed first. All
branches are retained until we can display such revision.
Expected usage is to display the current working copy parent first.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 04 Sep 2014 19:05:36 +0200] rev 23567
groupbranchiter: support for non-contiguous revsets
The algorithm now works when some revisions are skipped. We now use "first
included ancestors" instead of just "parent" to link changesets with each other.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 14 Nov 2014 20:08:59 +0000] rev 23566
groubranchhiter: indent most of the inner code
We are going to add an additional layer of indentation to support non-contiguous
revset. We do it in a pure code movement changeset to help the readability of
the next changeset.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 14 Nov 2014 17:37:59 +0000] rev 23565
graphlog: add a way to test the 'groupbranchiter' function
We add an experimental config option to use the topological sorting. I first
tried to hook the 'groupbranchiter' function in the 'sort' revset but this was useless
because graphlog enforces revision number sorting :(
As the goal is to advance on the topological iteration logic, I see this
experimental option as a good way to move forward.
We have to use turn the iterator into a list because the graphlog is apparently
not ready for pure iterator input yet.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 04 Sep 2014 18:19:32 +0200] rev 23564
graphmod: add a function for topological iteration
This changeset introduces a function to perform topological (one branch after
the other) iteration over a set of changesets. This first version has a lot of
limitations, but the approach should be flexible enough to allow many
improvements in the future. This changeset aims to set the first stone more
than providing a complete solution.
The algorithm does not need to know the whole set of nodes involved
before emitting revision. This makes it a good candidate for usage in place
like `hg log` or graphical tools that need a fast first result time.
Sean Farley <sean.michael.farley@gmail.com> [Fri, 17 Oct 2014 15:27:12 -0700] rev 23563
namespaces: add branches
Note that the exception-catching from the previous branchtip check is moved up
to catch exceptions from the try block surrounding the namespace lookup.
Sean Farley <sean.michael.farley@gmail.com> [Fri, 17 Oct 2014 15:27:33 -0700] rev 23562
namespaces: add tags
Ryan McElroy <rmcelroy@fb.com> [Sun, 14 Dec 2014 19:11:44 -0800] rev 23561
namespaces: remove weakref; always pass in repo
It turns out that maintaining a reference of any sort (even weak!) to the repo
when constructed doesn't work because we may at some point pass in a repoview
filtered by something other than what the initial repo was.
Sean Farley <sean.michael.farley@gmail.com> [Thu, 16 Oct 2014 23:27:54 -0700] rev 23560
changectx: use names api to simplify and extend node lookup
Previously, changectx had to know about each type of name (bookmark, tag, etc.)
to look up. Now, we use repo.namenodes to simplify (and extend) this.
Sean Farley <sean.michael.farley@gmail.com> [Fri, 17 Oct 2014 15:28:40 -0700] rev 23559
namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com> [Sun, 14 Dec 2014 12:53:50 -0800] rev 23558
namespaces: add bookmarks to the names data structure
This marks the first use of abstracting our different types of named objects
(bookmarks, tags, branches, etc.) and upcoming patches will use this to
simplify logic.
Sean Farley <sean.michael.farley@gmail.com> [Sun, 14 Dec 2014 16:22:24 -0800] rev 23557
namespaces: add a convenience property for the weakref _repo
Sean Farley <sean.michael.farley@gmail.com> [Sun, 14 Dec 2014 15:35:57 -0800] rev 23556
namespaces: pass repo to __init__
We store repo as a weakref so that we can prevent a cycle between namespaces
and localrepo.
Sean Farley <sean.michael.farley@gmail.com> [Sun, 14 Dec 2014 15:04:40 -0800] rev 23555
namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com> [Fri, 17 Oct 2014 11:25:51 -0700] rev 23554
namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com> [Sun, 14 Dec 2014 12:29:28 -0800] rev 23553
namespaces: introduce a generic way to map between names and nodes
This patch begins the work to provide a way to register a namespace to handle
'names'. Benefits of this would be,
- improved templating: This would provide {name} which could output any branch,
bookmark, tag, or any extension registered namespace all without having the
extension doing any extra work
- improved tab completion: Since this provides a single source of all 'names',
tab completion would not need to know of each namespace
- changeset lookup: Similar to before, a unified place to get all 'names' will
allow finding changesets without any extension code having to reimplement
this
Also,
d226fe36e362 has shown us that for internal code which expects a certain
type of method or behavior, we should provide an easy way for extensions to
check this behavior.
Mads Kiilerich <madski@unity3d.com> [Sun, 14 Dec 2014 19:27:58 +0100] rev 23552
statichttprepo: update profile of __call__ in mock vfs object
New code paths could fail because the old statichttprepo profile couldn't
handle the usual parameters.
Instead, reuse a more generic profile also used in readonlyvfs.
Mathias De Maré <mathias.demare@gmail.com> [Sun, 14 Dec 2014 21:00:58 +0100] rev 23551
tests: avoid git diffstat singular/plural output difference
'git diff --stat' output changed with regard to the amount
of changes/insertions/deletions shown.
In older git versions (1.7.7.6), output was shown as:
2 files changed, 2 insertions(+), 1 deletions(-)
In newer versions, output is shown as:
2 files changed, 2 insertions(+), 1 deletion(-)
This patch uses a regex to handle both cases.
Mathias De Maré <mathias.demare@gmail.com> [Sun, 14 Dec 2014 11:34:51 +0100] rev 23550
subrepo: add revert support without backup for git subrepos
Previously, git subrepos did not support reverting.
This change adds basic support for reverting
when '--no-backup' is specified.
A warning is given (and the current state is kept)
when a revert is done without the '--no-backup' flag.
Martin von Zweigbergk <martinvonz@google.com> [Sat, 01 Nov 2014 22:56:49 -0700] rev 23549
match: make 'always' and 'exact' functions, not classes
There is no reason for classes 'always' and 'exact' not to be just
functions that return instances the plain 'match' class.
Ryan McElroy <rmcelroy@fb.com> [Sat, 13 Dec 2014 14:31:55 -0800] rev 23548
share: implement shared bookmark functionality
This does not cause any behavioral change unless a 'bookmarks.shared' marker
file exists. A future change will add UI to create this file when a repository
is shared.
Kyle Lippincott <spectral@google.com> [Sat, 13 Dec 2014 13:56:05 -0800] rev 23547
debugindex: respect --debug flag to show full nodeids
Siddharth Agarwal <sid0@fb.com> [Fri, 12 Dec 2014 14:06:36 -0800] rev 23546
localrepo.clone: add a way to override server preferuncompressed
Without this patch, if the server sets preferuncompressed, there's no way for
clients to override that and force a non-streaming clone. With this patch, we
extend the meaning of --pull to also override preferuncompressed and force a
non-streaming clone.
Siddharth Agarwal <sid0@fb.com> [Fri, 12 Dec 2014 14:02:56 -0800] rev 23545
hg.clone: set 'stream' depending on whether --pull was requested or not
In an upcoming patch we'll differentiate between the two in localrepo.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 14 Nov 2014 05:53:04 -0800] rev 23544
merge: perform case-collision checking on final set of actions
When there are multiple common ancestors, we should check for case
collisions only on the resulting actions after bid merge has run. To
do this, move the code until after bid merge.
Move it past _resolvetrivial() too, since that might update
actions. If the remote changed a file and then reverted the change,
while the local side deleted the file and created a new file with a
name that case-folds like the old file, we should fail before this
patch but not after.
Although the changes to the actions caused by _forgetremoved() should
have no effect on case collisions, move it after that, too, so the
next person reading the code won't have to think about it.
Moving it past these blocks of code takes it to the end of
calculateupdates(), so let's even move it outside of the method, so we
also check collisions in actions produced by extensions overriding the
method.
Mads Kiilerich <madski@unity3d.com> [Thu, 17 Apr 2014 22:47:38 +0200] rev 23543
spelling: fixes from proofreading of spell checker issues
Mathias De Maré <mathias.demare@gmail.com> [Sat, 13 Dec 2014 09:45:00 +0100] rev 23542
tests: allow more flexibility in git diffstat output
The output of 'git diff --stat' changed in git 1.7.10 and 1.7.11.
To ensure the tests work with earlier versions of git as well,
the output is now wrapped with a whitespace regex.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 11 Dec 2014 21:21:21 -0800] rev 23541
merge: move cd/dc prompts after largefiles prompts
By moving the cd/dc prompts out of calculateupdates(), we let
largefiles' overridecalculateupdates() so the unresolved values
(i.e. 'cd' or 'dc' rather than 'g', 'r', 'a' and missing). This allows
overridecalculateupdates() to ask the user whether to keep the normal
file or the largefile before the user gets the cd/dc prompt. Whichever
answer the user gives, we make overridecalculateupdates() replace 'cd'
or 'dc' action, saving the user one annoying (and less clear)
question.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 30 Nov 2014 22:47:53 -0500] rev 23540
addremove: automatically process a subrepository's subrepos
Since addremove on the top of a directory tree will recursively handle sub
directories, it should be the same with deep subrepos, once the user has
explicitly asked to process a subrepo. This really only has an effect when a
path that is a subrepo (or is in a subrepo) is given, since -S causes all
subrepos to be processed already. An addremove without a path that crosses into
a subrepo, will still not enter any subrepos, per backward compatibility rules.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 09 Nov 2014 23:46:25 -0500] rev 23539
addremove: support addremove with explicit paths in subrepos
Git and svn subrepos are currently not supported.
Matt Harbison <matt_harbison@yahoo.com> [Mon, 24 Nov 2014 23:51:26 -0500] rev 23538
addremove: add support for the -S flag
Git and svn subrepos are currently not supported. It doesn't look like git or
svn have these commands natively, so that's an area for a git or svn expert.
Matt Harbison <matt_harbison@yahoo.com> [Mon, 24 Nov 2014 22:27:49 -0500] rev 23537
commit: propagate --addremove to subrepos if -S is specified (
issue3759)
The recursive addremove operation occurs completely before the first subrepo is
committed. Only hg subrepos support the addremove operation at the moment- svn
and git subrepos will warn and abort the commit.
Matt Harbison <matt_harbison@yahoo.com> [Wed, 26 Nov 2014 16:13:38 -0500] rev 23536
subrepo: store the ui object in the base class
This will be used in the next patch to print a warning from the base class. It
seems better than having to explicitly pass it to a new method, since a lot of
existing methods also require it.
Matt Harbison <matt_harbison@yahoo.com> [Wed, 26 Nov 2014 15:16:22 -0500] rev 23535
commit: abort if --addremove is specified, but fails
This will be required when subrepo support is added, in order to ensure
consistent commits when a subrepo flavor doesn't support addremove.
Matt Harbison <matt_harbison@yahoo.com> [Wed, 26 Nov 2014 14:27:36 -0500] rev 23534
addremove: warn when addremove fails to operate on a named path
It looks like a bad path is the only mode of failure for addremove. This
warning is probably useful for the standalone command, but more important for
'commit -A'. That command doesn't currently abort if the addremove fails, but
it will be made to do so prior to adding subrepo support, since not all subrepos
will support addremove. We could just abort here, but it looks like addremove
has always silently ignored bad paths, except for the exit code.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 09 Nov 2014 19:57:02 -0500] rev 23533
scmutil: pass a matcher to scmutil.addremove() instead of a list of patterns
This will make it easier to support subrepository operations.
Enrique A. Tobis <enrique@tobis.com.ar> [Wed, 10 Dec 2014 23:46:47 -0500] rev 23532
tests: fix a typo in test-walkrepos.py
Martin von Zweigbergk <martinvonz@google.com> [Wed, 03 Dec 2014 13:50:28 -0800] rev 23531
merge: extract _resolvetrivial() function
We would eventually like to move the resolution of modify/delete and
delete/modify conflicts to the resolve phase. However, we don't want
to move the checks for identical content that were added in
902554884335 (merge: before cd/dc prompt, check that changed side
really changed, 2014-12-01). Let's instead move these out to a new
_resolvetrivial() function that processes the actions from
manifestmerge() and replaces any false cd/dc conflicts. The function
will also provide a natural place for us to later add code for
resolving false 'm' conflicts.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 09 Dec 2014 22:10:51 -0800] rev 23530
largefiles: start by finding files of interest
Instead of iterating over 'g' action, first find the set of all files
that are largefiles in p1. Then iterate over these files. This
prepares for considering actions other than 'g'.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 09 Dec 2014 22:03:53 -0800] rev 23529
largefiles: rewrite merge code using dictionary with entry per file
In overridecalculateupdates(), we currently only deal with conflicts
that result in a 'g' action for either the largefile or a standin. We
will soon want to deal cases with 'cd' and 'dc' actions here. It will
be easier to reason about such cases if we rewrite it using a dict
from filename to action.
A side-effect of this change is that the output can only have one
action per file (which should be a good change). Before this change,
when one of the tests in test-
issue3084 received this input (the 'a'
in the input was a result of 'cd' conflict resolved in favor of the
modified file):
'g': [('.hglf/f', ('',), 'remote created')],
'a': [('f', None, 'prompt keep')],
and the user chose to keep the local largefile, it produced this
output:
'g': [('.hglf/f', ('',), 'remote created')],
'r': [('f', None, 'replaced by standin')],
'a': [('f', None, 'prompt keep')],
Although 'a' actions are processed after 'r' actions by
recordupdates(), it still worked because 'a' actions have no effect on
merges (only on updates). After this change, the output is:
'g': [('.hglf/f', ('',), 'remote created')],
'r': [('f', None, 'replaced by standin')],
Similarly, there are several tests in test-largefiles-update that get
inputs like:
'a': [('.hglf/large2', None, 'prompt keep')],
'g': [('large2', ('',), 'remote created')],
and when the user chooses to keep the local largefile, they produce
this output:
'a': [('.hglf/large2', None, 'prompt keep'),
('.hglf/large2', None, 'keep standin')],
'lfmr': [('large2', None, 'forget non-standin largefile')],
In this case, it was not a merge but an update, so the 'a' action does
have an effect. However, since dirstate.add() is idempotent, it still
has no obserable effect.
After this change, the output is:
'a': [('.hglf/large2', None, 'keep standin')],
'lfmr': [('large2', None, 'forget non-standin largefile')],
Martin von Zweigbergk <martinvonz@google.com> [Tue, 09 Dec 2014 09:53:26 -0800] rev 23528
largefiles: put same 'action' object back in 'newglist'
The items we put in 'newglist' are always the same as what we found in
actions['g'], so let's just put the same item into the list instead of
creating a new one.
Martin von Zweigbergk <martinvonz@google.com> [Mon, 08 Dec 2014 15:20:42 -0800] rev 23527
largefiles: don't unnecessarily sort merge action lists
The action lists returned from calculateupdates() (in merge.py) are
not required to be sorted. In fact, since they result from iteration
over the unordered manifest, they are unlikely to be sorted. Moreover,
some of the lists are appended to after they are returned from
manifestmerge(). The lists are instead sorted in
applyupdates(). Therefore, let's not sort the lists generated in
largefiles' overridecalculateupdates().
Martin von Zweigbergk <martinvonz@google.com> [Tue, 09 Dec 2014 16:49:55 -0800] rev 23526
merge: don't treat 'diverge' and 'renamedelete' like actions
See earlier patch for motivation.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 09 Dec 2014 14:18:31 -0800] rev 23525
merge: move dr/rd warning messages out of applyupdates()
As preparation for making 'dr' and 'rd' actions no longer actions,
move the reporting from applyupdates() to its caller update(). This
way we won't have to pass additonal arguments to applyupdates() when
they are no longer actions. Also, the warnings are equally unrelated
to applyupdates() as they are to recordupdates(), as they don't result
in any changes to either the working copy or the dirstate.
See earlier patch for additional motivation.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 05 Dec 2014 16:13:26 -0800] rev 23524
merge: don't report progress for dr/rd actions
It is easier to reason about certain algorithms in terms of a
file->action mapping than the current action->list-of-files. Bid merge
is already written this way (but with a list of actions per file), and
largefiles' overridecalculateupdates() will also benefit. However,
that requires us to have at most one action per file. That requirement
is currently violated by 'dr' (divergent rename) and 'rd' (rename and
delete) actions, which can exist for the same file as some other
action.
These actions are only used for displaying warnings to the user; they
don't change anything in the working copy or the dirstate. In this
way, they are similar to the 'k' (keep) action. However, they are even
less action-like than 'k' is: 'k' at least describes what to do with
the file ("do nothing"), while 'dr' and 'rd' or only annotations for
files for which there may exist other, "real" actions.
As a first step towards separating these acitons out, stop including
them in the progress output, just like we already exclude the 'k'
action.
Mathias De Maré <mathias.demare@gmail.com> [Wed, 10 Dec 2014 10:32:51 +0100] rev 23523
subrepo: add partial diff support for git subrepos
So far, git subrepositories were silently ignored for diffs.
This patch adds support for git subrepositories,
with the remark that --include and --exclude are not supported.
If --include or --exclude are used, the subrepo is ignored.
Mathias De Maré <mathias.demare@gmail.com> [Wed, 10 Dec 2014 08:41:21 +0100] rev 23522
subrepo: extend git version check to 3 digits
This allows more flexibility when a version check is required.
Some git features are introduced in a version where only
the 3rd digit changes.
Mathias De Maré <mathias.demare@gmail.com> [Wed, 10 Dec 2014 08:33:03 +0100] rev 23521
subrepo: move git version check into a separate method
This allows checking the git version in other methods,
instead of only being able to check if the version is ok or not.
Mads Kiilerich <mads@kiilerich.com> [Thu, 11 Oct 2012 23:22:02 +0200] rev 23520
rebase: show a note for updated mq patches
It deserves more than a debug message. Show a note like:
updating mq patch p0.patch to 5:
9ecc820b1737
The message could also refer to "qrefresh" instead. Same same.
Mads Kiilerich <madski@unity3d.com> [Wed, 10 Dec 2014 06:20:35 +0100] rev 23519
rebase: improve debug messages while processing the list of rebases
Mads Kiilerich <madski@unity3d.com> [Wed, 10 Dec 2014 06:20:35 +0100] rev 23518
rebase: show warning when rebase creates no changes to commit
Similar to graft:
note: rebase of 6:
eea13746799a created no changes to commit
Mads Kiilerich <madski@unity3d.com> [Tue, 09 Dec 2014 03:45:26 +0100] rev 23517
rebase: show more useful status information while rebasing
Show status messages while rebasing, similar to what graft do:
rebasing 12:
2647734878ef "fork" (tip)
This gives more context for the user when resolving conflicts.
Mads Kiilerich <madski@unity3d.com> [Sun, 07 Dec 2014 20:04:45 +0100] rev 23516
tests: make 'saved backup' globbing less narrow in rebase tests
Globbing the hash made it harder to maintain tests with run-tests -i when it
was so far by the generated test output.
The hashes are stable and we just need to add a (glob).
Mads Kiilerich <madski@unity3d.com> [Tue, 09 Dec 2014 03:37:06 +0100] rev 23515
tests: stabilise mq rebase tests
Prepare for including hashes in output ... and less globbing make the tests
easier to update.
Augie Fackler <raf@durin42.com> [Tue, 09 Dec 2014 14:45:12 -0500] rev 23514
test-graft: use strip extension instead of mq extension
It only needs strip, no reason to load all of mq.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 04 Dec 2014 13:52:46 -0800] rev 23513
transaction: remove the 'onabort' mechanism
It has no known users. If someones needs similar functionality, a new 'addabort'
method similar to 'addfinalize' should be added.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 04 Dec 2014 13:51:41 -0800] rev 23512
transaction: remove the redundant 'onclose' mechanism
It is superseded by the 'addfinalize' function and all its user have been
migrated.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 04 Dec 2014 16:35:03 -0800] rev 23511
fncache: document the fact fncache is outdate at hook run time
Using 'addfinalize' to generate 'fncache' means that no pending version of the
file will be generated for the hooks. We would have to use the
'addfilegenerator' method to get such result. However the 'fncachevfs' (who
decide that a write is necessary) have no access to the transaction to register
such file generation at add time. Having the transaction accessible to the 'vfs'
is too much trouble for no benefit. This outdated 'fncache' file at hook time is
not expected to be an issue.
The previous move from 'onclose' to 'addfinalize' had no impact on this timing.
I'm documenting it now because I looked at it.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 04 Dec 2014 13:49:45 -0800] rev 23510
fncache: drop dedicated 'onclose' function in favor of 'tr.addfinalize'
Now that we have a shiny generic mechanism, we can use it.
Matt Mackall <mpm@selenic.com> [Tue, 09 Dec 2014 13:32:19 -0600] rev 23509
merge with stable
Matt Mackall <mpm@selenic.com> [Tue, 09 Dec 2014 12:39:23 -0600] rev 23508
graft: drop cset description from empty commit message
This is either already redundant in the output or too verbose in quiet
mode.
Mads Kiilerich <madski@unity3d.com> [Tue, 09 Dec 2014 03:38:23 +0100] rev 23507
graft: show hashes in user-facing messages
Graft was in various places just showing the revision number in status
messges. Instead, also show the stable and more useful short hash.
Mads Kiilerich <madski@unity3d.com> [Tue, 09 Dec 2014 03:38:23 +0100] rev 23506
graft: give helpful warning for empty grafts
It was just showing a status message with the internal revision number.
Instead, show a warning like
note: graft of 27:
3aaa8b6725f0 "28" created no changes to commit
(message tweaked in-flight by mpm)
Mads Kiilerich <madski@unity3d.com> [Tue, 09 Dec 2014 03:38:23 +0100] rev 23505
graft: show more useful status information while grafting
Show status messages with first line of commit description and names, like
grafting 12:
2647734878ef "fork" (tip)
This gives more context for the user when resolving conflicts.
Mads Kiilerich <madski@unity3d.com> [Tue, 09 Dec 2014 03:37:55 +0100] rev 23504
tests: test coverage for empty graft
A future change will add a warning to the quiet rebase.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 07 Dec 2014 10:54:29 -0500] rev 23503
largefiles: drop the unfiltered repo usage in overridepurge()
Now that repoview supports replacing methods, we don't need this hack.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 07 Dec 2014 10:52:56 -0500] rev 23502
repoview: allow methods on the proxy class to be replaced
It doesn't seem to be a common idiom for repo instances, but the status() method
is replaced in largefiles' purge() override. Since __setattr__ is implemented
in repoview to setattr() on the unfiltered repo, the replacement method wouldn't
get called unless it was invoked with the unfiltered repo, because the filtered
repo remains unchanged.
Since this doesn't seem to be commonly used, I didn't bother to filter out
methods that perhaps shouldn't be replaced, such as changelog().
Durham Goode <durham@fb.com> [Mon, 08 Dec 2014 15:41:54 -0800] rev 23501
log: fix log revset instability
The log/graphlog revset was not producing stable results since it was
iterating over a dict. Now we sort before iterating to guarantee a fixed order.
This fixes some potential flakiness in the tests.
Durham Goode <durham@fb.com> [Fri, 05 Dec 2014 14:27:32 -0800] rev 23500
log: fix log -f slow path to actually follow history
The revset created when -f was used with a slow path (for patterns and
directories) did not actually contain any logic to enforce follow. Instead it
was depending on the passed in subset to already be limited (which was limited
to :. but not ::.). This fixes it by adding a '& ::.' to any -f log revset.
hg log -f <file> is still broken, in that it can return results that aren't
actually ancestors of the current file, but fixing that has major perf
implications, so we'll deal with it later.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 26 Nov 2014 23:23:33 -0800] rev 23499
obsstore: cache size computation for fm1 node
We have two different types of node type (sha1 and sha256, only sha1 is used
now) and therefor different sizes for them. We now compute the value once
instead of redoing the computation every loop. This has no visible performance
impact.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 26 Nov 2014 23:21:20 -0800] rev 23498
obsstore: prefetch struct.calcsize
This function is widely used and worth but be at module level. No specific
performance boost is visible, but this is more consistent.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 26 Nov 2014 16:58:31 -0800] rev 23497
obsstore: disable garbage collection during initialization (
issue4456)
Python garbage collection is triggered by container creation. So code that
creates a lot of tuples tends to trigger GC a lot. We disable the gc during
obsolescence marker parsing and associated initialization. This provides an
interesting speedup (25%).
Load marker function on my 58758 markers repo:
before: 0.468247 seconds
after: 0.344362 seconds
The benefit is a bit less visible overall. With python2.6 on my system I see:
after: 0.60
before: 0.53
The difference is probably explained by the delaying of a costly GC. (but there
is still a win). Marking involved tuples, lists and dicts as ignorable by the
garbage collector should give us more benefit. But this is another adventure.
Thanks goes to Siddharth Agarwal for the lead.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 04 Dec 2014 05:43:15 -0800] rev 23496
dirstate: use the 'nogc' decorator
Now that we have a generic way to disable the gc, we use it. however, we have too
use it in a baroque way. See inline comment for details.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 04 Dec 2014 05:43:40 -0800] rev 23495
util: add a 'nogc' decorator to disable the garbage collection
Garbage collection behave pathologically when creating a lot of containers. As
we do that more than once it become sensible to have a decorator for it. See
inline documentation for details.
Matt Harbison <matt_harbison@yahoo.com> [Fri, 05 Dec 2014 22:58:02 -0500] rev 23494
generate-working-copy-states: open() in binary mode when writing content
This avoids changes to the hashes on Windows in test-merge-force.t like so:
@@ -594,12 +594,12 @@
content2
M missing_content2_content3_content4-tracked
- <<<<<<< local:
443153eb5b88 - test: local\r (esc)
- content4
- ||||||| base
- =======
- content2
- >>>>>>> other:
9b2ccd328a08 - test: remote\r (esc)
+ <<<<<<< local:
0447570f1af6 - test: local
+ content4
+ ||||||| base
+ =======
+ content2
+ >>>>>>> other:
85100b8c675b - test: remote
missing_content2_content3_content4-tracked.orig:
content4
Martin von Zweigbergk <martinvonz@google.com> [Fri, 05 Dec 2014 16:45:52 -0800] rev 23493
largefiles: don't use 'r' action for standin that doesn't exist
When merging and the remote has turned a normal file into a largefile
and the user chooses to keep the local largefile, we use the 'r'
action for the remote largefile standin. This is wrong, since that
file does not exist in the parent of the working copy. Use 'k', which
does nothing but debug logging, instead.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 05 Dec 2014 16:51:37 -0800] rev 23492
largefiles: don't use 'r' action for normal file that doesn't exist
When merging and the remote has turned a largefile into a normal file
and the user chooses to keep the local largefile, we use the 'r'
action for the remote normal file. This is wrong, since that file does
not exist in the parent of the working copy. Use 'k', which does
nothing but debug logging, instead.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 02 Dec 2014 12:23:12 -0800] rev 23491
rebase: handle revtodo as a special value when storing/restoring state
Revtodo happens to share its value with nullrev, but this is an implementation
details, so we move away from it.
After this changeset one can successfully change the values for all
the constants and the tests still pass, but doing so would require more
refactoring if we want to avoid breaking backward compatibility on the
state file.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 02 Dec 2014 09:46:20 -0800] rev 23490
rebase: add a 'revtodo' constant
The state mapping is using '-1' to mark revisions that have not been
rebased yet. We introduce and use a constant for that purpose. This
will help emphasize the fact the value means something other than
nullrev.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 04 Dec 2014 07:03:02 -0800] rev 23489
rebase: use '>= 0' to know is a revision was rebased
The fact that the state for "not yet rebased" is -1 is an implementation
details. So we change the comparisons to some semantically more correct.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 02 Dec 2014 17:35:21 -0800] rev 23488
patchbomb: introduce a 'patchbomb.confirm' option
When set to true, this option will make patchbomb always ask for confirmation
before sending the email. Confirmation is a powerful way to prevent stupid
mistakes when the sending patches.
This should let me get rid of my global alias adding
--confirm to hg email.
I know that some people may get bitten when moving from a machine with confirm
configured to a machine where it is not, but I think it is worth the risk.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 02 Dec 2014 17:24:52 -0800] rev 23487
patchbomb: add a 'patchbomb.intro' option
This option allows the user to control the default behavior for
including an introduction message. This avoids having to tirelessly
skip the intro for people contributing to Mercurial.
The three possibles values are:
- always,
- auto (default, current behavior),
- never.
I was thinking of ("true", "false", "") (empty value being auto) but I ruled it
out as too confusing.
This new config option reuses the pre-existing 'patchbomb' section.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 02 Dec 2014 16:51:32 -0800] rev 23486
patchbomb: extract 'getoutgoing' closure into its own function
This continues my crusade against closure complication.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 20 Nov 2014 16:27:55 -0800] rev 23485
perf: add a perfloadmarkers command
It is used to benchmark the obsstore initialization time.
Mads Kiilerich <madski@unity3d.com> [Wed, 19 Nov 2014 03:38:51 +0100] rev 23484
rebase: move base calculation from rebasenode() to defineparents()
We want to collect all calculation in one place.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 05 Dec 2014 10:53:25 -0800] rev 23483
largefiles: remove redundant checks for false modify/delete conflicts
In
a34a99181f36 (largefiles: don't show largefile/normal prompts if
one side is unchanged, 2014-12-01), overridecalculateupdates() started
checking for false modify/delete conflicts in large files and their
standins. Then, in the very next changeset,
902554884335 (merge:
before cd/dc prompt, check that changed side really changed,
2014-12-01), calculateupdates() itself started checking for false
modify/delete conflicts in all files. Since "large files and their
standins" is a subset of "all files", we can now drop the checks in
overridecalculateupdates().
Martin von Zweigbergk <martinvonz@google.com> [Wed, 03 Dec 2014 14:03:20 -0800] rev 23482
merge: make 'keep' message more descriptive
Most merge action messages don't describe the action itself, they
describe the reason the action was taken. The only exeption is the 'k'
action, for which the message is just "keep" and instead there is a
code comment folling it that says "remote unchanged". Let's move that
comment into the merge action message.
Matt Harbison <matt_harbison@yahoo.com> [Thu, 04 Dec 2014 23:08:27 -0500] rev 23481
addremove: restore the relative path printing when files are named
This fixes the previously mentioned issue with
3778884197f0, and undoes its
corresponding test change.
The test change demonstrates the correctness when a file is specified (i.e. the
glob is required on Windows because relative paths use '\' and absolute paths
use '/'). It is admittedly very subtle, but there will be a more robust test in
the addremove -S v3 series.
Matt Harbison <matt_harbison@yahoo.com> [Thu, 04 Dec 2014 23:04:55 -0500] rev 23480
match: introduce uipath() to properly style a file path
Several methods print files relative to the repo root, unless files are named on
the command line, in which case they are printed relative to cwd. Since the
check relies on the 'pats' parameter, which needs to be replaced by a matcher
when adding subrepo support, this logic gets folded into the matcher to tidy up
the callers.
Prior to
3778884197f0, this style decision was based off of whether or not the
'pats' list was empty. That change altered the check to test match.anypats()
instead, in order to make paths printed consistent when -I/-X is specified.
That however, changed the style when a file is given to the command. So now we
test the pattern list to get the old behavior for files, as well as test -I/-X
to get the consistency for patterns.
Matt Mackall <mpm@selenic.com> [Fri, 05 Dec 2014 12:10:56 -0600] rev 23479
merge with stable
Martin von Zweigbergk <martinvonz@google.com> [Sun, 16 Nov 2014 23:41:44 -0800] rev 23478
update: don't overwrite untracked ignored files on update
When looking for untracked files that would conflict with a tracked
file in the target revision (or the remote side of a merge), we
explcitly exclude ignored files. The code was added in
7e30f5f2285f
(merge: refactor unknown file conflict checking, 2012-02-09), but it
seems like only unknown, not ignored, files were considered since the
beginning of time.
Although ignored files are mostly build outputs and backup files, we
should still not overwrite them. Fix by simply removing the explicit
check.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 02 Dec 2014 17:11:01 -0800] rev 23477
update: add tests for untracked local file
We don't seem to have any tests for updating to another revision when
there are untracked files on the local side that conflict with the
those on the remote side, so let's add tests. This shows how we
overwrite untracked ignored files when updating to a revision that
tracks the file.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 03 Dec 2014 11:02:52 -0800] rev 23476
merge: don't overwrite conflicting file in locally renamed directory
When the local side has renamed a directory from a/ to b/ and added a
file b/c in it, and the remote side has added a file a/c, we end up
overwriting the local file b/c with the contents of remote file
a/c. Add a check for this case and use the merge ('m') action in this
case instead of the directory rename get ('dg') action.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 03 Dec 2014 10:56:07 -0800] rev 23475
merge: don't ignore conflicting file in remote renamed directory
When the remote side has renamed a directory from a/ to b/ and added a
file b/c in it, and the local side has added a file a/c, we end up
moving a/c to b/c without considering the remote version of b/c. Add a
check for this case and use the merge ('m') action in this case
instead of the directory rename ('dm') action.
Martin von Zweigbergk <martinvonz@google.com> [Sun, 23 Nov 2014 15:08:50 -0800] rev 23474
merge: duplicate 'if f in copied' into each branch
Martin von Zweigbergk <martinvonz@google.com> [Sun, 23 Nov 2014 14:09:10 -0800] rev 23473
merge: branch code into {n1 and n2, n1, n2} top-level cases
There are three high-level cases that are of interest in
manifestmerge(): 1) The file exists on both sides, 2) The file exists
only on the local side, and 3) The file exists only on the remote
side. Let's make this clearer in the code.
The 'if f in copied' case will be broken up into the two applicable
branches in the next patch.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 02 Dec 2014 16:39:59 -0800] rev 23472
update: remove redundant and misplaced merge tests
The "nothing to merge" case is covered by test-merge-default.t.
The "uncommitted changes" case is covered by test-merge1.t (and
others).
The "merge -f" case is covered by test-merge-force.t.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 21 Nov 2014 13:02:45 -0800] rev 23471
largefiles: use clearer debug messages in actions
In overridecalculateupdates(), 'g' (get) actions may be converted into
other actions. In most of these cases, it does not make sense to keep
the action's message. For example, 'remote created' does not make
sense for an 'r' (remove) action.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 21 Nov 2014 11:44:57 -0800] rev 23470
largefiles: don't clobber merge action message with user message
The message in the action is used for debugging and should not be the
same as the question presented to the user. Use a different variable
for the user message, so the 'msg' variable already in scope does not
get overwritten.
Ryan McElroy <rmcelroy@fb.com> [Tue, 02 Dec 2014 20:31:19 -0800] rev 23469
bookmarks: factor out repository lookup from writing bookmarks file
This will allow the share extension to extend bookmarks functionality to share
bookmarks between repositories.
Mike Edgar <adgar@google.com> [Thu, 04 Dec 2014 12:02:02 -0500] rev 23468
parsers: ensure revlog index node tree is initialized before insertion
Currently, the revlog index C implementation assumes its node tree will be
initialized before a new element is inserted by revnum. For example, revlog.py
executes 'self.index.insert(-1, e)' in _addrevision(). This is only safe
because the node tree has been initialized by a "node in self.nodemap"
check made in addrevision().
(For context, this was discovered while developing an experimental revlog
mixin which stores "elided nodes" via a separate code path from
_addrevision(); that new code path segfaults without this patch.)
Yuya Nishihara <yuya@tcha.org> [Wed, 03 Dec 2014 22:56:42 +0900] rev 23467
revset: add 'only' to DoS-safe symbols
There is no reason to disable it in hgweb because the same query can be
written without using 'only()'.
Yuya Nishihara <yuya@tcha.org> [Wed, 03 Dec 2014 22:52:54 +0900] rev 23466
revset: move 'only' so that functions are sorted alphabetically
Matt Harbison <matt_harbison@yahoo.com> [Tue, 02 Dec 2014 22:42:41 -0500] rev 23465
tests: drop unnecessary glob that causes a warning on Windows
This was triggered by
3778884197f0.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 03 Dec 2014 10:01:24 -0800] rev 23464
merge: add test with conflicting file and remote directory rename
Changset
88629daa727b (merge: demonstrate that directory renames can
lose local file content, 2014-12-02) should clearly have added the
reverse version of the test: where the remote side renamed a
directory, added a new file in that directory, and the local directory
added a conflicting file in the source directory. Add such a test now,
and also touch up the ones already added slightly (e.g. 'local' was a
stupid value for content that can be on either side of a merge).
Martin von Zweigbergk <martinvonz@google.com> [Wed, 03 Dec 2014 15:03:29 -0800] rev 23463
graft: use a real conflict for the tests
One of the graft tests grafts a changeset that changes a file's
content from 'a' to 'b' onto a branch that has changed the file's
content from 'a', via 'b', and then back to 'a' again. To prepare for
not considering this a file in need of merging, let's use 'c' as the
file's new content to make sure it has to be considered
conflicting.
There's a second similar case further down where an ancestor is
grafted. Make sure that is also considered a conflict.
John Coomes <john.coomes@oracle.com> [Wed, 03 Dec 2014 14:33:29 -0800] rev 23462
add: use lexists so that broken symbolic links are added
This restores the add behavior prior to
d8cdd46f426d and matches the
behavior of addremove.
Mads Kiilerich <madski@unity3d.com> [Tue, 02 Dec 2014 05:12:59 +0100] rev 23461
rebase: avoid redundant repo[rev].rev() - just keep working in rev space
Mads Kiilerich <madski@unity3d.com> [Tue, 02 Dec 2014 05:12:59 +0100] rev 23460
rebase: always store rev in state, also when collapsing
Mads Kiilerich <madski@unity3d.com> [Tue, 02 Dec 2014 05:12:53 +0100] rev 23459
rebase: clarify naming of variables holding node hashes - don't call them rev
Ryan McElroy <rmcelroy@fb.com> [Thu, 27 Nov 2014 00:24:25 -0800] rev 23458
bookmarks: factor out bookmark file opening for easier extensibility
Matt Mackall <mpm@selenic.com> [Tue, 02 Dec 2014 17:19:20 -0600] rev 23457
merge with stable
Siddharth Agarwal <sid0@fb.com> [Tue, 18 Nov 2014 22:18:05 -0800] rev 23456
diff: explicitly honor all diffopts
'hg diff' should naturally honor all diffopts.
Siddharth Agarwal <sid0@fb.com> [Tue, 18 Nov 2014 22:16:46 -0800] rev 23455
annotate: explicitly only honor whitespace diffopts
The whitespace ones are the only ones the annotate logic cares about anyway, so
there's no visible impact.
Siddharth Agarwal <sid0@fb.com> [Tue, 18 Nov 2014 21:47:47 -0800] rev 23454
notify: explicitly honor all diffopts
The notify output doesn't seem to be parseable anyway, what with the maxdiff
config option. Plus it is designed mainly for servers where hopefully the
admins are doing sensible things.
Siddharth Agarwal <sid0@fb.com> [Tue, 18 Nov 2014 22:13:05 -0800] rev 23453
jsonchangeset: don't honor whitespace and format-changing diffopts
JSON is meant to be parsed by computers, and format changes can break them.
Siddharth Agarwal <sid0@fb.com> [Tue, 18 Nov 2014 21:49:05 -0800] rev 23452
transplant: don't honor whitespace and format-changing diffopts
transplant uses diff purely internally.
Siddharth Agarwal <sid0@fb.com> [Tue, 18 Nov 2014 21:38:19 -0800] rev 23451
hgk: don't honor whitespace and format-changing diffopts
The diff-tree command is a plumbing command in Git, which means it is expected
to have a stable output format. Ensure that our output is stable too.
Siddharth Agarwal <sid0@fb.com> [Tue, 18 Nov 2014 17:36:24 -0800] rev 23450
patchbomb: don't honor whitespace and format-changing diffopts (BC)
The whitespace diffopts break lossless transmission, and the format-changing
ones make import harder. We expect parsers to be able to read git-style diffs,
though.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 26 Nov 2014 11:45:21 -0800] rev 23449
merge: add more thorough tests for --force
With generate-working-copy-states.py generalized to support
arbitrarily many changesets, we can use it for generating test cases
for merge: use one changeset each for base, remote and local. With the
various working copy states, this is a total of 104 cases.
The first candidate for additional testing is 'hg merge --force'. Even
though the force option is deprecated, it is convenient for testing
because it can be tested without first needing to revert any
changes. Except for the lack of checking for uncommitted changes, it
differs in only a few cases from unforced merge.
The new tests cover all the cases in the existing test-merge-force.t,
except for the unforced merge case, which is covered in several other
files anyway, so nothing remains of the file after this patch.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 26 Nov 2014 10:25:27 -0800] rev 23448
merge: display modify/delete conflict prompts in sorted order
The order is determined by manifest.diff(), which currently is not
sorted. There are currently no tests for this, but we will soon add
some that would be flaky without this patch.
Martin von Zweigbergk <martinvonz@google.com> [Sun, 09 Nov 2014 00:10:29 -0800] rev 23447
generate-working-copy-states: accept depth arguments on command line
Add a parameter to generate-working-copy-states.py that indicates
how many changesets are wanted. This number impacts all the
subcommands. The current 'filelist' subcommand becomes 'filelist 2',
the current 'base' and 'parent' subcommands become 'state 2 1' and
'state 2 2' respectively, while 'wc' becomes 'state 2 wc'.
See earlier patch for motivation.
Martin von Zweigbergk <martinvonz@google.com> [Sat, 08 Nov 2014 23:37:54 -0800] rev 23446
generate-working-copy-states: generalize for depth
The script can currently generate filenames and contents for exactly
two changesets plus the working copy. For some tests (e.g. of plain
dirstate status), only one changeset is needed, while for others
(e.g. merge), three changesets are needed. Let's prepare for such
tests by generalizing the code for any number of changesets.
Martin von Zweigbergk <martinvonz@google.com> [Sat, 29 Nov 2014 14:39:33 -0800] rev 23445
generate-working-copy-states: make 'tracked' a string
The only places the 'tracked' variable is only used is where it's
converted to a string, so let's simplify by using the string value
directly.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 02 Dec 2014 13:28:07 -0800] rev 23444
merge: demonstrate that directory renames can lose local file content
When a directory has been renamed on the local branch and a file has
been added in the old location on a remote branch, we move that new
file to the new location. Unfortunately, if there is already a file
there, we overwrite it with the contents from the remote branch. For
untracked local files, we should probably abort, and for tracked local
files, we should merge the contents. To start with, let's add a test
to demonstrate the breakage. Also note that while files merged in from
a remote branch are normally (and unintuitively) reported as modified,
these files are reported as added.
Mads Kiilerich <madski@unity3d.com> [Fri, 28 Nov 2014 03:09:19 +0100] rev 23443
mq: drop updateheader - inserthgheader and insertplainheader is enough
Mads Kiilerich <madski@unity3d.com> [Fri, 28 Nov 2014 03:09:06 +0100] rev 23442
mq: smarter handling of plain headers
6333412245ec and
5ccced6eab0b fixed
issue4453 with a simple insertplainheader
function that fixed the regression but didn't make the implementation more
stable.
Now we introduce plain header handling similar to how we handle hg patches. The
whole header is scanned for fields to update while determining the best
position for inserting the field if it is missing. It also makes sure there is
an empty line between headers and body.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 30 Nov 2014 23:30:31 -0500] rev 23441
largefiles: drop the override for 'fetch'
The fetch extension has been calling cmdutil.bailifchanged() since
a014fdc97154,
so this is redundant. Add test coverage to prevent regression. It doesn't look
like there is any testing for fetch with largefiles.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 02 Dec 2014 11:06:38 -0800] rev 23440
rebase: ignore negative state when updating back to original wc parent
The state mapping also contains some magic negative values (detached
parent, ignored revision). Blindly reading the state thus lead to
unfortunate usage of the negative value as an update destination. We
now filter them out.
We do a minor alteration of the test to catch this.
Eric Sumner <ericsumner@fb.com> [Fri, 21 Nov 2014 15:50:38 -0800] rev 23439
bundle2-push: provide transaction to reply unbundler
This patch series is intended to allow bundle2 push reply part handlers to
make changes to the local repository; it has been developed in parallel with
an extension that allows the server to rebase incoming changesets while applying
them.
This diff adds an experimental config option "bundle2.pushback" which provides
a transaction to the reply unbundler during a push operation. This behavior is
opt-in because of potential security issues: the response can contain any part
type that has a handler defined, allowing the server to make arbitrary changes
to the local repository.
Eric Sumner <ericsumner@fb.com> [Mon, 24 Nov 2014 16:04:44 -0800] rev 23438
bundle2.processbundle: let callers request default behavior
This patch series is intended to allow bundle2 push reply part handlers to
make changes to the local repository; it has been developed in parallel with
an extension that allows the server to rebase incoming changesets while applying
them.
The default transaction getter for processbundle is a private function that
raises an exception; this diff lets calling code pass None as the transaction
getter to explicitly request this default behavior.
The next diff will check a config option to determine whether to provide a
transaction to the reply bundle processor. If one shouldn't be provided, the
code needs a way to specify that the default behavior should be used.
Eric Sumner <ericsumner@fb.com> [Fri, 21 Nov 2014 15:06:38 -0800] rev 23437
push: elevate phase transaction to cover entire operation
This patch series is intended to allow bundle2 push reply part handlers to
make changes to the local repository; it has been developed in parallel with
an extension that allows the server to rebase incoming changesets while applying
them.
Most pushes already open a transaction in order to sync phase information.
This diff replaces that transaction with one that spans the entire push
operation.
This transaction will be used in a later patch to guard repository changes
made during the reply handler.
Eric Sumner <ericsumner@fb.com> [Fri, 21 Nov 2014 14:32:57 -0800] rev 23436
pull: extract transaction logic into separate object
This patch series is intended to allow bundle2 push reply part handlers to
make changes to the local repository; it has been developed in parallel with
an extension that allows the server to rebase incoming changesets while applying
them.
Aside from the transaction logic, the pulloperation class is used primarily as
a logic-free data structure for storing state information. This diff extracts
the transaction logic into its own class that can be shared with push
operations.
Siddharth Agarwal <sid0@fb.com> [Tue, 18 Nov 2014 20:00:37 -0800] rev 23435
record: don't honor format-changing diffopts (
issue4459)
record does support the whitespace options, so honor those. In upcoming patches
we'll replace all the other uses.
Siddharth Agarwal <sid0@fb.com> [Tue, 18 Nov 2014 17:22:03 -0800] rev 23434
patch.difffeatureopts: add a feature for format-changing diffopts
Typically, callers that are interested in this set are also interested in the
others. We still add it as a first-class flag for convenience.
Siddharth Agarwal <sid0@fb.com> [Tue, 18 Nov 2014 17:09:26 -0800] rev 23433
patch.difffeatureopts: add a feature for whitespace diffopts
These aren't exactly format-breaking features -- just ones for which patches
applied to a repo will produce incorrect commits, In any case, some commands
like record and annotate only care about this feature.
Siddharth Agarwal <sid0@fb.com> [Tue, 18 Nov 2014 17:10:14 -0800] rev 23432
patch.difffeatureopts: add a feature for diff.git
This deserves to be its own feature -- indeed, this is often the only feature
several commands care about.
Siddharth Agarwal <sid0@fb.com> [Tue, 18 Nov 2014 21:43:38 -0800] rev 23431
patch: rename diffopts to diffallopts
This is meant to be used when all features are explicitly requested. diffopts
is kept as an alias for now -- it will go away soon.
Siddharth Agarwal <sid0@fb.com> [Tue, 18 Nov 2014 16:53:22 -0800] rev 23430
patch: add a new function to initialize diffopts by feature
Not all callers are interested in all diffopts -- for example, commands like
record (which use diff internally) break when diffopts like noprefix are
enabled. This function will allow us to add flags that callers can use to
enable only the features they're interested in.
Siddharth Agarwal <sid0@fb.com> [Tue, 18 Nov 2014 16:00:54 -0800] rev 23429
patch.diffopts: use a dict for initialization
In upcoming patches we'll conditionally add to and remove from the dict.
Matt Harbison <matt_harbison@yahoo.com> [Fri, 21 Nov 2014 22:24:45 -0500] rev 23428
largefiles: split the creation of a normal matcher out of its install method
Refactoring addremove to support subrepos will need the ability to keep passing
the same matcher and narrowing it, instead of monkey patching scmutil's matcher.
Martin von Zweigbergk <martinvonz@google.com> [Mon, 01 Dec 2014 21:48:32 -0800] rev 23427
addremove: print relative paths when called with -I/-X (BC)
For "hg addremove 'glob:*.py'", we print any paths added or removed as
relative to the current directory, but when "hg addremove -I
'glob:*.py'" is used, we use the absolute path (relative from the repo
root). It seems like they should be the same, so change it so we use
relative paths in both cases. Continue to use absolute paths when no
patterns are given.
Matt Mackall <mpm@selenic.com> [Mon, 01 Dec 2014 19:34:11 -0600] rev 23426
merge with stable
Matt Mackall <mpm@selenic.com> [Mon, 01 Dec 2014 18:51:10 -0600] rev 23425
merge with i18n
Wagner Bruna <wbruna@softwareexpress.com.br> [Mon, 01 Dec 2014 11:21:30 -0200] rev 23424
i18n-pt_BR: synchronized with
3bd577a3283e
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 29 Nov 2014 14:32:12 +0900] rev 23423
i18n-ja: synchronized with
edf29f9c15f0
Matt Mackall <mpm@selenic.com> [Mon, 01 Dec 2014 18:39:19 -0600] rev 23422
Added signature for changeset
902554884335
Matt Mackall <mpm@selenic.com> [Mon, 01 Dec 2014 18:39:14 -0600] rev 23421
Added tag 3.2.2 for changeset
902554884335
Mads Kiilerich <madski@unity3d.com> [Mon, 01 Dec 2014 02:30:21 +0100] rev 23420
merge: before cd/dc prompt, check that changed side really changed
Before, merging would in some cases ask "wrong" questions about
"changed/deleted" conflicts ... and even do it before the resolve phase where
they can be postponed, re"resolved" or answered in bulk operations.
Instead, check that the content of the changed file really did change.
Reading and comparing file content is expensive and should be avoided before
the resolve phase. Prompting the user is however even more expensive. Checking
the content here is thus better.
The 'f in ancestors[0]' should not be necessary but is included to be extra
safe.
Mads Kiilerich <madski@unity3d.com> [Mon, 01 Dec 2014 02:11:29 +0100] rev 23419
largefiles: don't show largefile/normal prompts if one side is unchanged
Mads Kiilerich <madski@unity3d.com> [Mon, 01 Dec 2014 02:11:17 +0100] rev 23418
tests: add test-
issue3084.t cases for 'changed but same' as for 'unchanged'
Use suffix -same for cases where file changed but content is the same - that is
the case where manifestmerge doesn't detect that a file is unchanged.
(The suffix -id is already used for cases where the file didn't change - that
is the trivial case where manifestmerge detects that the file is unchanged.)
These new tests are good but the results are bad. There shouldn't be any merge
conflicts or prompts when one side didn't change.
Mads Kiilerich <madski@unity3d.com> [Mon, 01 Dec 2014 02:10:57 +0100] rev 23417
tests: clean-up of largefiles tests in test-
issue3084.t
Prepare for adding more test cases to the systematic testing, moving the test
from
ac3b3a2d976d to another section.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 29 Nov 2014 19:17:47 -0800] rev 23416
pushkey: gracefully handle prepushkey hook failure (
issue4455)
This allow to gracefully report the failure of the bookmark push and carry on.
Before this change set. Local push would plain quit and wireprotocol would
failed in various ungraceful way.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 29 Nov 2014 19:13:35 -0800] rev 23415
hook: raise a more specialized HookAbort exception when a hook fails
We need to gracefully handle some aborts for pushkey, especially
because it leads to a user-facing crash over the wireprotocols. So we
need a more specialized exception to catch.
Matt Mackall <mpm@selenic.com> [Mon, 01 Dec 2014 15:04:34 -0600] rev 23414
help: fix typo in files help
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 01 Dec 2014 05:18:12 -0800] rev 23413
revset: fix first and last for generatorset (
issue4465)
The code was just plain wrong.
Mads Kiilerich <madski@unity3d.com> [Fri, 28 Nov 2014 02:57:33 +0100] rev 23412
mq: fix update of headers that occur in the "wrong" order
Mq tried to insert headers in the right order. Sometimes it would stop
searching before checking all headers and it could thus duplicate a header
instead of replacing it.
Mathias De Maré <mathias.demare@gmail.com> [Fri, 28 Nov 2014 20:16:15 +0100] rev 23411
subrepo: add status support for ignored files in git subrepos
Retrieving the status of a git subrepo did not show ignored
files. Using 'git ls-files', we can retrieve these files
and display the correct status.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 26 Nov 2014 15:37:01 -0800] rev 23410
manifest: document the extra letter in working copy manifest node
As the second developer to get confused by this in November, I'm adding some
documentation for the next poor soul.
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 28 Nov 2014 10:59:02 -0800] rev 23409
hgweb: send proper HTTP response after uncaught exception
This patch fixes a bug where hgweb would send an incomplete HTTP
response.
If an uncaught exception is raised when hgweb is processing a request,
hgweb attempts to send a generic error response and log that exception.
The server defaults to chunked transfer coding. If an uncaught exception
occurred, it was sending the error response string / chunk properly.
However, RFC 7230 Section 4.1 mandates a 0 size last chunk be sent to
indicate end of the entity body. hgweb was failing to send this last
chunk. As a result, properly written HTTP clients would assume more data
was coming and they would likely time out waiting for another chunk to
arrive.
Mercurial's own test harness was paving over the improper HTTP behavior
by not attempting to read the response body if the status code was 500.
This incorrect workaround was added in
ba6577a19656 and has been removed
with this patch.
Mads Kiilerich <madski@unity3d.com> [Sun, 30 Nov 2014 20:06:53 +0100] rev 23408
tests: test rebase of merge of target ancestors
Mads Kiilerich <madski@unity3d.com> [Sun, 30 Nov 2014 19:36:03 +0100] rev 23407
tests: test coverage of parent order with p1 outside rebase set
Mads Kiilerich <madski@unity3d.com> [Sun, 30 Nov 2014 19:35:54 +0100] rev 23406
tests: add test for rebasing merges with ancestors of the rebase destination
This shows sub-optimal behaviour. The user gets a merge prompt that it is very
hard to justify.
Mads Kiilerich <madski@unity3d.com> [Sun, 30 Nov 2014 19:26:53 +0100] rev 23405
merge: 0 is a valid ancestor different from None
Most internal functions can take either a hash or an integer. Merge did however
not handle 0 as revision 0. Now it does.
Matt Mackall <mpm@selenic.com> [Thu, 27 Nov 2014 12:25:01 -0600] rev 23404
merge with stable
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 25 Nov 2014 19:40:54 -0800] rev 23403
revert: look for copy information for all local modifications
Renaming a file over an existing one marks the file as modified. So we
track rename source in modified file too.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 24 Nov 2014 18:42:56 -0800] rev 23402
rename: properly report removed and added file as modified (
issue4458)
The result of 'hg rm' + 'hg rename' disagreed with the one from
'hg rename --force'. We align them on 'hg move --force' because it agrees with
what 'hg status' says after the commit.
Stopping reporting a modified file as added puts an end to the hg revert confusion in this
situation (
issue4458).
However, reporting the file as modified also prevents revert from restoring the copy
source. We fix this in a later changeset.
Git diff also stop reporting the add in the middle of the chain as add. Not
sure how important (and even wrong) it is.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 26 Nov 2014 14:54:16 -0800] rev 23401
manifest: fix a bug where working copy file 'add' mark was buggy
Because the same dictionary was used to (1) get node from parent and (2) store
annotated version, we could end up with buggy values. For example with a chain
of renames:
$ hg mv b c
$ hg mv a b
The value from 'b' would be updated as "<old-a>a", then the value of c would be
updated as "<old-b>a'. With the current dictionary sharing this ends up with:
'<new-c>' == '<old-a>aa'
This value is double-wrong as we should use '<old-b>' and a single 'a'.
We now use a read-only value for lookup. The 'test-rename.t' test is impacted
because such a chained added file is suddenly detected as such.
anatoly techtonik <techtonik@gmail.com> [Wed, 26 Nov 2014 17:22:09 +0300] rev 23400
merge: be precise about what merged into what in short desc
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 11 Nov 2014 20:32:10 -0800] rev 23399
docker: add Docker files for running an Apache mod_wsgi server
I frequently find myself wanting to run hgweb in a production-like
environment, with a real HTTP server and multiple WSGI workers.
This patch introduces a Docker environment for running Mercurial
under Apache + mod_wsgi. With just a few command executions, it is
possible to spin up a Docker container running hgweb.
The container is tailored for Mercurial developers wanting to run
Mercurial from a source checkout. It is **not** meant to be something
suitable for production use.
The container provides a default hgweb environment with an empty
repository that allows pushes. You can thus start a container and push
your favorite repository there for quick testing.
The container is designed to allow customizations. Users can provide
their own hgweb configurations and mount existing directories containing
repositories into the container.
The behavior of the container and how to control things is documented in
the README.rst file.
Martin von Zweigbergk <martinvonz@google.com> [Mon, 24 Nov 2014 16:17:02 -0800] rev 23398
merge: use None as filename for base in 'both created' conflicts
Instead of using a file that we know is not in the common ancestor's
maniffest, let's use None. This is safe as the only place that cares
about the value (applyupdates) already checks if the item exists in
the ancestor.
Martin von Zweigbergk <martinvonz@google.com> [Mon, 24 Nov 2014 16:42:36 -0800] rev 23397
merge: break out "both renamed a -> b" case
We can further limit the scope of the 2-way merge case by breaking out
the case where the file was not created from scratch on both sides but
rather renamed in the same way (and is therefore a 3-way merge). This
involves copying some code, but it makes it clearer which case the
"Note:" in the code refers to.
Martin von Zweigbergk <martinvonz@google.com> [Mon, 24 Nov 2014 16:16:34 -0800] rev 23396
merge: separate out "both created" cases
When 'f' is not in 'ma', 'a' will be 'nullid' and all the if/elif
conditions that check whether some one nodeid is equal to 'a' will
fail, and the else-clause will instead apply. We can make that more
explicit by creating a separate 'm' action for the case where 'a' is
'nullid'. While it does mean copying some code, perhaps it makes it a
little clearer which codepaths are possible, and which cases the
"Note:" in the code refers to. It also lets us make the debug action
messages a little more specific.
Martin von Zweigbergk <martinvonz@google.com> [Mon, 24 Nov 2014 16:11:22 -0800] rev 23395
merge: indent to prepare for next patch
Matt Mackall <mpm@selenic.com> [Tue, 25 Nov 2014 17:30:05 -0600] rev 23394
merge with stable
David Eckhardt <David.Eckhardt@cs.cmu.edu> [Tue, 25 Nov 2014 02:31:52 -0600] rev 23393
factotum: convert Plan 9 quoted string to Python string
Jeff Sickel <jas@corpus-callosum.com> [Tue, 25 Nov 2014 02:27:31 -0600] rev 23392
plan9: setup check for current python build
Matt Harbison <matt_harbison@yahoo.com> [Wed, 19 Nov 2014 22:27:55 -0500] rev 23391
add: check for the existence of a file matched inexactly before adding it
The change in
10697f29af2b created a problem on Windows and OS X:
--- /usr/local/mercurial/tests/test-
issue660.t
+++ /usr/local/mercurial/tests/test-
issue660.t.err
@@ -47,6 +47,8 @@
Should succeed - shadow removed:
$ hg add b
+ adding b/b
+ b/b does not exist!
Prior to the failing 'hg add', the file 'b/b' was added and committed, then 'b'
was recursively deleted from the filesystem, file 'b' was created and the delete
was recorded with 'hg rm --after'. This add is attempting to record the
existence of file 'b'.
A filesystem that is not case sensitive prevents dirstate.walk() from skipping
its step 3, and step 3 has the effect of inserting removed files into the walk
list. The Linux code doesn't run through step 3, and didn't exhibit the
problem. It's not clear why a non case sensitive filesystem triggers step 3,
given that the path normalization occurs in step 2.
Prior to
10697f29af2b, part of the check here was 'f not in repo.dirstate'
instead of 'f not in wctx'. Files in the 'r' state are filtered out of
context.__contains__() but not dirstate.__contains__(). Therefore the removed
file name wasn't added to the list of files to add when checking against
dirstate. That change was to allow removed files to be readded, but adding a
file that doesn't exist is nonsensical. If the user specifies a missing file,
it will be an exact match and will still fail.
Matt Harbison <matt_harbison@yahoo.com> [Thu, 20 Nov 2014 22:33:40 -0500] rev 23390
tests: choose the proper environment variable style for the platform
Windows was printing out 'commit $HG_NODE' instead of the actual hash.
Matt Harbison <matt_harbison@yahoo.com> [Thu, 20 Nov 2014 20:07:34 -0500] rev 23389
tests: fix another multi-statement hook for Windows
The double quotes are necessary, otherwise it tries to pipe into a program named
'short'. An '&' could serve as a command separator on Windows instead of ';',
but I don't see any obvious way to swap these depending on the platform. In
this case though, there really wasn't a need for multiple statements.
Matt Harbison <matt_harbison@yahoo.com> [Wed, 19 Nov 2014 23:41:40 -0500] rev 23388
run-tests: set a default largefiles usercache in the default hgrc file
This fixes a test failure introduced in
4be754832829 on Windows and OS X, where
the cached largefile wasn't being deleted because the named .cache directory
didn't exist. It only existed on Linux because the test suite sets $HOME to the
directory of the test being run, and Linux uses $HOME/.cache by default.
Most of the other largefiles tests explicitly set this value at the top of their
scripts, but test-largefiles-update.t didn't pick that up when it was created.
Those scripts that do set a value will override this.
We could just set the parameter in the test-largefiles-update.t script, but
there are a few other non obvious tests that exercise largefiles too. These
largefiles end up being cached in the user's real cache, so proper hygiene
dictates that this not be left to each individual test script.
Martin von Zweigbergk <martinvonz@google.com> [Mon, 24 Nov 2014 09:50:27 -0800] rev 23387
merge: remove obsolete check for untracked files in 'dm' action
Since
0776a6cababe (merge: don't use unknown(), 2012-02-09), untracked
files are no longer included in the manifest diff, so there is no need
to check exclude them when renaming files for directory moves with the
'dm' action.
Martin von Zweigbergk <martinvonz@google.com> [Sun, 23 Nov 2014 23:10:34 -0800] rev 23386
merge: remove dead assignment in applyupdates()
Martin von Zweigbergk <martinvonz@google.com> [Fri, 21 Nov 2014 13:06:04 -0800] rev 23385
merge: move calculateupdates() before applyupdated()
calculateupdates() happens before applyupdates(), so move it before in
the code. That also moves it close to manifestmerge(), which is a good
location as calculateupdates() is the only caller of manifestmerge().
Martin von Zweigbergk <martinvonz@google.com> [Mon, 24 Nov 2014 11:28:46 -0800] rev 23384
merge: remove unused variables from _checkcollision()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 25 Nov 2014 18:37:28 +0900] rev 23383
largefiles: avoid exec-bit examination on the platform being unaware of it
Changeset
24600c9d7f4e introduced the examination of exec bit of
largefiles in "hg status --rev REV" case, but it doesn't avoid it on
the platform being unaware of exec-bit (e.g. on NTFS of Windows).
Matt Mackall <mpm@selenic.com> [Sat, 22 Nov 2014 17:09:04 -0600] rev 23382
merge with stable
Durham Goode <durham@fb.com> [Thu, 20 Nov 2014 16:30:57 -0800] rev 23381
changegroup: fix file linkrevs during reorders (
issue4462)
Previously, if reorder was true during the creation of a changegroup bundle,
it was possible that the manifest and filelogs would be reordered such that the
resulting bundle filelog had a linkrev that pointed to a commit that was not
the earliest instance of the filelog revision. For example:
With commits:
0<-1<---3<-4
\ /
--2<---
if 2 and 3 added the same version of a file, if the manifests of 2 and 3 have
their order reversed, but the changelog did not, it could produce a filelog with
linkrevs 0<-3 instead of 0<-2, which meant if commit 3 was stripped, it would
delete that file data from the repository and commit 2 would be corrupt (as
would any future pulls that tried to build upon that version of the file).
The fix is to make the linkrev fixup smarter. Previously it considered the first
manifest that added a file to be the first commit that added that file, which is
not true. Now, for every file revision we add to the bundle we make sure we
attach it to the earliest applicable linkrev.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 20 Nov 2014 16:39:32 -0800] rev 23380
merge: consistently use single quotes for non-user-facing strings
Because I'm getting tired of searching for both 'O' and "O".
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 13 Nov 2014 11:12:47 +0000] rev 23379
localrepo: add a currenttransaction method
This method returnx the current transaction or None: it will allow a
cache writer to hook in an existing transaction.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 13 Nov 2014 11:11:17 +0000] rev 23378
repoview: extract actual hidden cache writing in its own function
This will allow the generation of this cache within the transaction. Relying on
the transaction will reduce the chance of reader seeing bad cache.
Anton Shestakov <engored@ya.ru> [Fri, 21 Nov 2014 13:58:49 +0800] rev 23377
templates: fix broken "less" & "more" links in paper style (
issue4460)
"/search", which is an invalid command in hgweb, was mistakenly used for
"[show] more [revsets]" and "[show] less [revsets]" links on search page in
templates "paper" (and those which inherit paper, such as coal) before and
worked fine until
6e1fbcb18a75, which made hgweb more strict about invalid
commands.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 19 Nov 2014 01:36:17 +0000] rev 23376
push: stop independent usage of bundle2 in syncphase (
issue4454)
The phase-syncing code was using bundle2 if the remote supported it. It was
doing so without regard to bundle2 activation on the client. Moreover, the
phase push is now properly included in the unified bundle2 push, so having extra
code in syncphase should be useless. If the remote is bundle2-enabled, the
phases should already be synced.
The buggy verification code was leading to a crash when a 3.2 client was pushing
to a 3.1 server. The real bundle2 path detected that their versions were
incompatible, but the syncphase code failed to, sending an incompatible bundle2
to the server.
We drop the useless and buggy code as a result. The "else" clause is
de-indented in the process.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 19 Nov 2014 23:15:07 -0800] rev 23375
dirstate: speed up repeated missing directory checks
In a mozilla repo with tip at
bb3ff09f52fe,
hg update tip~1000 && time hg revert -nq -r tip .
displays ~4:20 minutes. With tip~100, it runs in ~11 s. With revision
100000, it did not finish in 12 minutes.
Revert calls dirstate.status() with a matcher that matches each file
in the target revision. The main problem [1] lies in
dirstate._walkexplicit(), which looks for matching deleted directories
by checking whether each path is prefix of any path in the
dirstate. With m files in the dirstate and n files in the target
revision that are not in the dirstate, this is clearly O(m*n). Let's
improve by keeping a lazily initialized set of all the directories in
the dirstate, so the time becomes O(m+n).
After this patch, the 4:20 minutes become 5.5 s, while for a single
missing path, it slows down from 1.092 s to 1.150 s (best of 4). The
>12 min case becomes 5.8 s.
[1] A narrower optimization would be to make revert take the fast
path for '.' and '--all'.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 19 Nov 2014 17:07:27 -0800] rev 23374
revert: access status fields by name rather than index
For better readability.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 19 Nov 2014 18:35:14 +0900] rev 23373
subrepo: remove "_getstorehashcachepath" referred by no other code paths
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 19 Nov 2014 18:35:14 +0900] rev 23372
subrepo: replace direct file APIs around "writelines" by "vfs.writelines"
This patch also replaces "self._getstorehashcachepath" (building
absolute path up) by "self._getstorehashcachename" (building relative
path up), because "vfs.writelines" requires relative path.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 19 Nov 2014 18:35:14 +0900] rev 23371
vfs: add "writelines"
This patch allows "writelines" to take "mode" and "notindexed"
arguments, because subsequent patch for subrepo requires both.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 19 Nov 2014 18:35:14 +0900] rev 23370
vfs: add "notindexed" argument to invoke "ensuredir" with it in write mode
This patch uses "False" as default value of "notindexed" argument,
even though "vfs.makedir()" uses "True" for it, because "os.mkdir()"
doesn't set "_FILE_ATTRIBUTE_NOT_CONTENT_INDEXED" attribute to newly
created directories.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 19 Nov 2014 18:35:14 +0900] rev 23369
subrepo: replace direct file APIs around "readlines" by "vfs.tryreadlines"
This patch also replaces "self._getstorehashcachepath" (building
absolute path up) by "self._getstorehashcachename" (building relative
path up), because "vfs.tryreadlines" requires relative path.
This patch makes "_readstorehashcache()" return "[]" (returned by
"vfs.tryreadlines()"), when cache file doesn't exist, even though
"_readstorehashcache()" returned '' (empty string) in such case before
this patch.
"_readstorehashcache()" is invoked only by the code path below in
"_storeclean()":
for filehash in self._readstorehashcache(path):
if filehash != itercache.next():
clean = False
break
In this case, "[]" and '' don't differ from each other, because both
of them cause avoiding iteration of "for loop".
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 19 Nov 2014 18:35:14 +0900] rev 23368
vfs: add "readlines" and "tryreadlines"
This patch allows "readlines" and "tryreadlines" to take "mode"
argument, because "subrepo" requires to read files not in "rb"
(binary, default for vfs) but in "r" (text) mode in subsequent patch.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 19 Nov 2014 18:35:14 +0900] rev 23367
subrepo: add "_cachestorehashvfs" to handle cache store hash files via vfs
This "vfs" object will be used by subsequent patches to handle cache
store hash files without direct file APIs.
This patch decorates "_cachestorehashvfs" with "@propertycache" to
delay vfs creation, because it is used only for cooperation with other
repositories.
In this patch, "/" is used as the path separator, even though
"self._repo.join" uses platform specific path separator (e.g. "\\" on
Windows). But it is reasonable enough, because "store" and other
management file handling already include such implementation, and they
work well.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 19 Nov 2014 18:35:14 +0900] rev 23366
subrepo: remove "_calcfilehash" referred by no other code paths
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 19 Nov 2014 18:35:14 +0900] rev 23365
subrepo: replace "_calcfilehash" invocation by "vfs.tryread"
"_calcfilehash" can be completely replaced by simple "vfs.tryread"
invocation.
def _calcfilehash(filename):
data = ''
if os.path.exists(filename):
fd = open(filename, 'rb')
data = fd.read()
fd.close()
return util.sha1(data).hexdigest()
Building absolute path "absname" up by "self._repo.join" for files in
"filelist" is avoided, because "vfs.tryread" does so internally.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 19 Nov 2014 18:35:14 +0900] rev 23364
subrepo: replace "os.path.exists" by "exists" via wvfs of the parent
Existance of specified "path" should be examined by "exists" via wvfs
of the parent repository, because the working directory of the parent
repository may be in UTF-8 mode. Wide API should be used via wvfs in
such case.
In this patch, "/" is used as the path separator, even though "path"
uses platform specific path separator (e.g. "\\" on Windows). But it
is reasonable enough, because "store" and other management file
handling already include such implementation, and they work well.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 19 Nov 2014 18:35:14 +0900] rev 23363
subrepo: avoid redundant "util.makedirs" invocation
"util.makedirs" for the (sub-)repository root of "hgsubrepo" is also
executed in the constructor of "localrepository", if "create" is True
and ".hg" of it doesn't exist.
This patch avoids redundant "util.makedirs" invocation in the
constructor of "hgsubrepo".
Martin von Zweigbergk <martinvonz@google.com> [Wed, 19 Nov 2014 08:50:08 -0800] rev 23362
merge: remove confusing comment about --force
manifestmerge() has a piece of code that's roughly:
if not force and different:
abort
else:
# if different: old untracked f may be overwritten and lost
...
The comment only talks about what happens when 'different' is true,
and in combination with the if-block above, that must mean that it is
only about what happens when 'force and different'. It seems quite
fine that files are overwritten when 'force' is true, so let's remove
the comment. As it stands, it can easily be interpreted as a TODO
(which is how I interpreted it at first).
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 17 Oct 2014 22:23:06 -0700] rev 23361
phases: read pending data when appropriate
If we are called by a hook and pending data exists, read those.
Pierre-Yves David <pierre-yves.david@fb.com> [Sun, 28 Sep 2014 21:27:48 -0700] rev 23360
bookmark: read pending data when appropriate
If we are called by a hook and pending data exists, read it.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 12 Nov 2014 16:54:57 +0000] rev 23359
test-bundle2: check visible data in pre/post-transaction hooks
We are about to make bookmarks and phases available for hooks.
Therefore we need a witness for this new availability. We introduce
the new hooks in a distinct changeset to reduce the noise in the ones
with actual changes.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 17 Oct 2014 22:19:05 -0700] rev 23358
transaction: write pending generated files
Such file are generated with a .pending prefix. It is up to the reader to
implement the necessary logic for reading pending files.
We add a test to ensure pending files are properly cleaned-up in both success and
error cases.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 17 Oct 2014 21:57:32 -0700] rev 23357
transaction: have _generatefile return a boolean
The function returns True if any files were generated. This will be
used to know if any pending files have been written.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 29 Sep 2014 01:29:08 -0700] rev 23356
transaction: allow generating files with a suffix
This will allow us to generate temporary pending files. Files
generated with a suffix are assumed temporary and will be cleaned up
at the end of the transaction.
Matt Mackall <mpm@selenic.com> [Wed, 19 Nov 2014 09:52:05 -0600] rev 23355
transaction: fix some docstring grammar
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 12 Nov 2014 14:57:41 +0000] rev 23354
transaction: accept a 'location' argument for registertmp
This will allow generation of temporary files outside of store. This will be
useful for bookmarks.
Matt Harbison <matt_harbison@yahoo.com> [Tue, 18 Nov 2014 23:51:58 -0500] rev 23353
tests: handle differences between missing file error strings on Windows and Unix
Matt Harbison <matt_harbison@yahoo.com> [Tue, 18 Nov 2014 22:02:00 -0500] rev 23352
run-tests: don't warn on unnecessary globs mandated by check-code.py
When test output is processed, if os.altsep is defined (i.e. on Windows),
TTest.globmatch() will cause a warning later on if a line has a glob that isn't
necessary. Unfortunately, the regex checking in check-code.py doesn't have this
context. Therefore we ended up with cases where the test would get flagged with
a warning only on Windows because a glob was present, because check-code.py
would warn if it wasn't. For example, from test-subrepo.t:
$ hg -R
issue1852a push `pwd`/
issue1852c
pushing to $TESTTMP/
issue1852c (glob)
The glob isn't necessary here because the slash is shown as it was provided.
However, check-code mandates one to handle the case where the default path has
backslashes in it.
Break the cycle by checking against a subset of the check-code rules before
flagging the test with a warning, and ignore the superfluous glob if it matches
a rule. This change fixes warnings in test-largefiles-update.t, test-subrepo.t,
test-tag.t, and test-rename-dir-merge.t on Windows.
I really hate that the rules are copy/pasted here (minus the leading two spaces)
because it would be nice to only update the rules once, in a single place. But
I'm not sure how else to do it. I'm open to suggestions. Splitting some of the
rules out of check-code.py seems wrong, but so does moving check-code.py out of
contrib, given that other checking scripts live there.
There are other glob patterns that could be copied over, but this is enough to
make the current tests run on Windows.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 18 Nov 2014 16:14:32 -0800] rev 23351
update: remove unnecessary check for unknown files with --check
As far as I and the test suite can tell, the checks in manifestmerge()
already report the errors (whether or not --check is given), so we
don't need to call merge.checkunknown(). Since this is the last call
to the method, also remove the method.
Matt Mackall <mpm@selenic.com> [Tue, 18 Nov 2014 12:29:30 -0600] rev 23350
merge with stable
Matt Harbison <matt_harbison@yahoo.com> [Sun, 16 Nov 2014 22:03:57 -0500] rev 23349
tests: move a multi-statement debuglocks hook into a shell script for Windows
Before this patch, a part of "test-push-hook-lock.t" fails unexpectedly on
Windows environment, because semicolon (";") isn't recognized as the command
separator by "cmd.exe". This is fixed the same way as a similar issue in
7c253c23de3b.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 16 Nov 2014 16:26:15 -0500] rev 23348
tests: fix globs for Windows
test-largefiles-update.t, test-subrepo.t, test-tag.t, and
test-rename-dir-merge.t still warn about no result returned because of
unnecessary globs that test-check-code-hg.t wants, relating to output for
pushing to, pulling from and moving X to Y.
Matt Harbison <matt_harbison@yahoo.com> [Tue, 04 Nov 2014 12:46:00 -0500] rev 23347
run-tests: include quotes in the HGEDITOR value when storing sys.executable
This fixes test-install.t on Windows that broke in
2122b82b6987 when
shlex.split() was added to the debuginstall command:
@@ -7,8 +7,11 @@
checking installed modules (*mercurial)... (glob)
checking templates (*mercurial?templates)... (glob)
checking commit editor...
+ Can't find editor 'c:\Python27\python.exe -c "(omitted)"' in PATH
+ (specify a commit editor in your configuration file)
checking username...
- no problems detected
+ 1 problems detected, please check your install!
+ [1]
What happens is that shlex.split() on Windows turns this:
c:\Python27\python.exe -c "import sys; sys.exit(0)"
into this:
['c:Python27python.exe', '-c', 'import sys; sys.exit(0)']
While technically a regression, most programs on Windows live in some flavor of
'Program Files', and therefore the environment variable needs to contain quotes
anyway to handle the space. This wasn't handled prior to the shlex() change,
because it tested the whole environment variable to see if it was an executable,
or split on the first space and tested again.
Mads Kiilerich <madski@unity3d.com> [Mon, 17 Nov 2014 01:48:43 +0100] rev 23346
mq: when adding headers in plain mode, separate them from message (
issue4453)
c87f2a5a6e49 did a clean-up in one direction ... but we want it in the other
direction.
Mads Kiilerich <madski@unity3d.com> [Mon, 17 Nov 2014 01:48:19 +0100] rev 23345
mq: introduce insertplainheader - same naive implementation as before
Mads Kiilerich <madski@unity3d.com> [Sun, 16 Nov 2014 19:57:40 +0100] rev 23344
mq: when setting message in plain mode, separate it from header (
issue4453)
Fix inconsistent handling of plain header separation in mq patcheader - and
contrary to
c87f2a5a6e49, do it in the direction of having an empty line
between header and description. Plain patches are like mails and should thus
have an empty line between headers and body in compliance with RFC 822 3.1.
Siddharth Agarwal <sid0@fb.com> [Sun, 16 Nov 2014 00:40:29 -0800] rev 23343
setdiscovery: avoid a full changelog graph traversal
We were definitely being suboptimal here: we were constructing two full sets,
one with the full set of common nodes (i.e. a graph traversal) and one with all
nodes. Then we subtract one set from the other. This whole process is
O(commits) and causes discovery to be significantly slower than it should be.
Instead, keep track of common incrementally and keep undecided as small as
possible.
This makes discovery massively faster on large repos: on one such repo, 'hg
debugdiscovery' over SSH with one commit missing on the client and five on the
server went from 4.5 seconds to 1.5. (An 'hg debugdiscovery' with no commits
missing on the client, i.e. connection startup time, was 1.2 seconds.)
Siddharth Agarwal <sid0@fb.com> [Fri, 14 Nov 2014 19:40:30 -0800] rev 23342
ancestor: add a way to remove ancestors of bases from a given set
This and missingancestors can share state, which will turn out to be perfect
for set discovery.
Siddharth Agarwal <sid0@fb.com> [Fri, 14 Nov 2014 17:21:00 -0800] rev 23341
ancestor: add a way to add to bases of a missing ancestor object
This will be useful for setdiscovery, since with that we incrementally add to
our knowledge of common nodes.
Siddharth Agarwal <sid0@fb.com> [Sun, 16 Nov 2014 00:39:29 -0800] rev 23340
ancestor: add a way to test whether a missing ancestor object has bases
This is pretty trivial so there's no unit test coverage for it.
This will be used by setdiscovery.
Siddharth Agarwal <sid0@fb.com> [Fri, 14 Nov 2014 16:53:40 -0800] rev 23339
ancestor: remove now-unused missingancestors function
Callers should use revlog.incrementalmissingrevs instead.
Siddharth Agarwal <sid0@fb.com> [Fri, 14 Nov 2014 16:52:40 -0800] rev 23338
revlog: switch findmissing* methods to incrementalmissingrevs
This will allow us to remove ancestor.missingancestors in an upcoming patch.
Siddharth Agarwal <sid0@fb.com> [Sun, 16 Nov 2014 00:39:48 -0800] rev 23337
revlog: add a method to get missing revs incrementally
This will turn out to be useful for discovery.
Siddharth Agarwal <sid0@fb.com> [Sat, 15 Nov 2014 19:26:20 -0800] rev 23336
test-ancestor: add support for multiple tests against one incremental object
In upcoming patches we'll add more operations to the object, and this prepares
for testing those operations.
Siddharth Agarwal <sid0@fb.com> [Fri, 14 Nov 2014 23:50:01 -0800] rev 23335
test-ancestor: move naive missing ancestor algorithm into a class
This mirrors the change to the real missing ancestor algorithm in a previous
patch.
Siddharth Agarwal <sid0@fb.com> [Fri, 14 Nov 2014 23:44:38 -0800] rev 23334
ancestor.missingancestors: turn into a state-keeping class
This allows multiple efficient missing ancestor queries against the same set of
bases. In upcoming patches we'll also define ways to grow the set of bases.
The fact that the test output hasn't changed establishes this patch's
correctness.
Siddharth Agarwal <sid0@fb.com> [Fri, 14 Nov 2014 13:47:25 -0800] rev 23333
ancestor.missingancestors: calculate start point after filtering revsvisit
Any revs that are filtered out are also in basesvisit, which means they
wouldn't be returned in the missing list anyway. There's no need to explore
such revs or their ancestors.
The 'if not revsvisit' check moves down because we can't call max() on an empty
set.
Siddharth Agarwal <sid0@fb.com> [Fri, 14 Nov 2014 11:33:52 -0800] rev 23332
ancestor.missingancestors: don't discard from basesvisit
We only actually care about whether revsvisit is empty, so we can let
basesvisit grow to arbitrary size.
It turns out that this actually helps performance. For a large repo with
hundreds of thousands of commits, hg perfrevset 'only(0, tip)' (basically the
worst case, involving a full DAG traversal) goes from 1.63 seconds to 1.50. hg
perfrevset 'only(tip, 0)' remains unchanged at 1.98 seconds.
Siddharth Agarwal <sid0@fb.com> [Sat, 15 Nov 2014 10:55:34 -0800] rev 23331
test-ancestor: use random testing for missing ancestors
We're going to make changes to the missing ancestor algorithm, and random
testing will give us much more confidence than a fixed set of tests.
Siddharth Agarwal <sid0@fb.com> [Sat, 15 Nov 2014 18:52:44 -0800] rev 23330
test-ancestor: define a main function
We're going to add to it in upcoming patches.
Siddharth Agarwal <sid0@fb.com> [Fri, 14 Nov 2014 14:50:03 -0800] rev 23329
test-ancestor: test iteration for lazyancestors
This has some test coverage in test-revlog-ancestry.py, but not very much.
Siddharth Agarwal <sid0@fb.com> [Fri, 14 Nov 2014 14:36:25 -0800] rev 23328
ancestor.lazyancestors: take parentrevs function rather than changelog
Principle of least privilege, and it also brings this in line with
missingancestors.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 16 Nov 2014 00:24:23 -0500] rev 23327
remove: avoid a bogus warning about no tracked files when removing '.'
Previously, any files relative to the root of the repo that match the -I
patterns would be deleted, but the command exited with 1 after printing a
warning:
$ hg remove -S -I 're:.*.txt' .
removing sub1/sub2/folder/test.txt
removing sub1/sub2/test.txt
not removing .: no tracked files
Matt Harbison <matt_harbison@yahoo.com> [Wed, 12 Nov 2014 23:15:20 -0500] rev 23326
remove: support remove with explicit paths in subrepos
Matt Harbison <matt_harbison@yahoo.com> [Sat, 15 Nov 2014 21:36:19 -0500] rev 23325
remove: recurse into subrepositories with --subrepos/-S flag
Like 'forget', git and svn subrepos are currently not supported. Unfortunately
the name 'remove' is already used in the subrepo classes, so we break the
convention of naming the subrepo function after the command.
Yuya Nishihara <yuya@tcha.org> [Sat, 15 Nov 2014 13:50:43 +0900] rev 23324
cmdserver: protect pipe server streams against corruption caused by direct io
Because pipe-mode server uses stdio as IPC channel, other modules should not
touch stdio directly and use ui instead. However, this strategy is brittle
because several Python functions read and write stdio implicitly.
print 'hello' # should use ui.write()
# => ch = 'h', size =
1701604463 'ello', data = '\n'
This patch adds protection for such mistakes. Both stdio files and low-level
file descriptors are redirected to /dev/null while command server uses them.
Yuya Nishihara <yuya@tcha.org> [Sat, 15 Nov 2014 13:04:41 +0900] rev 23323
cmdserver: postpone creation of pipe server until run()
This makes it easy to swap file descriptors while running command server.
Yuya Nishihara <yuya@tcha.org> [Sat, 15 Nov 2014 12:43:35 +0900] rev 23322
cmdserver: use given streams as pipe channels like other commands
Because commandserver itself is an hg subcommand, it shouldn't use stdio
directly in principle.
Siddharth Agarwal <sid0@fb.com> [Fri, 14 Nov 2014 16:38:58 -0800] rev 23321
revset.only: use cl.findmissingrevs
ancestor.missingancestors is really an implementation detail.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 14 Nov 2014 09:33:28 -0800] rev 23320
manifestmerge: use already existing fl2 synonym for m2.flags(f)
Probably not a noticeable performance gain, but shortens the code
slightly.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 13 Nov 2014 23:12:15 -0800] rev 23319
merge: drop underscore prefix from _checkunknown()
The method has been called from commands.py since
3eab42088be4
(update: just merge unknown file collisions, 2012-02-09), so drop the
underscore prefix that suggests that it's private.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 12 Nov 2014 14:47:48 +0000] rev 23318
transaction: drop special handling for phases and bookmarks generation
We are still doing double backups, but now that we have proper
location handling this is less of an issue. Dropping this simplifies
the code before we add some pending-related logic.
This also ensures we actually test the new 'location' mechanism.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 17 Oct 2014 20:53:42 -0700] rev 23317
transaction: use 'location' instead of 'vfs' objects for file generation
The argument is now a location name. The location must be present in the
'vfsmap' provided to the transaction at creation time.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 05 Nov 2014 01:59:32 +0000] rev 23316
transaction: use 'location' instead of 'vfs' in the addbackup method
This unlock the backup of file outside of store (eg: bookmarks).
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 14 Nov 2014 00:14:23 +0000] rev 23315
addbackup: handle file in subdirectory
The current naming scheme ('journal.backups.<file>') resulted is bad directory
name when 'file' was in a subdirectory. We now extract the directory name and
create the backupfile within it.
We plan to use file in a subdirectory for cachefile.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 14 Nov 2014 14:54:55 +0000] rev 23314
addbackup: use the vfs for the backup destination too
The backup file location was always computed using the opener, bypassing the
'location' setting. (And making the feature broken.)
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 13 Nov 2014 11:17:36 +0000] rev 23313
transaction: set backupentries version to proper value
Now that all mechanisms are in place, we can advertise it with a
proper new version.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 13 Nov 2014 11:17:09 +0000] rev 23312
transaction: support cache file in backupentries
We do not want to abort if anything wrong happen while handling a cache file.
Cache file have way to be invalidated and if old/bad version stay no
misbehavior will happen. Proper value will eventually be computed and the wrong
will be righten.
This changeset use the transaction reporter (usually writing on stderr) to write
details about failed cache handling. This will only apply to write operation
using a transaction. The usual update during read only operation will stay a
debug message.
I was on the way to bring these message back to debug level when I realised it
could be a feature. People with write access to the repository are likely to
have the power to fix error related to cache (and it is valuable to fix them).
So let the things as is for now.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 17 Oct 2014 21:04:35 -0700] rev 23311
transaction: use the location value when doing backup
We finally use the 'location' value coupled with the 'vfsmap' to restore backup
for the right file.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 17 Oct 2014 20:49:39 -0700] rev 23310
transaction: pass a vfs map to the transaction
The goal is to allow access to file outside ofthe store directory from the
transaction. The obvious target are the `bookmarks` file. But we can envision
usage for cache too.
We keep passing a main opener explicitly because a lot of code rely on this
default opener. The main opener (operating on store) is using an empty key ''.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 05 Nov 2014 01:52:46 +0000] rev 23309
transaction: change the on disk format for backupentries
We need to store new data to improve the current transaction logic:
- location: We want to generate and backup file outside of the 'store' (eg:
bookmarks, or various cache files). This requires knowing and preserving where
each file is located. The value of this new field is a string. It will be used
as a key for a vfs mapping.
- cache: We would like to handle cache file in the transaction code. This
Will help to have cache consistent with the repository state and avoid
performance issue on big repository like Mozilla. However, failure to handle
cache file should not result in a transaction failure. We add a new field that
carry this information. The value is boolean, A True value mean any error
while handling this file can be ignored.
Those two mechanisms are not implemented yet, but they are now persisted in the
on disk file. Support for new mechanisms is coming in later changeset.
We update the file format now and will introduce the new features in later
changeset. The format version is set to 0 until we actually support the new feature.
This will prevent misunderstanding between incomplete and final client.
Support for reading both version 1 and (future) version 2 could be achieved
(using default value when reading version 1) but has not been seen as necessary
for now.
Augie Fackler <augie@google.com> [Thu, 13 Nov 2014 15:47:15 -0500] rev 23308
silenttestrunner: add environment variable to make tests noisy again
As I've been working on complicated extension code it's been handy to
be able to get standard unittest verbose output so I can find crashers
more efficiently.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 14 Nov 2014 05:58:59 -0800] rev 23307
largefiles: update comments to refer to the right overridden method
This cleans up leftovers from
b228ad1f79d7 (largefiles: override
calculateupdates instead of manifestmerge, 2014-03-02).
Siddharth Agarwal <sid0@fb.com> [Thu, 13 Nov 2014 21:36:38 -0800] rev 23306
revlog: cache chain info after calculating it for a rev (
issue4452)
This dumb cache works surprisingly well: on a repository with typical delta
chains ~50k in length, unbundling a linear series of 5000 revisions (changelogs
and manifests only) went from 60 seconds to 3.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 22 Oct 2014 21:38:30 -0700] rev 23305
manifest: add matches() method
Move the code in context._manifestmatches() into a new
manifest.matches(). It's a natural place for the code to live and it
allows other callers to easily use it. It should also make it easier
to optimize the new method in alternative implementations of the
manifest (same reasoning as with manifest.diff()).
Martin von Zweigbergk <martinvonz@google.com> [Wed, 12 Nov 2014 22:20:36 -0800] rev 23304
context.status: pass status tuple into _buildstatus
By passing a status tuple (instead of the current list), we can access
the status fields by name and make it a little more readable.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 12 Nov 2014 22:07:31 -0800] rev 23303
context.status: avoid de- and reconstructing status tuple
We can just modify the status tuple we got from dirstate.status()
instead of deconstructing it and constructing a new instance, thereby
simplifying the code a little.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 12 Nov 2014 16:51:11 -0800] rev 23302
context.status: make _dirstatestatus() return an status tuple
Letting _dirstatestatus() return an scmutil.status instance also means
that _buildstatus() will always return such an instance, so we can
remove the conversion from the call sites.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 12 Nov 2014 21:19:07 -0800] rev 23301
context.status: wipe deleted/unknown/ignored fields when reversed
It makes no sense to request reverse status (i.e. changes from the
working copy to its parent) and then look at the deleted, unknown or
ignored fields. If you do, you would get the result from the forward
status (changes from parent to the working copy). Instead of giving a
nonsensical answer to a nonsensical question, it seems a little saner
to return empty lists. It might be best if we could prevent the caller
accessing these lists, but it's doubtful it's worth the trouble.
Siddharth Agarwal <sid0@fb.com> [Wed, 12 Nov 2014 23:50:21 -0800] rev 23300
patch.trydiff: add support for noprefix
Siddharth Agarwal <sid0@fb.com> [Wed, 12 Nov 2014 23:29:14 -0800] rev 23299
mdiff.unidiff: add support for noprefix
Siddharth Agarwal <sid0@fb.com> [Thu, 13 Nov 2014 00:13:48 -0800] rev 23298
diff: add a --noprefix option
See previous patch descriptions for the motivation.
The tests reflect the current state of the world -- as we add support we'll see
changes in the test output.
Siddharth Agarwal <sid0@fb.com> [Thu, 13 Nov 2014 00:08:44 -0800] rev 23297
patch.diffopts: add support for noprefix
In an upcoming patch we'll enable support as an option to 'hg diff' as well.
The tests reflect the current state of the world -- as we add support we'll see
changes in the test output.
Siddharth Agarwal <sid0@fb.com> [Wed, 12 Nov 2014 23:47:25 -0800] rev 23296
patch.diffopts: allow a setting to be forced in plain mode
Upcoming patches will add an option that will almost certainly break diff
output parsers when enabled. Add support for forcing an option to something in
plain mode, as a fallback. Options passed in via the CLI are not affected,
though -- it is assumed that any script passing the option in explicitly knows
what it is doing.
Siddharth Agarwal <sid0@fb.com> [Wed, 12 Nov 2014 23:44:17 -0800] rev 23295
patch.diffopts: break get function into if statements
We're going to add another condition here, and with the current structure that
becomes just too confusing.
Siddharth Agarwal <sid0@fb.com> [Wed, 12 Nov 2014 23:25:32 -0800] rev 23294
mdiff.diffopts: add a new noprefix option
By popular demand, we introduce an option to disable the 'a/' and 'b/'
prefixes in diff output. This makes copying and pasting filenames from diff
output easier.
This option will be implemented and documented in upcoming patches. To ensure
that existing scripts that parse output don't break, we will ensure that this
prefix is disabled in plain mode. A straight 'hg export | hg import' without
HGPLAIN=1 will still be broken though, but there's little that can be done
about that.
Siddharth Agarwal <sid0@fb.com> [Wed, 12 Nov 2014 23:19:44 -0800] rev 23293
mdiff.diffopts: add doc comment for nobinary
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 08 Nov 2014 17:08:09 +0000] rev 23292
changelog: register changelog.i.a as a temporary file
The file is registered to make sure the transaction is cleaned up in all cases.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 05 Nov 2014 09:27:08 +0000] rev 23291
transaction: allow registering a temporary transaction file
During the transaction, files may be created to store or expose data
involved in the transaction (eg: changelog index data are written in
a 'changelog.i.a' for hooks). But we do not have an official way to
record such file creation and make sure they are cleaned up. The lack
of clean-up is currently okay because there is a single file involved
and a single producer/consumer.
However, as we want to expose more data (bookmarks, phases, obsmarker)
we need something more solid. The 'backupentries' mechanism could
handle that. Temporary files can be encoded as a backup of nothing
'('', <temporarypath>)'. We "need" to attach it to the same mechanism
as we use to be able to use temporary transaction files outside of
.'store/' and 'backupentries' is expected to gain such feature.
This changeset makes it clear that we should rename 'backupentries' to
something more generic.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 13 Nov 2014 10:22:47 +0000] rev 23290
transaction: always generate file on close
The conditionnal was buggy and file were only generated if "onclose" was
defined. By luck, "onclose" was always defined.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 09 Nov 2014 12:31:34 -0500] rev 23289
remove: move most of the implementation into cmdutils.remove()
This will allow access to the reusable parts from subrepos, similar to add(),
forget(), etc.
Siddharth Agarwal <sid0@fb.com> [Tue, 11 Nov 2014 20:08:19 -0800] rev 23288
revlog: increase I/O bound to 4x the amount of data consumed
This doesn't affect normal clones since they'd be bound by the CPU bound below
anyway -- it does, however, improve generaldelta clones significantly.
This also results in better deltaing for generaldelta clones -- in generaldelta
clones, we calculate deltas with respect to the closest base if it has a higher
revision number than either parent. If the base is on a significantly different
branch, this can result in pointlessly massive deltas. This reduces the number
of bases and hence the number of bad deltas.
Empirically, for a highly branchy repository, this resulted in an improvement
of around 15% to manifest size.
Siddharth Agarwal <sid0@fb.com> [Tue, 11 Nov 2014 20:01:19 -0800] rev 23287
revlog: bound based on the length of the compressed deltas
This is only relevant for generaldelta clones.
Siddharth Agarwal <sid0@fb.com> [Tue, 11 Nov 2014 19:54:36 -0800] rev 23286
revlog: compute length of compressed deltas along with chain length
In upcoming patches to the revlog, we're going to split up the notions of
bounding I/O and bounding CPU.
Siddharth Agarwal <sid0@fb.com> [Tue, 11 Nov 2014 21:41:12 -0800] rev 23285
revlog: store fulltext when compressed delta is bigger than it
This is a very silly case and not particularly likely to happen in the wild,
but it turns out we can hit it in a couple of places. As we tune the storage
parameters we're likely to hit more such cases.
The affected test cases all have smaller revlogs now.
Siddharth Agarwal <sid0@fb.com> [Tue, 11 Nov 2014 21:39:56 -0800] rev 23284
revlog: make a predicate clearer with parens
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 05 Nov 2014 13:06:24 +0000] rev 23283
transaction: extract backupentry registration in a dedicated function
We are about to use the 'backupentry' mechanism to allow cleaning up
transaction-related temporary files (such as 'changelog.i.a'). We start
by extracting the entry registration into its own method for easy reuse.
At that point, I would like to rename the backup-file related variable to
something generic but I'm a bit short of ideas.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 08 Nov 2014 16:35:15 +0000] rev 23282
transaction: pass the transaction to 'postclose' callback
This mirrors the API for 'pending' and 'finalize' callbacks. I do not have
immediate usage planned for it, but I'm sure some callback will be happy to
access transaction related data.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 08 Nov 2014 16:31:38 +0000] rev 23281
transaction: pass the transaction to 'finalize' callback
The callback will likely need to perform some operation related to the
transaction (eg: registering file update). So we better pass the current
transaction as the callback argument. Otherwise callback that needs it has to
rely on horrible weak reference trick.
This allow already allow us to slay a wild weak reference usage.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 08 Nov 2014 16:27:50 +0000] rev 23280
transaction: pass the transaction to 'pending' callback
The callback will likely need to perform some operation related to the
transaction (eg: backing files up). So we better pass the current transaction as
the callback argument. Otherwise callback that needs it has to rely on horrible
weak reference trick.
The first foreseen user of this is changelog._writepending. We would like it to
register the temporary file it create for cleanup purpose.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 05 Nov 2014 10:22:17 +0000] rev 23279
transaction: gather backupjournal logic together in the __init__
The initialisation of file-backup related variable were a bit scattered, we
gather them together.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 05 Nov 2014 01:38:48 +0000] rev 23278
transaction: handle missing file in backupentries (instead of using entries)
The case where a backup of a missing file was requested was previously
handled by the 'entries' list. As the 'backupentries' is about to gain
ability to backup files outside of '.hg/store', we want it to be able
to handle the missing file too.
Reminder: using 'addbackup' on a missing file means that such file needs to be
deleted if we rollback the transaction.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 05 Nov 2014 01:23:40 +0000] rev 23277
test-hup: use ls instead of echo
Having one file entry per line makes it easier to analyse diffs.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 08 Nov 2014 00:48:41 +0900] rev 23276
largefiles: move "copyalltostore" invocation into "markcommitted"
Before this patch, while "hg convert", largefiles avoids copying
largefiles in the working directory into the store area by combination
of setting "repo._isconverting" in "mercurialsink{before|after}" and
checking it in "copytostoreabsolute".
This avoiding is needed while "hg convert", because converting doesn't
update largefiles in the working directory.
But this implementation is not efficient, because:
- invocation in "markcommitted" can easily ensure updating
largefiles in the working directory
"markcommitted" is invoked only when new revision is committed via
"commit" of "localrepository" (= with files in the working
directory). On the other hand, "commitctx" may be invoked directly
for in-memory committing.
- committing without updating the working directory (e.g. "import
--bypass") also needs this kind of avoiding
For efficiency of this kind of avoiding, this patch does:
- move "copyalltostore" invocation into "markcommitted"
- remove meaningless procedures below:
- hooking "mercurialsink{before|after}" to (un)set "repo._isconverting"
- checking "repo._isconverting" in "copytostoreabsolute"
This patch invokes "copyalltostore" also in "_commitcontext", because
"_commitcontext" expects that largefiles in the working directory are
copied into store area after "commitctx". In this case, the working
directory is used as a kind of temporary area to write largefiles out,
even though converted revisions are committed via "commitctx" (without
updating normal files).
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 08 Nov 2014 00:48:41 +0900] rev 23275
largefiles: avoid printing messages while transplanting by "_lfstatuswriters"
Putting "lambda *msg, **opts: None" (= avoid printing messages always)
into "_lfstatuswriters" while transplanting makes explicit passing
"printmessage = False" for "updatelfiles()" useless.
This patch also removes setting/unsetting "repo._istransplanting" in
"overridetransplant", because there is no code path referring it.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 08 Nov 2014 00:48:41 +0900] rev 23274
largefiles: update standins only at the 1st commit of "transplant --continue"
Before this patch, "hg transplant --continue" may record incorrect
standins, because largefiles extension always avoid updating standins
while transplanting, even though largefiles in the working directory
may be modified manually at the 1st commit of "hg transplant --continue".
But, on the other hand, updating standins should be avoided at
subsequent commits for efficiency reason.
To update standins only at the 1st commit of "hg transplant
--continue", this patch uses "automatedcommithook", which updates
standins by "lfutil.updatestandinsbymatch()" only at the 1st commit of
resuming.
Even after this patch, "repo._istransplanting = True" is still needed
to avoid some status report while updating largefiles in
"lfcommands.updatelfiles()".
This is reason why this patch omits not "repo._istransplanting = True"
in "overriderebase" but examination of "getattr(repo,
"_istransplanting", False)" in "updatestandinsbymatch".
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 08 Nov 2014 00:48:38 +0900] rev 23273
largefiles: avoid redundant "updatelfiles" invocation in "overridetransplant"
At "hg transplant --merge REV", largefiles newly coming from the 2nd
parent (= REV) are marked as "a"(dded) by "patch.patch()", and have to
be marked as "n"(ormal) after commit.
But until changeset
3100d1cbce32, such largefiles were still marked as
"a" unexpectedly even after commit, because no additional entry is
added to filelog of such largefiles and they aren't listed in
"repo[newnode].files()" in this case: "newnode" is one of newly
committed changeset (= result of "repo.commit()").
"updatelfiles" invocation in "overridetransplant" shadows this problem
by forcibly synchronizing lfdirstate to dirstate.
Now, "updatelfiles" invocation in "overridetransplant" is redundant,
because changeset
3100d1cbce32 made "markcommitted" use "ctx.files()"
to get targets of "synclfdirstate" instead of "repo[newnode].files()".
Matt Mackall <mpm@selenic.com> [Wed, 12 Nov 2014 15:18:30 -0600] rev 23272
merge with stable
Yuya Nishihara <yuya@tcha.org> [Sat, 08 Nov 2014 13:14:19 +0900] rev 23271
util.system: remove unused handling of onerr=ui
In our code, onerr is None or util.Abort. It smells bad to overload ui and
exception class.
Yuya Nishihara <yuya@tcha.org> [Sat, 08 Nov 2014 13:06:22 +0900] rev 23270
util.system: use ui.system() in place of optional ui.fout parameter
Yuya Nishihara <yuya@tcha.org> [Sat, 08 Nov 2014 12:57:42 +0900] rev 23269
ui: introduce util.system() wrapper to make sure ui.fout is used
This change is intended to avoid future problem of data corruption under
command server. out=ui.fout is mandatory as long as command server uses
stdout as IPC channel.
Yuya Nishihara <yuya@tcha.org> [Wed, 12 Nov 2014 22:21:51 +0900] rev 23268
hook: remove redundant code to redirect http hook output to client stream
out=ui and out=ui.fout should be the same here. ui.fout was introduced at
afccc64eea73, which was not available when out=ui was added at
c37f35d7f2f5.
Yuya Nishihara <yuya@tcha.org> [Wed, 12 Nov 2014 21:53:44 +0900] rev 23267
hgk: forward command output to ui.fout consistently
Nobody would want to run hgk in command server, but it should work in
principle. This fixes possible data corruption of command-server channel.
Matt Mackall <mpm@selenic.com> [Tue, 11 Nov 2014 18:43:19 -0600] rev 23266
merge with stable
Matt Mackall <mpm@selenic.com> [Tue, 11 Nov 2014 17:25:09 -0600] rev 23265
Added signature for changeset
643c58303fb0
Matt Mackall <mpm@selenic.com> [Tue, 11 Nov 2014 17:24:47 -0600] rev 23264
Added tag 3.2.1 for changeset
643c58303fb0
Augie Fackler <raf@durin42.com> [Mon, 10 Nov 2014 13:20:56 -0500] rev 23263
run-tests: use a try/except ladder instead of looking for a specific version
This ensures we get json instead of simplejson in as many places as possible.
Augie Fackler <raf@durin42.com> [Mon, 10 Nov 2014 13:27:25 -0500] rev 23262
hghave: use a less brittle have-json check
Sean Farley <sean.michael.farley@gmail.com> [Wed, 15 Oct 2014 12:39:19 -0700] rev 23261
sortdict: add insert method
Future patches will allow extensions to choose which order a namespace should
output in the log, so we add a way for sortdict to insert to a specific
location.
Sean Farley <sean.michael.farley@gmail.com> [Sun, 09 Nov 2014 13:15:28 -0800] rev 23260
sortdict: add iteritems method
Future patches will start using sortdict for log operations where order is
important. Adding iteritems removes the headache of having to remember to use
items() if the object is a sortdict.
Martin von Zweigbergk <martinvonz@google.com> [Sat, 08 Nov 2014 23:13:39 -0800] rev 23259
addremove: add back forgotten files (BC)
After running "hg forget README && hg addremove", README will still be
reported as removed, while "hg forget README && hg add README" adds it
back so it gets reported as clean. It seems like they should behave
the same. Furthermore, it seems like no files should remain untracked
after 'hg addremove && hg commit' (or 'hg commit -A'). For these
reasons, change the behavior of addremove so it does add forgotten
files back.
The problem is with scmutil._interestingfiles(), which reports the
file as removed, so scmutil.addremove() does not add it. Fix by
teaching _interestingfiles() to report forgotten files separately from
removed files and make addremove() add forgotten files back. However,
do not treat forgotten files as sources for rename detection. Note
that since removed and forgotten files are treated the same before
this change, forgotten files were considered sources for rename
detection.
Also update the other caller, marktouched(), in the same way as
addremove().
Martin von Zweigbergk <martinvonz@google.com> [Mon, 10 Nov 2014 14:51:18 -0800] rev 23258
add: add back forgotten files even when not matching exactly (BC)
I accidentally did 'hg forget .' and tried to undo the operation with
'hg add .'. I expected the files to be reported as either modified or
clean, but they were still reported as removed. It turns out that
forgotten files are only added back if they are listed explicitly, as
shown by the following two invocations. This makes it hard to recover
from the mistake of forgetting a lot of files.
$ hg forget README && hg add README && hg status -A README
C README
$ hg forget README && hg add . && hg status -A README
R README
The problem lies in cmdutil.add(). That method checks that the file
isn't already tracked before adding it, but it does so by checking the
dirstate, which does have an entry for forgotten files (state 'r'). We
should instead be checking whether the file exists in the
workingctx. The workingctx is also what we later call add() on, and
that method takes care of transforming the add() into a normallookup()
on the dirstate.
Since we're changing repo.dirstate into wctx, let's also change
repo.walk into wctx.walk for consistency (repo.walk calls wctx.walk,
so we're simply inlining the call).
Martin von Zweigbergk <martinvonz@google.com> [Tue, 11 Nov 2014 10:16:54 -0800] rev 23257
context.status: explain "caching reasons" more fully
Where we "load earliest manifest first for caching reasons", elaborate
on what "caching reasons" refers to. Text provided by Matt in
http://thread.gmane.org/gmane.comp.version-control.mercurial.devel/73235/focus=73578.
Augie Fackler <raf@durin42.com> [Tue, 11 Nov 2014 10:35:06 -0500] rev 23256
localrepo: rename revlog.maxchainlen to format.maxchainlen
This is more consistent with other option names, as spotted by Pierre-Yves. Thanks!
Mateusz Kwapich <mitrandir@fb.com> [Thu, 06 Nov 2014 14:20:05 -0800] rev 23255
revlog: add config variable for limiting delta-chain length
The current heuristic for deciding between storing delta and full texts
is based on ratio of (sizeofdeltas)/(sizeoffulltext).
In some cases (for example a manifest for ahuge repo) this approach
can result in extremely long delta chains (~30,000) which are very slow to
read. (In the case of a manifest ~500ms are added to every hg command because of that).
This commit introduces "revlog.maxchainlength" configuration variable that will
limit delta chain length.
Mateusz Kwapich <mitrandir@fb.com> [Thu, 06 Nov 2014 14:08:25 -0800] rev 23254
debugrevlog: fix computing chain length in debugrevlog -d
The chain length was computed correctly only when generaldelta
feature was enabled. Now it's fixed.
When generaldelta is disabled the base revision in revlog index is not
the revision we have delta against - it's always previous revision.
Instead of incorrect chainbaseandlen in command.py we are now using two
single-responsibility functions in revlog.py:
- chainbase(rev)
- chainlen(rev)
Only chainlen(rev) was missing so it was written to mimic the way the
chain of deltas is actually found during file reconstruction.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 05 Nov 2014 10:13:01 +0000] rev 23253
transaction: factorise append-only file registration
The addition is done in two different places but differs slightly. We factorise
this addition to ensure it is consistent in all places.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 05 Nov 2014 13:00:48 +0000] rev 23252
transaction: document `tr.add`
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 05 Nov 2014 10:05:38 +0000] rev 23251
transaction: drop backupentries logic from startgroup and endgroup
The `startgroup` and `endgroup` methods are used in a very specific
context to wrap a very specific operation (revlog truncation). It does
not make sense to perform any other operations during such a "group"
(eg:file backup). There is currently no user of backupfile during a
"group" so we drop the group-specific code and restrict authorized
operations during "group".
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 05 Nov 2014 10:00:15 +0000] rev 23250
transaction: document startgroup and endgroup
These enigmatic methods are only used in repair. We document them to clarify
there purpose and user.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 05 Nov 2014 09:31:57 +0000] rev 23249
transaction: mark backup-related attributes private
As the transaction is gaining more functions and attributes, it is important to clarify
what is part of the public API.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 05 Nov 2014 01:30:29 +0000] rev 23248
transaction: document the contents of `tr.backupentries`
Now that all items are known we can document it.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 05 Nov 2014 01:33:16 +0000] rev 23247
transaction: drop the third item in `tr.backupentries`
This third item is always None and never used.
Durham Goode <durham@fb.com> [Mon, 10 Nov 2014 10:44:42 -0800] rev 23246
rebase: fix rebase with no common ancestors (
issue4446)
The new rebase revset didn't check for the case when there are no common
ancestors. Now it does. The new behavior should be the same as the pre-3.2
behavior. Added a test.
Augie Fackler <raf@durin42.com> [Thu, 06 Nov 2014 10:57:13 -0500] rev 23245
test-run-tests: accept more levels of precision and trailing ws (
issue4440)
simplejson produces slightly different output from the built-in json
module, specifically:
* It uses 0.000 instead of 0.0000
* It likes to put a trailing space after a comma
This change works around both of those variations.
Matt Mackall <mpm@selenic.com> [Mon, 10 Nov 2014 17:29:15 -0600] rev 23244
merge with stable
Siddharth Agarwal <sid0@fb.com> [Fri, 07 Nov 2014 17:54:59 -0800] rev 23243
changegroup.cg2packer: lookup 'group' via inheritance chain
This lets extensions insert themselves in the class hierarchy.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 23 Oct 2014 17:00:38 -0700] rev 23242
context.status: only filter suspect symlinks in the dirstate status
We don't care about filtering out symlinks that have already been
committed with full content, only those that have been accidentally
resolved in the working directory.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 23 Oct 2014 16:19:56 -0700] rev 23241
context.status: inline _poststatus()
By inlining _poststatus() into _buildstatus(), it becomes clearer that
it is only called for the workingctx.
Martin von Zweigbergk <martinvonz@gmail.com> [Sun, 12 Oct 2014 00:06:40 -0700] rev 23240
context.status: remove now-empty _prestatus()
Martin von Zweigbergk <martinvonz@gmail.com> [Sat, 11 Oct 2014 23:30:08 -0700] rev 23239
context.status: call _dirstatestatus() from within _buildstatus()
By making the call to _dirstatestatus() within _buildstatus(), it
becomes clearer that it's called only for the workingctx.
Martin von Zweigbergk <martinvonz@gmail.com> [Sun, 12 Oct 2014 00:00:13 -0700] rev 23238
context.status: move manifest caching trick to _buildstatus()
In basectx._buildstatus(), we read the manifests for the two revisions
being compared. For "caching reasons" unknown to me, it is better to
read the earlier manifest first, which basectx._prestatus() takes care
of. However, if the 'self' context is a committablectx and the 'other'
context is the parent of the working directory (as in the very common
case of plain "hg status"), there is no need to read any manifests at
all -- all that's needed is the dirstate status. To avoid reading the
manifests, _prestatus() is overridden in committablectx and avoids
calling its super method, and _buildstatus() calls its super method
only if the 'other' context is not the parent of the working
directory.
It seems easier to follow what's happening if we move the pre-fetching
to _buildstatus() just before the place where the manifests are
fetched. We just need to add an extra check that the revision is not
None to handle the case that was previously handled by subclass
overriding. That also makes it safe for committablectx._prestatus() to
call its parent, although the latter now becomes empty, so we won't
bother.
Martin von Zweigbergk <martinvonz@gmail.com> [Sat, 11 Oct 2014 23:18:53 -0700] rev 23237
context.status: remove unused arguments from _matchstatus()
Martin von Zweigbergk <martinvonz@google.com> [Thu, 23 Oct 2014 13:43:20 -0700] rev 23236
context.status: remove overriding in workingctx
The workingctx method simply calls the super method. The only effect
it has is that it uses a different default argument for the 'other'
argument. The only in-tree caller is patch.diff, which always passes
an argument to the method, so it should be safe to remove the
overriding. Having the default argument depend on the type seems
rather dangerous anyway.
Mike Edgar <adgar@google.com> [Mon, 20 Oct 2014 14:20:43 -0400] rev 23235
synthrepo: when adding files, ensure new path is not a directory
Mike Edgar <adgar@google.com> [Mon, 20 Oct 2014 13:59:13 -0400] rev 23234
synthrepo: synthesized dates must be positive, fit in 32-bit signed ints
Mads Kiilerich <madski@unity3d.com> [Thu, 06 Nov 2014 01:48:29 +0100] rev 23233
discovery: test coverage for
issue4438 /
86c35b7ae300 /
73cfaa348650
The randomness in the discovery protocol made this problem hard to reproduce.
The test mocks random.sample to make sure we hit the problem every time. The
set iteration order also made the output unstable ... but with the issue fixed,
it is stable.
Matt Harbison <matt_harbison@yahoo.com> [Wed, 05 Nov 2014 21:33:45 -0500] rev 23232
hgweb: fix a crash when using web.archivesubrepos
A matcher is required when enabling the subrepo option on archival.archive(),
because that calls match.narrowmatcher(), which accesses fields on the object.
It's therefore probably a bad idea to default the matcher to None on archive(),
but that's a fix for default.
Matt Harbison <matt_harbison@yahoo.com> [Wed, 05 Nov 2014 20:31:58 -0500] rev 23231
tests: introduce a subrepository to test-archive.t
This will be used in an upcoming patch to add coverage for web.archivesubrepos.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 04 Nov 2014 21:45:26 -0800] rev 23230
test-status-rev: add tests for plain dirstate and inter-revision status
We have tests for the status across from '.^' to the working copy. It
makes sense to have the similar tests for the inter-revision status
between '.^' and '.' and for the dirstate status in the same
place.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 04 Nov 2014 21:22:46 -0800] rev 23229
test-status-rev: remove unnecessary initial commit
The initial commit was there when we had a group of tests that
compared against an empty base, but since those tests no longer exist,
we can drop the empty commit.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 04 Nov 2014 16:10:20 -0800] rev 23228
test-status-rev: use one glob for each expected status
It's getting a little hard to read the ~30 calls to 'hg status' with
one per file. Instead, let's use one glob for each expected
status. For example, modified files can be listed with
'glob:content1_*_content[23]-tracked'. That also nicely becomes an
explanation for why each status is expected.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 04 Nov 2014 15:36:35 -0800] rev 23227
test-status-rev: remove duplicate tests
The second group of tests in test-status-rev compare to an empty
revision. The first group of tests that compare to the first commit
should be testing all the same states with the missing_* files, so
drop the second group of tests.
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 06 Nov 2014 22:48:20 -0800] rev 23226
changegroup: sparsely populate fnodes
Previously, fnodes had a key and empty dict value for every element in
changedfiles. This is somewhat wasteful. Empty dicts in CPython consume
a lot more memory than you would expect - 280 bytes.
On mozilla-central, which has ~190,000 files/fnodes keys, the previous
loop populating fnodes allocated 91,924 KB of memory, most of that for
the empty dicts.
With this patch in place, our peak RSS during mozilla-central clone
drops:
before: 364,356 KB
after: 326,008 KB
delta: -38,348 KB
When combined with the previous patch, total peak RSS decrease is now
190,116 KB.
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 06 Nov 2014 22:33:48 -0800] rev 23225
changegroup: don't store unused value on fnodes (
issue4443)
The contents of fnodes are only accessed once per key. It is wasteful to
cache the value since nobody will use it.
Before this patch, the caching of unused data in fnodes was effectively
causing a memory leak during the file streaming part of bundle creation.
On mozilla-central (which has ~190,000 entries in fnodes), this patch
has a significant impact on RSS at the end of generate():
before: 516,124 KB
after: 364,356 KB
delta: -151,768 KB
The origin of this code can be traced back to
627cd7842e5d and has been
with us since the 2.7 release.
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 06 Nov 2014 20:57:12 -0800] rev 23224
changegroup: don't define lookupmf() until it is needed
lookupmf() is currently defined earlier than when it is needed. Future
patches further refactoring this code will be easier to read when
lookupmf() is in its new home.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 05 Nov 2014 18:31:39 +0000] rev 23223
mail: actually use the verifycert config value
The mail module only verifies the smtp ssl certificate if 'verifycert' is enabled
(the default). The 'verifycert' can take three possible values:
- 'strict'
- 'loose'
- any "False" value, eg: 'false' or '0'
We tested the validity of the third value, but never converted it to actual
falseness, making 'False' an equivalent for 'loose'.
This changeset fixes it.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 28 Oct 2014 14:58:36 +0100] rev 23222
exchange: use the postclose API on transaction
As with changegroup, we should wait for the transaction to be really closed
before scheduling hook execution.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 28 Oct 2014 15:44:23 +0100] rev 23221
changegroup: use the 'postclose' API on transaction
The post-transaction hooks run after the lock release (because hooks may want to
touch the repository), but they must only run if the transaction is successfully
closed.
We use the new 'addpostclose' method on transaction to register a callback
installing this post-lock-release call.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 28 Oct 2014 14:24:43 +0100] rev 23220
transaction: allow registering a post-close callback
The addchangegroup code considers the transaction done after a 'tr.close()' call
and schedules the hook's execution for after lock release. In the nested transaction
case, the transaction is not yet committed and we must delay this scheduling.
We add an 'addpostclose' method (like the 'addpending' and 'addfinalize' ones) that
registers code to be run if the transaction is successfully committed.
Mike Edgar <adgar@google.com> [Fri, 24 Oct 2014 15:58:46 -0400] rev 23219
exchange: swap "push" for "pull" in pulloperation docstring
Mike Edgar <adgar@google.com> [Wed, 29 Oct 2014 12:46:08 -0400] rev 23218
exchange: prepare kwargs for bundle2 part generation exactly once
Mike Edgar <adgar@google.com> [Sat, 25 Oct 2014 00:40:51 -0400] rev 23217
exchange: fix indentation in _pullchangeset
Mike Edgar <adgar@google.com> [Fri, 24 Oct 2014 16:26:44 -0400] rev 23216
dagutil: fix id/ix typos in docstrings
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 06 Nov 2014 11:55:37 +0000] rev 23215
patchbomb: extract 'getpatchmsgs' closure into its own function
Keep marching toward the promised land of simplification!
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 06 Nov 2014 11:57:48 +0000] rev 23214
patchbomb: extract 'makeintro' closure into its own function
Keep marching toward the promised land of simplification!
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 04 Nov 2014 21:48:23 +0000] rev 23213
patchbomb: extract 'getbundlemsgs' closure in its own function
Keep marching toward the promised land of simplification!
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 04 Nov 2014 21:41:35 +0000] rev 23212
patchbomb: extract 'getdescription' closure in its own function
Keep marching toward the promised land of simplification!
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 04 Nov 2014 21:33:57 +0000] rev 23211
patchbomb: extract 'getbundle' closure in its own function
Keep marching toward the promised land of simplification!
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 04 Nov 2014 21:28:57 +0000] rev 23210
patchbomb: extract 'getpatches' closure in its own function
Keep marching toward the promised land of simplification!
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 04 Nov 2014 21:22:59 +0000] rev 23209
patchbomb: extract 'getoutgoing' closure into its own function
The patchbomb command is a gigantic 300 line function full of closures. As a
first step to simplify it in smaller bits, I'm extracting the closures into full
featured functions. The first victim is 'getoutgoing'. It gains a docstring in
the process.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 06 Nov 2014 09:52:57 +0000] rev 23208
bundle2: handle empty 'b2x:changegroup' value in push and pull
Changeset
e4dc2b0be056 added advertising of supported changegroup version
through the new 'b2x:changegroup' capability. However, this capability is not
new and has been around since 3.1 with an empty value. This makes new clients
unable to push to 3.2 servers through bundle2 as they cannot find a common
changegroup version to use from and empty list.
Treating empty 'b2x:changegroup' value as old client fixes it.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 06 Nov 2014 10:05:43 +0000] rev 23207
bundle2: drop duplicated definition of 'b2x:exchange'
This bundle2 capability is going to be dynamically computed in 'getrepocaps'. We
do not need to include it in the static value.
Thomas Arendsen Hein <thomas@intevation.de> [Thu, 06 Nov 2014 09:36:39 +0100] rev 23206
convert: use git diff-tree -Cn% instead of --find-copies=n% for older git
The option --find-copies was added in a later git version than the one included
in Debian squeeze-lts (1.7.2.5), probably around 1.7.4.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 18 Oct 2014 01:09:41 -0700] rev 23205
changelog: rely on transaction for finalization
Instead of calling 'cl.finalize()' by hand (possibly at a bogus time) we
register it in the transaction during 'delayupdate' and rely on 'tr.close()' to
call it at the right time.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 17 Oct 2014 22:28:09 -0700] rev 23204
transaction: allow registering a finalization callback
The new 'addfinalize' method allows people to register a callback to
be triggered when the transaction is closed. This aims to get rid of
explicit calls to 'changelog.finalize'. This also obsoletes the
'onclose' function but removing it is not in the scope of this series.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 17 Oct 2014 21:55:31 -0700] rev 23203
changelog: handle writepending in the transaction
The 'delayupdate' method now takes a transaction object and registers its
'_writepending' method for execution in 'transaction.writepending()'. The hook can then
use 'transaction.writepending()' directly.
At some point this will allow the addition of other file creation
during writepending.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 17 Oct 2014 21:19:54 -0700] rev 23202
transaction: add 'writepending' logic
The contents of the transaction must be flushed to disk before running
a hook. But it must be flushed to a special file so that the normal
reader does not use it. This logic is currently in the changelog only.
We add some facility to register such operations in the transaction
itself.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 18 Oct 2014 01:12:18 -0700] rev 23201
changelog: rework the delayupdate mechanism
The current way we use the 'delayupdate' mechanism is wrong. We call
'delayupdate' right after the transaction retrieval, then we call 'finalize'
right before calling 'tr.close()'. The 'finalize' call will -always- result in a
flush to disk, making the data available to all readers. But the 'tr.close()' may
be a no-op if the transaction is nested. This would result in data:
1) exposed to reader too early,
2) rolled back by other part of the transaction after such exposure
So we need to end up in a situation where we call 'finalize' a single time when
the transaction actually closes. For this purpose we need to be able to call
'delayupdate' and '_writepending' multiple times and 'finalize' once. This was
not possible with the previous state of the code.
This changeset refactors the code to makes this possible. We buffer data in memory
as much as possible and fall-back to writing to a ".a" file after the first call
to '_writepending'.
Matt Mackall <mpm@selenic.com> [Wed, 05 Nov 2014 12:41:12 -0600] rev 23200
merge with stable
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 05 Nov 2014 17:25:00 +0000] rev 23199
bookmarks: fix formatting of exchange message (
issue4439)
The message formatting was crashing when doing explicit pulling `hg pull -B X`.
This changeset fix it and improved the test coverage.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 04 Nov 2014 12:26:06 -0800] rev 23198
test-status-rev: document one more broken test
The status for missing_content2_content2-untracked doesn't get
reported at all. Since the file does exist in the working copy, it
should reported as unknown. Document that in the test.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 04 Nov 2014 16:09:52 -0800] rev 23197
test-status-rev: use common script for generating file history
Start using the generate-working-copy-states.py script that's shared
with test-revert.t, instead of creating the states manually in the
test. This adds several states that are currently missing. We will
start checking those states later.
Martin von Zweigbergk <martinvonz@google.com> [Mon, 20 Oct 2014 23:56:55 -0700] rev 23196
test-status-rev: use same names as from generate-working-copy-states
To prepare for using generate-working-copy-states.py for generating
the files and their content, let's start by renaming the files
according to the naming scheme used by that script.
Martin von Zweigbergk <martinvonz@google.com> [Mon, 03 Nov 2014 16:27:01 -0800] rev 23195
test-revert: move embedded script to its own file
Move the gen-revert-cases.py out of test-revert.t into its own file so
we can reuse it from other tests (specifically test-status-rev.t).
Martin von Zweigbergk <martinvonz@google.com> [Sat, 18 Oct 2014 22:00:08 -0700] rev 23194
test-revert: simplify generation of files
With the recent change in naming of the generated files, it becomes
much easier to generate the files by iterating over all the possible
states than over the state transitions.
Matt Mackall <mpm@selenic.com> [Wed, 05 Nov 2014 11:16:31 -0600] rev 23193
merge with stable
Mads Kiilerich <madski@unity3d.com> [Wed, 05 Nov 2014 13:05:32 +0100] rev 23192
discovery: indices between sample and yesno must match (
issue4438)
3ef893520a85 changed 'sample' from a list to a set. The iteration order is thus
undefined and the yesno indices are not stable.
To solve this, repeat the listification and comment from elsewhere in the code.
Note: the randomness in the discovery protocol can make this problem hard to
reproduce.
Mads Kiilerich <madski@unity3d.com> [Wed, 05 Nov 2014 13:05:29 +0100] rev 23191
discovery: limit 'all local heads known remotely' to real 'all' (
issue4438)
3ef893520a85 made it possible that the initial head check didn't include all
heads. If that is the case, don't use the early exit just because this random
sample happened to be 'all known'.
Note: the randomness in the discovery protocol can make this problem hard to
reproduce.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 05 Nov 2014 23:24:47 +0900] rev 23190
largefiles: avoid printing messages while rebasing by "_lfstatuswriters"
Putting "lambda *msg, **opts: None" (= avoid printing messages always)
into "_lfstatuswriters" while rebasing makes explicit passing
"printmessage = False" for "updatelfiles()" useless.
This patch also removes setting/unsetting "repo._isrebasing" in
"overriderebase", because there is no code path referring it.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 05 Nov 2014 23:24:47 +0900] rev 23189
largefiles: get function to write status messages via "getstatuswriter()"
This patch makes "updatelfiles()" get appropriate function to write
largefiles specific status messages via "getstatuswriter()".
This patch introduces None as "print messages if needed", because True
(forcibly writing) and False (forcibly ignoring) are already used for
"printmessage" of "updatelfiles".
Subsequent patch will move "avoid printing messages only while
automated committing" decision from caller of "updatelfiles()" into
"getstatuswriter()".
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 05 Nov 2014 23:24:47 +0900] rev 23188
largefiles: introduce "_lfstatuswriters" to customize status reporting
"lfutil.getstatuswriter" is the utility to get appropriate function to
write largefiles specific status out from "repo._lfstatuswriters".
This patch uses "stack" with an element instead of flag like
"_isXXXXing" or so, because:
- the former works correctly even when customizations are nested, and
- ensuring at least one element can ignore empty check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 05 Nov 2014 23:24:47 +0900] rev 23187
largefiles: update standins only at the 1st commit of "hg rebase --continue"
Before this patch, "hg rebase --continue" may record incorrect
standins, because largefiles extension always avoid updating standins
while rebasing, even though largefiles in the working directory may be
modified manually at the 1st commit of "hg rebase --continue".
But, on the other hand, updating standins should be avoided at
subsequent commits for efficiency reason.
To update standins only at the 1st commit of "hg rebase --continue",
this patch introduces state-full callable object
"automatedcommithook", which updates standins by
"lfutil.updatestandinsbymatch()" only at the 1st commit of resuming.
Even after this patch, "repo._isrebasing = True" is still needed to
avoid some status report while updating largefiles in
"lfcommands.updatelfiles()".
This is reason why this patch omits not "repo._isrebasing = True" in
"overriderebase" but examination of "getattr(repo, "_isrebasing",
False)" in "updatestandinsbymatch".
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 05 Nov 2014 23:24:47 +0900] rev 23186
largefiles: introduce "_lfcommithooks" to abstract pre-committing procedures
This changes allows to customize pre-committing procedures according
to conditions.
This patch uses "stack" with an element instead of flag like
"_isXXXXing" or so, because:
- the former works correctly even when customizations are nested, and
- ensuring at least one element can ignore empty check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 05 Nov 2014 23:24:47 +0900] rev 23185
largefiles: factor out procedures to update standins for pre-committing
This patch factors out procedures to update standins for
pre-committing. This is one of preparations to avoid execution of such
procedures according to invocation context.
For example, resuming automated committing (e.g. "hg rebase
--continue") should update standins at the 1st commit, because
largefiles in the working directory may be modified manually. But on
the other hand, it should avoid updating standins at subsequent
committings for efficiency reason.
For simplicity, this patch just moves procedures mechanically only
with replacing below.
- "self" => "repo"
- "lfutil." => (none)
- "orig" invocation => returning "match"
Using "fstandin" instead "standin" as the name of local variable for
the loop below is the only special care, because the latter shadows
the same name function in "lfutil.py".
[before]
for standin in standins:
lfile = lfutil.splitstandin(standin)
if lfdirstate[lfile] != 'r':
lfutil.updatestandin(self, standin)
[after]
for fstandin in standins:
lfile = splitstandin(fstandin)
if lfdirstate[lfile] != 'r':
updatestandin(repo, fstandin)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 05 Nov 2014 23:24:47 +0900] rev 23184
largefiles: factor out procedures to update lfdirstate for post-committing
Before this patch, procedures to update lfdirstate for post-committing
are scattered in "lfilesrepo.commit". In the case of "hg commit" with
patterns for target files ("Case 2"), lfdirstate is updated BEFORE
real committing.
This patch factors out procedures to update lfdirstate for
post-committing into "lfutil.markcommitted", and makes it callable via
"markcommitted" of the context passed to "lfilesrepo.commitctx".
"markcommitted" of the context is called, only when it is committed
successfully.
Passing original "markcommitted" of the context is meaningless in this
patch, but required in subsequent one to prepare something before
invocation of it.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 05 Nov 2014 23:24:47 +0900] rev 23183
largefiles: remove meaningless code path for "hg pull --rebase"
This patch removes "--rebase" specific code path for "hg pull" in
"overridepull", because previous patch makes it meaningless: now,
"rebase.rebase" ("orig" invocation in this patch) can
update/commit largefiles safely without "repo._isrebasing = True".
As a side effect of removing "rebase.rebase" invocation in
"overridepull", this patch removes "nothing to rebase ..." message in
"test-largefiles.t", which is shown only when rebase extension is
enabled AFTER largefiles:
before this patch:
1. "dispatch" invokes "pullrebase" of rebase as "hg pull" at
first, because rebase wraps "hg pull" later
2. "pullrebase" invokes "overridepull" of largefiles as "orig",
even though rebase assumes that "orig" is "pull" of commands
3. "overridepull" executes "pull" and "rebase" directly
3.1 "pull" pulls changesets and creates new head "X"
3.2 "rebase" rebases current working parent "Y" on "X"
4. "overridepull" returns to "pullrebase"
5. "pullrebase" tries to rebase, but there is nothing to be done,
because "Y" is already rebased on "X". then, it shows "nothing
to rebase ..."
after this patch:
1. "dispatch" invokes "pullrebase" of rebase as "hg pull"
2. "pullrebase" invokes "overridepull" of largefiles as "orig"
3. "overridepull" executes "pull" as "orig"
4. "overridepull" returns to "pullrebase"
5. revision "Y" is not yet rebased, so "pullrebase" doesn't shows
"nothing to rebase ..."
As another side effect of removing "rebase.rebase" invocation, this
patch fixes
issue3861, which occurs only when rebase extension is
enabled BEFORE largefiles:
before this patch:
1. "dispatch" invokes "overridepull" of largefiles at first,
because largefiles wrap "hg pull" later
2. "overridepull" executes "pull" and "rebase" explicitly
2.1 "pull" pulls changesets and creates new head "X"
2.2 "rebase" rebases current working parent, but fails because
no revision is checked out in
issue3861 case
3. "overridepull" returns to "dispatch" with exit code 1 returned
from "rebase" at (2.2)
4. "hg pull" terminates with exit code 1 unexpectedly
after this patch:
1. "dispatch" invokes "overridepull" of largefiles at first
2. "overridepull" invokes "pullrebase" of rebase as "orig"
3. "pullrebase" invokes "pull" as "orig"
4. "pullrebase" invokes "rebase", and it fails
5. "pullrebase" returns to "overridepull" with exit code 0
(because "pullrebase" ignores result of "pull" and "rebase")
6. "overridepull" returns to "dispatch" with exit code 0 returned
from "rebase" at (5)
7. "hg pull" terminates with exit code 0
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 05 Nov 2014 23:24:47 +0900] rev 23182
largefiles: wrap "rebase.rebase" for functions using it directly
Before this patch, largefiles extension wraps only "rebase" in the
command table by "extensions.wrapcommand". But there are some
functions using "rebase.rebase" directly.
Without special care for them, largefiles extension can't work
correctly with such functions. In addition to it, "special care" often
becomes complicated and awkward. For example:
- "unshelve" can't get correct result of "rebase.rebase", because of
lack of special care
- special care for "hg pull --rebase" causes
issue3861
This patch wraps "rebase.rebase" for functions using it directly.
For simplicity, this patch keeps 'special care for "hg pull --rebase"'.
It is removed in the subsequent patch.
Sune Foldager <cryo@cyanite.org> [Fri, 17 Oct 2014 14:41:11 +0200] rev 23181
changegroup: introduce cg2packer/unpacker
cg2 supports generaldelta in changegroups, to be used in bundle2.
Since generaldelta is handled directly in cg2, reordering is switched
off by default.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 17 Oct 2014 12:19:24 -0700] rev 23180
push: send highest changegroup format supported by both side
When using bundle2, we find the common subset of supported changegroup-packers
and we pick the max of them. This allow to use generaldelta aware changegroups through
bundle2.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 17 Oct 2014 14:59:10 +0200] rev 23179
getbundle: send highest changegroup format supported by both side
When using bundle2, we find the common subset of supported changegroup-packers
and we pick the max of them. This allow to use generaldelta aware changegroup
through bundle2.
Sune Foldager <cryo@cyanite.org> [Fri, 17 Oct 2014 14:41:21 +0200] rev 23178
changegroup: allow use of different cg#packer in getchangegroupraw
This will allow the use of general delta aware changegroup formats.
Sune Foldager <cryo@cyanite.org> [Fri, 17 Oct 2014 14:41:02 +0200] rev 23177
changegroup: introduce "raw" versions of some commands
The commands getchangegroup, getlocalchangegroup and getsubset now each
have a version ending in -raw. The raw versions return the chunk generator
from the changegroup packer directly, without wrapping it in a chunkbuffer
and unpacker. This avoids extra chunkbuffers in the bundle2 code path.
Also, the raw versions can be extended to support alternative packers
in the future, to be used from bundle2.
Matt Mackall <mpm@selenic.com> [Tue, 04 Nov 2014 16:43:33 -0600] rev 23176
merge with stable
Pascal Quantin <pascal.quantin@gmail.com> [Tue, 04 Nov 2014 21:54:27 +0100] rev 23175
win32: remove Mercurial.ini file from Inno Setup installer (
issue4435)
Pascal Quantin <pascal.quantin@gmail.com> [Tue, 04 Nov 2014 21:35:49 +0100] rev 23174
win32: fix win32 installers generation
cd0c51c07e5f introduced a typo preventing a proper generation of the
installers. Also remove ConcatenateFiles() function as it is no more
required.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 04 Nov 2014 13:38:33 +0000] rev 23173
patchbomb: add label and color to the confirm output
The current output is mostly a wall of text. This makes it hard to
actually check something for people with lazy eyes. We use labels and
colors to make it more joyful (and get the patch summaries to stand
out). The colors have been arbitrarily choosen. They can be changed
later if someone has a more scientific choice.
Yuya Nishihara <yuya@tcha.org> [Tue, 04 Nov 2014 23:41:46 +0900] rev 23172
tests: write hgrc of more than two lines by using shell heredoc
Here document should be readable than repeating echo commands.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 04 Nov 2014 10:40:06 +0000] rev 23171
perf: use a formatter for output
We use a `formatter` object in the perf extensions. This allow the use of
formatted output like json. To avoid adding logic to create a formatter and pass
it around to the timer function in every command, we add a `gettimer` function
in charge of returning a `timer` function as simple as before but embedding an
appropriate formatter.
This new `gettimer` function also return the formatter as it needs to be
explicitly closed at the end of the command.
example output:
$ hg --config ui.formatjson=True perfvolatilesets visible obsolete
[
{
"comb": 0.02,
"count": 126,
"sys": 0.0,
"title": "obsolete",
"user": 0.02,
"wall": 0.
0199398994446
},
{
"comb": 0.02,
"count": 117,
"sys": 0.0,
"title": "visible",
"user": 0.02,
"wall": 0.
0250301361084
}
]
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 24 Sep 2014 21:33:12 -0700] rev 23170
bundle2: support a "version" argument in `changegroup` part
When included, this mandatory parameter (mandatory == cannot be ignored) lets the
part handler select the right cgunpacker class.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 24 Sep 2014 21:28:54 -0700] rev 23169
bundle2caps: advertise the available versions for changegroup packer
This will let the bundle2 client and server detect what packer they should be using.
This detection part is not done. I expect it to be done with the addition of the
second packer (with generaldelta support).
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 24 Sep 2014 21:24:06 -0700] rev 23168
changegroup: add a "packermap" dictionary to track different packer versions
We only have "01" right now, but we should get general delta in soon.
Bundle2 is expected to make use of this to advertise and select the right packer
to use on both sides.
Matt Harbison <matt_harbison@yahoo.com> [Mon, 03 Nov 2014 12:08:03 -0500] rev 23167
templater: don't overwrite the keyword mapping in runsymbol() (
issue4362)
This keyword remapping was introduced in
e06e9fd2d99f as part of converting
generator based iterators into list based iterators, mentioning "undesired
behavior in template" when a generator is exhausted, but doesn't say what and
introduces no tests.
The problem with the remapping was that it corrupted the output for keywords
like 'extras', 'file_copies' and 'file_copies_switch' in templates such as:
$ hg log -r
142b5d5ec9cc --template "{file_copies % ' File: {file_copy}\n'}"
File: mercurial/changelog.py (mercurial/hg.py)
File: mercurial/changelog.py (mercurial/hg.py)
File: mercurial/changelog.py (mercurial/hg.py)
File: mercurial/changelog.py (mercurial/hg.py)
File: mercurial/changelog.py (mercurial/hg.py)
File: mercurial/changelog.py (mercurial/hg.py)
File: mercurial/changelog.py (mercurial/hg.py)
File: mercurial/changelog.py (mercurial/hg.py)
What was happening was that in the first call to runtemplate() inside runmap(),
'lm' mapped the keyword (e.g. file_copies) to the appropriate showxxx() method.
On each subsequent call to runtemplate() in that loop however, the keyword was
mapped to a list of the first item's pieces, e.g.:
'file_copy': ['mercurial/changelog.py', ' (', 'mercurial/hg.py', ')']
Therefore, the dict for the second and any subsequent items were not processed
through the corresponding showxxx() method, and the first item's data was
reused.
The 'extras' keyword regressed in
de7e6c489412, and 'file_copies' regressed in
0b241d7a8c62 for other reasons. The common thread of things fixed by this seems
to be when a list of dicts are passed to the templatekw._hybrid class.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 16 Oct 2014 23:15:35 -0700] rev 23166
revset-matching: call 'getset' on a 'fullreposet'
Calling 'baseset(repo.changelog)' builds a list for all revisions in
the repo. And we already have the lazy and efficient 'fullreposet'
class for this purpose.
This gives us the usual benefits of the fullreposet but it is less visible
because the matching process itself is very expensive:
revset) matching(100)
before) wall 6.413281 comb 6.420000 user 5.910000 sys 0.510000 (best of 3)
after) wall 6.173608 comb 6.170000 user 5.750000 sys 0.420000 (best of 3)
However for some complex list, this provide a massive speedup
revset) matching(parents(100))
before) wall 23.890740 comb 23.890000 user 23.450000 sys 0.440000 (best of 3)
after) wall 6.382280 comb 6.390000 user 5.930000 sys 0.460000 (best of 3)
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 16 Oct 2014 23:15:06 -0700] rev 23165
revset-parentspec: call 'getset' on a 'fullreposet'
Calling 'baseset(repo.changelog)' builds a list for all revisions in
the repo. And we already have the lazy and efficient 'fullreposet'
class for this purpose.
This gives us the usual benefits of the fullreposet:
revset) 100^1
before) wall 0.002694 comb 0.000000 user 0.000000 sys 0.000000 (best of 897)
after) wall 0.000997 comb 0.000000 user 0.000000 sys 0.000000 (best of 2324)
revset) parents(100)^1
before) wall 0.003832 comb 0.000000 user 0.000000 sys 0.000000 (best of 587)
after) wall 0.001034 comb 0.000000 user 0.000000 sys 0.000000 (best of 2309)
revset) (100^1)^1
before) wall 0.005616 comb 0.000000 user 0.000000 sys 0.000000 (best of 405)
after) wall 0.001030 comb 0.000000 user 0.000000 sys 0.000000 (best of 2258)
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 16 Oct 2014 23:14:17 -0700] rev 23164
revset-children: call 'getset' on a 'fullreposet'
Calling 'baseset(repo.changelog)' builds a list for all revisions in the
repo. And we already have the lazy and efficient 'fullreposet' class
for this purpose.
This gives us the usual benefits of the fullreposet:
revset) children(tip~100)
before) wall 0.007469 comb 0.010000 user 0.010000 sys 0.000000 (best of 338)
after) wall 0.003356 comb 0.000000 user 0.000000 sys 0.000000 (best of 755)
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 16 Oct 2014 23:11:25 -0700] rev 23163
revset-ancestorspec: call 'getset' on a 'fullreposet'
Calling 'baseset(repo.changelog)' builds a list for all revisions in
the repo. And we already have the lazy and efficient 'fullreposet'
class for this purpose.
This gives us the usual benefits of the fullreposet:
revset) 100~5
before) wall 0.002712 comb 0.000000 user 0.000000 sys 0.000000 (best of 918)
after) wall 0.000996 comb 0.000000 user 0.000000 sys 0.000000 (best of 2493)
revset) parents(100)~5
before) wall 0.003812 comb 0.010000 user 0.010000 sys 0.000000 (best of 667)
after) wall 0.001038 comb 0.000000 user 0.000000 sys 0.000000 (best of 2361)
revset) (100~5)~5
before) wall 0.005614 comb 0.000000 user 0.000000 sys 0.000000 (best of 446)
after) wall 0.001035 comb 0.000000 user 0.000000 sys 0.000000 (best of 2424)
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 16 Oct 2014 23:10:44 -0700] rev 23162
revset-rangeset: call 'getset' on a 'fullreposet'
Calling 'baseset(repo.changelog)' builds a list for all revisions in
the repo. And we already have the lazy and efficient 'fullreposet'
class for this purpose.
This gives us the usual benefit ofs the fullreposet:
revset) 10:100
before) wall 0.002774 comb 0.000000 user 0.000000 sys 0.000000 (best of 797)
after) wall 0.001977 comb 0.000000 user 0.000000 sys 0.000000 (best of 1244)
revset) parents(10):parents(100)
before) wall 0.005054 comb 0.000000 user 0.000000 sys 0.000000 (best of 481)
after) wall 0.002060 comb 0.000000 user 0.000000 sys 0.000000 (best of 1056)
Martin von Zweigbergk <martinvonz@google.com> [Sun, 19 Oct 2014 22:19:22 -0700] rev 23161
test-revert: make sure all 'tracked' files are really tracked
When a file is missing in the 'parent' version and is tracked but
missing in the working directory, which happens by the 'missing' or
'removed' types, and the 'clean' type in the working directory, the
file does not exist in the working directory (unlike it would had the
'deleted' type been used). Thus, the *_missing_missing_tracked are not
actually tracked and they end up testing the same state as
*_missing_missing_untracked. To make them tracked, add a temporary
file, just like we do for the delete case. For simplicity's sake,
let's make sure the gen-revert-cases.py script always puts a file in
the working directory, whether or not it's going to be deleted.
Martin von Zweigbergk <martinvonz@google.com> [Sat, 18 Oct 2014 18:12:54 -0700] rev 23160
test-revert: sort by output filename again
Future patches will change how the output of 'gen-revert-cases.py
filelist' is generated, so now we want the order to depend on just the
filename again.
Martin von Zweigbergk <martinvonz@google.com> [Mon, 20 Oct 2014 22:54:18 -0700] rev 23159
test-revert: name files by state, not by state transition
This is the main patch in a series. See motivation in earlier patch.
In this patch, we actually change the names of the generated
files. For example, the file that is currently called missing_clean
becomes missing_missing_missing-tracked and it's clearer that it
should be tracked. It turns out that since the state was not
previously clear, it ended up testing an untracked state, which was
the same as for missing_clean. We'll fix this in a later patch.
Let's also change the content from (base,parent,wc) to
(content1,content2,content3) to make them all the same length so they
line up when displayed.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 17 Oct 2014 06:27:43 -0700] rev 23158
test-revert: temporarily sort by input states instead of output filename
The next patch will change the names of the files produced by the
script in test-revert. In order to reduce the size and increase the
clarity of the next patch, make the order produced by the internal
'gen-revert-cases.py filelist' command independent of the filenames.
Martin von Zweigbergk <martinvonz@google.com> [Sat, 18 Oct 2014 22:23:19 -0700] rev 23157
test-revert: put content, not keys, into 'combination'
By putting the file content rather than keys in the 'combination'
list, we restrict the knowledge of 'ctxcontent' and 'wccontent' to the
loop generating the combinations. That will make it easier to replace
the generation code.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 17 Oct 2014 09:02:30 -0700] rev 23156
test-revert: replace 'removed' in working copy with 'untracked-deleted'
The 'wccontent' variable has eight different states, four of them
tracked, and the other four untracked (at least when the file existed
in the parent revision). Among these eight states, 'removed' sticks
out by lacking the 'untracked-' prefix despite resulting in an
untracked state. To make the symmetry clearer, and to prepare for
future patches, rename 'removed' to 'untracked-deleted', which is
exactly what it is.
Note that, unlike 'remove', 'deleted' is configured in
gen-revert-cases.py to have content in the working directory and that
that content is instead expected to be removed in the test script.
However, no changes are needed to the test script, since it already
contains 'hg forget *untracked*' and 'rm *deleted*', which together
have the same effect as 'hg remove'.
See additional motivation in earlier patch.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 16 Oct 2014 23:59:08 -0700] rev 23155
test-revert: removing a missing file has no effect
The tests for removed_deleted and removed_removed test the same state
as removed_clean and removed_untracked-clean, respectively. Drop the
duplicate tests.
See additional motivation in earlier patch.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 17 Oct 2014 00:39:26 -0700] rev 23154
test-revert: reverting an addition is the same as removing
The tests for added_revert and added_untracked-revert test the same
state as added_deleted and added_removed, respectively. Drop the
duplicate tests.
See additional motivation in earlier patch.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 16 Oct 2014 23:36:40 -0700] rev 23153
test-revert: reverting no change means it's clean
This is the first step in a series that aims to put the state, not the
state transitions, in the filenames of the files generated by the
gen-revert-cases.py script. The possible state of a file in a revision
and in the working copy is only whether it exists and what its content
is (the tests don't care check flags). In the dirstate, the only state
is whether it's tracked or not. With the new naming, the file that is
currently called modified_untracked-clean now becomes
content1_content2_content2-untracked, for example.
By putting these states in the filename, it becomes easier to see that
we're not missing or duplicating any state, and to check that the
state is what we think it is. For example, the file that is currently
called missing_clean becomes missing_missing_missing-tracked and it's
clearer that it should be tracked.
Putting the content in the filename will also make the tests of file
content (e.g. "cat ../content-parent.txt") very obvious.
When we put the state in the filename, the filenames clearly need to
be unique. However, it turns out that some states are currently tested
multiple times. The 'revert' transition in the script means to take
the content from the grandparent. If the parent is the same as the
grandparent, there is no change compared to the parent, which is
exactly what 'clean' means. Avoid testing the same state twice.
Matt Mackall <mpm@selenic.com> [Mon, 03 Nov 2014 16:56:32 -0600] rev 23152
merge with stable
Matt Harbison <matt_harbison@yahoo.com> [Sun, 02 Nov 2014 15:27:15 -0500] rev 23151
extdiff: drop the command alias without options example in the help text
In the dropped example, the extension would look for 'vdiff.diffargs' in the
configuration, and not finding it, would run kdiff3 without the configured
options. That's not obvious to a new user who sees a kdiff3 configuration in
the prepackaged mergetools.rc file, and sees that kdiff3 still runs. While it
is conceivable that the user wants a kdiff3 command that runs without the
preconfigured options, it is more likely what they want is this, which uses the
canned options:
[alias]
vdiff = kdiff3
[extdiff]
kdiff3 =
We could mention alias here, but that seems like it belongs elswhere.
Matt Harbison <matt_harbison@yahoo.com> [Fri, 31 Oct 2014 21:34:55 -0400] rev 23150
extdiff: allow a preconfigured merge-tool to be invoked
There are three ways to configure an extdiff tool:
1) cmd.tool = (/path/to/exe optional)
2) tool = (path/to/exe optional)
3) tool = sometool someargs
Previously, if no executable is specified in the first two forms, the named tool
must be in $PATH, or the invocation fails. Since the [merge-tools] section
already has the path to the diff executable, and/or the registry keys to find
the executable on Windows, reuse that configuration for forms 1 and 2 instead of
failing. We already fallback to [diff-tools] and then [merge-tools] for program
arguments if they aren't specified in the [extdiff] section.
Since this additional lookup only occurs if an executable is not on the $PATH
for the named tool, this is backwards compatible. For now, we assume the user
knows what he is doing if a path is provided.
This change allows a configuration file like this (assuming beyondcompare3 is
configured in merge-tools), instead of hardcoding system specific a path:
[extdiff]
beyondcompare3 =
Matt Mackall <mpm@selenic.com> [Mon, 03 Nov 2014 16:30:21 -0600] rev 23149
extdiff: sort files when snapshotting
This fixes output stability and is generally
filesystem-performance-friendly.
Matt Harbison <matt_harbison@yahoo.com> [Sun, 02 Nov 2014 14:58:50 -0500] rev 23148
filemerge: split the logic for finding an external tool to its own function
This will be used by extdiff in an subsequent patch.
Martin von Zweigbergk <martinvonz@google.com> [Sun, 02 Nov 2014 13:18:08 -0800] rev 23147
largefiles: simplify check for lack of path arguments
Instead of checking for a partial merge by checking that the matches
has no files and no patterns, check that it's not an
always-matcher. Except for being shorter, it also catches the rare
case of an exact-matcher with no files.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 31 Oct 2014 14:11:47 -0700] rev 23146
largefiles: shortcircuit status code also for non-matching patterns
We currently shortcircuit the checking for large file standins if only
patterns of type 'path' are given on the command line. That makes e.g.
"hg st 'glob:foo/**'" unnecessarily slow when the only large files are
in a sibling directory.
Relax the check to be that it is not an always-matcher and that no
large files match the patterns given on the command line.
Note that before this change, only the latter of the following two
would show the status of files in .hglf (since the -I makes
match.anypats() true). After this change, they both display the
status. This behavior doesn't seem correct, but it would be a separate
change to explicitly filter out .hglf even in the shortcircuit case.
hg st .hglf/$file
hg st .hglf/$file -I .
Martin von Zweigbergk <martinvonz@google.com> [Mon, 27 Oct 2014 21:10:24 -0700] rev 23145
largefiles: remove confusing 'or None' from predicate
The match function that is overriden returns a boolean value, so
adding 'or None' is both unnecessary and confusing.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 30 Oct 2014 22:32:39 -0700] rev 23144
largefiles: drop unnecessary setting of matcher._always
In two very similar segments of code, an existing matcher is modified
by changing its _files attribute through a map and a filter
operation. Neither operation can cause an empty list to become
non-empty, so a matcher that always matches can not stop always
matching. Drop the setting of the attribute, so we don't unnecessarily
prevent the fast paths to be taken where these matchers end up being
used.
Mads Kiilerich <madski@unity3d.com> [Sun, 19 Oct 2014 03:22:23 +0200] rev 23143
config: move mergetools configuration from contrib to default configuration
The merge tool configuration is an essential part of a good initial user
experience. 'make osx' installers and direct 'make' installation did not have
merge tool configuration. Now they have.
Note: The installer fixes for windows have been done blindly and might require
additional changes.
Mads Kiilerich <madski@unity3d.com> [Thu, 04 Sep 2014 21:36:35 +0200] rev 23142
config: introduce "built-in" default configuration settings in default.d
This helps providing a more consistent user experience on all platforms and
with all packaging.
The exact location of default.d depends on how Mercurial is installed and
whether it is 'frozen'. The exact location should never be relevant to users
and is intentionally not explained in details in the documentation. It will
however always be next to the help and templates files.
Note that setting HGRCPATH also disables these defaults. I don't know if that
should be considered a bug or a feature.
Mads Kiilerich <madski@unity3d.com> [Sat, 18 Oct 2014 21:48:38 +0200] rev 23141
contrib: buildrpm checking of md5 checksums of downloaded Python and Docutils
Mads Kiilerich <madski@unity3d.com> [Sun, 02 Nov 2014 16:39:02 +0100] rev 23140
contrib: update build defaults to latest Python and docutils versions
Use Python 2.7.8 and Docutils 0.12 for Makefile.python and buildrpm (CentOS 5
rpms).
Mads Kiilerich <madski@unity3d.com> [Thu, 17 Apr 2014 22:47:38 +0200] rev 23139
spelling: fixes from proofreading of spell checker issues
Michael Fyles <mf@vorston.net> [Thu, 26 Jul 2012 11:38:13 +0100] rev 23138
extdiff: quote user-supplied options passed to shell
$ hg extdiff -p cmd -o "name <user@example.com>"
resulted in a shell redirection error (due to the less-than sign),
rather than passing the single option to cmd. This was due to options
not being quoted for passing to the shell, via util.system(). Apply
util.shellquote() to each of the user-specified options (-o) to the
comparison program before they are concatenated and passed to
util.system(). The requested external diff command (-p) and the
files/directories being compared are already quoted correctly.
The discussion at the time of changeset
be98c5ce4022 correctly noted
that this course of action breaks whitespace-separated options specified
for external diff commands in the configuration. The lower part of the
patch corrects this by lexing options read from the configuration file
into separate options rather than reading them all into the first
option.
Update test to cover these conditions.
Related changesets (reverse-chronological):
-
be98c5ce4022 (fix reverted to make configuration file options work)
-
453097750fbf (issue fixed but without fix for configuration file)
Yuya Nishihara <yuya@tcha.org> [Sun, 02 Nov 2014 13:20:07 +0900] rev 23137
serve: correct meta variable of --daemon-pipefds option
It was changed to lock path at
e22695b4472f.
Yuya Nishihara <yuya@tcha.org> [Sun, 02 Nov 2014 13:08:46 +0900] rev 23136
tests: have dumbhttp.py use cmdutil.service() to wait for child to listen()
Because the original dumbhttp.py exited without waiting for listen(), several
tests could fail with "abort: error: Connection refused" if subsequent hg
command is fast enough.
Martin von Zweigbergk <martinvonz@google.com> [Sun, 19 Oct 2014 22:09:03 -0700] rev 23135
test-revert: remove obsolete comment about known misbehavior
It seems like the last known misbehvior that the comment was referring
to was dealt with in
2ff28e07d7d6 (revert: properly back up added
files with local modification, 2014-08-31).
Matt Mackall <mpm@selenic.com> [Mon, 03 Nov 2014 11:06:51 -0600] rev 23134
test-revert.t: fix wc check-code false positive
Matt Mackall <mpm@selenic.com> [Mon, 03 Nov 2014 14:01:52 -0600] rev 23133
merge with stable
Matt Mackall <mpm@selenic.com> [Sat, 01 Nov 2014 22:48:49 -0500] rev 23132
Added signature for changeset
ced632394371
Matt Mackall <mpm@selenic.com> [Sat, 01 Nov 2014 22:48:12 -0500] rev 23131
Added tag 3.2 for changeset
ced632394371
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 01 Nov 2014 23:52:53 +0000] rev 23130
setdiscovery: limit the size of all sample (
issue4411)
Further digging on this issue show that the limit on the sample size used in
discovery never works for heads. Here is a quote from the code itself:
desiredlen = size - len(always)
if desiredlen <= 0:
# This could be bad if there are very many heads, all unknown to the
# server. We're counting on long request support here.
The long request support never landed and evolution make the "very many heads,
all unknown to the server" case quite common.
We implement a simple and stupid hard limit of sample size for all query. This
should prevent HTTP 414 error with the current state of the code.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 01 Nov 2014 23:17:50 +0000] rev 23129
hook: protect commit hooks against stripping of temporary commit (
issue4422)
History rewriting commands like histedit tend to use temporary
commits. They may schedule hook execution on these temporary commits
for after the lock has been released. But temporary commits are likely
to have been stripped before the lock is released (and the hook run).
Hook executed for missing revisions leads to various crashes.
We disable hooks execution for revision missing in the repo. This
provides a dirty but simple fix to user issues.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 01 Nov 2014 22:59:37 +0000] rev 23128
mq: do not call [0] on revset
The __getitem__ method have been removed. The "first" method is to be used
instead. Test have been extended to test this code path.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 01 Nov 2014 22:58:30 +0000] rev 23127
addset: fix `first` and `last` on sorted addset (
issue4426)
The lazy sorting were not enforced on addset. This was made visible through MQ.
Matt Mackall <mpm@selenic.com> [Sat, 01 Nov 2014 17:30:57 -0500] rev 23126
clone: properly mark branches closed with --uncompressed (
issue4428)
On streaming clone, we were priming the local branch cache with the
remote branchmap, without checking which heads were closed.
This fixes an issue introduced in:
changeset: 17740:
e6067bec18da
user: Tomasz Kleczek <tomasz.kleczek@fb.com>
date: Wed Oct 03 13:19:53 2012 -0700
summary: branchcache: fetch source branchcache during clone (
issue3378)
that was exposed in 2.9 by:
changeset: 20192:
38fad5e76ee8
user: Brodie Rao <brodie@sf.io>
date: Mon Sep 16 01:08:29 2013 -0700
summary: branches: simplify with repo.branchmap().iterbranches()
Mads Kiilerich <madski@unity3d.com> [Sat, 01 Nov 2014 20:00:31 +0100] rev 23125
Makefile: update .PHONY
Based on
sed -n 's/^\([a-z0-9-]*\):\(\s.*\)\?$/\1/gp' Makefile | xargs echo
add check, check-code, update-pot, some packaging targets
Mads Kiilerich <madski@unity3d.com> [Sat, 01 Nov 2014 20:00:00 +0100] rev 23124
buildrpm: fix use of invalid $PLATFORM in mercurial.repo
Matt Mackall <mpm@selenic.com> [Sat, 01 Nov 2014 13:13:04 -0500] rev 23123
debuglocks: add missing usage summary
Mads Kiilerich <madski@unity3d.com> [Sat, 01 Nov 2014 19:02:31 +0100] rev 23122
help: don't crash on help for 'sections' with multiple '.'
Mads Kiilerich <madski@unity3d.com> [Sat, 01 Nov 2014 18:28:54 +0100] rev 23121
help: fix config description of ui.reportoldssl
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 01 Nov 2014 18:03:17 +0900] rev 23120
i18n-ja: synchronized with
f3baaeffe841
Wagner Bruna <wbruna@yahoo.com> [Fri, 31 Oct 2014 22:30:39 -0200] rev 23119
i18n-pt_BR: synchronized with
0b7853f969ac
Wagner Bruna <wbruna@yahoo.com> [Fri, 31 Oct 2014 22:22:41 -0200] rev 23118
merge with i18n
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 01 Nov 2014 01:03:11 +0900] rev 23117
i18n-ja: synchronized with
5459b30aa498
Durham Goode <durham@fb.com> [Fri, 31 Oct 2014 12:56:25 -0700] rev 23116
clone: fix copying bookmarks in uncompressed clones (
issue4430)
ef62c66bee1b broke bookmarks getting copied during uncompressed clones. Since
most of the pull logic has been moved into exchange.py, lets just call
exchange.pull to fix up the repo with the latest bits after the streaming clone
has bootstrapped the repo. This keeps us from having to duplicate the bookmark
logic.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 31 Oct 2014 10:41:36 -0700] rev 23115
revset: don't recreate matcher for every revision
The matcher variable 'm' in checkstatus() is reset to None on each
call, so the caching of the matcher no longer happens as it was
intended. This seems to be a regression in
ed7b674824a3 (revset: added
lazyset implementation to checkstatus, 2014-01-03).
Fix by moving the cached matcher into the enclosing function so it's
actually cached across calls. This speeds up
hg log -r 'modifies(mercurial/context.py)' >/dev/null
from 7.5s to 4s.
Also see similar fix in
f2aeff8a87b6 (revset: avoid recalculating
filesets, 2014-10-22).
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 01 Nov 2014 02:43:08 +0900] rev 23114
help: use ":hg:`command`" instead of incorrect ":hg:'command'" notation
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 01 Nov 2014 02:43:08 +0900] rev 23113
i18n: add i18n comment to error messages of filesets predicates
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 01 Nov 2014 02:43:08 +0900] rev 23112
i18n: add i18n comment to error messages of template functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 01 Nov 2014 02:43:08 +0900] rev 23111
help: refer ":merge3" instead of "internal:merge3"
According to warning message (introduced by
38e0363dcbe0) in
filemerge.py, the former should be used as official name.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 01 Nov 2014 02:43:08 +0900] rev 23110
i18n: make hint message of exception translatable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 01 Nov 2014 02:43:08 +0900] rev 23109
help: use "hg files" instead of "hg locate" in "hg help filesets"
The latter command is already deprecated.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 01 Nov 2014 02:41:18 +0900] rev 23108
files: refer "hg help filesets" instead of "hg help revsets" in help text
"specifying FILE patterns" should refer the former.
Matt Mackall <mpm@selenic.com> [Thu, 30 Oct 2014 17:52:01 -0500] rev 23107
tests: silence output race in test-run-tests.t
Matt Mackall <mpm@selenic.com> [Thu, 30 Oct 2014 16:57:28 -0500] rev 23106
merge with i18n
Wagner Bruna <wbruna@softwareexpress.com.br> [Mon, 27 Oct 2014 20:38:17 -0200] rev 23105
i18n-pt_BR: synchronized with
8d43c6bb38c0
Wagner Bruna <wbruna@softwareexpress.com.br> [Thu, 23 Oct 2014 18:17:00 -0200] rev 23104
i18n-pt_BR: synchronized with
c312ef382033
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 17 Oct 2014 21:25:48 -0700] rev 23103
transaction: only generate file when we actually close the transaction
Before this change, the file were written for every call to `tr.close()`
exposing data to reader far too early.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 29 Sep 2014 00:59:25 -0700] rev 23102
transaction: extract file generation into its own function
We extract the code generating files into its own function. We are
about to move this code around to fix a bug. We'll need it in a
function soon to reuse it for "pending" logic. So we move the code
into a function instead of moving it twice.
Matt Harbison <matt_harbison@yahoo.com> [Tue, 28 Oct 2014 23:05:19 -0400] rev 23101
amend: abort early if no username is configured with evolve enabled (
issue4211)
Amend will reuse the original username if a new one is not provided
with -U, but obsolete.createmarkers() only considers ui.username() for
the obsolete marker's metadata. Allowing the metadata field to be
spoofed seems to defeat the point of the field in the first place.
This covers 'evolve amend' and 'ci --amend' with evolve enabled.
Without this, the transaction aborts but the parent changeset is set to -1. The
corresponding test will be added to evolve separately.
Durham Goode <durham@fb.com> [Tue, 28 Oct 2014 14:06:06 -0700] rev 23100
revset: fix O(2^n) perf regression in addset
hg log -r 1 ... -r 100 was never returning due to a regression in the
way addset computes __nonzero__. It used 'bool(self._r1 or self._r2)'
which required executing self._r1.__nonzero__ twice (once for the or,
once for the bool). hg log with a lot of -r's happens to build a one
sided addset tree of N length, which ends up being 2^N performance.
This patch fixes it by converting to bool before or'ing.
This problem can be repro'd with something as simple as:
hg log `for x in $(seq 1 50) ; do echo "-r $x "; done`
Adding '1 + 2 + ... + 20' to the revsetbenchmark.txt didn't seem to repro the
problem, so I wasn't able to add a revset benchmark for this issue.
Matt Mackall <mpm@selenic.com> [Mon, 27 Oct 2014 23:47:41 -0500] rev 23099
tests: add missing glob for Windows
Matt Mackall <mpm@selenic.com> [Mon, 27 Oct 2014 18:44:05 -0500] rev 23098
test-convert-svn-sink: properly isolate symlink section
This was fixed earlier by moving all the symlink bits to a section to
the end of the file, but then it was broken (by the same person) by
adding more tests at the end.
Siddharth Agarwal <sid0@fb.com> [Fri, 24 Oct 2014 11:39:39 -0700] rev 23097
util.fspath: use a dict rather than a linear scan for lookups
Previously, we'd scan through the entire directory listing looking for a
normalized match. This is O(N) in the number of files in the directory. If we
decide to call util.fspath on each file in it, the overall complexity works out
to O(N^2). This becomes a problem with directories a few thousand files or
larger.
Switch to using a dictionary instead. There is a slightly higher upfront cost
to pay, but for cases like the above this is amortized O(1). Plus there is a
lower constant factor because generator comprehensions are faster than for
loops, so overall it works out to be a very small loss in performance for 1
file, and a huge gain when there's more.
For a large repo with around 200k files in it on a case-insensitive file
system, for a large directory with over 30,000 files in it, the following
command was tested:
ls | shuf -n $COUNT | xargs hg status
This command leads to util.fspath being called on $COUNT files in the
directory.
COUNT before after
1 0.77s 0.78s
100 1.42s 0.80s
1000 6.3s 0.96s
I also tested with COUNT=10000, but before took too long so I gave up.
Matt Mackall <mpm@selenic.com> [Mon, 27 Oct 2014 16:53:01 -0500] rev 23096
test-clone.t: drop message about listing bookmarks with no hardlinks
Matt Mackall <mpm@selenic.com> [Mon, 27 Oct 2014 16:39:57 -0500] rev 23095
tests: don't try to test unix sockets on vfat
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 28 Oct 2014 00:19:18 +0900] rev 23094
tests: change obsolete timestamp to avoid "gmtime()" problem on Windows
Before this patch, "test-obsolete.t" fails on Windows environment,
because strings corresponded to "tm_wday" (day of the week) field are
incorrect.
On POSIX environment, "gmtime()" returns correct "tm_wday" value even
for negative "time_t" value. On the other hand, it returns incorrect
one on Windows environment. At least, "gmtime()" of the Windows
runtime library bundled with Python 2.7.3 does.
According to
9a7d0f7e0561 introducing original timestamp value '56
120', it shouldn't cause negative "time_t" value.
test-obsolete: remove subminute timezone in test
Obsmarker format "1" does not supports sub minute timezone. So we
change the test to something slightly more sensible.
It replaced "-d '56 12'" by "-d '56 120'".
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 28 Oct 2014 00:19:18 +0900] rev 23093
tests: use "%HG_ARGS%" in shell alias on Windows instead of "$HG_ARGS"
Before this patch, a part of "test-alias.t" fails unexpectedly on
Windows environment, because "cmd.exe" can't evaluate "$HG_ARGS"
expression in shell alias correctly.
This patch uses "%HG_ARGS%" in shell alias on Windows instead of
"$HG_ARGS" to expand it correctly.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 28 Oct 2014 00:19:18 +0900] rev 23092
tests: introduce "checkeditform-n-cat.sh" script to invoke "cat" in it safely
Before this patch, a part of "test-transplant.t" fails unexpectedly on
Windows environment, because semicolon (";") in HGEDITOR isn't
recognized as the command separator by "cmd.exe".
This patch newly introduces "checkeditform-n-cat.sh" script to invoke
"cat" in it safely anywhere.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Fri, 24 Oct 2014 13:50:00 -0400] rev 23091
doc: change 'revision or range' to 'revision or revset'
The phrase "revision or range" comes from a pre-revset era. Since the
documentation for ranges now is under the revset docs, and as a
helpful hint nudging users towards revsets, I think it's better to say
"revision or revset"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 28 Oct 2014 01:14:12 +0900] rev 23090
largefiles: add examination of exec bit in "hg status --rev REV" case
Before this patch, "hg status --rev REV" doesn't list largefiles up
with "M" mark, even if exec bit of them is changed, because
"lfilesrepo.status" doesn't examine exec bit in such case.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 28 Oct 2014 01:14:11 +0900] rev 23089
largefiles: ignore removal status of files not managed in the target context
Before this patch, "hg status --rev REV" listed largefiles removed in
the working directory up with "R" mark, even if they aren't managed in
the REV. Normal files aren't listed up in such case.
When "lfilesrepo.status" is invoked for "hg status --rev REV", it
treats files on conditions below as "removed" (to avoid manifest full
scan in "ctx.status" ?):
- marked as "R" in lfdirstate, or
- files managed in the target revision but unknown in the manifest
of the working context (= not including "R" files)
But the former can include files not managed in the target context.
To ignore removal status of files not managed in the target context,
this patch drops files unknown in the target revision from "removed"
list.
Mads Kiilerich <madski@unity3d.com> [Sun, 26 Oct 2014 12:14:12 +0100] rev 23088
changelog: use headrevsfiltered
2b5940f64750 introduced use of the new filtering headrevs C implementation. It
caught TypeError to detect when to fall back to the implementation that was
compatible with old extensions. That method was however not reliable.
Instead, use the new headrevsfiltered function when passing a filter. It will
reliably fail with AttributeError when an old extension that predates
headrevsfiltered is used.
Mads Kiilerich <madski@unity3d.com> [Sun, 26 Oct 2014 12:14:10 +0100] rev 23087
parsers: introduce headrevsfiltered in C extension
All extensions that have this function do support filtering. The existing
headrevs function may support filtering but we cannot reliably detect whether
it does.
Matt Harbison <matt_harbison@yahoo.com> [Sat, 25 Oct 2014 21:34:49 -0400] rev 23086
httppeer: close the temporary bundle file after two-way streaming it
This fixes several push tests in test-bundle2-exchange.t that were failing on
Windows with messages like the following:
$ hg -R main push http://localhost:$HGPORT2/ -r
32af7686d403 \
--bookmark book_32af
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
remote: 1 new obsolescence markers
updating bookmark book_32af
abort: The process cannot access the file because it is being used by another
process: 'C:\path\to\tmp\bundle.hg'
[255]
Martin von Zweigbergk <martinvonz@google.com> [Fri, 24 Oct 2014 14:24:28 -0700] rev 23085
status: make 'hg status --rev' faster when there are deleted files
In order not to avoid listing files as both added and deleted, for
example, we check for every file in the manifest if it is in the
_list_ of deleted files. This can get quite slow when there are many
deleted files. Change it to a set to make the containment check
faster. On a somewhat contrived example of the Mozilla repo with the
entire testing/ directory deleted (~14k files), this makes
'hg status --rev .^' go from 26s to 2s.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 27 Oct 2014 17:52:33 +0100] rev 23084
setdiscovery: limit the size of the initial sample (
issue4411)
The set discovery start by sending a "known" command with all local heads. When
the number of local heads is massive (eg: using hidden changesets) such request
becomes too large. This lead to 414 error over http, aborting the whole
process.
We limit the size of the sample used by the first query to fix this.
The test are impacted because they do test massive number of heads. But they do
not test it over real world http setup.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 27 Oct 2014 17:40:32 +0100] rev 23083
setdiscovery: extract sample limitation in a `_limitsample` function
We need to reuse this logic for the initial query. We extract it in a function
to unsure sample limiting is applied consistently in all cases.
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 24 Oct 2014 17:24:46 -0500] rev 23082
exchange: don't report failure from identical bookmarks
b901645a8784 regressed the behavior of pushing an unchanged bookmark to
a remote. Before that commit, pushing a unchanged bookmark would result
in "exporting bookmark @" being printed. After that commit, we now see
an incorrect message "bookmark %s does not exist on the local or remote
repository!"
This patch fixes the regression introduced by
b901645a8784 by having
the bookmark error reporting code filter identical bookmarks and adds
a test for the behavior.
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 24 Oct 2014 10:40:37 -0700] rev 23081
bookmarks: explicitly track identical bookmarks
bookmarks.compare() previously lumped identical bookmarks in the
"invalid" bucket. This patch adds a "same" bucket.
An 8-tuple for holding this state is pretty gnarly. The return value
should probably be converted into a class to increase readability. But
that is beyond the scope of a patch intended to be a late arrival to
stable.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 24 Oct 2014 15:52:20 -0500] rev 23080
context.status: remove incorrect swapping of added/removed in workingctx
The comment in workingctx.status() says that "calling 'super' subtly
reveresed the contexts", but that is simply not true, so we should not
be swapping added and removed fields.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 23 Oct 2014 13:17:37 -0700] rev 23079
keyword: use parent of working copy as base for status
Instead of calling repo[None].status(), use the more common form that
uses the parent of the working copy as the base:
repo['.'].status(). Note that the former defaults to comparing to
revision '.', while the latter defaults to revision None, so the
contexts being compared are the same.
It might seem like this would result in a reverse diff, but it turns
out that workingctx.status() incorrectly reverses the result. That bug
will be fixed in a later commit.
Yuya Nishihara <yuya@tcha.org> [Thu, 23 Oct 2014 21:53:37 +0900] rev 23078
revset: avoid O(n) lookup of invalid revision in rev()
ba89f7b542c9 was not the final version of that patch. It was really slow
because `l not in repo.changelog` iterates revisions up to `l`. Instead,
rev() should utilize spanset.__contains__().
revset #0: rev(210000)
0) wall 0.000039 comb 0.000000 user 0.000000 sys 0.000000 (best of 67978)
1) wall 0.002721 comb 0.000000 user 0.000000 sys 0.000000 (best of 1055)
2) wall 0.000059 comb 0.000000 user 0.000000 sys 0.000000 (best of 45599)
(0: 3.2-rc, 1:
ba89f7b542c9, 2: this patch)
Note that the benchmark result described in
ba89f7b542c9 is wrong because
it is the one of the initial version.
Matt Mackall <mpm@selenic.com> [Thu, 23 Oct 2014 13:44:34 -0500] rev 23077
run-tests: output diffs with only forward slashes
This removes some gratuitous variance when testing on Windows with
test-run-tests.t.
Wagner Bruna <wbruna@softwareexpress.com.br> [Thu, 23 Oct 2014 12:35:10 -0200] rev 23076
i18n: add hint to digest mismatch message
Wagner Bruna <wbruna@softwareexpress.com.br> [Thu, 23 Oct 2014 12:28:00 -0200] rev 23075
help/config: fix typo
Wagner Bruna <wbruna@softwareexpress.com.br> [Thu, 23 Oct 2014 12:27:57 -0200] rev 23074
files: fix example list syntax
Mads Kiilerich <madski@unity3d.com> [Thu, 23 Oct 2014 02:42:57 +0200] rev 23073
parsers: use 'k' format for Py_BuildValue instead of 'n' because Python 2.4
'n' was introduced in Mercurial in
2b5940f64750 and broke Python 2.4 support in
mysterious ways that only showed failure in test-glog.t. Py_BuildValue failed
because of the unknown format and a TypeError was thrown ... but it never
showed up on the Python side and it happily continued processing with wrong
data.
Quoting https://docs.python.org/2/c-api/arg.html :
n (integer) [Py_ssize_t]
Convert a Python integer or long integer to a C Py_ssize_t.
New in version 2.5.
k (integer) [unsigned long]
Convert a Python integer or long integer to a C unsigned long without
overflow checking.
This will use unsigned long instead of Py_ssize_t. That is not a good solution,
but good is not an option when we have to support Python 2.4.
Durham Goode <durham@fb.com> [Mon, 20 Oct 2014 18:50:09 -0700] rev 23072
rebase: improve base revset performance
The old revset had pretty terrible performance on large repositories (12+
seconds). This new revset achieves the same result in only 0.7s. As we improve
the underlying revset APIs we can probably get this revset down to 'only(base,
dest)::', but at the moment that version still takes 2s.
Ryan McElroy <rmcelroy@fb.com> [Thu, 16 Oct 2014 06:35:06 -0700] rev 23071
amend: fix amending rename commit with diverged topologies (
issue4405)
This addresses the bug described in
issue4405: when obsolescence markers are
enabled, amending a commit with a file move can lead to the copy information
being lost.
However, the bug is more general and can be reproduced without obsmarkers as
well, as demonstracted by Pierre-Yves and put into the updated test.
Specifically, graph topology divergences between the filelogs and the changelog
can cause copy information to be lost during amends.
Augie Fackler <raf@durin42.com> [Tue, 21 Oct 2014 17:09:37 -0400] rev 23070
hgweb: disable SSLv3 serving (BC)
Because of recent attacks[0] on SSLv3, let's just drop support entirely.
0: http://googleonlinesecurity.blogspot.com/2014/10/this-poodle-bites-exploiting-ssl-30.html
Augie Fackler <raf@durin42.com> [Tue, 21 Oct 2014 17:01:23 -0400] rev 23069
sslutil: only support TLS (BC)
In light of the POODLE[0] attack on SSLv3, let's just drop the ability to
use anything older than TLSv1 entirely.
This only fixes the client side. Another commit will fix the server
side. There are still a few SSLv[23] constants hiding in httpclient,
but I'll fix those separately upstream and import them when we're not
in a code freeze.
0: http://googleonlinesecurity.blogspot.com/2014/10/this-poodle-bites-exploiting-ssl-30.html
Mads Kiilerich <madski@unity3d.com> [Wed, 22 Oct 2014 16:10:23 +0200] rev 23068
eol: fix crash when handling removed files
ci --amend would in some cases fail after
650b5b6e75ed failed to refactor the
eol extension too.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 15 Oct 2014 03:52:20 -0700] rev 23067
bundle2: transmit exception during part generation
If an exception is raised during a bundle2 part payload generation it is now
recorded in the bundle. If such exception occurs, we capture it, transmit an
abort exception through the bundle, cleanly close the current part payload and
raise it again. This allow to generate valid bundle even in case of exception so
that the consumer does not wait forever for a dead producer. This also allow to
raise the exception during unbundling at the exact point it happened during
bundling make debugging easier.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 14 Oct 2014 10:47:47 -0700] rev 23066
bundle2: add a interrupt mechanism
It is now possible to emit a single part in the middle of a payload production.
This part will be processed with limitation (only access to a `ui` object). The
goal is to let the server raise exception and output while a part is being
processed. The source motivation is to transmit exception that occurs while
generating a part.
This change is was the motivation to bump the bundle2 format from HG2X to HG2Y.
Somehow, the format bump made it into 3.2 without it. So this change go on
stable. It is low risk as bundle2 is still disabled by default.
Durham Goode <durham@fb.com> [Tue, 21 Oct 2014 12:38:28 -0700] rev 23065
transactions: change backupfiles format to use newlines
Previously the journal.backupfiles file was delimited by \0. Now we delimit it
using \n (same as the journal file). This allows us to change the number of
values in each line more easily, rather than relying on the count of \0's.
Durham Goode <durham@fb.com> [Tue, 21 Oct 2014 11:37:29 -0700] rev 23064
transactions: add version number to journal.backupfiles
The transaction format will be changing a bit over the next releases, so let's
go ahead and add a version number to make backwards compatibility easier. This
whole file format was broken prior to 3.2 (see previous patch), so changing it
now is pretty low risk.
Durham Goode <durham@fb.com> [Mon, 20 Oct 2014 16:53:56 -0700] rev 23063
transactions: fix hg recover with fncache backups
The transaction backupfiles logic was broken for 'hg recover'. The file format
is XXX\0XXX\0YYY\0YYY\0 but the parser did a couple things wrong. 1) It went one
step beyond the final \0 and tried to read past the end of the array. 2)
array[i:i+1] returns a single item, instead of two items as intended.
Added a test to catch it, which turns out to be the first actual 'hg recover'
test.
Yuya Nishihara <yuya@tcha.org> [Sun, 19 Oct 2014 16:48:33 +0900] rev 23062
revset: have rev() drop out-of-range or filtered rev explicitly (
issue4396)
The recent optimization of "and" operation relies on the assumption that
the rhs set does not contain invalid revisions. So rev() has to remove
invalid revisions.
This is still faster than using `.filter(lambda r: r == l)`.
revset #0: rev(25)
0) wall 0.026341 comb 0.020000 user 0.020000 sys 0.000000 (best of 113)
1) wall 0.000038 comb 0.000000 user 0.000000 sys 0.000000 (best of 66567)
2) wall 0.000062 comb 0.000000 user 0.000000 sys 0.000000 (best of 43699)
(0:
bbf4f3dfd700^, 1: 3.2-rc, 2: this patch)
Matt Mackall <mpm@selenic.com> [Wed, 22 Oct 2014 15:47:27 -0500] rev 23061
revset: avoid recalculating filesets
This fixes a regression in
8dabcc889e33 that moved matcher building
into a callback, thus causing it be rebuilt for each revision matched
against.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 20 Oct 2014 22:08:08 +0900] rev 23060
tests: open file in binary mode to use POSIX end-of-line style anywhere
Before this patch, "test-context.py" fails on Windows environment,
because "diff" output contains unexpected "\r" character.
Opening the target file in text mode causes this automatic end-of-line
conversion.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 20 Oct 2014 22:08:08 +0900] rev 23059
tests: add "(glob)" for l10n messages in test-clone.t for Windows
This patch follows the style of other tests avoiding same kind of issue.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 20 Oct 2014 22:08:08 +0900] rev 23058
tests: add "(glob)" for l10n messages in test-largefiles-update.t for Windows
This patch follows the style of other tests avoiding same kind of issue.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 20 Oct 2014 22:08:08 +0900] rev 23057
tests: add "(glob)" to paths in test-revset-outgoing.t for Windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 20 Oct 2014 22:08:08 +0900] rev 23056
tests: add "(glob)" to paths in test-hgrc.t for Windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 20 Oct 2014 22:08:08 +0900] rev 23055
tests: add "(glob)" to paths in test-url-rev.t for Windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 20 Oct 2014 22:08:08 +0900] rev 23054
tests: adjust expected prompt choice outputs in test-record.t for Windows
Changeset
9ab18a912c44 introduced "showing prompt choice if input is
not a tty but is forced to be interactive" and adjusted expected
output in test-record.t.
But some tests for no-execbit platform (= Windows) were not adjusted
by
9ab18a912c44.
This causes unexpected failure of test-record on Windows environment.
This patch adds below to prompt lines for such tests:
- prompt choice at the end of prompt line, and
- empty line after prompt line
Yuya Nishihara <yuya@tcha.org> [Tue, 21 Oct 2014 23:16:46 +0900] rev 23053
ui: separate option to show prompt echo, enabled only in tests (
issue4417)
The problem in commandserver was addressed by
524b786bd54f, but it is tricky
to reuse ui.nontty option to disable echo back. Instead, this patch introduces
new option to enable echoing of prompt response.
Prompt echoing is changed to be off by default, which should avoid possible
breakage of output parsing in user scripts.
For now, this option is undocumented because it exists for internal use.
Matt Mackall <mpm@selenic.com> [Sat, 18 Oct 2014 18:14:48 -0500] rev 23052
Added signature for changeset
7f8d16af8cae
Matt Mackall <mpm@selenic.com> [Sat, 18 Oct 2014 18:14:38 -0500] rev 23051
Added tag 3.2-rc for changeset
7f8d16af8cae
Matt Mackall <mpm@selenic.com> [Sat, 18 Oct 2014 18:05:10 -0500] rev 23050
merge with i18n
Alexander Sauta <demosito@gmail.com> [Mon, 13 Oct 2014 14:46:50 +0100] rev 23049
i18n-ru: synchronized with
6b4dc7968bf0
Matt Mackall <mpm@selenic.com> [Sat, 18 Oct 2014 18:04:31 -0500] rev 23048
merge default into stable for 3.2 freeze
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 17 Oct 2014 02:17:36 -0700] rev 23047
hook: schedule run "b2x-transactionclose" for after lock release
Hooks that run after the transaction need to be able to touch the
repository. So we need to run them after the lock release. This is
similar to what the "changegroup" hook is doing in the
`addchangegroup` function.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 17 Oct 2014 15:25:32 -0700] rev 23046
repoview: issue a special message when filtering hidden changesets
Hidden changesets are by far the most common error case and is the only one[1]
that can reach the user. We move to a friendlier message with a hint about how
to access the data anyway. We should probably point to a help topic instead but
we do not have such a topic yet.
Example of the new output
abort: hidden revision '4'!
(use --hidden to access hidden revisions)
[1] Actually, filtering from "served" can also reach the user during certain
exchange operations.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 17 Oct 2014 15:54:43 -0700] rev 23045
repoview: include the filter name in filtered revision error messages
This will help user to debug. A more precise message will be issued
for the most common case ("visible" filter) in the next changesets.
example output:
- abort: filtered revision '4'!
+ abort: filtered revision '4' (not in 'visible' subset)!
Mads Kiilerich <madski@unity3d.com> [Wed, 15 Oct 2014 05:08:56 +0200] rev 23044
largefiles: inline redundant toname function in status
Simpler and an optimization.
Mads Kiilerich <madski@unity3d.com> [Wed, 15 Oct 2014 05:08:56 +0200] rev 23043
largefiles: inline redundant inctx function in status
Mads Kiilerich <madski@unity3d.com> [Fri, 17 Oct 2014 18:56:12 +0200] rev 23042
ssl: only use the dummy cert hack if using an Apple Python (
issue4410)
The hack for using certificate store in addition to the provided CAs resides in
Apple's OpenSSL. Apple's own Pythons will use it, but other custom built
Pythons might use a custom built OpenSSL without that hack and will fail when
exposed to the dummy cacert introduced in
d7f7f1860f00.
There do not seem to be a simple way to check from Python if we are using a
patched OpenSSL or if it is an Apple OpenSSL.
Instead, check if the Python executable resides in /usr/bin/python* or in
/System/Library/Frameworks/Python.framework/ and assume that all Pythons found
there will be native Pythons using the patched OpenSSL.
Custom built Pythons will not get the benefit of using the CAs from the
certificate store.
Mads Kiilerich <madski@unity3d.com> [Wed, 15 Oct 2014 05:08:56 +0200] rev 23041
largefiles: move initialization of standins variable to clarify its "scope"
Mads Kiilerich <madski@unity3d.com> [Wed, 15 Oct 2014 05:08:56 +0200] rev 23040
largefiles: the update override only needs lfdirstate and status for --check
Mads Kiilerich <madski@unity3d.com> [Fri, 03 Oct 2014 00:42:40 +0200] rev 23039
largefiles: remove confusing rev parameter for lfdirstatestatus
Dirstate only works on the repo wctx.
Mads Kiilerich <madski@unity3d.com> [Fri, 03 Oct 2014 00:42:40 +0200] rev 23038
largefiles: replace repo._isaddremove hack with a simple function parameter
Martin von Zweigbergk <martinvonz@gmail.com> [Sun, 12 Oct 2014 22:23:43 -0700] rev 23037
status: add more complete tests for --rev
The 'status --rev' code is not very well tested, which has bitten us
as recently as in
issue4321. Let's add some more tests, some of which
uncover bugs. Remove the few existing tests that are now covered in a
more thorough and consistent way.
Yuya Nishihara <yuya@tcha.org> [Sat, 18 Oct 2014 12:24:50 +0900] rev 23036
cmdserver: include pid of server handling requests in hello message
Because unix-mode server forks child process per connection, client does not
know the pid of the server that will handle requests. The pid is necessary
to interrupt hung process:
1. client connects to socket server
2. server accepts the connection, forks, and tells pid
3. client requests "runcommand pull"
.. hung ..
4. client sends SIGINT to the (forked) server
5. server returns from I/O wait
Note that getsockopt(SO_PEERCRED) of Linux cannot be used because the server
fork()s after accept().
Yuya Nishihara <yuya@tcha.org> [Sat, 18 Oct 2014 21:52:11 +0900] rev 23035
run-tests: clean up unused globals that were removed by tests-refactor series
They were demoted to instance variables by
cb88d4a04f58,
1ad7aabba14e,
93511a595766,
2e1aa8c1ee37,
8e7b0f4d6ac7 and
02087bc4f143.
Mads Kiilerich <madski@unity3d.com> [Thu, 16 Oct 2014 17:44:37 +0200] rev 23034
docker: use official centos5 image
I guess it didn't exist when centos5 support was introduced.
Mads Kiilerich <madski@unity3d.com> [Thu, 16 Oct 2014 17:44:14 +0200] rev 23033
docker: add centos7 target for CentOS / Red Hat 7 support
Siddharth Agarwal <sid0@fb.com> [Thu, 16 Oct 2014 19:15:51 -0700] rev 23032
lock: while releasing, unlink lockfile even if the release function throws
Consider a hypothetical bug in the release function that causes it to raise an
exception. Also consider the bisect command, which saves its state in a finally
clause. Saving the state requires acquiring the wlock.
If we don't unlink the lockfile when the exception is thrown, we'll try to
acquire the wlock again. We're going to try and acquire a lock again while our
old lockfile is on disk. The PID on disk is our own, and of course we're still
running, so we won't take over the lock. Hence we'll be stuck waiting for a
lock that we left behind ourselves.
To avoid this, always unlink the lockfile. This preserves the invariant that
self.held > 0 is equivalent to the lockfile existing on disk.
Augie Fackler <raf@durin42.com> [Fri, 17 Oct 2014 13:52:10 -0400] rev 23031
i18n: cache the result of every gettext call
In looking at profiler output for 'hg log' on mozilla-central, I
noticed we spent a _huge_ amount of time in gettext relative to what
it's doing. Caching provides a roughly 15% performance improvement
even on repositories as small as hg.
== hg repo on linux ==
Before:
% cumulative self
time seconds seconds name
5.05 0.19 0.19 i18n.py:62:gettext
4.84 0.18 0.18 revlog.py:88:decompress
2.95 0.17 0.11 changelog.py:201:node
2.32 0.09 0.09 ui.py:577:write
2.11 0.08 0.08 i18n.py:72:gettext
2.11 0.08 0.08 obsolete.py:196:_fm0readmarkers
1.89 0.07 0.07 obsolete.py:569:_load
1.68 0.63 0.06 localrepo.py:29:__get__
real 0m4.026s
user 0m3.993s
sys 0m0.034s
After:
% cumulative self
time seconds seconds name
8.05 0.26 0.26 revlog.py:88:decompress
2.68 0.22 0.09 color.py:395:write
2.20 0.07 0.07 obsolete.py:196:_fm0readmarkers
1.95 0.06 0.06 obsolete.py:174:_fm0readmarkers
1.95 0.06 0.06 ui.py:577:write
1.95 0.06 0.06 util.py:1228:datestr
1.71 0.06 0.06 utf_8.py:16:decode
1.71 0.06 0.06 revlog.py:273:__len__
real 0m3.519s
user 0m3.447s
sys 0m0.073s
== mozilla-central repo on linux ==
Before:
% cumulative self
time seconds seconds name
7.72 2.35 2.35 revlog.py:88:decompress
4.46 1.36 1.36 i18n.py:62:gettext
2.22 0.67 0.67 i18n.py:72:gettext
2.19 1.14 0.67 changelog.py:201:node
2.16 0.66 0.66 ui.py:577:write
1.96 0.60 0.60 utf_8.py:16:decode
1.93 1.97 0.59 color.py:395:write
1.85 0.81 0.56 changelog.py:136:tip
real 0m30.822s
user 0m30.660s
sys 0m0.149s
After:
% cumulative self
time seconds seconds name
9.82 2.49 2.49 revlog.py:88:decompress
2.67 1.31 0.68 localrepo.py:29:__get__
2.57 0.65 0.65 utf_8.py:16:decode
2.48 1.01 0.63 changelog.py:201:node
2.10 0.82 0.53 changelog.py:136:tip
2.01 0.51 0.51 ui.py:577:write
1.91 0.49 0.49 util.py:1232:datestr
1.85 1.65 0.47 color.py:395:write
real 0m25.619s
user 0m25.446s
sys 0m0.166s
== cpython repo on os x =
Before:
% cumulative self
time seconds seconds name
5.05 1.35 1.35 cmdutil.py:982:_show
4.59 1.22 1.22 revlog.py:274:__len__
3.98 1.06 1.06 i18n.py:62:gettext
3.91 1.04 1.04 revlog.py:1016:revision
3.68 0.98 0.98 revlog.py:337:parents
3.45 0.92 0.92 revlog.py:88:decompress
2.91 0.78 0.78 revlog.py:309:rev
2.62 0.70 0.70 revlog.py:1033:revision
real 0m30.414s
user 0m28.145s
sys 0m0.541s
After:
% cumulative self
time seconds seconds name
7.98 1.66 1.66 cmdutil.py:982:_show
6.83 1.42 1.42 changelog.py:46:decodeextra
5.18 1.08 1.08 revlog.py:274:__len__
3.94 0.82 0.82 revlog.py:1016:revision
3.41 0.71 0.71 revlog.py:309:rev
3.32 0.69 0.69 revlog.py:88:decompress
2.99 0.63 0.62 revlog.py:1033:revision
2.69 0.56 0.56 revlog.py:341:start
real 0m22.811s
user 0m21.883s
sys 0m0.397s
Yuya Nishihara <yuya@tcha.org> [Sat, 30 Aug 2014 17:38:14 +0200] rev 23030
util.system: avoid buffering of subprocess output when it is piped
util.system() copies subprocess' output through pipe if output file is not
stdout. Because a file iterator has internal buffering, output won't be
flushed until enough data is available. Therefore, it could easily miss
important messages such as "waiting for lock".
Mike Hommey <mh@glandium.org> [Fri, 17 Oct 2014 09:57:05 +0900] rev 23029
bundle2: client side support for a part to import external bundles
Bundle2 opens doors to advanced features allowing to reduce load on
mercurial servers, and improve clone experience for users on unstable or
slow networks.
For instance, it could be possible to pre-generate a bundle of a
repository, and give a pointer to it to clients cloning the repository,
followed by another changegroup with the remainder. For significantly
big repositories, this could come as several base bundles with e.g. 10k
changesets, which, combined with checkpoints (not part of this change),
would prevent users with flaky networks from starting over any time
their connection fails.
While the server-side support for those features doesn't exist yet, it
is preferable to have client-side support for this early-on, allowing
experiments on servers only requiring a vanilla client with bundle2
enabled.
Mike Hommey <mh@glandium.org> [Thu, 25 Sep 2014 11:53:28 +0900] rev 23028
bundle2: remove _getbundleextrapart
Extensions can now add new part generators with the getbundle2partsgenerator
decorator instead.
Matt Mackall <mpm@selenic.com> [Fri, 17 Oct 2014 12:34:27 -0500] rev 23027
glossary: add deprecated and experimental
Martin von Zweigbergk <martinvonz@gmail.com> [Thu, 09 Oct 2014 16:57:45 -0700] rev 23026
test-merge5: remove obsolete '-y' and its motivating comment
The '-y' in 'hg update -y' was once needed to answer questions about
modify/delete conflicts. That is no longer needed, so remove the '-y'
and the comment justifying its use.
Augie Fackler <raf@durin42.com> [Fri, 17 Oct 2014 11:01:05 -0400] rev 23025
test-resolve.t: use redirection to /dev/null instead of grep -q
Martin von Zweigbergk <martinvonz@gmail.com> [Wed, 08 Oct 2014 22:30:04 -0700] rev 23024
resolve: run happily after conflict-free merge
Martin von Zweigbergk <martinvonz@gmail.com> [Wed, 08 Oct 2014 22:16:18 -0700] rev 23023
test-resolve: add tests for re-merge
Martin von Zweigbergk <martinvonz@gmail.com> [Wed, 08 Oct 2014 22:19:08 -0700] rev 23022
test-resolve: add more tests for in conflict-free states
We already have a test for 'hg resolve -m' when there is no merge in
progress. Add one for 'hg resolve --all' as well.
Also add tests for both --all and -m when there is a merge without
conflicts in progress. They should both be successful, just as if
there had been conflicts that had been marked resolved. However, that
is currently broken, so mark the tests broken for now. The behavior
will be fixed in a later patch.
Martin von Zweigbergk <martinvonz@gmail.com> [Wed, 08 Oct 2014 21:07:30 -0700] rev 23021
test-resolve: add test resolving one of two files
The tests for resolve are missing a lot of cases. Let's start by
adding another file to the test repo, so we can test resolving one of
two files.
Martin von Zweigbergk <martinvonz@gmail.com> [Wed, 08 Oct 2014 21:19:31 -0700] rev 23020
test-resolve: clarify test descriptions and consistently use "should"
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 16 Oct 2014 17:46:58 -0700] rev 23019
revset-phases: prefetch attributes in phasesrelated revsets
Pre-fetching attributes gives a significant performance boost. Such is Python.
draft()
0) wall 0.011661 comb 0.010000 user 0.010000 sys 0.000000 (best of 205)
1) wall 0.009804 comb 0.000000 user 0.000000 sys 0.000000 (best of 231)
draft() - ::bookmark()
0) wall 0.014173 comb 0.010000 user 0.010000 sys 0.000000 (best of 177)
1) wall 0.012966 comb 0.010000 user 0.010000 sys 0.000000 (best of 182)
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 11 Oct 2014 01:21:47 -0700] rev 23018
revset-phases: do not cache phase-related filters
The phase retrieval is fast enough to not require caching the result of the
functions.
draft()
0) wall 0.017209 comb 0.020000 user 0.020000 sys 0.000000 (best of 149)
1) wall 0.011654 comb 0.010000 user 0.010000 sys 0.000000 (best of 186)
public()
0) wall 0.018687 comb 0.010000 user 0.010000 sys 0.000000 (best of 128)
1) wall 0.013290 comb 0.010000 user 0.010000 sys 0.000000 (best of 181)
secret()
0) wall 0.017464 comb 0.020000 user 0.020000 sys 0.000000 (best of 127)
1) wall 0.011499 comb 0.000000 user 0.000000 sys 0.000000 (best of 196)
draft() - ::bookmark()
0) wall 0.020099 comb 0.020000 user 0.020000 sys 0.000000 (best of 127)
1) wall 0.014399 comb 0.020000 user 0.020000 sys 0.000000 (best of 169)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 15 Oct 2014 20:37:44 -0700] rev 23017
changectx: issue a FilteredRepoLookupError when applicable
We capture FilteredxxxError and issue a FilteredRepoLookupError instead with a
sightly different messsge. The message will likely get more improvement in the
future.
error: filtered revision '4'
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 16 Oct 2014 02:06:12 -0700] rev 23016
repoview: add a FilteredRepoLookupError
This exception is a more precise RepoLookupError that will allow us to issue
a special message when we end up accessing a filtered revision.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 16 Oct 2014 02:05:06 -0700] rev 23015
repoview: add a FilteredLookupError class
This exception is a more precise LookupError that will allow us to
issue a special message when we end up accessing a filtered revision.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 15 Oct 2014 17:02:44 -0700] rev 23014
repoview: add a FilteredIndexError class
This exception is a more precise IndexError that will allow us to
issue a special message when we end up accessing a filtered revision.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 15 Oct 2014 16:14:50 -0700] rev 23013
changectx: move `IndexError` handling in the top level try except
This one can be handled by the top level catching.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 15 Oct 2014 16:05:24 -0700] rev 23012
changectx: wrap the `changeid` processing in a try/except
We are going to introduce more precise exception classes for filtered nodes. So
we will have to upgrade them to the `RepoLookupError` level here. We wrap the
whole thing into a try/except to ease this future catching. Some of the current
exception catching will be moved in this one. But the current changeset focuses
on code movement only.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 15 Oct 2014 03:27:25 -0700] rev 23011
bundle2: detect and disallow a negative chunk size
We have no usage planned for 2/3 of them and the support for the planned
usecase is not here yet. So we raise a BundleValueError when encountered
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 15 Oct 2014 03:22:47 -0700] rev 23010
bundle2: add an UnsupportedPartError
We need the BundleValueError for format errors not related to part support. So
we add a specific class for part-support errors.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 01 Oct 2014 23:40:23 -0500] rev 23009
bundle2: change header size and make them signed (new format)
We are changing all integers that denote the size of a chunk to read to int32.
There are two main motivations for that.
First, we change everything to the same width (32 bits) to make it possible for
a reasonably agnostic actor to forward a bundle2 without any extra processing.
With this change, this could be achieved by just reading int32s and forwarding
chunks of the size read. A bit a smartness would be logic to detect the end of
stream but nothing too complicated.
Second, we need some capacity to transmit special information during the bundle
processing. For example we would like to be able to raise an exception while a
part is being read if this exception happend while this part was generated.
Having signed integer let us use negative numbers to trigger special events
during the parsing of the bundle.
The format is renamed for B2X to B2Y because this breaks binary
compatibility. The B2X format support is dropped. It was experimental to
allow this kind of things. All elements not directly related to the binary
format remain flagged "b2x" because they are still compatible.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 14 Oct 2014 02:32:26 -0700] rev 23008
bundle2: extract processing of part into its own function
This is code movement only. This will be useful to have it separated for reuse
purposes. We plan to introduce a new feature to the bundle format that allow
inserting a part in the middle of another part payload. This will be useful to
transmit a exception raised during a part generation.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 14 Oct 2014 13:23:03 -0700] rev 23007
bundle2: add a test for exceptions raised during the generation process
We would like exceptions raised during the generation process to be gracefully
handled on the receiver side. We add a test for it. It shows that we are not
doing it yet.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 02:43:51 -0700] rev 23006
dagwalker: drop a useless intermediate variable
The variable used to contain revs.set() but as the `.set()` has been removed
it is now useless.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 11 Oct 2014 01:39:20 -0700] rev 23005
revset-node: speedup by a few hundred fold
Instead of checking all elements of the subset against a single rev, just check
if this rev is in the subset. The old way was inherited from when the subset was
a list.
Non surprise, this provide massive speedup.
id("
d82e2223f132")
before) wall 0.008205 comb 0.000000 user 0.000000 sys 0.000000 (best of 302)
after) wall 0.000069 comb 0.000000 user 0.000000 sys 0.000000 (best of 34518)
revset #1: public() and id("
d82e2223f132")
before) wall 0.019763 comb 0.020000 user 0.020000 sys 0.000000 (best of 124)
after) wall 0.000101 comb 0.000000 user 0.000000 sys 0.000000 (best of 20130)
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 17:28:18 -0700] rev 23004
revset-only: use `subset &` instead of filtering
The & version is more likely to be optimised.
only(.)
before) wall 0.003216 comb 0.000000 user 0.000000 sys 0.000000 (best of 768)
after) wall 0.001086 comb 0.000000 user 0.000000 sys 0.000000 (best of 2231)
only(default, stable)
before) wall 0.018469 comb 0.020000 user 0.020000 sys 0.000000 (best of 138)
after) wall 0.015888 comb 0.010000 user 0.010000 sys 0.000000 (best of 156)
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 30 Sep 2014 15:03:54 -0500] rev 23003
revset-_ancestor: use & instead of filter
The & operation is more likely optimised.
::10
before) wall 0.028189 comb 0.030000 user 0.030000 sys 0.000000 (best of 100)
after) wall 0.001050 comb 0.000000 user 0.000000 sys 0.000000 (best of 2326)
::tip
before) wall 0.081132 comb 0.080000 user 0.080000 sys 0.000000 (best of 100)
after) wall 0.055418 comb 0.050000 user 0.050000 sys 0.000000 (best of 100)
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 16 Oct 2014 14:46:37 -0700] rev 23002
obsstore: record data as floating point in fm0 format
For python struct module, "d" is double. But for python string
formating, "d" is integer. We want to preserve the floating point
nature of the data, so we store it in the metadata as floating
point. We use "%r" to make sure we get as many significant digitis as
necessary to restore the float to the exact same value on the other
side.
The fm1 is transmitting the information as float. The lack of this made
fm1-stored markers not survive a round-trip to fm0 leading to duplicated
markers (or two markers very alike).
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 14 Oct 2014 01:27:25 -0700] rev 23001
bundle2: add a comment about addchangegroup source and url
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 15 Oct 2014 04:19:37 -0700] rev 23000
pull: call the `b2x-transactionclose` hook when closing the transaction
We need a wider set of hooks to process all the changes that happened during the
pull transaction. We reuse the experimental `b2x-transactionclose` hook set
from server's unbundle for consistency. This hook is experimental and will not
remains as-is forever, but this will open the door for experimentation in 3.2.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 02:45:21 -0700] rev 22999
revset-only: use __nonzero__ to check if a revset is empty
For some smartsets, computing length is more expensive than checking if the set
is empty.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 15 Oct 2014 12:38:47 -0700] rev 22998
_spanset: drop __getitem__ implementation
It is expensive and not part of the official smartset API.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 15 Oct 2014 12:38:32 -0700] rev 22997
filteredset: drop __getitem__ implementation
It is expensive and not part of the official smartset API.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 15 Oct 2014 04:28:55 -0700] rev 22996
generatorset: implement __len__
It was the only smartset class without a `__len__` implementation.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 15 Oct 2014 04:26:23 -0700] rev 22995
revset: make __len__ part of the offical API
It is common for code to ask for the length of a revset. In fact, all but
generatorset already implement it.
Yuya Nishihara <yuya@tcha.org> [Sat, 04 Oct 2014 16:46:50 +0900] rev 22994
cmdserver: add service that listens on unix domain socket and forks process
Typical use case of 'unix' mode is a background hg daemon.
$ hg serve --cmdserver unix --cwd / -a /tmp/hg-`id -u`.sock
Unlike 'pipe' mode in which parent process keeps stdio channel, 'unix' server
can be detached. So clients can freely connect and disconnect from server,
saving Python start-up time.
It might be better to write "--cmdserver socket -a unix:/sockpath" instead
of "--cmdserver unix -a /sockpath" in case hgweb gets the ability to listen
on unix domain socket.
Yuya Nishihara <yuya@tcha.org> [Sat, 27 Sep 2014 19:18:20 +0900] rev 22993
test-commandserver: add connector for unix domain socket server
The next patch will introduce --cmdserver unix.
Yuya Nishihara <yuya@tcha.org> [Sat, 27 Sep 2014 23:14:26 +0900] rev 22992
test-commandserver: allow check() to make connection in different way
The next patch will add connector for 'unix' mode server.
Yuya Nishihara <yuya@tcha.org> [Sat, 27 Sep 2014 22:39:01 +0900] rev 22991
test-commandserver: remove unused repopath argument from check()
Instead of repopath, check() will receive connect() function as argument.
It will allow to connect to server of different mode.
Yuya Nishihara <yuya@tcha.org> [Sat, 27 Sep 2014 15:10:14 +0900] rev 22990
cmdserver: make server streams switchable
In 'unix' mode, server instance will be created per connection, and fin/fout
are set to socket files.
Yuya Nishihara <yuya@tcha.org> [Sat, 27 Sep 2014 15:04:46 +0900] rev 22989
cmdserver: switch service objects by mode
server class will be changed to accept fin/fout pair instead of mode string
so that it can interact with socket files.
Yuya Nishihara <yuya@tcha.org> [Sat, 27 Sep 2014 14:52:09 +0900] rev 22988
cmdserver: wrap 'pipe' mode server by service object
This is the stub for new mode that will listen for connections on unix domain
socket.
Though --daemon option is not banned in 'pipe' mode, it is useless because
the detached 'pipe' mode server exits immediately due to null stdin. Should
it abort if --daemon is specified with --cmdserver pipe or --stdio?
Augie Fackler <raf@durin42.com> [Thu, 16 Oct 2014 14:55:45 -0400] rev 22987
histedit: miscellaneous style cleanups
Fix some mis-wrapped lines, re-wrap some lines to be more compact,
remove superfluous parens.
Augie Fackler <raf@durin42.com> [Thu, 16 Oct 2014 14:51:15 -0400] rev 22986
histedit: update docstring on histeditstate.read()
The docstring showed the previous class-less heritage of read(). Now
that it's classy, update the docstring.
Augie Fackler <raf@durin42.com> [Thu, 16 Oct 2014 14:49:46 -0400] rev 22985
histedit: remove now-superfluous repo argument from processreplacement
Spotted by Olle on the mailing list during review.
David Soria Parra <davidsp@fb.com> [Wed, 15 Oct 2014 08:38:36 -0700] rev 22984
histedit: move locks into state
Allow action functions to control the locks. This is necessary for
an implementation of x/exec or similar.
David Soria Parra <davidsp@fb.com> [Wed, 15 Oct 2014 08:38:16 -0700] rev 22983
histedit: read state from histeditstate
Read the state in histeditstate. This allows us to correctly update
internal variables when necessary without having to recreate a new
state. When we read a state in _histedit state while we will already
have state passed from histedit(), we can read the state in place
and don't have to merge two histeditstates.
David Soria Parra <davidsp@fb.com> [Wed, 15 Oct 2014 08:18:26 -0700] rev 22982
histedit: pass state to action functions
David Soria Parra <davidsp@fb.com> [Thu, 16 Oct 2014 10:06:49 -0700] rev 22981
histedit: pass state to processreplacement
David Soria Parra <davidsp@fb.com> [Wed, 15 Oct 2014 08:06:15 -0700] rev 22980
histedit: pass state to boostrapcontinue
Pass the state to boostrapcontinue and remove the unecessary passing
of repo.
David Soria Parra <davidsp@fb.com> [Wed, 15 Oct 2014 17:11:54 -0700] rev 22979
histedit: let the state expose a context but serialize correctly to nodes
The histedit code often expects a context. However histedit hands
around the tuple for the serialization and therefore hand over a
parentctxnode. This leads to code having to return a context based
on the parentctxnode. We let the state only return a context but
correctly serialize and deserialze to a node.
David Soria Parra <davidsp@fb.com> [Wed, 15 Oct 2014 17:30:57 -0700] rev 22978
histedit: add clear method to remove state
Encapsulate the unlinking histedit-state and use the vfs layer instead of
os.unlink.
David Soria Parra <davidsp@fb.com> [Tue, 14 Oct 2014 20:35:17 -0700] rev 22977
histedit: use state object where necessary
We are using the properties from the state object where necessary and
ensure that the state is set correctly.
David Soria Parra <davidsp@fb.com> [Wed, 15 Oct 2014 17:17:12 -0700] rev 22976
histedit: add histedit state class
Add an histeditstate class that is intended to hold the current
state. This allows us encapsulate the state and avoids passing
around a tuple which is based on the serialization format. In
particular this will give actions more control over the state and
allow external sources to have more control of histedits behavior,
e.g. an external implementation of x/exec.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 17 Oct 2014 02:07:05 +0900] rev 22975
import-checker: check modules for pure Python build correctly
Before this patch, "import-checker.py" just replaces "/" in specified
filenames by ".". This makes modules for pure Python build belong to
"mercurial.pure" package, and prevents "import-checker.py" from
correctly checking about cyclic dependency in them.
This patch discards "pure" component from fully qualified name of such
modules.
To avoid discarding "pure" from the module name of standard libraries
unexpectedly, this patch allows "dotted_name_of_path" to discard
"pure" only from Mercurial specific modules, which are specified via
command line arguments.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 17 Oct 2014 02:07:05 +0900] rev 22974
import-checker: treat "from mercurial import XXXX" style correctly
Before this patch, "import-checker.py" assumes that the name of
Mercurial module recognized by "imported_modules" doesn't have package
part: for example, "util".
This is reason why "import-checker.py" always builds fully qualified
module name up relatively, if the given module doesn't belong to
standard Python library.
But in fact, modules imported in "from mercurial import XXXX" style
already have fully qualified name: for example, "mercurial.util"
module imported by "mercurial.parsers" is treated as
"mercurial.mercurial.util" because of building module name up
relatively.
This prevents "import-checker.py" from correctly checking about cyclic
dependency in them.
This patch avoids building module name up relatively, also if module
name starts with "mercurial.", to treat modules imported in "from
mercurial import XXXX" style correctly.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 17 Oct 2014 02:07:04 +0900] rev 22973
encoding: avoid cyclic dependency around "parsers" in pure Python build
80f2b63dd83a brought "asciilower" and "import parsers" into
"encoding.py".
This works fine with "parsers" module in C implementation, but doesn't
with one in pure Python implementation, because the latter causes
cyclic dependency below and aborting execution:
util => i18n => encoding => parsers => util
This patch delays importing "parsers" module until it is really
needed, to avoid cyclic dependency around "parsers" in pure Python
build.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 14 Oct 2014 01:40:04 -0700] rev 22972
pull: add source information to the transaction
The source information can, should be applied once when opening the transaction
for the pull. This will lets element processed within a bundle2 be aware of them
and open the door to running a set of hooks when closing this pull transaction.
This is similar to what is done in server's unbundle call.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 14 Oct 2014 00:06:46 -0700] rev 22971
changegroup: store source and url in the `hookargs` dict
We store the source and url of the current data into `transaction.hookargs` this
let us inherit it from upper layers that may have created a much wider
transaction. We have to modify bundle2 at the same time to register the source
and url in the transaction. We have to do it in the same patch otherwise, the
`addchangegroup` call would fill these values and the hook calling will crash
because of the duplicated 'source' and 'url' arguments passed to the hook call.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 14 Oct 2014 00:43:20 -0700] rev 22970
prechangegroup: use hook argument from the transaction
There can be useful data in there (eg: bundle2 related one)
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 14 Oct 2014 00:09:25 -0700] rev 22969
addchangegroup: call `prechangegroup` hook after transaction retrieval
We want to reused some possible information stored in the transaction
`hookargs` dict that may be stored by something handling the transaction at an
upper level (eg: bundle2) So we move the running of the hooks after transaction
creation. This has no visible effects (but an empty transaction roolback if the
hook fails) because nothing had happened in the transaction yet.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 14 Oct 2014 00:03:03 -0700] rev 22968
addchangegroup: get the `node` argument of `incoming` hook from transaction
The transaction is now carrying hook-related informations. So we use it to
retrieve the `node` argument. This will also carry around all kinds of other useful
informations (like: "are we in a bundle2 processing")
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 14 Oct 2014 23:53:35 -0700] rev 22967
dicthelpers: delete now that they are no longer used
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 14 Oct 2014 23:18:07 -0700] rev 22966
manifest: transpose pair of pairs from diff()
It makes more sense for the file nodeids and returned from diff() to
be ((n1,fl1),(n2,fl2)) than ((n1,n2),(fl1,fl2)), so change it to the
former.
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 14 Oct 2014 22:48:44 -0700] rev 22965
manifest: for diff(), only iterate over files, not flags
From manifest.diff(), we return a dict from filename to pairs of pairs
of file nodeids and flags (values of the form ((n1,n2),(fl1,fl2))). To
create this dict, we currently generate one dict for files (with
(n1,n2) values) and one for flags (with (fl1,fl2) values) and then
join these dicts. Missing files are represented by None and missing
flags by '', but due to the dict joining, the inner pairs themselves
can also be None. The only caller, merge.manifestmerge(), then unpacks
these values while checking for None values.
By inlining the calls to dicthelpers and simplifying it to only
iterate over files (ignoring flags-only differences), we can simplify
life for our caller.
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 14 Oct 2014 17:09:16 -0700] rev 22964
manifest: repurpose flagsdiff() into (node-and-flag)diff()
The manifestdict class already has a method for diff flags between two
manifests (presumably because there is no full access to the private
_flags field). The only caller is merge.manifestmerge(), which also
wants a diff of files between the same manifests. Let's combine the
code for diffing files and flags into a single method on
manifestdict. This puts all the manifest diffing in one place and will
allow for further simplification. It might also be useful for it to be
encapsulated in manifestdict if we later decide to to shard
manifests. The docstring is intentionally unclear about missing
entries for now.
Mike Hommey <mh@glandium.org> [Thu, 16 Oct 2014 17:03:21 +0900] rev 22963
util: add a file handle wrapper class that does hash digest validation
It is going to be used for the remote-changegroup feature in bundle2.
Mike Hommey <mh@glandium.org> [Thu, 16 Oct 2014 17:02:51 +0900] rev 22962
util: add a helper class to compute digests
It is going to be used for the remote-changegroup feature in bundle2.
Mike Hommey <mh@glandium.org> [Thu, 16 Oct 2014 16:03:04 +0900] rev 22961
bundle2: merge return values when bundle contains multiple changegroups
A bundle2 may contain multiple parts adding changegroups, in which case there
are multiple operation records for changegroups, each with its own return
value. Those multiple return values are aggregated in a single cgresult value
for the whole operation.
As can be seen in the associated test case, the situation with hooks is not
really the best, but without deeper thoughts and changes, we can't do much
better. Hopefully, things will be improved before bundle2 is enabled by default.
In the meanwhile, multiple changegroups is not expected to be in widespread
use, and even less expected to be used for pushes. Also, not many clients
cloning or pulling bundle2 with multiple changesets are not expected to have
changegroup hooks anyways.
Mike Hommey <mh@glandium.org> [Thu, 16 Oct 2014 15:54:53 +0900] rev 22960
changegroup: use a copy of hookargs when invoking the changegroup hook
addchangegroup creates a runhook function that is used to invoke the
changegroup and incoming hooks, but at the time the function is called,
the contents of hookargs associated with the transaction may have been
modified externally. For instance, bundle2 code affects it with
obsolescence markers and bookmarks info.
It also creates problems when a single transaction is used with multiple
changegroups added (as per an upcoming change), whereby the contents
of hookargs are that of after adding a latter changegroup when invoking
the hook for the first changegroup.
Mike Hommey <mh@glandium.org> [Thu, 16 Oct 2014 13:48:51 +0900] rev 22959
tests: pull common http server setup out of individual tests
There are currently two different tests using roughly the same code to
create temporary scripts acting as HTTP servers. As there is going to
be at least one more in an upcoming change, factor those out in a
standalone dumbhttp.py script.
Mike Hommey <mh@glandium.org> [Wed, 24 Sep 2014 16:00:47 +0900] rev 22958
util: move md5 back next to sha1 and allow to call it without an argument
This effectively backs out changeset
908c5906091b.
The API change is done so that both util.sha1 and util.md5 can be called the
same way. The function is moved in order to use it for md5 checksumming for
an upcoming bundle2 feature.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 16 Oct 2014 03:22:51 -0700] rev 22957
test-bundle2-exchange: do not drop HG_NODE from the hook output
HG_NODE is precisely something we would like to test.
Durham Goode <durham@fb.com> [Tue, 14 Oct 2014 13:34:57 -0700] rev 22956
obsolete: update test-commit-amend to use obsolete option
This test actually used the obs.py file as part of the test, so we need to fix
up the test a little more than usual to work with the new obsolete option flags.
Durham Goode <durham@fb.com> [Tue, 14 Oct 2014 13:34:25 -0700] rev 22955
obsolete: update tests to use obsolete options
The obsolete._enabled flag has become a config option. This updates all but one
of the tests to use the minimal number of flags necessary for them to pass. For
most tests this is just 'createmarkers', for a couple tests it's
'allowunstable', and for even fewer it's 'exchange'.
Durham Goode <durham@fb.com> [Tue, 14 Oct 2014 13:27:00 -0700] rev 22954
obsolete: prevent options from being used without createmarkers
exchange and allowunstable should only be enabled if createmarkers is enabled,
so check for that and raise an exception if that's not the case.
Durham Goode <durham@fb.com> [Tue, 14 Oct 2014 13:26:01 -0700] rev 22953
obsolete: add exchange option
This adds an option that enables obsolete marker exchange.
Durham Goode <durham@fb.com> [Tue, 14 Oct 2014 13:25:13 -0700] rev 22952
obsolete: add allowunstable option
This option allows the creation of unstable commits. This allows things like
amending in the middle of a stack of commits, etc.
Durham Goode <durham@fb.com> [Tue, 14 Oct 2014 13:23:52 -0700] rev 22951
obsolete: add createmarkers option
The basic obsolete option is allowing the creation of obsolete markers. This
does not enable other features, such as allowing unstable commits or exchanging
obsolete markers.
Durham Goode <durham@fb.com> [Tue, 14 Oct 2014 13:20:31 -0700] rev 22950
obsolete: add readonly flag to obstore constructor
Previously, obstore read the obsolete._enabled flag to determine whether to
allow writes to the obstore. Since obsolete._enabled will be moving into a repo
specific config, we can't read it globally, and therefore must pass the
information into the constructor.
Durham Goode <durham@fb.com> [Tue, 14 Oct 2014 13:17:35 -0700] rev 22949
obsolete: add isenabled function for option checking
Previously, obsolete used the module level _enabled flag to determine whether it
was on or off. We need a bit more granular control, so we'll be introducing
toggle options. The isenabled() function is how you check if a particular option
is enabled for the given repository.
Future patches will add options such as 'createmarkers', 'allowunstable', and
'exchange' to enable various features of obsolete markers.
Durham Goode <durham@fb.com> [Wed, 15 Oct 2014 12:52:10 -0700] rev 22948
obsstore: fix defaultformat option passing
The obsstore format passing was not actually being passed to the obsstore. This
fixes it.
Augie Fackler <raf@durin42.com> [Wed, 15 Oct 2014 15:35:59 -0400] rev 22947
tests: use $PYTHON instead of hardcoding python
This makes running the testsuite with pypy possible.
Augie Fackler <raf@durin42.com> [Wed, 15 Oct 2014 15:13:43 -0400] rev 22946
checklink: always close the NamedTemporaryFile
This fixes test-patchbomb.t when using pypy with --pure.
Angel Ezquerra <angel.ezquerra@gmail.com> [Mon, 13 Oct 2014 11:46:04 +0200] rev 22945
hgignore: ignore the PyCharm workspace folder
Mads Kiilerich <madski@unity3d.com> [Wed, 15 Oct 2014 04:08:06 +0200] rev 22944
revset: better naming of variables containing the value of a single argument
Calling them args is not helpful.
Augie Fackler <raf@durin42.com> [Tue, 14 Oct 2014 14:42:25 -0400] rev 22943
manifest: add docstring to text() method
Augie Fackler <raf@durin42.com> [Fri, 10 Oct 2014 14:09:37 -0400] rev 22942
manifest: rename ambiguously-named set to setflag
Just makes it a little clearer what this method does.
Pierre-Yves David <pierre-yves.david@fb.com> [Sun, 12 Oct 2014 08:29:31 -0700] rev 22941
bookmarks: inform transaction-related hooks that some bookmarks were moved
We do not have enough information to provide any finer data, but this is still
useful information.
Pierre-Yves David <pierre-yves.david@fb.com> [Sun, 12 Oct 2014 08:03:20 -0700] rev 22940
phases: inform transaction-related hooks that a phase was moved
We do not have enough information to provide finer data, but this is still
useful information.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 13 Oct 2014 14:52:38 -0700] rev 22939
test-bundle2: also test the argument of the changegroup hook
We also track execution of the changegroup hook. The important information here
is to make sure the information that the transaction was processing a bundle2 is passed to
hook. This will let most hooks disable themselves while waiting for the hook
concluding bundle2 processing (the one we discovered to be not called for
pull in the previous changesets).
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 13 Oct 2014 14:47:36 -0700] rev 22938
test-bundle2: test that we got appropriate hook called with appropriate data
We can notice that this transaction wide hook is only happening during push and
it is missing changegroup-related information. We'll want to fix this but this
is not what this patch is about.
Pierre-Yves David <pierre-yves.david@fb.com> [Sun, 12 Oct 2014 06:40:36 -0700] rev 22937
pull: use `stepsdone` instead of `todosteps`
The push process uses a `stepsdone` attribute instead of a `todosteps` one (with
the logic swapped). We unify the two process by picking the `stepsdone` version.
I feel like `stepsdone` better fits extensions that would want to extend the push
exchange process.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 27 Sep 2014 00:29:06 -0700] rev 22936
pull: make discovery phase extensible
We apply the same approach as for push and make the discovery extensible. There
is only one user in core right now, but we already know we'll need something
smarter for obsmarkers. In fact the evolve extension could use this to cleanly
extend discovery.
The main motivation for this change is consistency between push and pull.
Yuya Nishihara <yuya@tcha.org> [Tue, 14 Oct 2014 21:59:39 +0900] rev 22935
sshpeer: forward stdout of remote "hg init" to appropriate output channel
Otherwise, commandserver channel could be corrupted.
Mike Edgar <adgar@google.com> [Wed, 03 Sep 2014 16:34:29 -0400] rev 22934
revlog: support importing censored file revision tombstones
This change allows a revision log to not fail integrity checks when applying a
changegroup delta (eg from a bundle) results in a censored file tombstone. The
tombstone is inserted as-is, so future integrity verification will observe the
tombstone. Deltas based on the tombstone will also remain correct.
The new code path is encountered for *exactly* the cases where _addrevision is
importing a tombstone from a changegroup. When committing a file containing
the "magic" tombstone text, the "text" parameter will be non-empty and the
checkhash call is not executed (and when committing, the node will be computed
to match the "magic" tombstone text).
Mike Edgar <adgar@google.com> [Tue, 14 Oct 2014 16:16:04 -0400] rev 22933
verify: report censored nodes if configured policy is abort
Mike Edgar <adgar@google.com> [Tue, 14 Oct 2014 15:46:16 -0400] rev 22932
context: handle censored data in an on-disk file context based on config
Two possible behaviors are defined for handling censored data: abort, and
ignore. When we ignore censored data we return an empty file to callers
requesting the file data.
Augie Fackler <raf@durin42.com> [Wed, 08 Oct 2014 15:20:14 -0400] rev 22931
manifest: add fastdelta method to manifestdict
This is another step closer to alternate manifest implementations that
can offer different hashing algorithms.
Augie Fackler <raf@durin42.com> [Wed, 08 Oct 2014 15:21:59 -0400] rev 22930
manifest: move _search to module level and rename to _msearch
The rename is intended to provide a slight hint that it is
manifest-specific.
Augie Fackler <raf@durin42.com> [Wed, 08 Oct 2014 14:47:30 -0400] rev 22929
manifest: move manifestdict-to-text encoding to manifest class
A future patch will introduce a new format, with a new class.
Martin von Zweigbergk <martinvonz@gmail.com> [Fri, 03 Oct 2014 13:22:31 -0700] rev 22928
localrepo: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com> [Sat, 11 Oct 2014 22:43:14 -0700] rev 22927
subrepo: use separate instances of empty lists in status
We do modify the lists that make up the status in several places, so
it seems risky to use the same instance of a list for several
different status types. Use a separate empty list for each type
instead.
Martin von Zweigbergk <martinvonz@gmail.com> [Fri, 03 Oct 2014 09:29:48 -0700] rev 22926
summary: make status code more readable
In commands.summary(), we currently zip a list of labels with a list
of statuses. This means the order of the status list has to match the
list of the labels, which in turn means the status elements have to be
inserted into specific places in the list. Let's instead group the
labels and status data we want to display in a single list of pairs.
Martin von Zweigbergk <martinvonz@gmail.com> [Sat, 04 Oct 2014 20:53:05 -0700] rev 22925
strip: make checklocalchanges() return full status tuple
By making checklocalchanges() return the full instance of the status
class instead of just the first 4 elements of it, we can take
advantage of the field names and not require the caller to remember
the element indices.
Martin von Zweigbergk <martinvonz@gmail.com> [Sat, 04 Oct 2014 21:58:01 -0700] rev 22924
fileset: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com> [Sat, 04 Oct 2014 21:19:44 -0700] rev 22923
histedit: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com> [Fri, 03 Oct 2014 22:12:43 -0700] rev 22922
shelve: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com> [Fri, 03 Oct 2014 10:44:07 -0700] rev 22921
record: access status fields by name rather than index
It is safe to pass the full status to patch.diff() since it does its
own slicing.
Martin von Zweigbergk <martinvonz@gmail.com> [Fri, 03 Oct 2014 10:38:43 -0700] rev 22920
purge: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com> [Fri, 03 Oct 2014 22:10:08 -0700] rev 22919
largefiles: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com> [Fri, 03 Oct 2014 10:05:54 -0700] rev 22918
keyword: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com> [Fri, 03 Oct 2014 09:51:39 -0700] rev 22917
hgcia: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com> [Sat, 04 Oct 2014 21:05:41 -0700] rev 22916
context: store status class instead of plain tuple in self._status
This improves readability a bit by allowing us to refer to statuses by
name rather than index.
Martin von Zweigbergk <martinvonz@gmail.com> [Fri, 10 Oct 2014 10:14:35 -0700] rev 22915
status: update and move documentation of status types to status class
The various status types are currently documented on the
dirstate.status() method. Now that we have a class for the status
types, it makese sense to document the status types there
instead. Only leave the bits related to lookup/unsure in the status()
method documentation.
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 14 Oct 2014 00:52:27 -0500] rev 22914
status: update various other methods to return new class
Martin von Zweigbergk <martinvonz@gmail.com> [Fri, 10 Oct 2014 14:32:36 -0700] rev 22913
status: create class for status lists
Callers of various status() methods (on dirstate, context, repo) get a
tuple of 7 elements, where each element is a list of files. This
results in lots of uses of indexes where names would be much more
readable. For example, "status.ignored" seems clearer than "status[4]"
[1]. So, let's introduce a simple named tuple containing the 7 status
fields: modified, added, removed, deleted, unknown, ignored, clean.
This patch introduces the class and updates the status methods to
return instances of it. Later patches will update the callers.
[1] Did you even notice that it should have been "status[5]"?
(tweaked by mpm to introduce the class in scmutil and only change one user)
Martin von Zweigbergk <martinvonz@gmail.com> [Fri, 03 Oct 2014 21:21:20 -0700] rev 22912
lfutil: avoid creating unnecessary copy of status tuple
In lfdirstatestatus(), the status tuple gets deconstructed, the lists
get updated, and then an identical status tuple gets created and
returned. Change it so we simply return the original tuple.
Martin von Zweigbergk <martinvonz@gmail.com> [Fri, 03 Oct 2014 21:44:10 -0700] rev 22911
dirstate: separate 'lookup' status field from others
The status tuple returned from dirstate.status() has an additional
field compared to the other status tuples: lookup/unsure. This field
is just an optimization and not something most callers care about
(they want the resolved value of 'modified' or 'clean'). To prepare
for a single future status type, let's separate out the 'lookup' field
from the rest by having dirstate.status() return a pair: (lookup,
status).
Martin von Zweigbergk <martinvonz@gmail.com> [Mon, 13 Oct 2014 14:18:47 -0700] rev 22910
commit: update file nodeid and flags in the same place
Now that we have a separate variable for the original 'm1' manifest,
we can safely update the nodeid of the file in the new manifest in the
same place as we update the flags.
Martin von Zweigbergk <martinvonz@gmail.com> [Mon, 13 Oct 2014 14:11:47 -0700] rev 22909
commit: use separate variable for p1 manifest and new manifest
In localrepo.commitctx(), p1's manifest is copied and used as the
basis for the manifest that is about to be committed. The way the copy
is updated makes it safe to use it where the original p1's manifest is
wanted. For readability, though, a separate variable for each purpose
would be clearer. Make it so.
Martin von Zweigbergk <martinvonz@gmail.com> [Mon, 13 Oct 2014 14:34:53 -0700] rev 22908
commit: remove dead initialization of 'lock'
The 'lock' variable is initialized to None, but before it's ever read,
it's assigned again.
Martin von Zweigbergk <martinvonz@gmail.com> [Mon, 13 Oct 2014 16:43:37 -0700] rev 22907
commit: reduce scope of 'removed' variable
The variable is closely related to 'added' and 'changed', so it makes
sense to have it declared next to them.
Matt Mackall <mpm@selenic.com> [Mon, 13 Oct 2014 18:00:39 -0500] rev 22906
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com> [Mon, 13 Oct 2014 17:55:45 -0500] rev 22905
rebase: move duplicatecopies next to merge
This is preparation for removing open-coded rebase/graft operations.
As a side-effect, this exposes proper renames in the working copy when
there are conflicts, which shows up in test-shelve.t.
Matt Mackall <mpm@selenic.com> [Mon, 13 Oct 2014 17:12:47 -0500] rev 22904
histedit: use merge.graft
Matt Mackall <mpm@selenic.com> [Mon, 13 Oct 2014 17:12:31 -0500] rev 22903
graft: use merge.graft
Matt Mackall <mpm@selenic.com> [Mon, 13 Oct 2014 17:12:12 -0500] rev 22902
merge: add merge.graft helper
This will help unify all the open-coded graft/rebase operations.
Matt Mackall <mpm@selenic.com> [Mon, 13 Oct 2014 14:33:13 -0500] rev 22901
duplicatecopies: move from cmdutil to copies
This is in preparation for moving its primary caller into merge.py,
which would be a layering violation in the current location.
Matt Mackall <mpm@selenic.com> [Mon, 13 Oct 2014 14:04:11 -0500] rev 22900
histedit: fix indent
The duplicatecopies call should be part of the rebase block.
Matt Mackall <mpm@selenic.com> [Mon, 13 Oct 2014 13:21:03 -0500] rev 22899
graft: move rebase cleanup code next to actual rebase
This is prep for refactoring the rebase logic.
Matt Mackall <mpm@selenic.com> [Fri, 10 Oct 2014 13:44:40 -0500] rev 22898
shelve: add a bundlerepo method
Matt Mackall <mpm@selenic.com> [Sat, 11 Oct 2014 14:05:09 -0500] rev 22897
dirstate: merge falls through to otherparent
This lets us more correctly fix the state when we use setparents, as
demonstrated in the change in test-graft.t.
Matt Mackall <mpm@selenic.com> [Fri, 10 Oct 2014 13:31:06 -0500] rev 22896
dirstate: use 'm' state in otherparent to reduce ambiguity
In rebase-like operations where we abandon the second parent, we can
correctly fix up the state in setparents.
Matt Mackall <mpm@selenic.com> [Fri, 10 Oct 2014 13:05:50 -0500] rev 22895
dirstate: properly clean-up some more merge state on setparents
Durham Goode <durham@fb.com> [Tue, 07 Oct 2014 11:42:37 -0700] rev 22894
phases: move root phase assignment to it's own function
This moves the initial root phase assignment to it's own function. Future
patches which make phase calculations lazy will use this function to pre-fill
certain phases which can be deduced from the roots.
Durham Goode <durham@fb.com> [Tue, 07 Oct 2014 11:37:54 -0700] rev 22893
phases: add invalidate function
Phase cache invalidation was spread all over the place. Let's add a function to
unify it. Later more will be added to this function.
Durham Goode <durham@fb.com> [Sun, 12 Oct 2014 23:30:04 -0700] rev 22892
phases: change phase command change detection
A future patch is going to make phase computation lazy, so the phase command can
no longer read and diff the entire phase list directly. This changes the phase
command to build it's own list for diff purposes.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 13:09:22 -0700] rev 22891
spanset: remove `.set()` definition
All my friends are dead.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 13:08:49 -0700] rev 22890
generatorset: remove `.set()` definition
All my friends are dead.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 13:08:28 -0700] rev 22889
addset: remove `.set()` definition
All my friends are dead.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 13:08:10 -0700] rev 22888
filteredset: remove `.set()` definition
All my friends are dead.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 13:07:35 -0700] rev 22887
baseset: remove `set()` definition
All my friends are dead.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 11:27:57 -0700] rev 22886
abstractsmartset: remove `set()` method definition
Now that all usages have been removed, we can drop this not so useful part of
the API. We can note that the name was wrong all along...
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 14:27:05 -0700] rev 22885
match: check if an object is a baseset using `isascending` instead of `set`
The `set()` method is going away.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 14:22:23 -0700] rev 22884
getset: check if an object is a baseset using `isascending` instead of `set`
The `set()` method is going away.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 13:24:57 -0700] rev 22883
fullreposet: detect smartset using "isascending" instead of "set"
The `.set()` function is going away.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 13:21:05 -0700] rev 22882
fullreposet: drop custom sets but not smartsets detection
All custom classes use by revsets are smartsets now. We drop the special-casing.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 12:30:00 -0700] rev 22881
addset: drop `.set()` usage during iteration
We can use the containment check directly.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 12:31:22 -0700] rev 22880
baseset: access `_set` directly for containment check
The `.set()` method is going away.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 12:30:56 -0700] rev 22879
baseset: make `_set` a property cache
This will remove the need for `baseset.set()`.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 11:27:04 -0700] rev 22878
graphnode: remove usage of `set()`
All smartset classes have fast lookup, so this function will be removed soon.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 02:52:10 -0700] rev 22877
revset-_hexlist: remove usage of `set()`
All smartset classes have fast lookup, so this function will be removed soon.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 02:51:54 -0700] rev 22876
revset-_intlist: remove usage of `set()`
All smartset classes have fast lookup, so this function will be removed soon.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 02:51:16 -0700] rev 22875
revset-_list: remove usage of `set()`
All smartset classes have fast lookup, so this function will be removed soon.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 02:50:20 -0700] rev 22874
revset-roots: remove usage of `set()`
All smartset classes have fast lookup, so this function will be removed soon.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 13:31:00 -0700] rev 22873
histedit: stabilise the order nodes that are stripped
The `nodes` object is a set. We sort it to get stable order. This is going to
prevent revsets from getting confused when removing a `.set()` call in `roots`.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 02:49:17 -0700] rev 22872
revset-origin: remove usage of `set()`
All smartset classes have fast lookup, so this function will be removed soon.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 02:48:56 -0700] rev 22871
revset-last: remove usage of `set()`
All smartset classes have fast lookup, so this function will be removed soon.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 02:48:24 -0700] rev 22870
revset-limit: remove usage of `set()`
All smartset classes have fast lookup, so this function will be removed soon.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 02:47:46 -0700] rev 22869
revset-destination: remove usage of `set()`
All smartset classes have fast lookup, so this function will be removed soon.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 02:47:24 -0700] rev 22868
revset-children: remove usage of `set()`
All smartset classes have fast lookup, so this function will be removed soon.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 02:47:00 -0700] rev 22867
revset-branch: remove usage of `set()`
All smartset classes have fast lookup, so this function will be removed soon.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 02:45:53 -0700] rev 22866
revset-rangeset: remove usage of `set()`
All smartset classes have fast lookup, so this function will be removed soon.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 02:45:43 -0700] rev 22865
revset-only: remove usage of `set()`
All smartset classes have fast lookup, so this function will be removed soon.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 22:57:52 -0700] rev 22864
revset: cache most conditions used in `filter`
Except when stated otherwise, the condition used in `smartset.filter` will be
cached. A new argument has been introduced to disable that behavior. We use it
for filters created from `and` and `sub` operations.
This gives massive performance boosts for revsets with expensive conditions.
revset: branch(stable) or branch(default)
before) wall 4.329070 comb 4.320000 user 4.310000 sys 0.010000 (best of 3)
after) wall 2.356451 comb 2.360000 user 2.330000 sys 0.030000 (best of 4)
revset: author(mpm) or author(lmoscovicz)
before) wall 4.434719 comb 4.440000 user 4.440000 sys 0.000000 (best of 3)
after) wall 2.321720 comb 2.320000 user 2.320000 sys 0.000000 (best of 4)
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 04:12:20 -0700] rev 22863
baseset: empty or one-element sets are ascending and descending
The empty set is full of interesting properties. In the ordering case, the one
element set is too.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 01:33:05 -0700] rev 22862
filteredset: drop explicit order management
Now that all low-level smartset classes have proper ordering and fast iteration
management, we can just rely on the subset in filteredset.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 04:24:51 -0700] rev 22861
revset: restore order of `or` operation as in Mercurial 2.9
Lazy revset broke the ordering of the `or` revset. We now stop assuming that
two ascending revset are combine into an ascending one.
Behavior in 3.0:
3:4 or 2:5 == [2, 3, 4, 5]
Behavior in 2.9:
3:4 or 2:5 == [3, 4, 2, 5]
We are adding a test for it.
For unclear reason, the performance `or` revset with expensive filter are
getting even worse than they used to be. This is probably caused by extra
uncached containment check or iteration.
revset #9: author(lmoscovicz) or author(mpm)
before) wall 3.487583 comb 3.490000 user 3.490000 sys 0.000000 (best of 3)
after) wall 4.481486 comb 4.480000 user 4.470000 sys 0.010000 (best of 3)
revset #10: author(mpm) or author(lmoscovicz)
before) wall 3.164839 comb 3.170000 user 3.160000 sys 0.010000 (best of 3)
after) wall 4.574965 comb 4.570000 user 4.570000 sys 0.000000 (best of 3)
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 09:12:54 -0700] rev 22860
revset-_descendant: rework the whole sorting and combining logic
We use the & operator to combine with subset (since this is more likely to be
optimised than filter) and we enforce the sorting of the result. Without this
enforced sorting, we may result in a different iteration order than the set
_descendent was computed from.
This reverts a bad `test-glog.t` change from
69402eb72115.
Another side effect is that `test-mq.t` shows `qparent::` including `-1` if
`qparent is -1`. This sound like a positive change.
This has good and bad impacts on the benchmarks, here is a good ones:
revset: 0::
before) wall 0.045489 comb 0.040000 user 0.040000 sys 0.000000 (best of 100)
after) wall 0.034330 comb 0.030000 user 0.030000 sys 0.000000 (best of 100)
revset: roots((0::) - (0::tip))
before) wall 0.134090 comb 0.140000 user 0.140000 sys 0.000000 (best of 63)
after) wall 0.128346 comb 0.130000 user 0.130000 sys 0.000000 (best of 69)
revset: ::p1(p1(tip))::
before) wall 0.143892 comb 0.140000 user 0.140000 sys 0.000000 (best of 55)
after) wall 0.124502 comb 0.130000 user 0.130000 sys 0.000000 (best of 65)
revset: roots((0:tip)::)
before) wall 0.204966 comb 0.200000 user 0.200000 sys 0.000000 (best of 43)
after) wall 0.184455 comb 0.180000 user 0.180000 sys 0.000000 (best of 47)
Here is a bad one:
revset: (20000::) - (20000)
before) wall 0.009592 comb 0.010000 user 0.010000 sys 0.000000 (best of 222)
after) wall 0.029837 comb 0.030000 user 0.030000 sys 0.000000 (best of 100)
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 20:15:41 -0700] rev 22859
addset: do lazy sorting
The previous implementation was consuming the whole revset when asked for any
sort. The addset class is now doing lazy sorting like all other smarset classes.
This has no significant impact in the benchmark as-is. But this is important
to later change.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 04:40:04 -0700] rev 22858
test-import.t: use proper revset order
This test, written after 3.0, is relying on addset being enforced ascending if
both side are ascending. We are about to restore the ordering to 2.9 behavior
(elements are ordered in the order they are specified). We fix the test before
fixing the order.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 04:29:18 -0700] rev 22857
baseset: drop custom __sub__ method
This add method is enforcing non-laziness, disabling multiple optimisations.
Benchmarks do not spot any significant difference but real usecase may. This
will also be important for further improvements to addset later in this series.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 04:27:25 -0700] rev 22856
baseset: drop custom __and__ method
This add method is enforcing non-laziness, disabling multiple optimisations.
Benchmarks do not spot any significant regression but real usecase may. This
even gives some speedup in some cases:
revset #15: min(0::)
before) wall 0.001247 comb 0.000000 user 0.000000 sys 0.000000 (best of 1814)
after) wall 0.000942 comb 0.000000 user 0.000000 sys 0.000000 (best of 2367)
This will also be important for further improvement to addset later in this series.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 04:27:01 -0700] rev 22855
baseset: drop custom __add__ method
This add method is enforcing non-laziness, disabling multiple optimisations.
Benchmarks do not spot any significant differences but real usecase may. This
will also be important for further improvements to addset later in this series.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 17:57:44 -0700] rev 22854
obsolete: use format version 1 as the default for obsstore
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 19:13:08 -0700] rev 22853
test-obsolete: remove subminute timezone in test
Obsmarker format "1" does not supports sub minute timezone. So we change the
test to something slightly more sensible.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 17:52:40 -0700] rev 22852
obsolete: add a "format.obsstore-version" config option
This option controls what version of the binary format to use when creating a new
obsstore file.
Default is still the old format. No safeguards are currently placed around the
option value, but no clueless users are in danger of harm since it is
undocumented.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 00:10:10 -0700] rev 22851
obsolete: introduce a new binary encoding for obsmarkers (version 1)
This new encoding explicitly stores the date and parents allowing a
significantly faster marker decoding. See inline documentation for details.
This format is not yet used to store format on disk. But it will be used in
bundle2 exchange if both side support it. Support for on-disk format is coming
in other changesets.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 16:43:04 -0500] rev 22850
obsstore: add a flag for sha256 hashes
We add flag to inform that the marker is using sha256 hashes. As format 0 is not
able to handle sha256 hashes (32 bytes long), we plain crash if we even attempt to
encode a sha256 with it.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 00:15:04 -0700] rev 22849
obsolete: use uint## in the format documention
This is shorter and kind of more readable for people who care about binary
format.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 22:34:48 -0700] rev 22848
obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 22:12:06 -0700] rev 22847
obsolete: _rename decodemeta to _fm0decodemeta
This will be format zero specific.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 22:11:36 -0700] rev 22846
obsolete: _rename encodemeta to _fm0encodemeta
This will be format zero specific.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 22:10:15 -0700] rev 22845
obsolete: store metadata as a tuple of (key, value) pairs (API)
Different formats will encode metadata in different ways. So we cannot keep the
binary blob in the object anymore. We use a tuple to ensure it is immutable and
hashable.
Matt Mackall <mpm@selenic.com> [Fri, 10 Oct 2014 12:15:46 -0500] rev 22844
merge with stable
Matt Mackall <mpm@selenic.com> [Fri, 10 Oct 2014 11:38:00 -0500] rev 22843
templater: fix ifcontains when list is a string (
issue4399)
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Wed, 08 Oct 2014 07:47:11 -0400] rev 22842
shelve: don't delete "." when rebase is a no-op (
issue4398)
When unshelving and facing a conflict, if we resolve all conflicts in
favour of the committed changes instead of the shelved changes, then
the ensuing implicit rebase is a no-op. That is, there is nothing to
rebase. In this case, there are no extra intermediate shelve commits
to strip either. Prior to this change, the commit being unshelved to
would be marked for destruction in a rather catastrophic way.
The relevant part of the test case failed as follows:
$ hg unshelve -c
unshelve of 'default' complete
$ hg diff
warning: ignoring unknown working parent
33f7f61e6c5e!
diff --git a/a/a b/a/a
new file mode 100644
--- /dev/null
b/a/a
@@ -0,0 1,3 @@
a
c
x
$ hg status
warning: ignoring unknown working parent
33f7f61e6c5e!
M a/a
? a/a.orig
? foo/foo
$ hg summary
warning: ignoring unknown working parent
33f7f61e6c5e!
parent: -1:
000000000000 (no revision checked out)
branch: default
commit: 1 modified, 2 unknown (new branch head)
update: 4 new changesets (update)
With this change, this test case now passes.
Martin von Zweigbergk <martinvonz@gmail.com> [Wed, 08 Oct 2014 14:16:53 -0700] rev 22841
merge: make error message consistent with other commands
If a merge is attempted when another merge is already ongoing, we give
the message "outstanding uncommitted merges". Many other commands
(such as backout, rebase, histedit) give the same message in singular
form. Since the singular form also seems to make more sense, let's use
that for 'hg merge' as well.
Augie Fackler <raf@durin42.com> [Fri, 10 Oct 2014 10:34:52 -0400] rev 22840
test-run-tests: add a test for detection of failure to start a server
This also highlights a bug: right now we print "2 failed" but we only
ran one test.
Kyle Lippincott <spectral@google.com> [Thu, 09 Oct 2014 17:00:29 -0700] rev 22839
run-tests: more accurate/helpful message than "diff generation failed"
Diff generation didn't really fail, it recognized that an hg serve server has
failed to start, and thus skipped the diff generation intentionally.
The most common reason for a server to fail to start is that the port was
already in use, so output HGPORT as well, to help finding it (since pgrep -f
'hg serve' is not sufficient, if the command line is something like 'hg -R main
serve')
Augie Fackler <raf@durin42.com> [Thu, 09 Oct 2014 15:10:40 -0400] rev 22838
run-tests: handle --jobs and --first gracefully
Without this change, --first causes currently-running tests to explode
in violent and surprising ways when their temporary directory gets
cleaned up. Now we just suppress failure messages from non-first
failures when running in --first mode.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Mon, 06 Oct 2014 16:35:02 -0400] rev 22837
config: use the same hgrc for a cloned repo as for an uninitted repo
This just copies the same local sample hgrc, except it sets the
default path to the repo it was cloned from.
This is cut-and-paste from the local sample hgrc, but I think it's
acceptable, since the two pieces of code are right next to each other
and they're small. There is danger of them going out of synch, but it
would complicate the code too much to get rid of this C&P.
I also add ui as an import to hg.py, but with demandimport, this
should not be a noticeable performance hit.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Wed, 08 Oct 2014 07:45:51 -0400] rev 22836
config: give a more detailed sample repo config
Some examples of the typical configurations that one might want to do
in an .hg/hgrc file. This includes a default-push that happens to
point to the same location as my-fork.
I insist on the myfork terminology for a server-side clone. Bitbucket,
Github, and others have widely popularised this meaning of "fork".
This also includes a gentle nudge to use a repo-specific username,
which is something that people might not instinctively realise is an
option.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 01:46:53 -0700] rev 22835
smartset: drop infamous ascending, descending
All your friends are dead.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 01:41:14 -0700] rev 22834
fullreposet: use `isascending` instead of `ascending` to recognise smartsets
`ascending` is going to be removed.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 01:41:26 -0700] rev 22833
fullreposet: use `sort` to enforce the order
The `ascending` and `descending` methods are useless.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 01:48:34 -0700] rev 22832
revancestors: replace `descending` with `sort(reverse=False)`
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 01:41:02 -0700] rev 22831
_descendants: replace `ascending()` with `sort()`
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 01:36:53 -0700] rev 22830
_descendants: directly use smartset
As `addset` objects are proper smartset objects, we do not need to make any
transformation of the result.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 03:29:55 -0500] rev 22829
baseset: explicitly track order of the baseset
A baseset starts without an explicit order. But as soon as a sort is requested,
we simply register that the baseset has an order and use the ordered version of
the list to behave accordingly.
We will want to properly record the order at creation time in the future. This
would unlock more optimisation and avoid some sorting.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 03:31:05 -0500] rev 22828
baseset: fix isascending and isdescending
We now have sufficient information to return the proper value there.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 03:26:18 -0500] rev 22827
baseset: prepare lazy ordering in __iter__
We'll explicitly track the order of the baseset to take advantage of the
ascending and descending lists during iteration.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 03:19:23 -0500] rev 22826
baseset: implement a fastasc and fastdesc
Baseset contains already-computed revisions. It is considered "cheap" to do
operations on an already-computed set. So we add attributes to hold version of
the list in ascending and descending order and use them for `fastasc` and
`fastdesc`. Having distinct lists is important to provide correct iteration in
all cases. Altering a python list will impact an iterator connected to it.
eg: not preserving order at iterator creation time
>>> l = [0, 1]
>>> i = iter(l)
>>> l.reverse()
>>> list(i)
[1, 0]
eg: corrupting in progress iteration
>>> l = [0, 1]
>>> i = iter(l)
>>> i.next()
0
>>> l.reverse()
>>> i.next()
0
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 11:03:30 -0700] rev 22825
baseset: stop inheriting from built-in list class
The baseset is doing more and more smartset magic and using its list-like
property less and less. So we store the list of revisions in an explicit
attribute and stop inheriting.
This requires reimplementing some basic methods.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:38:14 -0700] rev 22824
strip: stop calling `remove` on smartset
The `remove` method is not part of the smartset specification. We use a plain
old list comprehension instead.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:31:53 -0700] rev 22823
rebase: transform the smartset to a list before comparing with a list
This is highly suboptimal but smartsets are not comparable to lists yet.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:41:58 -0700] rev 22822
merge.update: use `first` instead of direct indexing
This makes it compatible with all smartset classes.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:33:47 -0700] rev 22821
qimport: use `first` and `last` instead of direct indexing
This makes it compatible with all smartset classes.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:16:59 -0700] rev 22820
rebase: use `last` instead of direct indexing
This makes it compatible with all smartset classes.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:14:53 -0700] rev 22819
mq: use `last` instead of direct indexing
This makes it compatible with all smartset classes.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:09:50 -0700] rev 22818
repair: use `first` instead of direct indexing
This makes it compatible with all smartset classes.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 23:45:07 -0700] rev 22817
rangeset: use `first` and `last` instead of direct indexing
This makes it compatible with all smarsets classes.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 23:37:39 -0700] rev 22816
revpair: use `first` and `last` instead of direct indexing
This makes it compatible with all smarsets classes.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 23:37:08 -0700] rev 22815
revsingle: use `last` instead of direct indexing
This makes it compatible with all smarsets classes.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 11:43:32 -0700] rev 22814
revset-limit: use boolean testing instead of `len(revs) < 1`
I'm not sure why we wrote it that way. But smartsets have faster/lazier non-zero
testing than length computation.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:18:08 -0700] rev 22813
filteredset: implement `first` and `last`
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 14:42:00 -0700] rev 22812
baseset: implement `first` and `last` methods
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 12:52:36 -0700] rev 22811
generatorset: implement first and last methods
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 11:57:59 -0700] rev 22810
addset: implement first and last methods
The implementation is non-lazy for now. One may want to make it more lazy in the
future.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 11:54:53 -0700] rev 22809
spanset: implement `first` and `last` methods
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 11:46:53 -0700] rev 22808
smartset: add first and last methods
In multiple places in the code, we use `someset[0]` or `someset[-1]`. This
works only because the `someset` is usually a baseset. For the same reason we
introduce a `first` and `last` methods to be implemented for all smartset
classes.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:20:00 -0700] rev 22807
getgraphlogrevs: remove user of baseset.append
A `baseset` has multiple cached results and will get even more in the future.
Making it an object "populated once" like the other smartsets makes it both safer
and simpler. The append method will be removed at some point.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:04:16 -0700] rev 22806
getlogrevs: remove user of baseset.append
A `baseset` has multiple cached results and will get even more in the future.
Making it an object "populated once" like the other smartsets makes it both safer
and simpler. The append method will be removed at some point.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 00:55:09 -0700] rev 22805
revset-last: remove user of baseset.append
A `baseset` has multiple cached results and will get even more in the future.
Making it an object "populated once" like the other smartsets makes it both safer
and simpler. The append method will be removed at some point.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 10:57:01 -0700] rev 22804
revset-limit: remove user of baseset.append
A `baseset` has multiple cached results and will get even more in the future.
Making it an object "populated once" like the other smartsets makes it both safer
and simpler. The append method will be removed at some point.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:12:56 -0700] rev 22803
mq: use `revs.sort()` to ensure the set is ascending
Sorting is super-cheap with the new smartset class, so we can use it to enforce
the order. Otherwise all smartset classes would have to allow direct indexing.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 10:41:43 -0700] rev 22802
baseset: use default value instead of [] when possible
For pure cleanup purposes, we replace all the occurences of `baseset([])` with
`baseset()`.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 04 Oct 2014 06:17:18 -0700] rev 22801
generatorset: implement isascending and isdescending
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 21:11:56 -0700] rev 22800
generatorset: explicitly track iteration order
The expected iteration order may be different than the fast iteration order (eg:
ancestors(42) is expected to be iterated upward but is fast/lazy to compute
downward.
So we explicitly track the iteration order and enforce it if the manual
iteration is requested.
Default expected iteration order of a generator set is ascending because I'm
not aware of any descending revset that need a generatorset. The first to find
such descending revset will have the pleasure to make this configurable.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 20:23:02 -0700] rev 22799
addset: drop caching through generatorset
The utility of this cache is debatable (no visible benchmark impact) and using
generatorset for such purpose makes the code complicated.
We drop it for now. Someone can reintroduce a smart version of it in the future
if it is detected to be relevant.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 21:01:30 -0700] rev 22798
generatorset: get list-based fast iterations after the generator is consumed
When all revisions are known, we shortcut most of the class logic to use list
iteration instead. The cost of the sort is expected to be non-significant. The
list creation and sorting could be done lazily in the future. We have to copy
the list to not break existing iterator created before we finished consuming the
generator.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 20:48:28 -0700] rev 22797
generatorset: move iteration code into _iterator
_iterator handles the generator iteration. The `__iter__` method will need
changes to handle ordering-related information.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 20:43:48 -0700] rev 22796
generatorset: stop using a base as the _genlist
It does not add anything and makes it more complicated to have a simple baseset
implementation.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 20:12:02 -0700] rev 22795
generatorset: drop the leading underscore in the class name
This is a real smart set now.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 20:14:43 -0700] rev 22794
generatorset: update the docstring now that it is a smartset
The documentation was still stating that this class was not a smartset. We drop
that part.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 20:18:48 -0700] rev 22793
addset: drop the leading underscore from the class name
This class is now a real smartset.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 20:17:12 -0700] rev 22792
addset: this is a smartset, update the docstring
The documentation was still stating that this class is a not a smartset. We drop
that part.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 05:27:23 -0700] rev 22791
addset: use the ascending argument in _iterordered
Fix a bug where fastasc and fastdesc were iterator in the same order as
self._ascending.
Matt Mackall <mpm@selenic.com> [Wed, 08 Oct 2014 14:03:07 -0500] rev 22790
rebase: add help examples
Matt Mackall <mpm@selenic.com> [Wed, 08 Oct 2014 13:40:50 -0500] rev 22789
rebase: attempt to clarify --base
Augie Fackler <raf@durin42.com> [Wed, 08 Oct 2014 12:59:11 -0400] rev 22788
manifest: rearrange add() method and add comments for clarity
Omit the check of bool(p1) since it's always true in practice: it will
either be nullid or some valid manifest sha, and we know nullid won't
ever be in the cache so we can simplify understanding of this code.
Augie Fackler <raf@durin42.com> [Wed, 08 Oct 2014 11:52:30 -0400] rev 22787
manifest: simplify manifest.add() by making args required
I verified that changed was never false (it was always a 2-tuple) by
adding
@@ -220,6 +225,8 @@ class manifest(revlog.revlog):
def add(self, map, transaction, link, p1=None, p2=None,
changed=None):
+ if not changed:
+ assert False, 'changed was %r' % changed
# if we're using the cache, make sure it is valid and
# parented by the same node we're diffing against
if not (changed and p1 and (p1 in self._mancache)):
and observing that the test suite still passed. Making all the
arguments required should help future readers understand what's going
on here.
Augie Fackler <raf@durin42.com> [Thu, 25 Sep 2014 14:13:31 -0400] rev 22786
manifest: move manifest parsing to module-level
We'll need this in the sharded manifest hashing routine, and I need to
tweak it anyway, so make it module-level now.
Augie Fackler <raf@durin42.com> [Wed, 24 Sep 2014 15:14:44 -0400] rev 22785
revlog: move references to revlog.hash to inside the revlog class
This will make it possible for subclasses to have different hashing
schemes when appropriate. I anticipate using this in manifests.
Note that there's still one client of mercurial.revlog.hash() outside
of revlog: mercurial.context.memctx uses it to construct the file
entries in an in-memory manifest. I don't think this will be a problem
in the immediate future, so I've left it as-is.
Augie Fackler <raf@durin42.com> [Wed, 24 Sep 2014 15:10:52 -0400] rev 22784
revlog: mark nullhash as module-private
No other module should ever need this, so mark it with _ so nobody
tries to use it.
Yuya Nishihara <yuya@tcha.org> [Wed, 08 Oct 2014 20:51:01 +0900] rev 22783
ui: disable echo back of prompt input if ui is set to non-tty purposely
9ab18a912c44 is nice for test output, but it also affects command-server
channel. Command-server client shouldn't receive echo-back message, which
makes it harder to parse the output.
Siddharth Agarwal <sid0@fb.com> [Fri, 03 Oct 2014 18:48:09 -0700] rev 22782
dirstate: cache util.normcase while constructing the foldmap
This is a small win on OS X. hg perfdirstatefoldmap:
before: wall 0.399708 comb 0.410000 user 0.390000 sys 0.020000 (best of 25)
after: wall 0.386331 comb 0.390000 user 0.370000 sys 0.020000 (best of 25)
Siddharth Agarwal <sid0@fb.com> [Fri, 03 Oct 2014 18:47:28 -0700] rev 22781
normcase: for darwin, use fast ASCII lower
Constructing the foldmap is much faster on OS X now. For a large real-world
repo, hg perfdirstatefoldmap:
before: wall 0.805278 comb 0.800000 user 0.790000 sys 0.010000 (best of 13)
after: wall 0.399708 comb 0.410000 user 0.390000 sys 0.020000 (best of 25)
This is a nice boost to 'hg status', especially with the third-party hgwatchman
extension enabled (which eliminates stat calls). For the above repo, 'hg
status' goes from 1.17 seconds to 0.74.
Siddharth Agarwal <sid0@fb.com> [Fri, 03 Oct 2014 19:58:26 -0700] rev 22780
perf: add a way to measure the perf of constructing the foldmap
Constructing the foldmap is a necessary part of operations like 'hg status' on
OS X. This command allows us to measure the perf of constructing it.
Siddharth Agarwal <sid0@fb.com> [Fri, 03 Oct 2014 18:45:56 -0700] rev 22779
encoding.lower: use fast ASCII lower
This benefits, among other things, the case collision auditor.
On a Linux system with a large real-world repo where all filenames are ASCII,
hg perfcca:
before: wall 0.260157 comb 0.270000 user 0.230000 sys 0.040000 (best of 38)
after: wall 0.164616 comb 0.160000 user 0.160000 sys 0.000000 (best of 54)
Siddharth Agarwal <sid0@fb.com> [Fri, 03 Oct 2014 18:42:39 -0700] rev 22778
parsers: add a function to efficiently lowercase ASCII strings
We need a way to efficiently lowercase ASCII strings. For example, 'hg status'
needs to build up the fold map -- a map from a canonical case (for OS X,
lowercase) to the actual case of each file and directory in the dirstate.
The current way we do that is to try decoding to ASCII and then calling
lower() on the string, labeled 'orig' below:
str.decode('ascii')
return str.lower()
This is pretty inefficient, and it turns out we can do much better.
I also tested out a condition-based approach, labeled 'cond' below:
(c >= 'A' && c <= 'Z') ? (c + ('a' - 'A')) : c
'cond' turned out to be slower in all cases. A 256-byte lookup table with
invalid values for everything past 127 performed similarly, but this was less
verbose.
On OS X 10.9 with LLVM version 6.0 (clang-600.0.51), the asciilower function
was run against two corpuses.
Corpus 1 (list of files from real-world repo, > 100k files):
orig: wall 0.428567 comb 0.430000 user 0.430000 sys 0.000000 (best of 24)
cond: wall 0.077204 comb 0.070000 user 0.070000 sys 0.000000 (best of 100)
lookup: wall 0.060714 comb 0.060000 user 0.060000 sys 0.000000 (best of 100)
Corpus 2 (mozilla-central, 113k files):
orig: wall 0.238406 comb 0.240000 user 0.240000 sys 0.000000 (best of 42)
cond: wall 0.040779 comb 0.040000 user 0.040000 sys 0.000000 (best of 100)
lookup: wall 0.037623 comb 0.040000 user 0.040000 sys 0.000000 (best of 100)
On a Linux server-class machine with GCC 4.4.6
20120305 (Red Hat 4.4.6-4):
Corpus 1 (real-world repo, > 100k files):
orig: wall 0.260899 comb 0.260000 user 0.260000 sys 0.000000 (best of 38)
cond: wall 0.054818 comb 0.060000 user 0.060000 sys 0.000000 (best of 100)
lookup: wall 0.048489 comb 0.050000 user 0.050000 sys 0.000000 (best of 100)
Corpus 2 (mozilla-central, 113k files):
orig: wall 0.153082 comb 0.150000 user 0.150000 sys 0.000000 (best of 65)
cond: wall 0.031007 comb 0.040000 user 0.040000 sys 0.000000 (best of 100)
lookup: wall 0.028793 comb 0.030000 user 0.030000 sys 0.000000 (best of 100)
SSE instructions might help even more, but I didn't experiment with those.
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 30 Sep 2014 15:58:08 -0700] rev 22777
match: remove unnecessary setting of self._always
The 'always' class calls its parent constructor with an empty list of
patterns, which will result in a matcher that always matches. The
parent constructor will set self._always to True in such cases, so
there is no need to set it again.
Yuya Nishihara <yuya@tcha.org> [Fri, 03 Oct 2014 00:43:22 +0900] rev 22776
bookmarks: port to generic templater
Yuya Nishihara <yuya@tcha.org> [Fri, 03 Oct 2014 00:36:36 +0900] rev 22775
bookmarks: split ui.write() so that it can be easily ported to formatter api
Test output changes because color labels are applied separately.
Yuya Nishihara <yuya@tcha.org> [Fri, 03 Oct 2014 00:15:39 +0900] rev 22774
bookmarks: iterate bookmarks list even if it is known to be empty
This clarifies that "no bookmarks set" is displayed in addition to the list
of bookmarks. In JSON output, for example, [] should be written if empty,
and "no bookmarks set" message should be skipped.
David Soria Parra <davidsp@fb.com> [Mon, 06 Oct 2014 07:29:40 -0700] rev 22773
repoview: remove hiddencache verification
We have been running hiddencache verification since 3.1.1 and so
far not received a bug report concerning it. Therefore we remove
the verification code and make the hiddencache authoritive. That
way we get the intended speedup.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Mon, 06 Oct 2014 08:18:03 -0400] rev 22772
color: reorganise and sectionify the help text
The color docstring was getting long. This splits it up into
bite-sized sections and rearranges the order of the paragraphs a
little to match these sections.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Mon, 06 Oct 2014 08:16:40 -0400] rev 22771
color: update description of the extension
The color extension long ago ceased to work only for the status and
qseries commands.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Mon, 06 Oct 2014 07:35:53 -0400] rev 22770
help: show all nested subsections of a section with `hg help foo.section`
Used to be that `hg help hgrc.paths` would show
"paths"
-------
Assigns symbolic names to repositories. The left side is the symbolic
name, and the right gives the directory or URL that is the location of the
repository. Default paths can be declared by setting the following
entries.
and stop there. Obviously the result seems better as shown in the
attached test.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Mon, 06 Oct 2014 07:29:38 -0400] rev 22769
help: fix output of sections in `hg help foo.somesection`
There was a bug in
c3c3dd31fe1c. The block that added definitions to
getsections should have been an elif, not an if. Otherwise section
titles get added twice, since the else clause would always get
executed for section titles.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Sat, 04 Oct 2014 17:52:59 -0400] rev 22768
log: show phase in hg log -v with the phase template
It seems weird that `hg log -v -T phases` would be *less* verbose than
`hg log -T phases`. This cset corrects that oversight.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Sat, 04 Oct 2014 17:48:59 -0400] rev 22767
log: add labels to the phase template
This copies the labelled default template and just adds an extra
{phase} keyword as necessary.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Fri, 03 Oct 2014 19:48:56 -0400] rev 22766
log: rewrite default template to use labels (
issue2866)
This is a complete rewrite of the default template to use labels. This
seems ultimately useless to me in most cases. The biggest benefit of
this patch to me seems to be a fairly complicated example of the
templating engine. It was a lot of hard work to figure out the precise
acceptable syntax, since it's almost undocumented. Hat tip to Steve
Losh's smartlog template, which helped me figure out a lot of the
syntax. Hopefully later I can use the present default log template
as an example for documenting the templating engine.
A test is attached. My goal was to match the --color=debug output,
which may differ slightly in newlines from the actual ANSI escape
codes output. I consider this an acceptable invisible deviation.
There seems to be a considerable slowdown with this rewrite.
Before:
$ time hg log -T default -r .~100::. > /dev/null
real 0m0.882s
user 0m0.812s
sys 0m0.064s
$ time hg log -T default -r .~100::. > /dev/null
real 0m0.872s
user 0m0.796s
sys 0m0.068s
$ time hg log -T default -r .~100::. > /dev/null
real 0m0.917s
user 0m0.836s
sys 0m0.076s
After:
$ time hg log -T default -r .~100::. > /dev/null
real 0m1.480s
user 0m1.392s
sys 0m0.072s
$ time hg log -T default -r .~100::. > /dev/null
real 0m1.500s
user 0m1.400s
sys 0m0.088s
$ time hg log -T default -r .~100::. > /dev/null
real 0m1.462s
user 0m1.364s
sys 0m0.092s
Following the maxim, "make it work, profile, make it faster, in that
order", I deem this slowdown acceptable for now.
I suspect but have not confirmed that a big slowdown comes from
calling keywords twice in the file templates, once to test the
existence of output and again to actually list the output. If so, a
simple speedup might be to improve the templating engine to cache
keywords when called more than once on the same revision.
TODO: I found a bug while working on this. The following stack traces:
hg log -r . -T '{ifcontains(phase, "secret public", "lol", "omg")}\n'
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Sat, 04 Oct 2014 16:28:28 -0400] rev 22765
log: do not hide the public phase in debug mode (BC)
When
51fc43253a52 introduced phases to the `hg log --debug` output, it
also disabled outputting public phase. At the same time, it always
shows phases in the default template, `hg log --debug -T default`.
Those two should produce the same output, but they don't.
I think it makes a lot more sense to always show all phases. There's
already loss of backwards compatibility in this case when using a
newer hg on an old hg repo, since draft commits will show up in the
output of `hg log --debug`.
Finally, I just don't think that any sort of information should be
hidden with --debug. This flag should be about showing as much
information as possible.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Fri, 03 Oct 2014 22:03:31 -0400] rev 22764
templater: set the correct phase for parents
Akin to
f6371cc62d2a which did this for `hg log`, the following sets
the correct phase for the {phase} keyword when the context is a parent
of the current cset. This allows templates such as the following to be
defined,
parent = '{label("log.parent changeset.{phase}",
"parent: {rev}:{node|formatnode}")}\n'
which when called on a parent (e.g. with the `parents` template
keyword), will produce the correct phase.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Fri, 03 Oct 2014 19:47:57 -0400] rev 22763
color: omit debug label output on empty strings
This is most noticeable when using custom templates. Before this
patch, a template like {label("foo.bar", baz)} would emit
[foo.bar|]
whenever baz was empty. This cset simply omits all output when baz is
empty.
Yuya Nishihara <yuya@tcha.org> [Sat, 04 Oct 2014 17:22:22 +0900] rev 22762
tests: make hghave list features alphabetically
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 12:54:56 -0500] rev 22761
revset: remove the now unused _descgeneratorset class
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 12:53:41 -0500] rev 22760
revset: use _generatorset in _revancestors
The _descgeneratorset class is going away.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 12:52:49 -0500] rev 22759
revset: remove now unused class _ascgeneratorset
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 12:52:17 -0500] rev 22758
revset: use _generatorset directly in _revdescendant
_ascgeneratorset is going away.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 12:46:34 -0500] rev 22757
generatorset: move membership testing on ordered gen to the main class
We are phasing out the ordered version of the class to simplify the code.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 12:36:57 -0500] rev 22756
generatorset: make use of the new mechanism in the subclass
Until we remove them, we use the new parameter of _generatorset to make sure
the code is run.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 12:36:08 -0500] rev 22755
generatorset: make it possible to use gen as fastasc or fastdesc
We gain a parameter to inform that the generator is ascending or descending. If
the generator is ordered, it is also used for the `fastasc` or `fastdesc`
version.
The _ascgeneratorset and _descgeneratorset class will be removed soon.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 03:19:00 -0500] rev 22754
baseset: rely on the abstractsmartset implementation for filter
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 19:48:14 -0500] rev 22753
_orderedsetmixin: drop this now unused class
All my friends are dead.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 19:47:33 -0500] rev 22752
spanset: drop _orderedsetmixin inheritance
The min/max method are as well provided by abstractsmartset.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 01:44:52 -0500] rev 22751
orderedlazyset: drop this now unused class
All my friends are dead.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 19:43:42 -0500] rev 22750
_descendant: use filteredset instead of orderedlazyset
The orderedlazyset class is going away. Filteredset gives the same service.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 01:37:13 -0500] rev 22749
addset: use the base implementation for ascending and descending
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 01:34:25 -0500] rev 22748
addset: use base implementation for __filter__
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 01:33:32 -0500] rev 22747
addset: use base implementation for __add__
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 01:32:50 -0500] rev 22746
addset: use base implementation for __sub__
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 01:31:46 -0500] rev 22745
addset: use base implementation for __and__
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 19:42:06 -0500] rev 22744
addset: promote to real smartset
Better revset performance are also achieved with less overlay. There is no good
reason for addset to not be a smartset. We can replace the `_orderedsetmixin`
inheritance since `abstractsmartset` has efficient min and max too.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 00:12:22 -0500] rev 22743
addset: add a __nonzero__ method
This is required to be a full smartset (not sure what was happening before
that...)
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 23:38:30 -0500] rev 22742
addset: offer a fastasc and fastdesc methods
If the underlying object offers fast iterators, we use them to provide fast
iterators too.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 23:28:18 -0500] rev 22741
addset: split simple and ordered iteration
We have two goals here. First, we would like to restore the former iteration
order we had in 2.9. Second, we want this logic to be reusable for `fastasc`
and `fastdesc` methods.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 01:55:09 -0500] rev 22740
generatorset: promote to smartset
This is not going to be efficient but we need all basic set classes to be smartsets
for the other classes to work.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 01:56:57 -0500] rev 22739
generatorset: implement __nonzero__
This is necessary to become a real smartset.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 00:31:33 -0500] rev 22738
spanset: use base implementation for __add__
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 00:31:18 -0500] rev 22737
spanset: use base implementation for __sub__
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 00:30:58 -0500] rev 22736
spanset: use base implementation for __and__
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 00:39:57 -0500] rev 22735
spanset: use base implementation for filter
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 01:27:00 -0500] rev 22734
filteredset: use base implementation for filter
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 01:25:35 -0500] rev 22733
filteredset: use base implementation for __add__
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 01:24:30 -0500] rev 22732
filteredset: use base implementation for __sub__
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 01:23:12 -0500] rev 22731
filteredset: use base implementation for __and__
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 19:22:17 -0500] rev 22730
abstractsmartset: add default implementation for __sub__
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 19:22:03 -0500] rev 22729
abstractsmartset: add default implementation for __add__
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 19:21:40 -0500] rev 22728
abstractsmartset: add default implementation for __and__
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 01 Oct 2014 00:26:50 -0500] rev 22727
abstractsmartset: add default implementation for filter
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 01:16:23 -0500] rev 22726
lazyset: rename the class to filteredset
All smartsets try to be lazy. The purpose of this class is to apply a
filter on another set. So we rename the class (and all its occurences) to
`filteredset`.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 19:14:03 -0500] rev 22725
lazyset: add order awareness to the class
Just a bit of extra code makes the lazyset aware of order. This renders
orderedlazyset useless.
At some point, the `subset` will become responsible for this ordering logic. But
we are not there yet because the various objects used as subsets are not good enough.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 19:03:14 -0500] rev 22724
lazyset: remove min/max
This is now handled by abstractsmartset.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 19:02:50 -0500] rev 22723
baseset: remove min/max methods
This is now handled by the base class.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 18:59:41 -0500] rev 22722
abstractsmartset: add a default implementation for min and max
This default implementation takes advantage of the fast iterator if available.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 18:52:09 -0500] rev 22721
lazyset: drop now useless ascending/descending definition
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 30 Sep 2014 23:36:57 -0500] rev 22720
lazyset: inherit the fastasc and fastdesc method from subset
When the filtered subset has such methods, we can use them. It is implemented
as properties to be able to quickly return None if no corresponding fastasc exists
on the subset.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 18:25:37 -0500] rev 22719
lazyset: split the iteration logic from the condition filtering logic
So that the filter can be reused by `fastasc` or `fastdesc`.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 17:53:55 -0500] rev 22718
spanset: do a single range check in __contains__
Now that `start <= end` is always true, we can simplify this function.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 18:02:17 -0500] rev 22717
spanset: enforce the order lazily to gain `fastasc` and `fastdesc` methods
Instead of having the direction of iteration enforced through the ordering of
`start` and `end` attributes of spanset, we encode the iteration direction in
an explicit attribute and always store start < end. The logic for sort and
reverse has to be updated. The __iter__ is now based on the newly introduced
`fastasc` and `fastdesc` methods.
This will allow other code simplifications in the future.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 30 Sep 2014 22:26:34 -0500] rev 22716
abstractsmartset: document the `fastasc` and `fastdesc` attributes/methods
See the in-line documentation for details. (This is the beginning of a massive
overhaul of revset).
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 18:35:56 -0500] rev 22715
spanset: remove ascending/descending implementation
We can rely on their implementation in abstractsmartset.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 18:35:00 -0500] rev 22714
baseset: remove ascending/descending redefinition
We can rely on the abstractsmartset implementation.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 18:34:18 -0500] rev 22713
abstractsmartset: default implementation for `ascending` and `descending`
These two methods are actually silly aliases for `sort()` and
`sort(reverse=True)`. So we get that aliasing at the abstractsmartset level. We
will slowly phase out all the custom implementations and eventually remove any
mentions of it from the code.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 04:55:55 -0700] rev 22712
revert: bring back usage of `subset & ps` in `parents`
Changeset
95af98616aa7 switched the order of the operand of the "&" computation
to work around an issue from repo-wide spanset. The need for a workaround has been
alleviated by the introduction of `fullreposet`. So we restore it to normal.
The benchmark shows no significant changes as expected.
We also revert the bogus test change introduced by
95af98616aa7. The order is
actually important.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Sun, 24 Aug 2014 17:40:27 -0400] rev 22711
color: update docstring for debug option
964dd1c491ca updated the format for the --color=debug option. This
updates the documentation to match this new format.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Wed, 20 Aug 2014 15:19:37 -0400] rev 22710
color: document the possibility to colourise tabs in diffs
This is a no-op change that simply suggests that tabs can be
colourised, but defaults to no colour effects for tabs. This
complements cset
c343557a8442.
Like the similar effects for phases from
f8e2aebbb24c, we set the
default effects to '' instead of None, so that this is a true noop
change. Otherwise, the diff.tab effect would override (i.e.
neutralise) the effect of the surrounding label.
Mike Edgar <adgar@google.com> [Fri, 12 Sep 2014 22:07:23 -0400] rev 22709
contrib/synthrepo: walk a repo's directory structure during analysis
Augments the analyze command to additionally walk the repo's current
directory structure (or of any directory tree), counting how many files
appear in which paths. This data is saved in the repo model to be used
by synthesize, for creating an initial commit with many files.
This change is aimed at developing, testing and measuring scaling
improvements when importing/converting a large repository to mercurial.
Mike Edgar <adgar@google.com> [Fri, 12 Sep 2014 22:04:29 -0400] rev 22708
contrib/synthrepo: generate initial repo contents using directory shape model
Augments the synthesize command to use an additional parameter to the analyzed
repo model: the number of files in each directory at a given snapshot. Before
synthesizing history, an arbitrary number of files will be generated in a
distribution matching the analyzed directory structure.
Intended for developing, testing and measuring scaling improvements when
importing/converting a large repository to Mercurial.
Mads Kiilerich <madski@unity3d.com> [Sun, 28 Sep 2014 17:15:28 +0200] rev 22707
filemerge: switch the default name for internal tools from internal:x to :x
Mads Kiilerich <madski@unity3d.com> [Sun, 28 Sep 2014 17:15:25 +0200] rev 22706
filemerge: introduce :x as short version of internal:x merge tool name
"internal:" is so much typing - it is frequently specified on the command line
and gives options that are longer than any other I have seen.
Yuya Nishihara <yuya@tcha.org> [Thu, 02 Oct 2014 23:26:02 +0900] rev 22705
branches: include active, closed and current flags in template output
Yuya Nishihara <yuya@tcha.org> [Thu, 02 Oct 2014 23:13:56 +0900] rev 22704
branches: merge white space to format string
Diffs of test output should be harmless. A white space character is moved
into "log.changeset" color region.
Yuya Nishihara <yuya@tcha.org> [Thu, 02 Oct 2014 22:59:56 +0900] rev 22703
branches: port to generic templater
Yuya Nishihara <yuya@tcha.org> [Thu, 02 Oct 2014 22:15:39 +0900] rev 22702
branches: format rev as integer that is necessary for generic templater
Yuya Nishihara <yuya@tcha.org> [Fri, 03 Oct 2014 22:20:02 +0900] rev 22701
formatter: add general way to switch hex/short functions
This seems a bit awkward, but it can avoid duplicates in annotate, tags,
branches and bookmarks.
I guess fm.hexfunc can eventually be removed (or redesigned) when it gets
template backend.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 11:37:56 -0500] rev 22700
locarepo: remove the `pull` method (API)
All the logic of this function is in the `exchange.pull` function for some time.
We just stop calling `localrepo.pull` in `command.pull` to have access to more
information. Leaving `localrepo.pull` in place will let third-party extensions
wrap it but it would never be called by `hg pull` making the wrapping useless.
Therefore, the method is removed so that third-party code fail noisily and
get properly upgraded.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 11:21:52 -0500] rev 22699
transplant: use exchange.pull
localrepo.pull is going away. See
4d52e6eb98ea for details.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 11:19:25 -0500] rev 22698
convert-hg: use localrepo.pull
localrepo.pull is going away. See
4d52e6eb98ea for details.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 11:16:57 -0500] rev 22697
fetch: use exchange.pull
localrepo.pull is going away. See
4d52e6eb98ea for details.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 11:15:33 -0500] rev 22696
localrepo: use exchange.pull when cloning
localrepo.pull is going away. See
4d52e6eb98ea for details.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 11:12:55 -0500] rev 22695
subrepo: use exchange.pull
localrepo.pull is going away, see
4d52e6eb98ea for details.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 11:11:12 -0500] rev 22694
commands: directly use exchange.pull
localrepo.pull is going away. See explanations in
4d52e6eb98ea.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 11:07:47 -0500] rev 22693
exchange: have `pull` return the pulloperation object
We mimic what was done for `push` for similar reason. We are about to drop
`localrepo.pull` (for consistency with dropping `localrepo.push` and we better
have an API as extensible as `push` is.
Find explanations about localrepo.push removal in
4d52e6eb98ea.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 01 Oct 2014 15:14:36 -0500] rev 22692
revset: introduce an abstractsmartset class
This class documents all methods required by a smartset. This makes it easier
for people to respect the API and ensure we fail loudly when something does
not. It will later also contain common default implementations for multiple
methods, making it easier to have smartset classes with minimal work.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 01 Oct 2014 15:03:16 -0500] rev 22691
revset: add a `__nonzero__` to baseset
We are about to add a base class for `baseset` with an abstract `__nonzero__`
method. So we need this method to be explicitly defined to avoid issues. The
built-in list object apparently does not have a `__nonzero__` and relies on
`__len__` for this purpose?
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 01 Oct 2014 15:50:54 -0500] rev 22690
revset: drop isinstance(baseset) in spanset.__sub__
As baseset now has a fast __contains___ operator, this `baseset.set()` dance is no
longer needed. No regressions are visible in the benchmark.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 01 Oct 2014 15:50:40 -0500] rev 22689
revset: drop isinstance(baseset) in spanset.__and__
As baseset now has a fast __contains___ operator, this `baseset.set()` dance is no
longer needed. No regressions are visible in the benchmark.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 30 Sep 2014 23:09:59 -0500] rev 22688
revset: drop isinstance(baseset) from baseset.__and__
As baseset now has a fast __contains___ operator, this `baseset.set()` dance is
no longer needed. No regressions are visible in the benchmark.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 01 Oct 2014 15:53:42 -0500] rev 22687
revset: use direct access to __contains__ in spanset.__sub__
Using `x.__contains__(r)` instead of `r in x` does not matter for built-in type
(set) but have a positive impact for all other classes. This will let us drop
some usage of baseset.set() in future patches. This also probably improves some
performance.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 30 Sep 2014 12:39:21 -0500] rev 22686
revset: use a single return statement in matcher function
This makes it easy to insert post processing and debug code on the returned
value.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 16:57:51 -0500] rev 22685
obsolete: replace "nb" notation with "num" (for "number")
As requested by Matt Mackall.
Martin von Zweigbergk <martinvonz@gmail.com> [Wed, 24 Sep 2014 17:18:57 -0700] rev 22684
shelve: remove unused status variables
Matt Mackall <mpm@selenic.com> [Thu, 02 Oct 2014 18:50:41 -0500] rev 22683
gpg: use an abort hint and don't mention --force
Matt Mackall <mpm@selenic.com> [Thu, 02 Oct 2014 18:47:02 -0500] rev 22682
gpg: move test of force before status call
Martin von Zweigbergk <martinvonz@gmail.com> [Wed, 24 Sep 2014 12:57:39 -0700] rev 22681
gpg: drop unnecessary slicing of status array
The call to repo.status() does not request status for clean files, so
there is no reason to slice it out from the result. Leaving the tuple
untouched will simplify a future change.
Matt Mackall <mpm@selenic.com> [Thu, 02 Oct 2014 18:39:57 -0500] rev 22680
tag: use an abort hint
Matt Mackall <mpm@selenic.com> [Thu, 02 Oct 2014 18:38:10 -0500] rev 22679
tag: only check the status of .hgtags
Matt Mackall <mpm@selenic.com> [Thu, 02 Oct 2014 18:37:12 -0500] rev 22678
tag: properly abort if an unknown or ignored .hgtags is present
This was a regression introduced by
4faaa0535ea7 in 2008.
Martin von Zweigbergk <martinvonz@gmail.com> [Wed, 01 Oct 2014 12:50:18 -0700] rev 22677
summary: remove unused code for listing ignored files
The call to repo.status() does not request ignored files to be listed,
so remove the code for printing them.
Martin von Zweigbergk <martinvonz@gmail.com> [Wed, 01 Oct 2014 14:48:42 -0700] rev 22676
fetch: use cmdutil.bailifchanged()
Use the existing method cmdutil.bailifchanged() instead of
implementing it again in fetch.py. An effect of this is that the error
messages in case of uncommited changes will be different.
Matt Mackall <mpm@selenic.com> [Thu, 02 Oct 2014 18:00:05 -0500] rev 22675
ui: fix comment about non-interactive prompts
This fixes my earlier in-flight addition to Mads' change.
Yuya Nishihara <yuya@tcha.org> [Thu, 02 Oct 2014 23:20:59 +0900] rev 22674
formatter: convert booleans to json
It will be used in branches output.
Mads Kiilerich <madski@unity3d.com> [Wed, 01 Oct 2014 03:42:00 +0200] rev 22673
merge: mute the status message when bid merge kicks in
Bid merge is now the default and it is not necessary to tell the user that an
experimental feature kicked in.
(It could however still be relevant to get a notice that it is one of the rare
criss-cross merge situations so the user is warned that the situation is more
tricky than usual.)
Mads Kiilerich <madski@unity3d.com> [Wed, 01 Oct 2014 03:41:11 +0200] rev 22672
merge: use bid merge by default (BC)
In most cases merges will work exactly as before.
The only difference is in criss-cross merge situations where there is multiple
ancestors. Instead of picking an more or less arbitrary ancestor, it will
consider both ancestors and pick the best bids.
Bid merge can be disabled with --config merge.preferancestor='!'.
Mads Kiilerich <madski@unity3d.com> [Wed, 01 Oct 2014 03:40:51 +0200] rev 22671
changectx: skip all invalid merge.preferancestor values
A better fix for
17011b36aac7 that will ignore other kinds of "invalid"
revisions.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 30 Apr 2014 16:56:23 -0700] rev 22670
revset: rely on built in iterator when possible in _generatorset.__iter__
Doing manual iteration is expensible. We rely on built in list iteration
whenever possible. The other case has to become a closure we cannot have a both
yield and return in the same function.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 18 Sep 2014 15:52:45 -0700] rev 22669
revset: prefetch an attribute in _generatorset.__iter__
Python's attribute lookup are expensible, lets do less of them.
This gives us a 7% speedup on this revset iteration (from 0.063403 to 0.059032)
Anton Shestakov <engored@ya.ru> [Tue, 09 Sep 2014 22:14:13 +0900] rev 22668
templater: add count template filter, plus tests
Previously there was no way of telling how much children or bookmarks or tags a
certain changeset has in a template. It was possible to tell if a changeset has
either 0 or not 0 bookmarks, but not to tell if it has 1 or 2 of them, for
example.
This filter, simply named count, makes it possible to count the number of items
in a list or the length of a string (or, anything that python's len can count).
E.g.: {children|count}, {bookmarks|count}, {file_adds|count}.
Testing the filter on node hash and shortened node hash is chosen because they
both have defined length.
As for lists of strings - children, tags and file_adds are used, because they
provide some variety and also prove that what's counted is the number of string
items in the list, and not the list stringified (they are lists of non-empty,
multi-character strings).
Additionally, revset template function is used for testing the filter, since
the combination is very flexible and will possibly be used together a lot.
(The previous version of this patch had an incorrect email subject and was
apparently lost - patchwork says the patch has been accepted, but it's not so.
The changes between that and this patch are minimal: now the filter does not
disturb the alphabetical order of function definitions and dict keys.)
Pierre-Yves David <pierre-yves.david@fb.com> [Sun, 28 Sep 2014 17:35:33 -0700] rev 22667
push: update bookmarks (on server) within a transaction
A nice side effect is that bookmarks sent through bundle2 are updated within the
same transaction as all other changes.
Pierre-Yves David <pierre-yves.david@fb.com> [Sun, 28 Sep 2014 15:21:38 -0700] rev 22666
pull: perform bookmark updates in the transaction
Pierre-Yves David <pierre-yves.david@fb.com> [Sun, 28 Sep 2014 00:41:55 -0700] rev 22665
bookmark: add a `bmstore.recordupdate` to plug bookmarks into the transaction
Instead of manually writing bookmarks when they are updated, we can just record this
update to the transaction and rely on it to update the on-disk file.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 27 Sep 2014 03:10:33 -0700] rev 22664
bookmarks: split bookmark serialization and file handling
If we want to handle bookmarks in a transaction we need to decouple the file
handling and the actual production of the content. This is similar to how we
handle phases in transaction.
Pierre-Yves David <pierre-yves.david@fb.com> [Sun, 28 Sep 2014 00:36:42 -0700] rev 22663
transaction: allow generating file outside of store
We allow a vfs argument to `addfilegenerator`. This allows generating files outside
of the store directory like bookmarks. However, this is not really working since
we do not have the infrastructure to backup and restore files outside of store.
By chance, the bookmark file is already backed up by another mechanism so we can
restrict this new feature to bookmarks (which is our only interest here) and
proceed.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 01 Oct 2014 21:40:44 -0500] rev 22662
transaction: work around and document issue with file backup
The backup restoration is actually hard-coded for the main file. And this
hard-coded list is the only one used when repairing an interrupted transaction
from another process.
Solving this problem is out of the scope of this series so we document it and
work around its implications.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 00:15:15 -0500] rev 22661
bundle2: remove an explicit packing
The final writing of the empty part was done explicitly. We now using proper
pack call using symbolic constant. This open simple change in the bundle2
format.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 01 Oct 2014 23:55:22 -0500] rev 22660
bundle2: split test in two
We split the test between the one dedicated to the binary format and the one
dedicated to checking the exchange of data using pull and push.
Pierre-Yves David <pierre-yves.david@fb.com> [Sun, 28 Sep 2014 14:07:56 -0700] rev 22659
pull: merge bookmark updates and imports
We do all the things in one go now, updating existing bookmark, adding new ones,
and overwriting the ones explicitly specified for --bookmark. This impacts the
tests by removing some duplicated or unnecessary output.
Pierre-Yves David <pierre-yves.david@fb.com> [Sun, 28 Sep 2014 13:43:31 -0700] rev 22658
pull: gather explicit bookmark pulls with bookmark updates
There is no reason to make them at different times. So we gather them. This is
the first step toward merging them.
Pierre-Yves David <pierre-yves.david@fb.com> [Sun, 28 Sep 2014 12:47:25 -0700] rev 22657
subrepo: stop pulling bookmark manually
Bookmark pulling is now done with all the other pull steps in the
`exchange.pull` function.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 27 Sep 2014 01:59:56 -0700] rev 22656
pull: retrieve bookmarks through bundle2
We can retrieve any pushkey namespace through bundle2. So we also ask for
bookmark data and use them to update the local repo.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 27 Sep 2014 01:37:56 -0700] rev 22655
pull: retrieve bookmarks before obsmarkers
Retrieving bookmarks before obsmarkers will avoid turning some changesets hidden
right before making them visible again if a bookmark keeps them visible.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 27 Sep 2014 01:31:15 -0700] rev 22654
pull: move bookmark pulling into its own function
This requires adding an attribute on the pulloperation object. The bookmark
pulling is protected behind a "todostep" as other steps of pull.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 27 Sep 2014 01:34:02 -0700] rev 22653
pull: perform the todostep inside functions handling old way of pulling
This matches what is done during push.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 26 Sep 2014 23:04:35 -0700] rev 22652
bookmark: remove now unused `pushtoremote` function
Everything is unified in the push discovery now.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 27 Sep 2014 20:51:53 -0700] rev 22651
push: gather all bookmark decisions together
The discovery phases for bookmarks now use the list of explicitly pushed bookmarks
to do addition, removal and overwriting.
Tests are impacted because this reduces the amount of listkeys calls issued, removes
some duplicated messages and improves the accuracy of some messages.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 26 Sep 2014 18:33:11 -0700] rev 22650
push: prepare the issue of multiple kinds of messages
To gather all the bookmark pushing actions together, we need code performing
those actions to be ready for them. We need to be able to produce different
messages for different actions.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 13:19:49 -0500] rev 22649
push: set bkresult when pushing bookmarks through bundle2
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 26 Sep 2014 13:56:20 -0700] rev 22648
clone: remove duplicated bookmark pulling
Now that all clone methods (copy, pull and push) also transport bookmarks, we can
safely drop the manual pulling that was performed during clone.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 26 Sep 2014 15:15:49 -0700] rev 22647
clone: explicitly push bookmarks when cloning from local to remote
We need to explicitly push all local bookmarks when doing the clone from a local
repo to a remote one through ssh. This will let us remove the manual export of
bookmarks in clone and rely on the official exchange in push and pull instead.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 26 Sep 2014 13:55:53 -0700] rev 22646
clone: copy `.hg/bookmarks` during copy clone
Now that the standard pull function includes bookmarks, we need to ensure that
a copy clone also copies the bookmarks. This will let us drop the manual bookmark
pulling done independently during a clone.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 26 Sep 2014 17:44:00 -0700] rev 22645
pull: move bookmark movements inside the `exchange.pull`
There is no reason for bookmarks to get a special treatment. As a first step we
move the code as is in the `exchange.pull` function. Integration with the rest
of the flow will come later.
Adding bookmarks to pull means that most clone paths are now pulling bookmarks
through pull. We ensure that bookmark-update messages are properly suppressed in
that case.
In test-pull-http.t the 'requesting all changes' message disappear because we
now get the authentication error on the `listkeys`command before such message
is printed.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 12:16:07 -0500] rev 22644
bookmarks: allow `updatefromremote` to be quiet
This will be useful to use the function during clone (clone is not printing any
bookmark data right now)
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 02 Oct 2014 12:39:37 -0500] rev 22643
util: fix sorteddict.pop
When using `.pop` on such object the list was not cleared of the popped key,
leading to crash.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 26 Sep 2014 12:51:55 -0700] rev 22642
localrepo: pass arbitrary kwargs from `repo.pull` to `exchange.pull`
We'll add bookmark-related arguments to `repo.pull` so we need to widen the
signature of `repo.pull`. We should probably kill `repo.pull` now that
`repo.push` is dead but this is outside the scope of this series.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 26 Sep 2014 10:59:29 -0700] rev 22641
pull: use `other.url()` as the source of a bookmark pull
We want to move the bookmarks movement into `exchange.pull`, for this purpose we
need to stop relying on variables from `command.pull`.
Kyle Lippincott <spectral@google.com> [Tue, 30 Sep 2014 17:13:54 -0700] rev 22640
setup: set mode 644 or 755 on installed files
Yuya Nishihara <yuya@tcha.org> [Thu, 02 Oct 2014 21:58:10 +0900] rev 22639
branches: reduce nesting in for loop
Mads Kiilerich <madski@unity3d.com> [Sun, 28 Sep 2014 16:57:47 +0200] rev 22638
i18n: use datapath for i18n like for templates and help
To avoid circular module dependencies we initialize i18n from util when
datapath is found.
Mads Kiilerich <madski@unity3d.com> [Sun, 28 Sep 2014 16:57:47 +0200] rev 22637
help: don't search randomly for help data - trust util.datapath
The search was introduced in
c904e76e3834 without a convincing explanation why
it should be necessary ... except for consistency with templater handling.
Now, just keep it simple.
Mads Kiilerich <madski@unity3d.com> [Sun, 28 Sep 2014 16:57:37 +0200] rev 22636
templater: don't search randomly for templates - trust util.datapath
The search was introduced in
2653740d8118. It might have been necessary back
then when using __file__ directly and frozen-ness wasn't considered. Now we
should know exactly where the templates can be found.
Mads Kiilerich <madski@unity3d.com> [Sun, 28 Sep 2014 16:57:37 +0200] rev 22635
templater: inline global 'path' list in templatepaths
Mads Kiilerich <madski@unity3d.com> [Sun, 28 Sep 2014 16:57:37 +0200] rev 22634
templater: introduce templatepaths for getting paths searched for templates
Avoid function with different return types depending on parameters.
Mads Kiilerich <madski@unity3d.com> [Sun, 28 Sep 2014 16:57:06 +0200] rev 22633
util: introduce datapath for getting the location of supporting data files
templates, help and locale data is normally stored as sub folders in the
directory containing the source of the mercurial module. In a frozen build they
live as sub folders next to 'hg.exe' and 'library.zip'.
These different kind of data were handled in different ways. Unify that by
introducing util.datapath. The value is computed from the environment and is
always used, so we just calculate the value on module load.
Mads Kiilerich <madski@unity3d.com> [Sun, 28 Sep 2014 16:57:06 +0200] rev 22632
util: move _hgexecutable a few lines, closer to where it is used
Andrew Shadura <andrew@shadura.me> [Sun, 28 Sep 2014 13:27:40 +0200] rev 22631
hgk: define bookmark colour explicitly, as Tk 8.6 has changed their meaning
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 30 Sep 2014 14:32:49 -0700] rev 22630
largefiles: remove 'forget' list that's always empty
Matt Mackall <mpm@selenic.com> [Thu, 02 Oct 2014 16:43:50 -0500] rev 22629
bookmarks: fix divergent bookmark path normalization
Matt Mackall <mpm@selenic.com> [Thu, 02 Oct 2014 11:35:20 -0500] rev 22628
exchange: remove a broken i18n abuse
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 26 Sep 2014 11:31:15 -0700] rev 22627
bookmark: make the search for divergent names more robust
We translate the "url we update from" and "the url in the config" into their
canonical representation. This is useful for urls that have multiple equivalent
forms:
/foo/bar/ == file:/foo/bar/ == file:///foo/bar
eg: hg pull --config path.bar=/foo/bar/ file:/foo/bar
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 25 Sep 2014 17:53:27 -0700] rev 22626
pull: gather all bookmark-pulling code together
Pulling bookmarks is done in two rounds. First we do a simple update, then we use
the content of the `bookmark` argument to possibly overwrite some bookmark
with their remote location.
The second step was not done right after the first one for some obscure reason.
We now perform them one after the other.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 25 Sep 2014 02:53:29 -0700] rev 22625
push: perform bookmark export in the push function
This part is responsible for adding new bookmarks on the remote. Before that,
it was done on its own in `commands.push`. The export is still not integrated
with the rest of the push process, but at least it now dwells in the right
function.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 25 Sep 2014 00:57:36 -0700] rev 22624
push: add `pushoperation.bkresult`
This attribute will be used to carry the result of the bookmark push (when the
`push` function will effectively be doing any bookmarks pushes)
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 25 Sep 2014 01:49:20 -0700] rev 22623
push: pass list of bookmark to `exchange.push`
Currently stored but not unused. This parameter will control bookmarks explicitly
pushed (added to the server if missing).
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 25 Sep 2014 15:26:09 -0700] rev 22622
exchange: import bookmarks as bookmod
Using the original names makes it difficult to use `bookmarks` as a variable
name.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 25 Sep 2014 02:53:49 -0700] rev 22621
push: sanitize handling of bookmark push return value
Mixing return and assignment does not make sense, let's unify this.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 25 Sep 2014 01:43:24 -0700] rev 22620
locarepo: remove the `push` method (API)
All the logic of this function is in the exchange.push function for some time.
We just stop calling `localrepo.push` in `command.push` to have access to more
information. Leaving `localrepo.push` in place will let third-party extensions
wrap it but it would never be called by `hg push` making the wrapping useless.
Therefore, the method is removed so that third-party code fail noisily and
get properly upgraded.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 25 Sep 2014 01:42:49 -0700] rev 22619
push: `exchange.push` instead of `localrepo.push`
The latter is going away.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 25 Sep 2014 01:41:26 -0700] rev 22618
clone: use `exchange.push` instead of `localrepo.push`
The latter is going away.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 25 Sep 2014 01:39:39 -0700] rev 22617
push: use `exchange.push` in `commands.push`
To gain access to all results from the push, we need to have access to the
`pushoperation` object. We call `exchange.push` to do so.
It is impossible to just change the `localrepo.push` signature because the
change may be too subtle to be caught by external extension wrapping
`localrepo.push`.
This mean we'll have to kill `localrepo.push` because just using
`exchange.push` in `commands.py` would silently disable all wrapping around
`localrepo.push` by third-party extensions. So we'll remove it in a later
changeset to get such extensions to fail noisily.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 25 Sep 2014 02:21:59 -0700] rev 22616
push: `exchange.push` now returns the `pushoperation` object
Returning the pushop object gives access to more information (upcoming bookmark
push result for example). `localrepo.push` currently extracts the `cgresult` for
callers.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 25 Sep 2014 00:55:39 -0700] rev 22615
push: rename `pushop.ret` to `pushop.cgresult`
We are about to introduce more results-related attributes on pushop (for
bookmarks) so we need a more distinctive name. We now use `cgresult` as
`pulloperation` does.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 15:57:51 -0700] rev 22614
obsolete: use version constants in the format mapping
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 15:56:38 -0700] rev 22613
obsolete: use the `version` argument in encodemarkers
Recent scientific studies show that assigning a variable have no effect on
a unrelated constant. We therefore use the variable where we intended to in the
first place.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 12 Sep 2014 14:41:43 +0200] rev 22612
obsolete: gather all contents related to format version 0 in a single place
All contents includes documentation, constants, and functions, so we
gather all of those things into a single location. The diff is confusing
because it cannot understand what code is semantically moved around in this
grand migration.
Pierre-Yves David <pierre-yves.david@fb.com> [Sun, 31 Aug 2014 13:01:00 +0200] rev 22611
revert: properly back up added files with local modification
These files were previously not backed up because the backup mechanism was not
smart enough. This leads to data lose for the user since uncommitted contents
were discarded.
We now properly move the modified version to <filename>.orig before deleting it.
We have to use a small hack to do a different action if "--no-backup" is
specified. This is needed because the backup process is actually a move (not a
copy) so the file is already missing when we backup. The internet kitten is a
bit disapointed about that, but such is life.
This patch concludes the "lets refactor revert" phases. We can now open the
"Lets find stupid bug with renames and merge" phases.
I'm sure that now that the code is clearer we could do it in another simpler
way, but I consider the current improvement good enough for now.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 02:39:08 +0200] rev 22610
revert: track added files with local modifications
Those files need to be backed up but are currently not. We compute the set of
them to be able to use a different backup strategy in the next changeset.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 02:30:24 +0200] rev 22609
revert: distinguish between "check" and "backup" strategy
"check" behaves as backup did before. We check if the current file differs
from destination and we create a backup if it does. This is used for untracked
files that will be overwritten by formerly-deleted files. We have to do the manual
check since no status output can provide the content comparison.
"backup" is now doing unconditional backup. This can be used for files seen as
modified compared to both the target and the working directory. In such a case, we
know that the file differs from target without actually comparing any content.
This new "backup" strategy will be especially useful in the case of files added
between the target and the working directory -parent- with additional modifications
in the working directory -itself-. In that case we know we need to back it up, but we
cannot run the content check as the files does not exists in target.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 02:28:27 +0200] rev 22608
revert: small refactoring in the way backup value are handled
The current backup value may have two different values:
1. Do not try to do backup
2. Do backup if applicable
We are about to move to:
1. Do not try to do backup
2. Do backup if applicable
3. Do backup in all cases
So we change the current values to make room for the new one.
Matt Mackall <mpm@selenic.com> [Wed, 01 Oct 2014 15:05:09 -0500] rev 22607
merge with stable
Matt Mackall <mpm@selenic.com> [Wed, 01 Oct 2014 14:59:33 -0500] rev 22606
Added signature for changeset
f768c888aaa6
Matt Mackall <mpm@selenic.com> [Wed, 01 Oct 2014 14:58:05 -0500] rev 22605
Added tag 3.1.2 for changeset
f768c888aaa6
Matt Mackall <mpm@selenic.com> [Wed, 01 Oct 2014 14:44:24 -0500] rev 22604
parsers: fix Py2.4 argument parsing issue
Since
fa53d66b45a8, we were getting this strange message with Py2.4:
TypeError: argument 1 must be impossible<bad format char>, not int
..because we were using the 'n' type specifier introduced in 2.5.
It turns out that offset is actually a revision number index, which
ought to be an int anyway. So we store it in an int, use the 'i'
specifier, rely on Py_ParseTuple for range checking, and rename it to
avoid type confusion.
Matt Mackall <mpm@selenic.com> [Wed, 01 Oct 2014 12:35:18 -0500] rev 22603
merge with i18n
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Tue, 30 Sep 2014 16:59:07 -0400] rev 22602
diff: document the nobinary option
Since
3fbef7ac26f0, we have a diff.nobinary option. This is handy, but
the only way I found out about it was by looking at the release notes
for 3.1, which is not something I normally do.
Wagner Bruna <wbruna@softwareexpress.com.br> [Tue, 30 Sep 2014 13:43:30 -0300] rev 22601
i18n-pt_BR: minor fixes and rewording on histedit help text
Wagner Bruna <wbruna@softwareexpress.com.br> [Tue, 30 Sep 2014 10:17:59 -0300] rev 22600
i18n-pt_BR: synchronized with
c712238c4f9b
Wagner Bruna <wbruna@softwareexpress.com.br> [Tue, 30 Sep 2014 10:13:25 -0300] rev 22599
merge with i18n
Wagner Bruna <wbruna@softwareexpress.com.br> [Mon, 22 Sep 2014 15:39:21 -0300] rev 22598
i18n-pt_BR: synchronized with
802dffd62de5
Mike Edgar <adgar@google.com> [Sun, 14 Sep 2014 20:32:34 -0400] rev 22597
filelog: censored files compare against empty data, have 0 size
To support "status" operations against working directories that are
the children of censored revisions, filelog must define "cmp" and "size"
for censored content.
Mike Edgar <adgar@google.com> [Wed, 03 Sep 2014 22:14:20 -0400] rev 22596
filelog: raise CensoredNodeError when hash checks fail with censor metadata
With this change, when a revlog revision hash does not match its content, and
the content is empty with a special metadata key, the integrity failure is
assumed to be intentionally caused to remove sensitive content from repository
history.
To allow different Mercurial functionality to handle this scenario differently
a more specific exception is raised than "ordinary" hash failures.
Alternatives to this approach include, but are not limited to:
- Calling a hook when hashes mismatch to allow arbitrary tombstone validation.
Cons: Irresponsibly easy to disable integrity checking altogether.
- Returning empty revision data eagerly instead of raising, masking the error.
Cons: Push/pull won't roundtrip the tombstone, so client repos are unusable.
- Doing nothing differently at this layer. Callers must do their own detection
of tombstoned data if they want to handle some hash checks and not others.
- Impacts dozens of callsites, many of which don't have the revision data
- Would probably be missing one or two callsites at any given time
- Currently we throw a RevlogError, as do 12 other places in revlog.py.
Callers would need to parse the exception message and/or ensure
RevlogError is not thrown from any other part of their call tree.
Mike Edgar <adgar@google.com> [Wed, 03 Sep 2014 15:59:03 -0400] rev 22595
error: add CensoredNodeError, will be thrown when content deliberately erased
This change introduces the error plus a corresponding catch in dispatch, to
provide localized error messages.
The verb "censor" is used in this commit and all following to refer to erasing
the content of a revlog revision (filelog, for now) without recalculating node
IDs, leaving that revision invalid. Further work must be done to safely share
such revision data with compliant clients.
I find the analogy to censorship straightforward; for less politically
charged options, consider "erase", "excise", "expunge", or "blackhole".
Siddharth Agarwal <sid0@fb.com> [Tue, 30 Sep 2014 16:01:19 -0700] rev 22594
files: cache repo.dirstate
For a large repo, 'hg files' goes from 2.27 seconds to 1.92.
Siddharth Agarwal <sid0@fb.com> [Tue, 30 Sep 2014 15:21:35 -0700] rev 22593
files: only check for removed, not unknown or missing
ctx.matches() doesn't return unknown files, and repo.dirstate[f] never returns
'!' for an answer.
Siddharth Agarwal <sid0@fb.com> [Tue, 30 Sep 2014 14:39:58 -0700] rev 22592
files: use ctx.matches instead of ctx.walk
ctx.matches() is an optimized form of ctx.walk() when we don't care about the
state of files on disk.
For a large repo, 'hg files > /dev/null' drops from 3.7 seconds to 2.3.
Siddharth Agarwal <sid0@fb.com> [Tue, 30 Sep 2014 15:45:48 -0700] rev 22591
files: actually filter out removed files
'hg files' makes an attempt to filter out removed files, but that doesn't work
because repo.dirstate[f] returns lowercase 'r', not uppercase.
Mads Kiilerich <madski@unity3d.com> [Wed, 01 Oct 2014 01:08:17 +0200] rev 22590
subrepo: remove superfluous newline from subrepo prompt
Mads Kiilerich <madski@unity3d.com> [Wed, 01 Oct 2014 01:04:18 +0200] rev 22589
ui: show prompt choice if input is not a tty but is forced to be interactive
The tests often set ui.interactive to control normally interactive prompts from
stdin. That gave an output where it was non-obvious what prompts got which
which response, and the output lacked the newline users would see after input.
Instead, if the input not is a tty, write the selection and a newline.
Matt Mackall <mpm@selenic.com> [Tue, 30 Sep 2014 18:22:58 -0500] rev 22588
merge with stable
Matt Mackall <mpm@selenic.com> [Tue, 30 Sep 2014 16:40:10 -0500] rev 22587
help: basic support for showing only specified topic sections
For instance, 'hg help config.files' will show only the Files section.
Matt Mackall <mpm@selenic.com> [Tue, 30 Sep 2014 15:55:30 -0500] rev 22586
help: use OS containers for config file lists
Matt Mackall <mpm@selenic.com> [Tue, 30 Sep 2014 15:51:22 -0500] rev 22585
help: support OS-specific help sections
Containers of the form:
.. container:: verbose.<os>
are shown by default on the given OS (or with -v).
Matt Mackall <mpm@selenic.com> [Tue, 30 Sep 2014 15:48:43 -0500] rev 22584
minirst: allow multiple container types for prune
If we have a container of type x.y, then we can preserve it by
keeping x or y.
Mads Kiilerich <madski@unity3d.com> [Thu, 04 Sep 2014 21:36:35 +0200] rev 22583
config: don't read the same config file twice
In some cases some config files would be read twice and shown twice in
showconfig --debug.
Yuya Nishihara <yuya@tcha.org> [Tue, 30 Sep 2014 23:15:56 +0900] rev 22582
templater: fix precedence of --style and --template options
Since
e3eb480a9391, --template option is ignored if --style is specified,
which is wrong according to the doc of show_changeset():
Display format will be the first non-empty hit of:
1. option 'template'
2. option 'style'
...
Martin von Zweigbergk <martinvonz@gmail.com> [Mon, 29 Sep 2014 23:23:44 -0700] rev 22581
shelve: avoid writing file that is never read from
The contents of the .files file has not been used since
1d7a36ff2615
(shelve: use rebase instead of merge (
issue4068), 2013-10-23), so stop
writing it. Where we currently use the presence of the file as a check
for a valid shelve name, switch to checking for the .patch file.
Andrew Shadura <andrew@shadura.me> [Sun, 28 Sep 2014 15:21:29 +0200] rev 22580
hgk: don't break on repositories with obsolete changesets
Check the existence of a changeset before adding it to the list
returned by debug-rev-list command.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 18 Sep 2014 11:43:47 -0700] rev 22579
test: protect the run-tests.py --json test behind an hghave rule
We add a rules to detect availability of a json module and skip if json is not
available.
Matt Mackall <mpm@selenic.com> [Mon, 29 Sep 2014 17:23:38 -0500] rev 22578
merge with stable
Anton Shestakov <engored@ya.ru> [Sat, 27 Sep 2014 21:59:55 +0900] rev 22577
hgweb: refresh hgweb.repo on phase change (
issue4061)
Make hgweb.refresh() also look at phaseroots file (in addition to 00changelog.i
file) and reload the repo when os.stat returns different mtime or size than
cached, signifying the file was modified.
This way if user changes phase of a changeset (secret <-> draft), there's no
need to restart hg serve to see the change.
Matt Mackall <mpm@selenic.com> [Mon, 29 Sep 2014 16:42:12 -0500] rev 22576
help: fix typo in log examples
Mads Kiilerich <madski@unity3d.com> [Fri, 26 Sep 2014 02:19:48 +0200] rev 22575
ssl: on OS X, use a dummy cert to trick Python/OpenSSL to use system CA certs
This will give PKI-secure behaviour out of the box, without any configuration.
Setting web.cacerts to any value or empty will disable this trick.
This dummy cert trick only works on OS X 10.6+, but 10.5 had Python 2.5 which
didn't have certificate validation at all.
Mads Kiilerich <madski@unity3d.com> [Fri, 26 Sep 2014 02:19:47 +0200] rev 22574
ssl: refactor sslkwargs - move things around a bit, preparing for next change
Durham Goode <durham@fb.com> [Fri, 19 Sep 2014 18:43:53 -0700] rev 22573
revert: special case 'hg revert --all'
On large repos, hg revert --all can take over 13 seconds. This is mainly due to
it walking the tree three times: once to find the list of files in the
dirstate, once to find the list of files in the target, and once to compute the
status from the dirstate to the target.
This optimizes the hg revert --all case to only require the final status. This
speeds it up to 1.3 seconds or so (with hgwatchman enabled).
Further optimizations could be done for the -r NODE and pattern cases, but they
are significantly more complex.
Yuya Nishihara <yuya@tcha.org> [Sun, 28 Sep 2014 17:21:38 +0900] rev 22572
test-commandserver: make runcommand message bolder
It seems ' runcommand' is difficult to distinguish from command output.
'*** runcommand' is slightly better.
Yuya Nishihara <yuya@tcha.org> [Sun, 28 Sep 2014 14:46:57 +0900] rev 22571
test-commandserver: rewrite manual substitution of output by (glob) match
Yuya Nishihara <yuya@tcha.org> [Sun, 28 Sep 2014 16:59:30 +0900] rev 22570
test-commandserver: remove redundant banner output
Since test output was inlined, "testing <func>" message should no longer
be necessary.
Yuya Nishihara <yuya@tcha.org> [Sun, 28 Sep 2014 16:55:14 +0900] rev 22569
test-commandserver: remove .py test which was ported to .t
Yuya Nishihara <yuya@tcha.org> [Sun, 28 Sep 2014 16:05:37 +0900] rev 22568
test-commandserver: port test functions from .py to .t
Though we have to duplicate import statements, .t test is still more handy
than .py test which has cryptic .out file.
This change allows to skip a part of test by #if conditional, which my next
patch series depends on.
Yuya Nishihara <yuya@tcha.org> [Sun, 28 Sep 2014 14:27:40 +0900] rev 22567
test-commandserver: add stub for .t test by copying .out with 2-space indent
Currently test-commandserver.t only contains output, so it is skipped by
#require false.
Yuya Nishihara <yuya@tcha.org> [Sun, 28 Sep 2014 13:31:16 +0900] rev 22566
test-commandserver: split helper functions to new hgclient module
This prepares for porting test-commandserver.py to .t test.
Though command-server test needs many Python codes, .t test will be more
readable than .py test thanks to inlined output.
Yuya Nishihara <yuya@tcha.org> [Sun, 28 Sep 2014 15:13:35 +0900] rev 22565
heredoctest: do not append extra newline character to continuation line
Trailing newline characters are kept in lines.
Yuya Nishihara <yuya@tcha.org> [Sun, 28 Sep 2014 14:15:43 +0900] rev 22564
heredoctest: use the same dict for local/global contexts as in doctest
In order to mimic module-level evaluation, globals and locals should be the
same object, so doctest does not pass separate locals dict.
https://docs.python.org/2.7/reference/simple_stmts.html#exec
This fixes NameError in the following example:
>>> import foo
>>> def bar():
... foo # must exist in globalvars
Yuya Nishihara <yuya@tcha.org> [Sat, 27 Sep 2014 12:37:53 +0900] rev 22563
cmdserver: drop useless in_ attribute from channeledoutput
The previous patch makes sure that in_ == out, so it's no longer needed
to keep in_ for __getattr__. Also, it seems strange for channeledoutput
to have in_ stream which is actually a writable file object.
Yuya Nishihara <yuya@tcha.org> [Sat, 27 Sep 2014 12:27:03 +0900] rev 22562
cmdserver: get file attributes of 'e'-channel from stdout, not from stderr
It seems wrong to get attributes from object different than the underlying
file. In the following example, it doesn't make sense to flush stderr after
writing to stdout:
self.ferr.write(str(a))
if not getattr(self.ferr, 'closed', False):
self.ferr.flush()
Yuya Nishihara <yuya@tcha.org> [Sat, 27 Sep 2014 12:15:01 +0900] rev 22561
cmdserver: correct doc of channeledoutput
in_ is only used as the source of file attributes.
Matt Mackall <mpm@selenic.com> [Sat, 27 Sep 2014 14:47:52 -0500] rev 22560
merge with stable
Matt Mackall <mpm@selenic.com> [Fri, 26 Sep 2014 16:44:11 -0500] rev 22559
commands: add debuglocks to report/clear lock state
Siddharth Agarwal <sid0@fb.com> [Wed, 24 Sep 2014 11:20:35 -0700] rev 22558
test-convert-git.t: make copy detection deterministic
Since both 'bar' and 'bar-copied' matched 'bar-copied2', Git's copy detection
would sometimes result in 'bar' being the source for 'bar-copied2' and
sometimes 'bar-copied'. Change bar in a separate commit so that that would no
longer be the case.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 23 Sep 2014 17:12:27 -0700] rev 22557
revsetbenchmark: add a rebase-related revset to the benchmark list
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 23 Sep 2014 17:09:19 -0700] rev 22556
revsetbenchmark: allow comments ('#' prefix) in the revset input
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 23 Sep 2014 17:08:49 -0700] rev 22555
revsetbenchmark: make it clear that revsets may be read from stdin
Yuya Nishihara <yuya@tcha.org> [Sun, 21 Sep 2014 12:50:48 +0900] rev 22554
tags: use full hash for formatter output as in log or annotate commands
Yuya Nishihara <yuya@tcha.org> [Sun, 21 Sep 2014 12:46:23 +0900] rev 22553
tags: change field name of formatter output to be the same as log command
Since -T option is not public yet, this won't break backward compatibility.
Yuya Nishihara <yuya@tcha.org> [Sun, 21 Sep 2014 12:38:47 +0900] rev 22552
files: correct topic of formatter
Durham Goode <durham@fb.com> [Fri, 19 Sep 2014 18:40:39 -0700] rev 22551
revert: move targetsubs calculation down to its use
A future patch will be reorganizing this section of the code into two paths, and
targetsubs complicates this by existing in the middle of one path, but not the
other. We fix that by moving it 200 lines down, to the only place it's used.
Augie Fackler <raf@durin42.com> [Tue, 23 Sep 2014 14:20:08 -0400] rev 22550
help: document that default hgweb style is called paper (
issue4373)
Arun Chandrasekaran <visionofarun@gmail.com> [Sat, 20 Sep 2014 14:16:39 -0700] rev 22549
help: update help for hgweb template and style (
issue4373)
Mike Hommey <mh@glandium.org> [Tue, 23 Sep 2014 16:22:52 +0900] rev 22548
bundle2: rename functions that have the same name
Mads Kiilerich <madski@unity3d.com> [Sat, 20 Sep 2014 17:06:57 +0200] rev 22547
mq: write headers of new patches using patchheader
Mads Kiilerich <madski@unity3d.com> [Wed, 24 Sep 2014 02:41:11 +0200] rev 22546
mq: refactor patchheader header ordering to match export (BC)
The refactoring also gives more robust and extendable handling of other HG
headers.
Mads Kiilerich <madski@unity3d.com> [Sat, 20 Sep 2014 17:06:57 +0200] rev 22545
mq: upgrade non-plain patches to HG format when setting parent in patchheader
Parent will now always be updated or added when qrefreshing HG patches. Plain
patches will not be changed, but patches that neither are plain nor HG will be
upgraded to HG patches on first refresh.
Mads Kiilerich <madski@unity3d.com> [Sat, 20 Sep 2014 17:06:56 +0200] rev 22544
mq: make patchheader .plainmode more reliable
Instead of having to make extra checks whenever we use .plainmode, let the
initial value consider the actual patch header content.
Mike Hommey <mh@glandium.org> [Wed, 24 Sep 2014 21:50:03 -0700] rev 22543
bundle2: remove heads and common arguments to getbundle parts generators
Mike Hommey <mh@glandium.org> [Thu, 25 Sep 2014 11:47:57 +0900] rev 22542
bundle2: separate bundle10 and bundle2 cases in getbundle()
The primary goal is to make it easier for extensions to alter how bundle2
parts are laid out. They now can use the getbundle2partsgenerator decorator
to add new parts, or directly act on getbundle2partsmapping to wrap existing
part functions.
Note the 'request for bundle10 must include changegroup' error was kept
under the same conditions as before, although the logic changes don't make
it obvious.
Mike Hommey <mh@glandium.org> [Thu, 25 Sep 2014 11:11:37 +0900] rev 22541
bundle2: pass b2caps down to functions adding bundle2 parts for getbundle
David Soria Parra <davidsp@fb.com> [Wed, 24 Sep 2014 13:16:20 -0700] rev 22540
parsers: fix uninitialize variable warning
The heads pointer is not initialized correctly if filter is false, causing
both clang and gcc to issue a warning. Correctly initialize heads to NULL.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 11:00:03 -0700] rev 22539
revset: use `subset &` in bare `p2()`
This takes advantage of the `fullreposet` smartness with a nice
speedup. It's a similar speedup to `p1()` when a merge is in progress
(the non merge case is already lightning fast anyway.)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:59:52 -0700] rev 22538
revset: use `subset &` in bare `p1()`
This takes advantage of the `fullreposet` smartness and yields a nice
speedup.
revset #0: p1()
0) wall 0.003256 comb 0.010000 user 0.010000 sys 0.000000 (best of 527)
1) wall 0.000066 comb 0.000000 user 0.000000 sys 0.000000 (best of 23224)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 11:00:09 -0700] rev 22537
revset: use `subset &` in `rev`
This takes advantage of the `fullreposet` smartness and yields a nice
speedup.
revset #0: rev(25)
0) wall 0.005480 comb 0.000000 user 0.000000 sys 0.000000 (best of 305)
1) wall 0.000052 comb 0.000000 user 0.000000 sys 0.000000 (best of 21891)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 19:52:34 -0700] rev 22536
revset: use `subset &` in `origin`
This takes advantage of the `fullreposet` smartness.
revset #0: origin(tip)
0) wall 0.005353 comb 0.000000 user 0.000000 sys 0.000000 (best of 354)
1) wall 0.003080 comb 0.000000 user 0.000000 sys 0.000000 (best of 446)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:59:16 -0700] rev 22535
revset: use `subset &` in `follow`
This takes advantage of the `fullreposet` smartness.
revset #0: follow(COPYING)
0) wall 0.002446 comb 0.000000 user 0.000000 sys 0.000000 (best of 735)
1) wall 0.000331 comb 0.000000 user 0.000000 sys 0.000000 (best of 5672)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:58:50 -0700] rev 22534
revset: use `subset &` in `filelog`
This takes advantage of the `fullreposet` smartness.
revset #0: file(COPYING)
0) wall 3.179066 comb 3.180000 user 3.140000 sys 0.040000 (best of 3)
1) wall 2.723699 comb 2.730000 user 2.690000 sys 0.040000 (best of 4)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:58:39 -0700] rev 22533
revset: use `subset &` in `divergent`
This takes advantage of the `fullreposet` smartness.
revset #0: divergent()
0) wall 0.002047 comb 0.000000 user 0.000000 sys 0.000000 (best of 813)
1) wall 0.000052 comb 0.000000 user 0.000000 sys 0.000000 (best of 22757)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:57:57 -0700] rev 22532
revset: use `subset &` in `bisect`
This takes advantage of the `fullreposet` smartness.
revset #0: bisect(range)
0) wall 0.014007 comb 0.010000 user 0.010000 sys 0.000000 (best of 115)
1) wall 0.005556 comb 0.010000 user 0.010000 sys 0.000000 (best of 235)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:57:47 -0700] rev 22531
revset: use `subset &` in `ancestorspec`
This takes advantage of the `fullreposet` smartness.
revset #0: tip~25
0) wall 0.004800 comb 0.010000 user 0.010000 sys 0.000000 (best of 259)
1) wall 0.002475 comb 0.000000 user 0.000000 sys 0.000000 (best of 717)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 19:57:09 -0700] rev 22530
revset: use `subset &` in `bookmark`
Speedup, Weeeeeee!
revset #0: bookmark()
0) wall 0.002240 comb 0.000000 user 0.000000 sys 0.000000 (best of 571)
1) wall 0.000132 comb 0.000000 user 0.000000 sys 0.000000 (best of 14059)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:59:40 -0700] rev 22529
revset: use `subset &` in `outgoing`
This should give us the same benefit as elsewhere. Result is simpler (and
"faster").
Outgoing is dominated by the discovery so no benchmark is provided.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 30 Apr 2014 16:56:48 -0700] rev 22528
revset: avoid in loop lookup in _generatorset._consumegen
Python lookups are slow, so do all lookup outside of the for loop.
This provide a small but still significant speedup:
revset #0: 0::
0) wall 0.063258 comb 0.060000 user 0.060000 sys 0.000000 (best of 100)
1) wall 0.057776 comb 0.050000 user 0.050000 sys 0.000000 (best of 100)
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 25 Apr 2014 14:51:24 -0700] rev 22527
revset: reduce dict lookup in lazyset.__contains__
Avoid an extra dict lookup when we have to compute the value. No
visible performance impact but this shaves the yak a few extra
nanometers.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 25 Apr 2014 17:53:58 -0700] rev 22526
revset: do less lookup during spanset.__contains__
Attribute lookup is slow in python. So this version is going to be a bit
faster. This does not have a visible impact since the rest of the stack is much
slower but this shaves the yak a few extra nanometers.
Moreover the new version is more readable so it worth doing this change for code
quality purpose.
This optimisation was approved by a core python dev.
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 16 Sep 2014 23:10:39 -0700] rev 22525
largefiles: simplify iteration over standins
Instead of iterating over all files in the context and ignoring those
that are not standins, pass a standin-matcher to the context and
iterate over only the files matching.
Apart from making the intent clearer, this implementation will also
benefit from any future optimizations done to the manifest walking
code.
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 16 Sep 2014 22:50:38 -0700] rev 22524
largefiles: avoid using 'lfiles' variable for two purposes
The variable 'lfiles' is first used for a set of the names of all the
large files. It is then overwritten with a tuple like the ones
returned from status(). To reduce confusion, let's create a separate
variable for the second use.
Martin von Zweigbergk <martinvonz@gmail.com> [Mon, 22 Sep 2014 13:05:36 -0700] rev 22523
largefiles: remove unnecessary clearing of status fields
At the end of lfilesrepo.status(), we clear the lists of unknown,
ignored and clean files, depending on the values of 'listunknown'
etc. The lists originate from other calls to status(), and it is only
'clean' that may get updated after the calls. Let's remove the need to
clear any of the lists by explicitly only adding to 'clean' when
'listclean' is true.
Mads Kiilerich <madski@unity3d.com> [Wed, 24 Sep 2014 01:39:25 +0200] rev 22522
mq: simplify patchheader handling of the empty line before the diff
Don't try to append empty lines to HG patch headers - instead, add them in str
method.
This minor change removes some apparently redundant code and makes the code
more robust.
Mads Kiilerich <madski@unity3d.com> [Wed, 24 Sep 2014 01:36:44 +0200] rev 22521
mq: write '# Parent ' lines with two spaces like export does (BC)
This aligns "Parent" node IDs with "Node ID" node IDs.
Mads Kiilerich <madski@unity3d.com> [Sat, 20 Sep 2014 17:06:56 +0200] rev 22520
mq: write headers for new HG patches in the same order as export (BC)
Mads Kiilerich <madski@unity3d.com> [Sat, 20 Sep 2014 17:06:56 +0200] rev 22519
mq: correctly make an empty line after description in new patches
There would in some cases be an empty line between headers and the description -
that does not seem right.
There should also be an empty line between description and diff - but that was
missing.
These two mistakes would sometimes make it up for each other so we fix both at
once to just show the improvement.
Instead of writing an extra newline when writing a header line, write an extra
line when it not is written as a part of the description but is necessary
anyway.
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 16 Sep 2014 14:51:56 -0700] rev 22518
largefiles: extract 'orig' method in reposetup.status
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 16 Sep 2014 14:51:25 -0700] rev 22517
largefiles: extract 'orig' method in lfilesctx.filectx
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 16 Sep 2014 14:50:38 -0700] rev 22516
largefiles: extract 'orig' method in lfilesmanifestdict.__contains__
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 16 Sep 2014 14:40:25 -0700] rev 22515
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com> [Tue, 16 Sep 2014 11:35:13 -0700] rev 22514
largefiles: remove dead assignment left over from change
1ff42ee98446
Martin von Zweigbergk <martinvonz@gmail.com> [Fri, 19 Sep 2014 13:49:58 -0700] rev 22513
match: simplify brittle predicate construction
In match.__init__(), we create the matchfn predicate by and-ing
together the individual predicates for includes, excludes (negated)
and patterns. Instead of the current set of nested if/else blocks, we
can simplify by adding the predicates to a list and defining the
overall predicate in a generic way based on the components. We can
still optimize it for the 0-length and 1-length cases. This way, there
is no combinatorial explosion to deal with if new component predicates
are added, and there is less risk of getting the overall predicate
wrong.
Siddharth Agarwal <sid0@fb.com> [Tue, 23 Sep 2014 14:45:23 -0700] rev 22512
convert: change default for git rename detection to 50%
This default mirrors the default for 'git diff'. Other commands have slightly
different defaults -- for example, the move/copy detection for 'git blame'
assumes that a hunk is moved if more than 40 alphanumeric characters are the
same, or copied if more than 20 alphanumeric characters are the same. 50% seems
to be the most common default, though.
Siddharth Agarwal <sid0@fb.com> [Tue, 23 Sep 2014 14:40:32 -0700] rev 22511
convert: simplify git.similarity parsing
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 24 Sep 2014 20:11:36 -0700] rev 22510
revset: fast implementation for fullreposet.__and__
"And" operation with something that contains the whole repo should be super
cheap. Check method docstring for details.
This provide massive boost to simple revset that use `subset & xxx`
revset #0: p1(20000)
0) wall 0.002447 comb 0.010000 user 0.010000 sys 0.000000 (best of 767)
1) wall 0.000529 comb 0.000000 user 0.000000 sys 0.000000 (best of 3947)
revset #1: p2(10000)
0) wall 0.002464 comb 0.000000 user 0.000000 sys 0.000000 (best of 913)
1) wall 0.000530 comb 0.000000 user 0.000000 sys 0.000000 (best of 4226)
No other regression spotted.
More performance improvements are expected in the future as more
revset predicate are converted to use `subset & xxx`
The relaxed way `fullreposet` handles "&" operation may cause some trouble for
people comparing smartset from different filter levels. I'm not sure such people
exist and we can improve that aspect in later patches.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 18 Sep 2014 13:04:02 -0700] rev 22509
revset: turn spanset into a factory function
We rename the `spanset` class to `_spanset`. `spanset` is now a function that
builds either a `fullreposet` or a `_spanset` according to the argument passed.
At some point, we may force people to explicitly use the `fullreposet`
constructor, but the current approach makes it easier to ensure we use the new
class whenever possible and focus on the benefits of this class.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 29 Apr 2014 19:06:15 -0700] rev 22508
revert: add a fullreposet class
Every revset evaluation starts from `subset = spanset(repo)` and a lot of
revset predicates build a `spansetrepo` for their internal needs.
`spanset` is a generic class that can handle any situation. As a result a lot
of operation between spanset result in an `orderedlazyset`, a safe object but
suboptimal in may situation.
So we introduce a `fullreposet` class where some of the operation will be
overwritten to produce more interesting results.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 23 Sep 2014 12:21:38 -0700] rev 22507
obsolete: ensure that `getrevs` always return a set
When a set of revisions was empty, we were using an empty tuple. We now return an
empty frozenset to ensure the object could be used in an operation that requires a
set.
Anton Shestakov <engored@ya.ru> [Mon, 22 Sep 2014 23:46:38 +0900] rev 22506
hgweb: fail if an invalid command was supplied in url path (
issue4071)
Traditionally, the way to specify a command for hgweb was to use url query
arguments (e.g. "?cmd=batch"). If the command is unknown to hgweb, it gives an
error (e.g. "400 no such method: badcmd").
But there's also another way to specify a command: as a url path fragment (e.g.
"/graph"). Before, hgweb was made forgiving (looks like it was made in
44c5157474e7) and user could put any unknown command in the url. If hgweb
couldn't understand it, it would just silently fall back to the default
command, which depends on the actual style (e.g. for paper it's shortlog, for
monoblue it's summary). This was inconsistent and was breaking some tools that
rely on http status codes (as noted in the
issue4071). So this patch changes
that behavior to the more consistent one, i.e. hgweb will now return "400 no
such method: badcmd".
So if some tool was relying on having an invalid command return http status
code 200 and also have some information, then it will stop working. That is, if
somebody typed foobar when they really meant shortlog (and the user was lucky
enough to choose a style where the default command is shortlog too), that fact
will now be revealed.
Code-wise, the changed if block is only relevant when there's no "?cmd" query
parameter (i.e. only when command is specified as a url path fragment), and
looks like the removed else branch was there only for falling back to default
command. With that removed, the rest of the code works as expected: it looks at
the command, and if it's not known, raises a proper ErrorResponse exception
with an appropriate message.
Evidently, there were no tests that required the old behavior. But, frankly, I
don't know any way to tell if anyone actually exploited such forgiving behavior
in some in-house tool.
Mike Hommey <mh@glandium.org> [Wed, 24 Sep 2014 15:52:40 +0900] rev 22505
keepalive: fix how md5 is used
The code in keepalive dates from when it was importing the md5 module directly
and uses md5.new. Since then, what 'md5' means has been changed from an import
of the md5 module to being a function using the right module between hashlib
and md5, so the md5.new idiom doesn't work anymore.
Matt Mackall <mpm@selenic.com> [Sat, 27 Sep 2014 13:18:10 -0500] rev 22504
merge with stable
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 23:59:29 -0700] rev 22503
revset: add an optimised baseset.__contains__ (
issue4371)
The baseset class is based on a python list. This means that base.__contains__
was absolutely as crappy as list.__contains__. We now rely on __contains__ from
the underlying set.
This will avoid having to explicitly convert the baseset to a set (using
baseset.set()) whenever one want fast membership test.
Apparently there is already code that forgot to do such conversions since we
observe a massive speedup in some test.
revset #25: roots((0::) - (0::tip))
0) wall 2.079454 comb 2.080000 user 2.080000 sys 0.000000 (best of 5)
1) wall 0.132970 comb 0.130000 user 0.130000 sys 0.000000 (best of 65)
No regression is observed in benchmarks.
This change improve the
issue4371 back to acceptable situation (but are still
slower than manual substraction)
Matt Mackall <mpm@selenic.com> [Mon, 22 Sep 2014 16:14:08 -0500] rev 22502
merge with stable
Matt Mackall <mpm@selenic.com> [Mon, 22 Sep 2014 16:03:07 -0500] rev 22501
commands: deprecate the parents commands
It's replaced by 'hg summary' or hg log -r 'parents(foo)' and
doesn't need to take up space in our command list anymore.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 19:56:59 -0700] rev 22500
revset: remove nullrev from the bookmark computation
Same as for other revset we sanitize the content of the set to be able to rely
on it more.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:58:25 -0700] rev 22499
revset: unify code flow in `bookmark`
We refactor the code of the bookmark revset to have a single return. This will
allow us to sanitize the content of the set.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 10:59:30 -0700] rev 22498
revset: remove invalid value in the origin set
Same as the parents related revsets, origin had some invalid value in the
computed set. We remove them.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 19:49:26 -0700] rev 22497
revset: remove nullrev from set computed in parents()
The old code relied on the subset contents to get rid of invalid values. We would
like to be able to rely more on the computation in parents() so we filter out
the invalid value.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 19:44:03 -0700] rev 22496
revset: refactor parents() into a single return point
Both paths are doing similar thing in the end. We refactor the function so that
the `ps` set is commonly used at the end.
This will end excluding `nullrev` from this set in a future patch
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 17 Sep 2014 04:40:30 -0700] rev 22495
revset: remove nullrev from set computed in p1() and p2()
The old code relied on the subset contents to get rid of invalid values. We would
like to be able to rely more on the computation in p1() and p2() so we filter out
the invalid value
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 23:42:41 -0700] rev 22494
revset: document the choice made in __generatorset.__iter__
The method code looks a bit ugly but has good reasons to. We document them
to prevent naive refactoring in the future.
Matt Mackall <mpm@selenic.com> [Sun, 21 Sep 2014 10:31:34 -0500] rev 22493
help: mention mode in hg log --removed help (
issue4381)
Matt Mackall <mpm@selenic.com> [Sun, 21 Sep 2014 10:07:06 -0500] rev 22492
commit: catch changed exec bit on files from p1 (
issue4382)
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 02:25:23 +0200] rev 22491
revert: add a `drop` action
This prevents the need for a try except in the `_performrevert` code.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 02:23:25 +0200] rev 22490
revert: explicitly track added but deleted file
Added + deleted file are files that need to be untracked from the dirstate but
that are already missing on disk. The current `_performrevert` code is handling
that with exception catching. We will be able to do better with a dedicated set.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 01 Sep 2014 12:36:48 +0200] rev 22489
revert: have an explicit action for "forget"
The distinction between "remove" and "forget" used to be in special logic
checking for the state of the file in the dirstate. Now that we have dedicated
filtering, we can stop relying on this logic and have two distinct actions.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 18:20:29 +0200] rev 22488
revert: split between newly added file and file added in other changeset
These two kinds of files are handled differently. One is deleted and the other
is just forgotten (the file is untracked but left in place). The distinction is
done in the `_performrevert` code itself and we would like to get ride of this.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 22:55:49 -0700] rev 22487
revset: stop using a baseset instead of a plain list in _revsbetween
The function internal code needs a list. Lets use a list.
anuraggoel <anurag.dsps@gmail.com> [Fri, 19 Sep 2014 07:23:10 +0530] rev 22486
run-tests: added 'cuser', 'csys' time info in report.json file
This patch adds up a 'cuser' and 'csys'(cputime) info in report.json file
which generated when --json is enabled while testing.
Now the new format of report.json file is as below.
testreport ={
"test-success.t": {
"csys": "1.041",
"cuser": "1.041",
"result": "success",
"time": "2.041"
}
"test-failure.t": {
"csys": "1.041",
"cuser": "1.041",
"result": "failure",
"time": "4.430"
}
"test-skip.t": {
"csys": "1.041",
"cuser": "1.041",
"result": "skip",
"time": "3.754"
}
}
Matt Mackall <mpm@selenic.com> [Fri, 19 Sep 2014 14:51:58 -0500] rev 22485
import: let --exact 'work' with --no-commit (
issue4376)
Durham Goode <durham@fb.com> [Tue, 16 Sep 2014 16:03:21 -0700] rev 22484
obsolete: use C code for headrevs calculation
Previously, if there were filtered revs the repository could not use the C fast
path for computing the head revs in the changelog. This slowed down many
operations in large repositories.
This adds the ability to filter revs to the C fast path. This speeds up histedit
on repositories with filtered revs by 30% (13s to 9s). This could be improved
further by sorting the filtered revs and walking the sorted list while we walk
the changelog, but even this initial version that just calls __contains__ is
still massively faster.
The new C api is compatible for both new and old python clients, and the new
python client can call both new and old C apis.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 23:47:34 -0700] rev 22483
revset: simplify orderedlazyset creation in spanset method
We can simply use the `self.isascending` value instead of more complex if/else
clause. This get the code simpler.
Benchmarks show no performances harmed in the process.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 23:37:03 -0700] rev 22482
revset: use spanset.isdescending in multiple simple places
We call the method directly instead of duplicating checks.
Benchmarks show no performances harmed in the process.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 23:34:18 -0700] rev 22481
revset: wider definition of ascending and descending for spanset
Before this patches, empty spanset were seen as neither ascending nor
descending. This is mathematically wrong and create some edges case. We put
`isascending` and `isdescending` back on track so we can use them to simplify
some of the spanset code.
Benchmarks show no performances harmed in the process.
Yuya Nishihara <yuya@tcha.org> [Wed, 17 Sep 2014 23:21:20 +0900] rev 22480
annotate: port to generic templater enabled by hidden -T option
If the selected formatter is other than plainformatter, raw data are passed
to the formatter. In this case, it isn't necessary (and not possible) to
calculate column widths.
Field names are substituted to be the same as "log" command.
There are a few limitations:
- "binary file" message is not included in formatted output.
- no data structure for multiple files. all lines are packed to single list.
Yuya Nishihara <yuya@tcha.org> [Tue, 16 Sep 2014 23:40:24 +0900] rev 22479
annotate: split functions to get data without applying text formatting
This prepares for porting to generic templater API, where raw data should
be passed to the formatter.
makefunc() is necessary to build closure in list comprehension.
Yuya Nishihara <yuya@tcha.org> [Fri, 29 Aug 2014 06:19:32 +0200] rev 22478
annotate: remove unused variable in calculation of column widths
Yuya Nishihara <yuya@tcha.org> [Fri, 29 Aug 2014 05:36:52 +0200] rev 22477
annotate: build format string separately from annotation data
This prepares for porting to generic templater API.
Note that we cannot use '%*s' to pad white spaces because it doesn't take
into account character widths, as described in
4f5a6df2af92.
Yuya Nishihara <yuya@tcha.org> [Wed, 17 Sep 2014 22:21:01 +0900] rev 22476
formatter: convert float value to json
It will be used to encode ctx.date().
Yuya Nishihara <yuya@tcha.org> [Wed, 17 Sep 2014 21:30:22 +0900] rev 22475
formatter: have jsonformatter accept tuple as value
This is necessary for "annotate" to encode ctx.date() in the same manner
as jsonchangeset printer.
It doesn't support list object because keeping mutable object in _item could
be a source of hidden bugs. Also, I can't think of the use case.
Yuya Nishihara <yuya@tcha.org> [Wed, 17 Sep 2014 21:15:43 +0900] rev 22474
formatter: extract function that encode values to json string
This is the stub for tuple support, which will be used to encode ctx.date()
in the same manner as jsonchangeset printer.
Mike Edgar <adgar@google.com> [Fri, 12 Sep 2014 21:38:52 -0400] rev 22473
contrib/synthrepo: pass options to ctx.diff as kwargs, not a dict
Mike Edgar <adgar@google.com> [Fri, 12 Sep 2014 17:43:37 -0400] rev 22472
contrib/synthrepo: only generate 2 parents if model contains merges
If `hg analyze` is run on a revision set which contains no merges, then
`hg synthesize` will raise IndexError trying to select from p2distance,
which will be empty.
Siddharth Agarwal <sid0@fb.com> [Fri, 12 Sep 2014 12:28:30 -0700] rev 22471
convert: add support to find git copies from all files in the working copy
I couldn't think of a better name for this option, so I stole the Git one in
the hope that anyone converting a Git repo knows what it means.
Siddharth Agarwal <sid0@fb.com> [Fri, 12 Sep 2014 11:23:26 -0700] rev 22470
convert: add support to detect git renames and copies
Git is fairly unique among VCSes in that it doesn't record copies and renames,
instead choosing to detect them on the fly. Since Mercurial expects copies and
renames to be recorded, it can be valuable to preserve this history while
converting a Git repository to Mercurial. This patch adds a new convert option,
called 'convert.git.similarity', which determines how similar files must be to
be treated as renames or copies.
Siddharth Agarwal <sid0@fb.com> [Thu, 11 Sep 2014 23:57:49 -0700] rev 22469
convert: for git, factor out code to add entries to a separate function
We're going to call this for multiple files in one iteration in upcoming
patches.
Siddharth Agarwal <sid0@fb.com> [Thu, 11 Sep 2014 23:37:47 -0700] rev 22468
convert: for git's getchanges, always split entry line into components
We always need to know whether the entry is a rename or copy, so split it up
unconditionally.
Siddharth Agarwal <sid0@fb.com> [Thu, 11 Sep 2014 23:35:19 -0700] rev 22467
convert: for git's getchanges, use explicit index for iteration
Upcoming patches will add support for copies and renames, for which we'll need
to access multiple lines of the difftree output at once.
Siddharth Agarwal <sid0@fb.com> [Fri, 12 Sep 2014 10:17:56 -0700] rev 22466
convert: add initial docs for git sources
Upcoming patches will add config options for git sources. This patch adds a
place to document them.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Sun, 24 Aug 2014 17:27:28 -0400] rev 22465
color: document that changeset phases have labels
It's very useful to be able to colourise csets according to their
phases. There was no indication anywhere in the docs that this is
possible.
We use e.g. `changeset.secret = ` instead of `changeset.secret
='none'`, because otherwise this is a BC: it would nullify the effects
given to log.changeset label that usually surrounds the
changeset.{phase} labels. Specifying the label without any effect
instead of 'none' is a true no-op change and purely documentation.
Matt Mackall <mpm@selenic.com> [Fri, 19 Sep 2014 12:51:15 -0500] rev 22464
color: change the debug output format
Before, the format was
label(labeled text) # single label
[label1 label2](labeled text) # multiple
Now, it's
[labels|labeled text]
..which should make things a bit more clear.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Sun, 24 Aug 2014 17:40:27 -0400] rev 22463
color: enable debug option to show labels
This is a debug option for showing labels. This can be helpful for
knowing which labels are available for colouring or to see the output
when defining your own templates. A couple of tests are included.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Sun, 24 Aug 2014 17:35:36 -0400] rev 22462
color: document that labels are used for colorizing text
It is a deeply hidden secret that it's possible to colorise so many
things with so many different labels. This is an attempt to document
this. The text is a bit long, but it seems as short as can be while
documenting everything. Perhaps it should be hidden under a --verbose
option.
Mads Kiilerich <madski@unity3d.com> [Wed, 27 Aug 2014 16:39:44 +0200] rev 22461
contrib: add OS X p4merge to mergetools.hgrc
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Wed, 20 Aug 2014 15:15:50 -0400] rev 22460
patch: enable diff.tab markup for the color extension
The following patch splits up changed lines along tabs (using
re.findall), and gives them a "diff.tab" label. This can be used by
the color extension for colorising tabs, like it does right now with
trailing whitespace.
I also provide corresponding tests.
Siddharth Agarwal <sid0@fb.com> [Wed, 17 Sep 2014 13:08:03 -0700] rev 22459
dirstate: copyedit exception for no beginparentchange call
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 07 Sep 2014 11:33:22 -0700] rev 22458
revsetbenchmarks: add an additional roots() benchmark
The existing roots(x - y) revset only considered the most recent 100
revisions. This was a good start. But expanding it to the full history
of the repository can dramatically increase execution time and thus
constitutes a useful benchmark.
Matt Mackall <mpm@selenic.com> [Tue, 16 Sep 2014 14:49:56 -0500] rev 22457
merge with stable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 12 Sep 2014 02:29:19 +0900] rev 22456
mq: examine "pushable" of already applied patch correctly
Before this patch, "hg qselect" with --pop/--reapply may pop patches
unexpectedly, even when all of patches applied before "qselect" are
still pushable.
Strictly speaking about the condition of this issue:
- before "qselect"
- there are N applied patches
- the index of the guarded patch X in the series is less than N
- after "qselect"
- X is still guarded, and
- all of applied patched are still pushable
In the case above, "hg qselect" should keep current status, but it
actually tries to pop patches because of X.
The index in "the series" should be used to examine "pushable" of a
patch by "mq.pushablek()", but the index in "applied patches" is used,
and this may cause unexpected examination of guarded patch.
To examine "pushable" of already applied patch correctly, this patch
uses "mq.applied[i].name": "pushable" is the function introduced by
the previous patch, and it returns "mq.pushable(mq.applied[i].name)[0]".
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 12 Sep 2014 02:29:19 +0900] rev 22455
mq: pop correct patches when changing pushable-ness of already applied ones
Before this patch, "hg qselect" with --pop/--reapply may pop incorrect
patches, because the index in "applied patches" is used to pop patches
by "mq.pop()", even though the index in "the series" should be used.
For example, when the already applied patch becomes guarded and it
follows the already guarded (= not yet applied) one, "hg qselect" is
aborted, because it tries to pop to guarded one.
This patch uses "mq.applied[i - 1].name" to pop to the patch, of which
the index in the "applied ones" is "i - 1".
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 12 Sep 2014 02:29:19 +0900] rev 22454
mq: use "mq.applied[i].name" instead of "mq.appliedname(i)" for safety
Before this patch, "hg qselect --reapply" is aborted when "--verbose"
is specified, because "mq.appliedname()" returns "INDEX PATCHNAME"
instead of "PATCHNAME" in such case and "mq.push" can't accept the
former as the name of patch.
This patch uses "mq.applied[i].name" instead of "mq.appliedname(i)" as
the name of the patch to be pushed for safety.
Now, there is no code path using "mq.appliedname()", and it should be
removed to prevent developers from using it in the wrong way like this
issue.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 12 Sep 2014 02:29:19 +0900] rev 22453
mq: report correct numbers for changing "number of guarded, applied patches"
Before this patch, "hg qselect" may report incorrect numbers for
"number of guarded, applied patches has changed", because it examines
"pushable" of patches by the index not in "the series" but in "applied
patches", even though "mq.pushable()" expects the former.
To report correct numbers for changing "number of guarded, applied
patches", this patch uses the name of applied patch to examine
pushable-ness of it.
This patch also changes the result of existing "hg qselect" tests,
because they doesn't change pushable-ness of already applied patches.
This patch assumes that "hg qselect" focuses on changing pushable-ness
only of already applied patches, because:
- the report message uses not "previous" (in the series) but
"applied"
- the logic to pop patches for --pop/--reapply examines
pushable-ness only of already applied ones (in fact, there are
some incorrect code paths)
Yuya Nishihara <yuya@tcha.org> [Fri, 29 Aug 2014 05:09:59 +0200] rev 22452
annotate: remove redundant check for empty list of annotation data
It isn't necessary because zip(*pieces) returns [] if pieces are empty,
and pieces are empty only if lines are empty.
Durham Goode <durham@fb.com> [Fri, 12 Sep 2014 14:21:18 -0700] rev 22451
revset: lower weight for _intlist function
The histedit command uses a revset like:
(_intlist('1234\x001235')) and merge()
Previously the optimizer gave a weight of 1.5 to the _intlist side (1 for the
function, 0.5 for the string) which caused it to process the merge() side first.
This caused it to evaluate merge against every commit in the repo, which took
2.5 seconds on a large repo.
I changed the weight of _intlist to 0, since it's a trivial calculation, which
makes it process intlist first, which makes merge apply only to the revs in the
list. Which makes the revset take 0.15 seconds now. Cutting off 2.4 seconds off
our histedit performance.
>From the revset benchmark:
revset #25: (_intlist('20000\x0020001')) and merge()
0) obsolete feature not enabled but 54243 markers found!
! wall 0.036767 comb 0.040000 user 0.040000 sys 0.000000 (best of 100)
1) obsolete feature not enabled but 54243 markers found!
! wall 0.000198 comb 0.000000 user 0.000000 sys 0.000000 (best of 9084)
Durham Goode <durham@fb.com> [Fri, 12 Sep 2014 15:00:51 -0700] rev 22450
revset: make parents() O(number of parents)
Strip executes a revset like this:
max(parents(_intlist('1234\x001235')) - _intlist('1234\x001235'))
Previously the parents() revset would do 'subset & parents' which iterates over
each item in the subset and checks if it's in parents. subset is usually the
entire repo (a spanset) so this takes a while.
Reversing the parameters to be 'parents & subset' means the operation becomes
O(number of parents) instead of O(size of repo). It also means the result gets
evaluated immediately (since parents isn't a lazy set), but I think this is a
win in most scenarios.
This shaves 0.3 seconds off strip (amend/histedit/rebase/etc) for large repositories.
revset #0: parents(20000)
0) obsolete feature not enabled but 54243 markers found!
! wall 0.006256 comb 0.010000 user 0.010000 sys 0.000000 (best of 289)
1) obsolete feature not enabled but 54243 markers found!
! wall 0.000391 comb 0.000000 user 0.000000 sys 0.000000 (best of 4323)
Durham Goode <durham@fb.com> [Fri, 12 Sep 2014 16:21:13 -0700] rev 22449
revset: make descendants() lazier
Previously descendants() would force the provided subset to become a set. In
the case of revsets like '(%ld::) - (%ld)' (as used by histedit) this would
force the '- (%ld)' set to be evaluated, which produced a set containing every
commit in the repo (except %ld). This takes 0.6s on large repos.
This changes descendants to trust the subset to implement __contains__
efficiently, which improves the above revset to 0.16s. Shaving 0.4 seconds off
of histedit.
revset #27: (20000::) - (20000)
0) obsolete feature not enabled but 54243 markers found!
! wall 0.023640 comb 0.020000 user 0.020000 sys 0.000000 (best of 100)
1) obsolete feature not enabled but 54243 markers found!
! wall 0.019589 comb 0.020000 user 0.020000 sys 0.000000 (best of 100)
This commit removes the final revset related perf hotspot from histedit.
Combined with the previous two patches, they shave a little over 3 seconds off
histedit on large repos.
Yuya Nishihara <yuya@tcha.org> [Wed, 17 Sep 2014 00:28:37 +0900] rev 22448
check-code: look for misuse of __bool__
Yuya Nishihara <yuya@tcha.org> [Wed, 17 Sep 2014 00:31:03 +0900] rev 22447
formatter: correct bool testing which should be __nonzero__ in Python 2
Mike Edgar <adgar@google.com> [Mon, 15 Sep 2014 16:07:54 -0400] rev 22446
contrib/synthrepo: return None to delete files on commit, don't raise IOError
The internal commit API was changed in
650b5b6e75ed to expect None from the
filectx function when a file is to be deleted, not an IOError. This change
keeps synthrepo up-to-date.
Steve Borho <steve@borho.org> [Mon, 15 Sep 2014 09:36:12 -0500] rev 22445
wix: contrib/sample.hgrc is no more
Mads Kiilerich <madski@unity3d.com> [Sun, 31 Aug 2014 13:41:09 +0200] rev 22444
dockerrpm: create a yum/dnf repo from the generated rpms
This gives "PPA" functionality where users easily can stay uptodate with latest
nightly build.
Mads Kiilerich <madski@unity3d.com> [Thu, 15 May 2014 01:48:37 +0200] rev 22443
docker: add CentOS 5
There is no official CentOS 5 docker template so we use one from saltstack.
Mads Kiilerich <madski@unity3d.com> [Sun, 31 Aug 2014 13:41:09 +0200] rev 22442
docker: use stable tags for fedora and centos
A moving target is rarely useful.
Mads Kiilerich <madski@unity3d.com> [Fri, 30 May 2014 14:14:33 +0200] rev 22441
dockerrpm: prepare source outside docker and just run rpmbuild inside docker
Simplifies the rpm build process.
We will use platform specific rpmbuild directories and will not clean them and
will drop the explicit copy to build directory.
Mads Kiilerich <madski@unity3d.com> [Fri, 30 May 2014 14:14:33 +0200] rev 22440
dockerrpm: run docker build process as the current user, not as root
Docker can be run by ordinary users if they are in the docker group. The build
process would however be run as a root user, only protected by the sandboxing.
That caused problems with the shared directory where rpmbuild would be picky
about building from sources owned by less privileged users and producing files
owned by root.
Instead, add a build user with the right uid/gid to the image and run the
docker process as that user.
Mads Kiilerich <madski@unity3d.com> [Fri, 30 May 2014 14:14:33 +0200] rev 22439
dockerrpm: better handling of specification of docker name
Mads Kiilerich <madski@unity3d.com> [Fri, 30 May 2014 14:14:33 +0200] rev 22438
dockerrpm: check that docker is running correctly before building
Mads Kiilerich <madski@unity3d.com> [Sun, 31 Aug 2014 13:40:53 +0200] rev 22437
buildrpm: introduce --rpmdir instead of using hardcoded rpmbuild dir
Used as rpm _topdir when preparing spec and source and building rpms.
Mads Kiilerich <madski@unity3d.com> [Thu, 15 May 2014 01:50:11 +0200] rev 22436
buildrpm: introduce --withpython for building rpms that includes Python 2.7
Mads Kiilerich <madski@unity3d.com> [Sun, 31 Aug 2014 12:51:06 +0200] rev 22435
buildrpm: introduce --prepare for preparing without actually building rpms
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 28 Aug 2014 22:45:36 +0900] rev 22434
templater: add "diff" template function
"diff" allows to embed changes in the target revision into template
output, even if the command itself doesn't take "--patch" option
Combination of "[committemplate]" configuration and "diff" template
function can achieve the feature like
issue231 ("option to have diff
displayed in commit editor buffer")
http://bz.selenic.com/show_bug.cgi?id=231
For example, templating below can be used to add each "diff" output
lines "HG: " prefix::
{splitlines(diff) % 'HG: {line}\n'}
This patch implements "diff" not as "a template keyword" but as "a
template function" to take include/exclude patterns at runtime.
It allows to specify target files of command (by -I/-X command line
options) and "diff" separately.
Matt Mackall <mpm@selenic.com> [Tue, 16 Sep 2014 11:08:29 -0500] rev 22433
locate: add pointer to files command in help
Matt Mackall <mpm@selenic.com> [Tue, 16 Sep 2014 11:08:14 -0500] rev 22432
tests: fix breakage from locate deprecation
Matt Mackall <mpm@selenic.com> [Sun, 16 Mar 2014 13:29:08 -0500] rev 22431
locate: deprecate in favor of files
Matt Mackall <mpm@selenic.com> [Fri, 12 Sep 2014 18:36:38 -0500] rev 22430
formatter: add pickle format
This gives convenient Python2 output. Python 3 users will need encoding=bytes.
Matt Mackall <mpm@selenic.com> [Mon, 15 Sep 2014 13:15:07 -0500] rev 22429
commands: add hidden -T option for files/manifest/status/tags
These commands have generic formatting support but no way to enable it
yet. When this feature is more fully developed, this flag will be unhidden.
Matt Mackall <mpm@selenic.com> [Fri, 12 Sep 2014 18:29:29 -0500] rev 22428
formatter: add json formatter
Matt Mackall <mpm@selenic.com> [Mon, 15 Sep 2014 13:11:13 -0500] rev 22427
cmdutil: add json style to log-like commands
Sadly, this can't be done with the normal templater like we do with
XML due to JSON's inter-record comma rules.
Matt Mackall <mpm@selenic.com> [Mon, 15 Sep 2014 13:12:49 -0500] rev 22426
encoding: add json escaping filter
This ends up here because it needs to be somewhat encoding aware.
Matt Mackall <mpm@selenic.com> [Mon, 15 Sep 2014 13:12:20 -0500] rev 22425
encoding: handle empty string in toutf8
Matt Mackall <mpm@selenic.com> [Fri, 12 Sep 2014 19:06:11 -0500] rev 22424
formatter: make debug style match Python syntax
Matt Mackall <mpm@selenic.com> [Fri, 12 Sep 2014 18:32:46 -0500] rev 22423
files: add new command unifying locate and manifest functionality
Mike Edgar <adgar@google.com> [Tue, 02 Sep 2014 14:42:30 -0400] rev 22422
filelog: parsemeta stops returning unused key list
Currently, only the returned meta dictionary is used. An upcoming change will
use the returned text offset.
Mike Edgar <adgar@google.com> [Wed, 10 Sep 2014 00:18:15 -0400] rev 22421
filelog: make parsemeta a public module function, to be used by censor module
Mike Edgar <adgar@google.com> [Wed, 10 Sep 2014 00:17:17 -0400] rev 22420
filelog: make packmeta a public module function, to be used by censor
Matt Mackall <mpm@selenic.com> [Thu, 11 Sep 2014 12:26:12 -0500] rev 22419
ui: move samplehgrcs from config
config is generic code that doesn't know about Mercurial usage, so
this was at the wrong layer
Matt Mackall <mpm@selenic.com> [Thu, 11 Sep 2014 12:21:15 -0500] rev 22418
config: normalize style between user/global example configs
Augie Fackler <raf@durin42.com> [Tue, 19 Aug 2014 14:33:31 -0400] rev 22417
commit: correctly check commit mutability during commit --amend
The right way to check if a context is mutable is to call .mutable(),
not to compare .phase() with public.
Augie Fackler <raf@durin42.com> [Tue, 19 Aug 2014 14:33:01 -0400] rev 22416
histedit: check mutability of contexts correctly
The right way to check if a context is mutable is to call .mutable(),
not to compare .phase() with public.
Augie Fackler <raf@durin42.com> [Thu, 11 Sep 2014 10:14:34 -0400] rev 22415
manifest: mark addlistdelta and checkforbidden as module-private
Augie Fackler <raf@durin42.com> [Wed, 10 Sep 2014 10:52:00 -0400] rev 22414
convert: enable deterministic conversion progress bar for svn
This produces slightly bad results when branches are in play, but
overall I think it's probably worthwhile. We might be able to do
better with branches somehow, but I haven't given it any thought.
Augie Fackler <raf@durin42.com> [Wed, 10 Sep 2014 10:51:46 -0400] rev 22413
convert: enable deterministic conversion progress bar for git
Augie Fackler <raf@durin42.com> [Wed, 10 Sep 2014 11:04:29 -0400] rev 22412
test-convert-git.t: add a test of convert progress bars for git
We're about to enhance this support, so test the existing behavior so
the improved behavior is obvious in the next patch.
Augie Fackler <raf@durin42.com> [Mon, 26 May 2014 11:53:12 -0400] rev 22411
convert: add support for deterministic progress bar on scanning phase
This makes it possible to estimate how long the "scanning source"
phase will take, if the specified source repo type supports a quick
"how many changes" check.
Augie Fackler <raf@durin42.com> [Wed, 10 Sep 2014 11:01:47 -0400] rev 22410
test-convert-svn-move.t: remove stray '
Augie Fackler <raf@durin42.com> [Thu, 07 Aug 2014 12:47:20 -0400] rev 22409
manifest: move addlistdelta to module-level
Again, there's no reason for this to be inside manifest.add, so we'll
define it only once.
Augie Fackler <raf@durin42.com> [Thu, 07 Aug 2014 09:46:05 -0400] rev 22408
manifest: move checkforbidden to module-level
There's no need for this function to be nested, so let's just define
it once instead of every time manifest.add() gets called.
Durham Goode <durham@fb.com> [Fri, 05 Sep 2014 11:37:44 -0700] rev 22407
dirstate: add exception when calling setparent without begin/end (API)
Adds an exception when calling dirstate.setparent without having first called
dirstate.beginparentchange. This will prevent people from writing code that
modifies the dirstate parent without considering the transactionality of their
change.
This will break third party extensions that call setparents.
Durham Goode <durham@fb.com> [Fri, 05 Sep 2014 15:36:56 -0700] rev 22406
dirstate: add test for exceptions during updates
Adds a test that checks if the working copy parent and the working copy are in a
good state if an exception happens between the time the working copy parent is
set and the time the actual updates are recorded in the dirstate.
Durham Goode <durham@fb.com> [Fri, 05 Sep 2014 11:36:20 -0700] rev 22405
dirstate: wrap setparent calls with begin/endparentchange (
issue4353)
This wraps all the locations of dirstate.setparent with the appropriate
begin/endparentchange calls. This will prevent exceptions during those calls
from causing incoherent dirstates (
issue4353).
Durham Goode <durham@fb.com> [Fri, 05 Sep 2014 11:34:29 -0700] rev 22404
dirstate: add begin/endparentchange to dirstate
It's possible for the dirstate to become incoherent (
issue4353) if there is an
exception in the middle of the dirstate parent and entries being written (like
if the user ctrl+c's). This change adds begin/endparentchange which a future
patch will require to be set before changing the dirstate parent. This will
allow us to prevent writing the dirstate in the event of an exception while
changing the parent.
Henrik Stuart <hg@hstuart.dk> [Mon, 08 Sep 2014 20:57:44 +0200] rev 22403
parsers: avoid signed/unsigned comparison mismatch
Based on warning from Microsoft Visual C++ 2008.
Henrik Stuart <hg@hstuart.dk> [Mon, 08 Sep 2014 20:22:10 +0200] rev 22402
parsers: use correct type for file offset
Now using Py_ssize_t instead of long to denote offset in file whose length is
already measured using Py_ssize_t. Length and offset are now consistent. Based
on warning from Microsoft Visual C++ 2008.
Henrik Stuart <hg@hstuart.dk> [Mon, 08 Sep 2014 20:20:17 +0200] rev 22401
parsers: ensure correct return type for inline_scan
The returned data type for inline_scan should be Py_ssize_t rather than long.
Based on warning from Microsoft Visual C++ 2008.
Henrik Stuart <hg@hstuart.dk> [Thu, 11 Sep 2014 12:05:23 -0500] rev 22400
parsers: fix typing issue when constructing Python integer object
The passed variable is a Py_ssize_t, not a long, and consequently should use
PyInt_FromSsize_t rather than PyInt-FromLong. Fixed based on warning from
Microsoft Visual C++ 2008.
Henrik Stuart <hg@hstuart.dk> [Mon, 08 Sep 2014 20:06:52 +0200] rev 22399
parsers: use bitmask type consistently in find_gca_candidates
Normalized type usage in find_gca_candidates triggered by warning from
Microsoft Visual C++ 2008.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 02:10:29 +0200] rev 22398
revert: drop `lexist` check in the backup logic
We are no longer trying to backup files that do not exist on disk. This check
can be safely dropped.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 02:09:53 +0200] rev 22397
revert: distinguish between deleted file and locally modified
Locally modified needs a backup while a deleted file cannot be backed
up because there is no file to backup.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 02:00:20 +0200] rev 22396
revert: detect unknown files in the same path as files marked as removed
Such unknown files may need to be backed up. Having them identified beforehand
will help simplify the backup logic.
We now use different sets with different backup strategies.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 01:52:08 +0200] rev 22395
revert: cache working context in a variable
During the silicon age, humans on planet Earth discovered the use of
variables. This marvelous invention let them improve both code
readability and performance.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 10 Sep 2014 14:42:52 +0100] rev 22394
obsolete: properly drop 'date' from metadata
Mistakes were made while resolving rebase conflicts in
4bc96685a40c. This led to
'date' being preserved in metadata when reading markers from a binary stream.
As a result, some known markers were seen as "new" when pulling. I noticed it
because a no-op pulls from main added about 600 duplicated markers to my
obsstore (for each pull).
I do not believe we need to perform any specific action to actively
de-duplicates existing obsstore. After this fix, duplicated markers will no be
propagated and the few affected repositories can probably deal with duplication (or
people can repull the obsstore from a clone).
As a side effect, we decode metadata only once, reducing the impact of the hack
in fm0 to store extra important data (parents and date).
Anton Shestakov <engored@ya.ru> [Mon, 08 Sep 2014 20:12:58 +0900] rev 22393
templater: implement __len__ for _hybrid
Objects of class _hybrid are returned by such template keywords as children,
bookmarks, tags and others, and also by revset() template function. They are
representing "list of strings" (as hg help template says) for use in templates.
So it would be logical to implement a handy way to count the number of strings
in such list, and that's what __len__ method does.
David Soria Parra <davidsp@fb.com> [Fri, 05 Sep 2014 19:54:26 +0200] rev 22392
tests: remove unnecessary apostrophe
anuraggoel <anurag.dsps@gmail.com> [Mon, 08 Sep 2014 16:41:00 +0200] rev 22391
run-tests: added '--json' functionality to store test result in json file
This patch added a new functionality '--json'. While testing, if '--json'
is enabled then test result data gets stored in newly created "report.json"
file in the following format.
testreport ={
"test-success.t": {
"result": "success",
"time": "2.041"
}
"test-failure.t": {
"result": "failure",
"time": "4.430"
}
"test-skip.t": {
"result": "skip"
"time": "3.754"
}
}
Otherwise, if '--json' is enabled but json module was not installed then it
will raise an error "json module not installed".
This "report.json" file will further accessed by html/javascript file for
graph usage.
Sune Foldager <cryo@cyanite.org> [Tue, 02 Sep 2014 12:11:36 +0200] rev 22390
changegroup: rename bundle-related functions and classes
Functions like getbundle and classes like unbundle10 really manipulate
changegroups and not bundles. A HG10 bundle is the same as a changegroup
plus a small header, but this is no longer the case for a HG2X bundle,
so it's better to separate the names a bit.
Mads Kiilerich <madski@unity3d.com> [Tue, 19 Aug 2014 01:13:10 +0200] rev 22389
comments: describe ancestor consistently - avoid 'least common ancestor'
"best" is as defined by mercurial.ancestor.ancestors: furthest from a root (as
measured by longest path).
Mads Kiilerich <madski@unity3d.com> [Tue, 19 Aug 2014 01:12:56 +0200] rev 22388
rebase: improve description of --base
No Mercurial DAG has ever (!) been drawn in a way where 'up to' would apply.
Instead, describe deliberatey vague and informal instead of seemingly precise
but not describing the essentials:
rebase the tree around the specified changeset without ancestors of dest
Mads Kiilerich <madski@unity3d.com> [Fri, 15 Aug 2014 19:43:32 +0200] rev 22387
dagutils: fix docstrings for singleton internalize/externalize
Martin von Zweigbergk <martinvonz@gmail.com> [Sun, 31 Aug 2014 07:45:50 -0700] rev 22386
cmdutil: avoid the confusing name 'patch' for a matcher
Siddharth Agarwal <sid0@fb.com> [Tue, 02 Sep 2014 14:10:08 -0700] rev 22385
fedora: remove sample.hgrc from shipped files
sample.hgrc was long obsolete and was removed in
63ed188e3fc7.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Sun, 24 Aug 2014 19:45:46 -0400] rev 22384
config: propose some sample global config file
An example of what could be suggested to the user as a global config
file. Trying to be conservative here, and only suggesting the safest
possible extensions. In addition to the user-level extensions, the
blackbox extension is something a sysadmin might reasonable want to
enable for every repo on the system.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Wed, 13 Aug 2014 17:05:48 -0400] rev 22383
config: give more fine-tuned sample hgrcs to this command
The hgrc for user config is typically different from the hgrc at the
system-wide or repository level. This patch provides different sample
hgrcs for each level. Sometimes when copying repos around, the copy or
the original don't have a default path yet, so at least for `hg config
-l`, this ought to provide a more reasonable default and suggestions
of what typically goes there.
The actual sample configs go in the config.py file, to minimise
clutter. In order to avoid an unnecessary import, the corresponding
import for this dictionary is at the file level.
David Soria Parra <davidsp@fb.com> [Mon, 01 Sep 2014 11:48:55 +0200] rev 22382
rebase: add a deprecated -i/--interactive flag
A common mistake can be to type 'hg rebase -i' to discover interactive history
editing. We add a -i/--interactive flag as discussed in the sprint and deprecate
it right away, but hint people using it to use histedit instead.
Mads Kiilerich <madski@unity3d.com> [Tue, 19 Aug 2014 01:13:10 +0200] rev 22381
revlog: introduce isancestor method for efficiently determining node lineage
Hide the not so obvious use of commonancestorsheads.
Augie Fackler <raf@durin42.com> [Tue, 09 Sep 2014 17:16:24 -0400] rev 22380
clone: provide sample username = config entry in .hg/hgrc (
issue4359)
Some users clone from a server before ever running 'hg config --edit',
so they don't see our helpful template for things like enabling the
username. Attempt to give them some helpful guidance.
Augie Fackler <raf@durin42.com> [Tue, 09 Sep 2014 16:51:21 -0400] rev 22379
test-acl: alter sed construct to avoid changes in .hg/hgrc formatting
A future patch is going to add some extra commented-out boilerplate to
the top of .hg/hgrc during clone. In order to make this test not
require regular updates, switch to searching for [hooks] or [acl] and
print file from the first match to that pattern.
Augie Fackler <raf@durin42.com> [Tue, 09 Sep 2014 13:47:50 -0400] rev 22378
merge with stable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 10 Sep 2014 00:41:44 +0900] rev 22377
dispatch: check shell alias again after loading extensions (
issue4355)
Before this patch, the shell alias causes failure when it takes its
specific (= unknown for "hg") options in the command line, because
"_parse()" can't accept them.
This is the regression introduced by
03d345da0579.
It fixed the issue that ambiguity between shell aliases and commands
defined by extensions was ignored. But it also caused that ambiguous
shell alias is handled in "_parse()" even if it takes specific options
in the command line.
To avoid such failure, this patch checks shell alias again after
loading extensions.
All aliases and commands (including ones defined by extensions) are
completely defined before the 2nd (= newly added in this patch)
"_checkshellalias()" invocation, and "cmdutil.findcmd(strict=False)"
can detect ambiguity between them correctly.
For efficiency, this patch does:
- omit the 2nd "_checkshellalias()" invocation if "[ui] strict= True"
it causes "cmdutil.findcmd(strict=True)", of which result should
be equal to one of the 1st invocation before adding aliases
- avoid removing the 1st "_checkshellalias()" invocation
it causes "cmdutil.findcmd(strict=True)" invocation preventing
shell alias execution from loading extensions uselessly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 10 Sep 2014 00:41:44 +0900] rev 22376
dispatch: make "_checkshellalias" reusable regardless of adding aliases
To reduce changes in the subsequent patch fixing
issue4355, this patch
makes "_checkshellalias" reusable regardless of adding aliases.
In this patch, alias definitions are added and restored, only when
"precheck=True".
J. Lewis Muir <jlmuir@anl.gov> [Tue, 02 Sep 2014 11:28:44 +0200] rev 22375
build: don't clean __version__.py on 'make clean' in release tarballs
When running 'make clean' in an extracted release tarball, file
mercurial/__version__.py is removed, causing a subsequent install to
indicate 'version unknown'.
This problem was reported in the past [1] and a patch proposed in that mail,
but was never properly sent nor applied.
[1] http://selenic.com/pipermail/mercurial/2010-December/036249.html
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 01:51:02 +0200] rev 22374
revert: drop now useless conditional in the backup check
Now that we removed the (hopeless) attempt to backup file we knew to be
missing in the target changeset, we can stop checking if the file exists in
the target changeset.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 01:49:28 +0200] rev 22373
revert: no backup for `dsadded` set
There is only one case where a backup is required in the `dsadded` set, and the
current backup mechanism fails to handle it. So we stop trying to do backups at
all for now. This will help us to simplify the backup code and finally fix
this backup issue.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 16:06:09 +0200] rev 22372
revert: add more padding in the dispatch list
We are going to add more sets and some of them will have longer names. We add
padding in a standalone patch for readbility purposes.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 01:48:58 +0200] rev 22371
revert: add documentation in the dispatch table
More sets are coming so documenting the existing ones will help.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 02:47:59 +0200] rev 22370
revert: add a way for external extensions to prefetch file data
This allow extensions that mess with the storage layer (remotefilelog,
largefile) to prefetch any data that will be accessed during the revert
operation.
We are currently fetching more data than theoretically required because the
backup code is a bit stupid. Future patches will improve that.
Kevin Bullock <kbullock@ringworld.org> [Sun, 07 Sep 2014 11:46:11 -0500] rev 22369
merge with stable
Siddharth Agarwal <sid0@fb.com> [Wed, 03 Sep 2014 20:42:51 +0200] rev 22368
histedit: abort gracefully on --continue/--abort with no state
Previously we'd print an ugly message saying that the histedit-state file
doesn't exist in the repo.
Augie Fackler <raf@durin42.com> [Thu, 04 Sep 2014 09:59:23 -0400] rev 22367
merge with stable
Matt Mackall <mpm@selenic.com> [Tue, 02 Sep 2014 03:41:01 +0200] rev 22366
Added signature for changeset
5dc91146f353
Matt Mackall <mpm@selenic.com> [Tue, 02 Sep 2014 03:40:55 +0200] rev 22365
Added tag 3.1.1 for changeset
5dc91146f353
Durham Goode <durham@fb.com> [Tue, 26 Aug 2014 04:58:41 -0700] rev 22364
bookmarks: allow pushkey if new equals current
Previously a bookmark pushkey would be rejected if the specified 'old' value
didn't match the servers 'current' value. This change allows this situation, as
long as the 'current' server value equals the 'new' pushkey value already.
We are trying to write a hook that forces a server bookmark to move forward,
using a changegroup hook. If the user also pushed the bookmark, they would get
an error, since they computed their pushkey (old,new) pair before the server
moved the bookmark. Long term, bundle2 will let us do this more smartly, but
this change seems reasonable for now.
Mads Kiilerich <madski@unity3d.com> [Fri, 29 Aug 2014 12:17:53 +0200] rev 22363
tests: improve test coverage of branch command and existing branches
Angel Ezquerra <angel.ezquerra@gmail.com> [Thu, 28 Aug 2014 17:23:05 +0200] rev 22362
localrepo: make it possible to pass multiple path elements to join and wjoin
This makes join and wjoin behave in the same way as os.path.join. That is, it
makes it possible to pass more than one path element to them.
Note that the first path element is still required, as it was before this patch,
and as is the case for os.path.join.
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 31 Aug 2014 12:22:44 +0200] rev 22361
run-tests: make --interactive work with --view
Mads Kiilerich <madski@unity3d.com> [Sun, 31 Aug 2014 11:11:42 +0200] rev 22360
convert: don't use multi-argument set.update
Mumble mumble 2.4 mumble.
Mike Edgar <adgar@google.com> [Sat, 30 Aug 2014 12:22:20 +0200] rev 22359
error: use docstrings, not bare strings, for error classes
Mads Kiilerich <madski@unity3d.com> [Sun, 31 Aug 2014 10:24:25 +0200] rev 22358
osx: create dmg with installer instead of zip
OS X would offer to expand the zip so the (multi file) installer inside it
could be run ... but that would leave the expanded zip folder around.
Instead, use a .dmg file that automatically will be mounted - that seems more
common on OS X.
Still, there is two levels of levels of clicking before actually launching the
installer. Having a single file installer would be better ... but seems to be
hard. A more feasible improvement would be some fancy layout inside the .dmg .
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 12:33:12 +0200] rev 22357
branchmap: pre-filter topological heads before ancestors based filtering
We know that topological heads will not be ancestors of anything, so we filter
them out to potentially reduce the range of the ancestors computation.
On a strongly headed repo this gives humble speedup:
from 0.1984 to 0.1629
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 12:20:50 +0200] rev 22356
branchmap: issue a single call to `ancestors` for all heads
There is no reason to make multiple calls. This provides a massive speedup for
repo with a lot of heads.
On a strongly headed repo this gives humble speedup in simple case:
from 8.1097 to 5.1051
And massive speedup in other case:
from 7.8787 to 0.1984
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 30 Aug 2014 11:39:15 +0200] rev 22355
test-ancestor: add a test for `ancestor` with ancestry within the initset
I was wondering if revisions in the initial set that are still ancestors of other
elements in the initial set were yielded by `changelog.ancestors`. I now have my
answer (they do) and Mercurial has a new test.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 26 Aug 2014 12:47:41 +0200] rev 22354
bundle2: pull obsmarkers relevant to the pulled set through bundle2
We use the new `obsheads` argument to retrieve them in a bundle2 part at the
same time as the changegroup.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 29 Aug 2014 12:36:17 +0200] rev 22353
getbundle: add `obsmarkers` argument to getbundle
This argument triggers the retrieval of all markers relevant to the set of
changesets defined by the nodes in `heads`.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 29 Aug 2014 12:28:58 +0200] rev 22352
pull: use the "cg" argument when pulling a bundle2
We use the `cg` argument to disable the generation of a changegroup part. This
is useful to pull information when changesets are already in sync (phases,
obsmarkers).
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 29 Aug 2014 12:51:00 +0200] rev 22351
wireprotocol: fix 'boolean' handling
The encoding and decoding code were swapped. This is now fixed.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 20 Aug 2014 01:15:09 -0700] rev 22350
push: only push obsmarkers relevant to the "pushed subset"
We should only exchange obsolete markers related to the changesets
that are being exchanged. For example, if `A'` is a successor of `A`,
we do not want to push the marker if we are not exchanging
`A'`. Otherwise `A` would disappear without a successor, leading to confusion
for both users and the evolution mechanism.
Therefore we now exchange only the markers relevant to the subset of nodes
involved in the push (the nodes themselves may be already common but were
selected by --rev (or the lack of --rev)).
Note that all selected markers are still exchanged on each push. We do
not have a discovery protocol for markers in core yet. Such discovery
would save us the exchange of markers known on both side.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 20 Aug 2014 19:47:35 -0700] rev 22349
test-obsolete: sort the output of debugobsolete
The set of relevant markers is currently unordered. Therefore the
markers will be added in arbitrary order. We sort the list of markers
beforehand to ensure stable output for testing.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 20 Aug 2014 19:42:33 -0700] rev 22348
test-obsolete: change a marker so it is relevant to the exchanged set
We are going to only exchange markers relevant to the exchanged
changesets. So we need to change this marker to use a known changeset as
a successor instead of a precursor.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 19:44:27 +0200] rev 22347
push: use bundle2 to push obsmarkers when possible
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 19:32:51 +0200] rev 22346
exchange: add a `buildobsmarkerpart` function
We'll have to build an obsmarker part for both push and pull. So we build a
function to factor out the common part.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 26 Aug 2014 11:36:23 +0200] rev 22345
obsolete: add a `commonversion` function
This function returns the highest common version between the locally known
formats and a list of remotely known formats. This is going to be useful to
know what format should be used for exchange.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 26 Aug 2014 11:48:26 +0200] rev 22344
bundle2: add a `obsmarkersversion` function to extract supported version
Right next to the function that encodes the supported versions in
capabilities we add a function that decodes the versions out of capabilities.
This is going to be useful to know what formats can be used for exchange.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 21 Aug 2014 18:18:38 -0700] rev 22343
bundle2: advertise the obsmarker part in bundle2 capabilities
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 19:21:47 +0200] rev 22342
bundle2: introduce a `getrepocaps` to retrieve the bundle2 caps of a repo
This function lets extensions change the bundle2 capabilities of a repository.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 19:17:06 +0200] rev 22341
obsmarker: move bundle2caps from the localrepo class to the bundle2 module
The localrepo path was quicker, easier, more seductive. We'll soon add a
function in another changeset to alter the capabilities.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 18:35:39 +0200] rev 22340
obsmarker: produce a reply part for markers received through bundle2
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 18:26:56 +0200] rev 22339
obsmarker: record the number of new markers in the transaction
This lets hooks be notified about new markers in the repository.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 18:10:08 +0200] rev 22338
obssmarker: add a bundle2 record with the number of markers added
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 18:09:54 +0200] rev 22337
obsmarker: write a message with the number of markers added through bundle2
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 18:08:22 +0200] rev 22336
bundle2: add an obsmarkers part handler
This part contains a binary stream of obsolescence markers. Received markers are
added to the repository.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 16:24:40 +0200] rev 22335
obsolete: make encodemarkers a public function
We'll need access to it for bundle2.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 16:21:33 +0200] rev 22334
obsolete: move _encodemarkers next to _readmarkers
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 16:18:44 +0200] rev 22333
obsstore: store and preserve ondisk version
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 16:51:51 +0200] rev 22332
obsolete: have _readmarkers return the format version
readmarkers is not returning the version of the format it read from. This will
let callers know about the format and allow them to preserve it.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 16:16:01 +0200] rev 22331
obsolete: support for any known obsstore format when reading or writing
We can now read and write any known format. The list of known formats
currently has one element (0). The obsstore itself is not aware of
multiple formats yet and always uses format 0.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 16:09:18 +0200] rev 22330
obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 16:43:23 +0200] rev 22329
obsolete: rename _encodeonemarker to _fm0encodeonemarkers
This function encodes markers in version 0 of the format.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 14:58:11 +0200] rev 22328
obsolete: extract the part of _readmarkers specific to format version 0
If we are to introduce new formats we need to be able call different
functions for different formats. Creating a function for format
version 0 is the first step.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 14:56:15 +0200] rev 22327
obsolete: rename all _fm to _fm0
This change is because these formats are used for version 0 of the
obsstore format. This is going to be useful in the future when we
introduce new versions of the format.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 25 Aug 2014 14:52:51 +0200] rev 22326
obsolete: rename _fnodesize to _fmfnodesize
All variables involved in the obsstore format are prefixed with `_fm`.
`_fnodesize` was the exception. It is now back in line.
This is meaningful as we'll need to distinguish between multiple versions of the
obsstore format.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 21 Aug 2014 17:42:50 -0700] rev 22325
obsstore: have the `mergemarkers` method return the number of new markers
The mergemarkers function now returns the number of unknown markers in
the stream that have been added to the obsstore. This is similar to what
`obsstore.add` already does.
The method gains a docstring in the process.
Matt Mackall <mpm@selenic.com> [Mon, 01 Sep 2014 23:43:33 +0200] rev 22324
merge with i18n
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 21 Aug 2014 17:36:05 -0700] rev 22323
test-bundle2: add obsolescence information to be exchanged
To introduce a bundle2 way to exchange obsolescence markers, we need to
have some information available to exchange. Introduce markers relevant
to changesets involved in the exchange. The new markers reference the
changesets as successor nodes of clowny (nonexistent) hashes so that
other than being exchanged they have no effect.
We introduce them in two waves as push is expected to be smart about the
number of markers it exchanges sooner than pull.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 30 Aug 2014 20:06:24 +0200] rev 22322
help: only call doc() when it is callable
`hg help -k` on my machine was aborting because the hg-prompt extension
was inserting a string and not a function into help.helptable and help
was blindly calling it.
This patch changes keyword searching to be more robust against
unexpected types.
Wagner Bruna <wbruna@softwareexpress.com.br> [Mon, 01 Sep 2014 10:57:27 -0300] rev 22321
i18n-pt_BR: synchronized with
6a8b8efb0641
Wagner Bruna <wbruna@softwareexpress.com.br> [Mon, 01 Sep 2014 10:54:49 -0300] rev 22320
merge with i18n
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 31 Aug 2014 20:49:13 +0900] rev 22319
i18n-ja: synchronized with
0c838e7459a5
Wagner Bruna <wbruna@yahoo.com> [Sat, 30 Aug 2014 09:40:31 -0300] rev 22318
i18n-pt_BR: synchronized with
0c838e7459a5
Mike Hommey <mh@glandium.org> [Sun, 31 Aug 2014 19:43:03 +0900] rev 22317
repoview: fix typo in repoview.changelog
Incidentally, this avoids the changelog cache being invalidated each time
it's accessed on a repoview.
On a filtering experiment on a repository the size of mozilla-central,
this makes a significant difference:
Before, running hg log -l 10 --time with about 8k changesets filtered out:
time: real 1.490 secs (user 1.450+0.000 sys 0.040+0.000)
After:
time: real 0.540 secs (user 0.530+0.000 sys 0.010+0.000)
Aaron Kushner <akushner@fb.com> [Tue, 19 Aug 2014 16:57:02 -0700] rev 22316
config: exit non zero on non-existent config option (
issue4247)
When running 'hg config no_such_option', hg exited with a
zero exit code. This change now exits with a 1 if the
config option does not exist.
Matt Mackall <mpm@selenic.com> [Sat, 30 Aug 2014 18:44:59 +0200] rev 22315
merge with crew
Kevin Bullock <kbullock@ringworld.org> [Sat, 30 Aug 2014 15:13:02 +0200] rev 22314
bookmarks: refer to "the" active bookmark to clarify that there's only one
This is a follow-on to
0c6cdbb697d9 that just makes a slight clarification.
Siddharth Agarwal <sid0@fb.com> [Sat, 30 Aug 2014 05:29:38 -0700] rev 22313
memctx: allow extensions to determine what filectxfn should do
Rev
650b5b6e75ed switched the contract for filectxfn from "raise IOError if
file is missing" to "return None if file is missing". Out of tree extensions
need to be updated for that, but for extensions interested in compatibility
with both Mercurial <= 3.1 and default, it is next to impossible to introspect
core Mercurial to figure out what to do.
This patch adds a field to memctx for extensions to use.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 30 Aug 2014 15:17:37 +0200] rev 22312
revsetbenchmark: add revset with lazyset subtraction
The added revset is used by obsolescence and currently results in
recursion in __contains__ between 2 lazysets. We should have
coverage of this revset.
Sune Foldager <cryo@cyanite.org> [Sat, 30 Aug 2014 11:57:46 +0200] rev 22311
debugrevlog: add chainlen column to --dump output
Henrik Stuart <hg@hstuart.dk> [Sat, 30 Aug 2014 11:56:33 +0200] rev 22310
debugdag: stop wrongly sorting parents
The dag being dumped is not in a format that allows us to reconstruct the
original dag as the parent revisions are normalised.
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 29 Aug 2014 18:00:44 +0200] rev 22309
obsolete: avoid slow, generic date parsing
Simple profiling of `hg log -r .` revealed ~18,000 calls to
mercurial.i18n.gettext() on the author's repository. The
culprit was 3 _() calls in util.parsedate() multiplied by
~6000 obsmarkers originating from the parsing of obsmarkers.
Changing the obsmarker code to parse the stored format of
dates instead of going through a generic path eliminates these
gettext() lookups and makes `hg log -r .` execute ~10% faster
on the author's repo. The performance gain is proportional to
the number of obsmarkers.
The author attempted to patch util.parsedate() to avoid the
gettext() lookups. However, that code is whacky and the author
is jet lagged, so the approach was not attempted.
Kevin Bullock <kbullock@ringworld.org> [Fri, 29 Aug 2014 12:06:31 +0200] rev 22308
build: don't use -s flag for `which`
`which -s` is a BSDism that doesn't exist on other versions of
`which`. That means that even on Mac OS X, `make osx` breaks if you have
another utils package installed (e.g. debianutils installed thru
fink). Redirect output to /dev/null instead.
Matt Mackall <mpm@selenic.com> [Fri, 29 Aug 2014 17:15:49 +0200] rev 22307
contrib: drop obsolete sample.hgrc
This was full of bad suggestions and is obsoleted by hg config --edit.
Matt Mackall <mpm@selenic.com> [Fri, 29 Aug 2014 17:14:45 +0200] rev 22306
contrib: drop old convert-repo script
This has been obsolete since 2007.
Matt Mackall <mpm@selenic.com> [Wed, 27 Aug 2014 18:35:34 +0200] rev 22305
merge with stable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 23 Aug 2014 21:23:02 +0900] rev 22304
templater: enable alias predicates to be used in "revset()" function
Before this patch, predicates defined in "[revsetalias]" can't be used
in the query specified to template function "revset()", because:
- "revset()" uses "localrepository.revs()" to get query result, but
- "localrepository.revs()" passes "None" as "ui" to "revset.match()", then
- "revset.match()" can't recognize any alias predicates
To enable alias predicates to be used in "revset()" function, this
patch invokes "revset.match()" directly with "repo.ui".
This patch doesn't make "localrepository.revs()" pass "self.ui" to
"revset.match()", because this may be intentional implementation to
prevent alias predicates from shadowing built-in ones and breaking
functions internally using "localrepository.revs()".
Even if it isn't intentional one, the check for shadowing should be
implemented (maybe on default branch) before fixing it for safety.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 27 Aug 2014 23:10:06 +0900] rev 22303
import: show the warning message for failure of merging
Before this patch, no message is shown for failure of merging at "hg
import".
In such case, merging patch is imported as a normal revision silently,
and it may confuse users.
For simplicity, this patch recommends just using "--exact", even
though importing the merging patch itself is possible without it if:
- the hash of the 1st parent in the patch is equal to one of the
patch imported just before (or the parent of the working
directory, for the 1st patch of the series), and
- the hash of the 2nd parent in the patch is known in the local
repository
Mads Kiilerich <madski@unity3d.com> [Wed, 27 Aug 2014 15:30:09 +0200] rev 22302
graft: fix collision detection with origin revisions that are missing
When grafting something with a matching origin, it would normally be skipped:
skipping already grafted revision 123 (23 also has origin 12)
But after stripping a graft origin, graft could fail with a reference to the
origin that no longer exists:
abort: unknown revision '
5c095ad7e90f871700f02dd1fa5012cb4498a2d4'!
Instead, detect that the origin is unknown and skip it anyway, like:
skipping already grafted revision 8 (2 also has unknown origin
5c095ad7e90f871700f02dd1fa5012cb4498a2d4)
Sean Farley <sean.michael.farley@gmail.com> [Sat, 23 Aug 2014 17:03:08 -0500] rev 22301
log: use correct phase info for parent field (
issue4347)
Previously, there was a copy / paste error with using the current changeset's
phase information. We now look up the parent context explicitly.
The line was too long so it is stored into a variable first.
Mads Kiilerich <madski@unity3d.com> [Tue, 26 Aug 2014 22:03:32 +0200] rev 22300
convert: introduce --full for converting all files
Convert will normally only process files that were changed in a source
revision, apply the filemap, and record it has a change in the target
repository. (If it ends up not really changing anything, nothing changes.)
That means that _if_ the filemap is changed before continuing an incremental
convert, the change will only kick in when the files it affects are modified in
a source revision and thus processed.
With --full, convert will make a full conversion every time and process
all files in the source repo and remove target repo files that shouldn't be
there. Filemap changes will thus kick in on the first converted revision, no
matter what is changed.
This flag should in most cases not make any difference but will make convert
significantly slower.
Other names has been considered for this feature, such as "resync", "sync",
"checkunmodified", "all" or "allfiles", but I found that they were less obvious
and required more explanation than "full" and were harder to describe
consistently.
Mads Kiilerich <madski@unity3d.com> [Tue, 26 Aug 2014 22:03:32 +0200] rev 22299
convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com> [Tue, 26 Aug 2014 22:03:32 +0200] rev 22298
convert: refactor subversion getchanges and caching
Mads Kiilerich <madski@unity3d.com> [Tue, 26 Aug 2014 22:03:32 +0200] rev 22297
convert: remove incorrect and unused handling of removed svn directories
Since it was introduced in
f0c58fd4b798, tidy_dirs has been comparing
the result of os.listdir with a string - which never can be true.
Convert apparently works anyway and there is no test coverage of it.
It also seems like it could make a bigger difference on older svn versions but
is less relevant with more recent versions.
Instead of trying to fix the code, we take the low risk option and remove it.
Mads Kiilerich <madski@unity3d.com> [Tue, 26 Aug 2014 22:03:32 +0200] rev 22296
convert: use None value for missing files instead of overloading IOError
The internal API used IOError to indicate that a file should be marked as
removed.
There is some correlation between IOError (especially with ENOENT) and files
that should be removed, but using IOErrors to represent file removal internally
required some hacks.
Instead, use the value None to indicate that the file not is present.
Before, spurious IO errors could cause commits that silently removed files.
They will now be reported like all other IO errors so the root cause can be
fixed.
Matt Mackall <mpm@selenic.com> [Wed, 27 Aug 2014 12:30:28 +0200] rev 22295
merge with stable
Mads Kiilerich <madski@unity3d.com> [Mon, 25 Aug 2014 03:27:51 +0200] rev 22294
convert: p4: ignore purged files with p4d 2012.2 and later
Perforce has the concept of "+Sn" files where only the last revisions of the
file is stored. In p4d 2012.1 old purged revisions were not included in the
"manifest". With 2012.2 they started being included and convert's getfile
failed to recognize the "purged" flag and saw it as an empty file. That made
test-convert-p4-filetypes.t fail.
There is no point in storing an empty file as placeholder for a purged file so
we restore the old behaviour by checking the flag and letting getfile consider
purged files deleted.
(It is questionable whether it makes sense to convert not-yet-purged +S files
to mercurial ... but that is another question.)
Mads Kiilerich <madski@unity3d.com> [Mon, 25 Aug 2014 03:27:51 +0200] rev 22293
tests: fix p4 tests so they use separate ports and can be run in parallel
Mads Kiilerich <madski@unity3d.com> [Tue, 26 Aug 2014 22:03:30 +0200] rev 22292
run-tests: report skipped tests as "skipped" - they might still be "relevant"
Yuya Nishihara <yuya@tcha.org> [Sun, 24 Aug 2014 12:35:53 +0900] rev 22291
ui: add brief comment why raw_input() needs dummy ' ' prompt string
Retrieved from
17ffb30d9174.
I was about to move ' ' to label(msg + ' ', 'ui.prompt') so that subclass can
distinguish prompt output from data. But it was not that simple.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 24 Aug 2014 23:47:26 +0900] rev 22290
largefiles: remove redundant "updatelfiles" invocation in "lfilesrepo.commit"
After previous patches, largefiles in the working directory are
ensured to be updated before "repo.commit" invocation for automated
committing below:
- by "overrides.mergeupdate" via "merge.update" for rebase
- by "overrides.scmutilmarktouched" via "patch.patch" for transplant
This patch removes redundant "lfcommands.updatelfiles" invocation in
"Case 0" code path of "lfilesrepo.commit" for automated committing,
and revises detailed comment.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 24 Aug 2014 23:47:26 +0900] rev 22289
largefiles: update largefiles even if transplant is aborted by conflict
Before this patch, largefiles in the working directory aren't updated
correctly, if transplant is aborted by conflict. This prevents users
from viewing appropriate largefiles while resolving conflicts.
While transplant, largefiles in the working directory are updated only
at successful committing in the special code path of
"lfilesrepo.commit()".
To update largefiles even if transplant is aborted by conflict, this
patch wraps "scmutil.marktouched", which is invoked from "patch.patch"
with "files" list of added/modified/deleted files.
This patch invokes "updatelfiles" with:
- "printmessage=False", to suppress "getting changed largefiles ..."
messages while automated committing by transplant
- "normallookup=True", because "patch.patch" doesn't update dirstate
for modified files
in such case, "normallookup=False" may cause marking modified
largefiles as "clean" unexpectedly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 24 Aug 2014 23:47:26 +0900] rev 22288
largefiles: update largefiles even if rebase is aborted by conflict
Before this patch, largefiles in the working directory aren't updated
correctly, if rebase is aborted by conflict. This prevents users from
viewing appropriate largefiles while resolving conflicts.
While rebase, largefiles in the working directory are updated only at
successful committing in the special code path of
"lfilesrepo.commit()".
To update largefiles even if rebase is aborted by conflict, this patch
centralizes the logic of updating largefiles in the working directory
into the "mergeupdate" wrapping "merge.update".
This is a temporary way to fix with less changes. For fundamental
resolution of this kind of problems in the future, largefiles in the
working directory should be updated with other (normal) files
simultaneously while "merge.update" execution: maybe by hooking
"applyupdates".
"Action list based updating" introduced by hooking "applyupdates" will
also improve performance of updating, because it automatically
decreases target files to be checked.
Just after this patch, there are some improper things in "Case 0" code
path of "lfilesrepo.commit()":
- "updatelfiles" invocation is redundant for rebase
- detailed comment doesn't meet to rebase behavior
These will be resolved after the subsequent patch for transplant,
because this code path is shared with transplant.
Even though replacing "merge.update" in rebase extension by "hg.merge"
can also avoid this problem, this patch chooses centralizing the logic
into "mergeupdate", because:
- "merge.update" invocation in rebase extension can't be directly
replaced by "hg.merge", because:
- rebase requires some extra arguments, which "hg.merge" doesn't
take (e.g. "ancestor")
- rebase doesn't require statistics information forcibly displayed
in "hg.merge"
- introducing "mergeupdate" can resolve also problem of some other
code paths directly using "merge.update"
largefiles in the working directory aren't updated regardless of
the result of commands below, before this patch:
- backout (for revisions other than the parent revision of the
working directory without "--merge")
- graft
- histedit (for revisions other than the parent of the working
directory
When "partial" is specified, "merge.update" doesn't update dirstate
entries for standins, even though standins themselves are updated.
In this case, "normallookup" should be used to mark largefiles as
"possibly dirty" forcibly, because applying "normal" on lfdirstate
treats them as "clean" unexpectedly.
This is reason why "normallookup=partial" is specified for
"lfcommands.updatelfiles".
This patch doesn't test "hg rebase --continue", because it doesn't
work correctly if largefiles in the working directory are modified
manually while resolving conflicts. This will be fixed in the next
step of refactoring for largefiles.
All changes of tests/*.t files other than test-largefiles-update.t in
this patch come from invoking "updatelfiles" not after but before
statistics output of "hg.update", "hg.clean" and "hg.merge".
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 24 Aug 2014 23:47:26 +0900] rev 22287
largefiles: move "updatestandin" invocation to "hg.updaterepo" wrapper
Code paths below expect "hg.updaterepo" (or "hg.update" using it) to
execute linear merging:
- "update" in commands
- "postincoming" in commands, used for:
- "hg pull --update"
- "hg unbundle --update"
- "hgsubrepo.get" in subrepo
For linear merging with largefiles, standins should be updated
according to (possibly dirty) largefiles before "merge.update"
invocation to detect conflicts correctly.
Before this patch, only the "update" command can execute linear merging
correctly, because largefiles extension takes care of only it.
This patch moves "updatestandin" invocation from "overrideupdate" ("hg
update" wrapper) to "_hgupdaterepo" ("hg.updaterepo" wrapper) to
execute linear merging in "hg.updaterepo" correctly.
This is also a preparation to centralize the logic of updating
largefiles in the working directory into the function wrapping
"merge.update" in the subsequent patch.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 24 Aug 2014 23:47:26 +0900] rev 22286
largefiles: unlink standins not known to the restored dirstate at rollback
Before this patch, standinds not known to the restored dirstate at
rollback still exist after rollback of the parent of the working
directory, and they become orphans unexpectedly.
This patch unlinks standins not known to the restored dirstate.
This patch saves names of standins matched against not
"repo.dirstate[f] == 'a'" but "repo.dirstate[f] != 'r'" before
rollback, because branch merging marks files newly added to
dirstate as not "a" but "n".
Such standins will also become orphan after rollback, because they are
not known to the restored dirstate.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 24 Aug 2014 23:47:25 +0900] rev 22285
largefiles: restore standins according to restored dirstate
Before this patch, standins are restored from the NEW parent of the
working directory at "hg rollback", and this causes:
- standins removed in the rollback-ed revision are restored, and
become orphan, because they are already marked as "R" in the
restored dirstate and expected to be unlinked
- standins added in the rollback-ed revision are left as they were
before rollback, because they are not included in the new parent
(this may not be so serious)
This patch replaces the "merge.update" invocation with a specific
implementation to restore standins according to restored dirstate.
This is also the preparation to centralize the logic of updating
largefiles into the function wrapping "merge.update" in the subsequent
patch.
After that patch, "merge.update" will also update largefiles in the
working directory and be redundant for restoring standins only.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 24 Aug 2014 23:47:25 +0900] rev 22284
largefiles: restore standins from non branch-tip parent at rollback correctly
Before this patch, "hg rollback" can't restore standins correclty, if:
- old parent of the working directory is rollback-ed, and
- new parent of the working directory is not branch-tip
"overriderollback" uses "merge.update" as a kind of "revert" utility
to restore only standins with "node=None", and this makes
"merge.update" choose "branch-tip" revision as the updating target
unexpectedly.
Then, "merge.update" restores standins from the branch-tip revision
regardless of the parent of the working directory after rollback and
this may cause unexpected behavior.
This patch invokes "merge.update" with "node='.'" to restore standins
from the parent revision of the working directory.
In fact, this "merge.update" invocation will be replaced in the
subsequent patch to fix another problem, but this change is usefull to
inform reason why such complicated case should be tested.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 24 Aug 2014 23:47:25 +0900] rev 22283
largefiles: omit restoring standins if working parent is not rollbacked
For efficiency, this patch omits restoring standins and updating
lfdirstate, if the parent of the working directory is not rollbacked.
This patch adds the test not to confirm whether restoring is skipped
or not, but to detect unexpected regression in the future: it is
difficult to distinguish between skipping and perfectly restoring.
Matt Mackall <mpm@selenic.com> [Tue, 26 Aug 2014 13:11:53 +0200] rev 22282
repoview: fix 0L with pack/unpack for 2.4
Thomas De Schampheleire <thomas.de.schampheleire@gmail.com> [Mon, 25 Aug 2014 15:10:09 +0200] rev 22281
help: add pad function to template help
Commit
aa51392da507 introduced a pad function for use in templates, but did
not add the corresponding documentation to 'hg help templating'.
Mike Edgar <adgar@google.com> [Fri, 22 Aug 2014 16:40:34 -0400] rev 22280
histedit: use str.startswith to check for comments in action list
Mike Edgar <adgar@google.com> [Fri, 22 Aug 2014 16:37:55 -0400] rev 22279
histedit: drop duplicate line extracting keep option
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 23 Aug 2014 23:03:50 +0900] rev 22278
import: avoid editor invocation when importing with "--exact" for exact-ness
Before this patch, external editor is invoked when imported patch has
no commit message, even if "--exact" is specified. Then, exact-ness is
broken, because empty commit message causes failure of committing.
This patch avoids editor invocation at importing with "--exact" for
exact-ness, because commit message in the patch should be kept as it
is in such case, even if it is empty.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 23 Aug 2014 23:03:50 +0900] rev 22277
import: disallow meaningless combination of "--exact" and "--edit"
Before this patch, "hg import" allows combination of "--exact" and
"--edit", even though editing commit message breaks exact-ness.
This patch disallows meaningless combination of "--exact" and "--edit".
Razvan Cojocaru <razvan.cojocaru93@gmail.com> [Sun, 16 Mar 2014 17:31:31 +0200] rev 22276
config: highlight parse error caused by leading spaces (
issue3214)
Added "unexpected leading whitespace" message to parse error
when .hgrc has a line that starts with whitespace.
Helps new users unfamiliar with syntax of rc file.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 20 Aug 2014 22:52:56 -0700] rev 22275
test-config: add tests for invalid syntax
This was not tested and there is more to come in the next patch.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 19 Aug 2014 23:22:44 -0700] rev 22274
debugobsolete: add a --rev argument
This argument can be used to list markers relevant to a set of revisions. We
add a test for this option and the relevant computation in the same move.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 20 Aug 2014 18:11:23 -0700] rev 22273
obsolete: rename `allmarkers` to `getmarkers`
This function is going to gain a "nodes" argument to filter the markers to the
ones relevant to <nodes> only.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 20 Aug 2014 00:43:08 -0700] rev 22272
debugobsolete: add a way to record parent information
We add a ``--record-parents`` flag to debugobsolete. This can be used to record
parent information in the marker when the precursors are known locally. This
will be useful to test the "relevant markers" computation.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 19 Aug 2014 17:03:10 -0700] rev 22271
obsstore: add relevantmarkers method
We add a ``relevantmarkers`` method to fetch all markers that seem relevant to a
set of nodes. See function documentation about how this set is computed. This
will let us exchange only the markers that seem "relevant" to the set of
changesets related to a push or a pull.
The approach used to define "relevant" has been successfully tested in evolve
for 6 months.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 19 Aug 2014 16:53:53 -0700] rev 22270
obsstore: keep track of children information
We use the new `parents` field to build a dictionary of markers that touch
children of a node. This will be used to link prune markers to a set of
exchanged nodes.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 20 Aug 2014 17:36:54 -0700] rev 22269
push: check if local and remote support evolution during discovery
We can now directly prevent any evolution-related operation from happening by using
an empty set for outgoing markers. So we detect if no transfers should occur and
use an empty set in this case.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 19 Aug 2014 16:46:17 -0700] rev 22268
obsstore: drop outdated comment
This comment was associated with a now-defunct line.
Augie Fackler <raf@durin42.com> [Thu, 21 Aug 2014 10:07:30 -0400] rev 22267
cvsps: add two more tiebreakers in cscmp
test-convert-cvs.t has been a little flaky for a while now. Add an
extra tiebreaker in cscmp so that all the cases in the test will sort
reliably.
Without this patch, test-convert-cvs.t failed after 346 runs. With
this patch, I stopped trying to get it to fail after 615 runs. While
not conclusive, that makes me pretty optimistic that this is a working
fix.
Yuya Nishihara <yuya@tcha.org> [Sat, 16 Aug 2014 17:59:26 +0900] rev 22266
annotate: abort early if no file is specified
This change is intended to move the getdate function near the opmap table.
Siddharth Agarwal <sid0@fb.com> [Wed, 20 Aug 2014 15:07:25 -0700] rev 22265
purge: avoid full walks when directories aren't purged
If match.traversedir is not None, we're forced to do full walks. However when
we aren't purging directories we don't need to set match.traversedir to
anything.
This speeds up non-full walks such as the one hgwatchman makes possible. For
mozilla-central with hgwatchman enabled, 'hg purge --files' goes from 0.88
seconds to 0.22.
Siddharth Agarwal <sid0@fb.com> [Thu, 21 Aug 2014 16:05:29 -0700] rev 22264
clone: for local clones, copy over filtered branchcaches as well (
issue4286)
Local clones copy/hardlink over files directly, so the branchcaches should all
be valid. There's a slight chance that a read operation would update one of the
branchcaches, but we hold a lock over the source repo so they shouldn't cause
an invalid branchcache to be copied over, just a different, valid one.
Siddharth Agarwal <sid0@fb.com> [Thu, 21 Aug 2014 15:58:32 -0700] rev 22263
clone: for local clones, copy branchcache from the right location (
issue4286)
The unfiltered branchcache is in .hg/cache/branch2, not
.hg/store/cache/branch2.
Augie Fackler <raf@durin42.com> [Wed, 20 Aug 2014 14:33:59 -0400] rev 22262
obsolete: avoid 2-argument form of enumerate, which was new in Python 2.6
Augie Fackler <raf@durin42.com> [Wed, 20 Aug 2014 13:21:41 -0400] rev 22261
repoview: use util.sha1() instead of hashlib.sha1()
45b5cd948a4d accidentally broke Python 2.4 compatibility, this fixes it.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 18 Aug 2014 17:17:23 -0700] rev 22260
debugobsolete: display parents information from markers
Now that we have a new field, we need a way to visualize it.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 18 Aug 2014 17:14:27 -0700] rev 22259
obsmarkers: add a `parentnodes` method to retrieve parent information
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 18 Aug 2014 16:28:44 -0700] rev 22258
obsstore: also store the 'parents' field on disk
We now store the `parents` field on disk. We use the same strategy as for
`date`: We stick it into the metadata. This is slow and dirty, but this is also
the only way we currently have.
At some point we'll have a new obsstore format to store this properly.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 18 Aug 2014 17:06:08 -0700] rev 22257
obsstore: drop 'date' from the metadata dictionary
We are extracting the `date` information from the metadata at read time.
However, we failed to remove it from the metadata returned in the markers. This
is now fixed.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 18 Aug 2014 16:17:16 -0700] rev 22256
createmarkers: automatically record the parent of pruned changesets
We need this information to build the set of relevant markers during
exchanges. This can only be done at the `createmarkers` level since
the `obsstore.create` function does not have a repo and therefore has
no access to the parent information.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 18 Aug 2014 16:12:29 -0700] rev 22255
obsstore: add a `parents` argument to obsstore.create
We need a way to pass the information to the function. Some guru told me that
what's arguments are made for.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 18 Aug 2014 16:08:44 -0700] rev 22254
obsstore: add a `parents` field
This field is intended to store the parent of the precursor. This is useful to
attach pruned changesets to a set of exchanged changesets. We currently just
add the fields with a None value. None stands for "no data recorded".
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 19 Aug 2014 14:42:08 -0700] rev 22253
obsstore: add some documentation about the marker fields
As the number of fields grow, it makes sense to start documenting their contents.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 16 Aug 2014 10:43:59 +0900] rev 22252
transplant: change "editform" to distinguish merge commits from others
"editform" argument for "getcommiteditor" is decided according to the
format below:
EXTENSION[.COMMAND][.ROUTE]
- EXTENSION: name of extension
- COMMAND: name of command, if there are two or more commands in EXTENSION
- ROUTE: name of route, if there are two or more routes in COMMAND
This patch newly adds "normal" and "merge" as ROUTE, to distinguish
merge commits from other.
This patch adds 4 test patterns to test combination of "merge"(x2) and
"--continue"(x2).
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 16 Aug 2014 10:43:59 +0900] rev 22251
rebase: change "editform" to distinguish merge commits from others
"editform" argument for "getcommiteditor" is decided according to the
format below:
EXTENSION[.COMMAND][.ROUTE]
- EXTENSION: name of extension
- COMMAND: name of command, if there are two or more commands in EXTENSION
- ROUTE: name of route, if there are two or more routes in COMMAND
This patch newly adds "merge" as ROUTE, to distinguish merge commits
from other.
This patch passes bool as "ctxorbool" to "mergeeditform", because
working context has always 2 parents at this point. Dropping the
second parent of non-merging commits is executed in "concludenode".
Unlike other patches in this series (e.g. for "hg commit"), this patch
doesn't add "normal.normal"/"normal.merge" style ROUTEs, because there
is no "merge" case in "collapse" ROUTE.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 16 Aug 2014 10:43:59 +0900] rev 22250
import: change "editform" to distinguish merge commits from others
"editform" argument for "getcommiteditor" is decided according to the
format below:
COMMAND[.ROUTE]
- COMMAND: name of command
- ROUTE: name of route, if there are two or more routes in COMMAND
This patch uses "normal.normal" and "normal.merge" as ROUTE of
"editform" instead of "normal", to distinguish merge commits from
other in "hg import" without "--bypass" case.
This patch assumes "editform" variations for "hg import" below:
import.normal.normal
import.normal.merge
import.bypass.normal
import.bypass.merge
Unlike other patches in this series, this patch uses "editor.sh"
instead of "checkeditform.sh" for the name of the script to check
"HGEDITFORM", because it has to do more than checking "HGEDITFORM".
To invoke editor forcibly in "test-import-merge.t", this patch creates
the patch not having patch description as "merge.nomsg.diff".
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 16 Aug 2014 10:43:59 +0900] rev 22249
commit: change "editform" to distinguish merge commits from other (--amend)
"editform" argument for "getcommiteditor" is decided according to the
format below:
COMMAND[.ROUTE]
- COMMAND: name of command
- ROUTE: name of route, if there are two or more routes in COMMAND
This patch uses "amend.normal" and "amend.merge" as ROUTE of
"editform" instead of "amend", to distinguish merge commits from other
in "hg commit --amend" case.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 16 Aug 2014 10:43:59 +0900] rev 22248
commit: change "editform" to distinguish merge commits from others
"editform" argument for "getcommiteditor" is decided according to the
format below:
COMMAND[.ROUTE]
- COMMAND: name of command
- ROUTE: name of route, if there are two or more routes in COMMAND
This patch uses "normal.normal" and "normal.merge" as ROUTE of
"editform" instead of "normal", to distinguish merge commits from
others in "hg commit" without "--amend" case.
This patch assumes "editform" variations for "hg commit" below:
commit.normal.normal
commit.normal.merge
commit.amend.normal
commit.amend.merge
"mergeeditform" is factored out for subsequent patches. It takes
"ctxorbool" argument, because context object can't be passed in some
cases.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 16 Aug 2014 10:19:26 -0700] rev 22247
test-ssh: verify that stderr from remote is printed (
issue4336)
The issue fixed in the previous patch was uncovered by implementing an
extension that printed additional output locally before the push command
completed. This test emulates that.
If this change is applied before the previous patch, the test will fail
on Linux, with the local output being printed before the "remote: "
lines.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 16 Aug 2014 10:28:59 -0700] rev 22246
posix: implement readpipe using non-blocking I/O (
issue4336)
On Linux, fstat().st_size of a pipe always returns 0, even if the
pipe has data available for reading. This meant that reading from
and subsequently printing the stderr pipe content after wireproto
commands over SSH meant that available data wasn't being printed.
We now implement pipe reading on POSIX by doing a non-blocking
read for all available data.
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 15 Aug 2014 20:02:18 -0700] rev 22245
platform: implement readpipe()
Reading all available data from a pipe has a platform-dependent
implementation.
This patch establishes platform.readpipe() by copying the
inline implementation in sshpeer.readerr(). The implementations
for POSIX and Windows are currently identical. The POSIX
implementation will be changed in a subsequent patch.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 15 Aug 2014 19:18:21 -0700] rev 22244
exchange: remove duplicated addition to pushop.stepdone
Not sure how it got there but it is useless.
Augie Fackler <raf@durin42.com> [Mon, 18 Aug 2014 20:23:37 -0400] rev 22243
exchange: drop superfluous parens
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 15 Aug 2014 19:03:42 -0700] rev 22242
push: add bookmarks to the unified bundle2 push
We use the `pushkey` part to exchange bookmark updates within the unified
bundle2 push. Note that this only applies on update (moving a bookmark known on both
sides) since bookmark export (creation of a new bookmark on remote) is apparently
done outside of the _push function.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 15 Aug 2014 19:03:33 -0700] rev 22241
test-bundle2: add bookmark movement to the push test
If we add bookmarks to bundle2, we need a way to test the new code.
Tests are changed beforehand to highlight that inclusion of bookmarks in bundle
does not introduce any behavior changes.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 15 Aug 2014 18:40:57 -0700] rev 22240
push: use stepsdone to control bookmark push
If bookmark are to be integrated in the unified bundle2, we need a way to disable
the old-style push.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 15 Aug 2014 18:39:39 -0700] rev 22239
push: move bookmark discovery with other discovery steps
The discovery of necessary bookmark updates is now done within the "discovery
phase". This opens the door to the inclusion of bookmarks in a unified bundle2
push.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 15 Aug 2014 18:02:54 -0700] rev 22238
pushbookmark: split an ultra-long line into a saner version
We make a temporary variable for the remote bookmark data and we do not expand
all elements from `bookmark.compare` since we are going to use only one.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 25 Jun 2014 00:02:17 +0100] rev 22237
revert: drop dead code for untracked files
Untracked files are handled through status now.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 25 Jun 2014 00:01:30 +0100] rev 22236
revert: handle unknown files through status
This will allow us to drop the code dedicated to this special case.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 24 Jun 2014 23:55:43 +0100] rev 22235
revert: drop more dead code
Now that we detect all clean files, we do not need this clause anymore.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 02 Aug 2014 13:07:01 -0700] rev 22234
revert: add a message to noop action
This prepares for the arrival of a second "not touching file" action:
revert of an untracked file.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 01 Aug 2014 11:41:56 -0700] rev 22233
revert: simplify loop conditional
The two breaks can be joined into one. The code gains one level of indent.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 24 Jun 2014 18:04:13 +0100] rev 22232
revert: explode the action tuple in the for loop
noop is about to gain a message.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 02 Aug 2014 12:45:34 -0700] rev 22231
revert: use actions[...] in all disptable cases
1. Special cases are not special enough
2. There are two cases where nothing is done and a message is displayed. This
prepares it.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 24 Jun 2014 17:54:33 +0100] rev 22230
revset: factorize backup decision
The conditional controlling the creation of backup is fairly big. We move config
related decisions outside of the loop.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 24 Jun 2014 17:44:31 +0100] rev 22229
revert: use a flat dispatch table
Now that the table is simpler, remove one level of depth from it. This
simplifies its usage in the for loop.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 15 Aug 2014 18:26:21 -0700] rev 22228
pushbookmark: do not attempt to update bookmarks if the push failed (BC)
Before this patch, there was always an attempt to update bookmark even if prior
steps of the push failed. I cannot see a good semantic reason to do so. We
disable this possibility to simplify the push flow with bundle2. Bookmarks will
be included in the bundle and fail with other steps.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 15 Aug 2014 17:58:15 -0700] rev 22227
pushbookmark: remove a <cond> and <val> or <other> construct
We make the conditional explicit for the sake of readability.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 15 Aug 2014 16:31:06 -0700] rev 22226
pushbookmark: stop unrolling ancestors
Now that ancestors has the same boolean property as a list, we can stop unrolling
the set of ancestors. This should provide a significant speedup to this step as
ancestor objects are smart and lazy.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 15 Aug 2014 15:57:50 -0700] rev 22225
ancestors: add a __nonzero__ method
This allows using the object in a conditional the same way we can use list.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 15 Aug 2014 15:25:12 -0700] rev 22224
push: update bookmarks within the remote lock
Updating bookmarks is part of the push. It should be done within the same lock
as the other steps of the push.
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 18 Aug 2014 12:12:57 -0700] rev 22223
hgweb: refresh repository using URL not path (
issue4323)
hgweb detects out-of-date repository instances (using a highly
suspect mechanism that should probably be fixed) and obtains a new
repository object if needed.
This patch changes the repository object copy to use the repo URL
(instead of path). This preserves more information about the source
repository and allows bundles to be served through hgweb.
A test verifying that bundles can now be served properly via
`hg serve` has been added.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 19 Aug 2014 10:01:06 -0700] rev 22222
obsmarker: add `date` as an explicit field
The markers are now 5-item tuples (concluded by the date). The obsstore.fields
contents have been updated accordingly.
There is no change to the on-disk format yet, so the date has to be extracted
every time we read binary markers and re-injected each team we write them. This
introduces a slowdown that will be solved when a new version of the format is
added. Such a slowdown was already introduced by the evolve extension anyway.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 12 Aug 2014 01:49:38 -0700] rev 22221
obsstore: add fields attribute to track each field in a marker
We are going to increase the amount of data explicitly stored in obsolescence
markers. This mean we are going to have a longer tuple and some values will be
shuffled around. So we add a ``fields`` attribute to the obsstore class to
keep track of what entry is what. This will be useful for extensions and for
documentation purpose.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 13 Aug 2014 23:42:36 -0700] rev 22220
debugobsolete: explicitly display date in the output
As the date is becoming a first-class citizen, we are displaying it in an
explicit field. As a bonus it is now readable by humans.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 14 Aug 2014 12:59:48 -0700] rev 22219
obsolete: add a date argument to the `createmarkers` function
The function is now just passing the value to create markers.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 13 Aug 2014 23:25:07 -0700] rev 22218
debugobsolete: use the new date argument on obsstore.create
Now that we have this new argument, we can just use it.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 13 Aug 2014 22:44:47 -0700] rev 22217
obsstore: add an explicit `date` argument to obsstore.create
The date will become an official field in the markers (and ultimately
in the on-disk format). We start by making it an official argument for
the function.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 14 Aug 2014 01:53:07 -0700] rev 22216
obsolete: explicitly pass metadata argument using keyword argument
We are about to add more arguments to this function (date, parents, etc).
Passing metadata as a keyword argument gives us more flexibility when adding
them.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 15 Aug 2014 09:41:30 -0700] rev 22215
obsmarker: add a `flags` method
We introduce a proper method to access the flag information.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 15 Aug 2014 14:19:15 -0700] rev 22214
test-treediscovery: update output after merge
Recent change in the push process introduced an extra listing of the phase
name space before the push (on default). Meanwhile on default, a fix introduced
a new test with debug output.
We update the test output to be correct.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 24 Jun 2014 16:59:40 +0100] rev 22213
revert: add an XXX about rename tracking
We check for rename information in the dirstate. This is probably not enough to
preserve this behavior when using an explicit target rev.
I just spotted this while working on this code, but this is outside the scope
of my series so I'm just adding a comment to highlight this suspicious
situation.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 24 Jun 2014 17:39:43 +0100] rev 22212
revert: inline a now useless closure
Now that a single call site remains, we can just inline its content.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 24 Jun 2014 17:37:24 +0100] rev 22211
revert: remove code killed by the double status
All those checks were here to catch cases where files were not modified in
dirstate but were different in the target revision. This is now properly handled
by calling status on the target node too.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 24 Jun 2014 17:36:49 +0100] rev 22210
revert: drop `missingmodified` set
There cannot be any elements in this set since:
dsmodified &= modified
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 24 Jun 2014 17:28:20 +0100] rev 22209
revert: detect files added during a merge
In case of merge, file that are actually added can be reported as modified. This
is currently handled by special-case code. We detect it beforehand instead. This
will lets use remove the special-case code at some point in the future.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 02 Aug 2014 11:32:24 -0700] rev 22208
revert: simplify handling of `added` files
There are multiple possible cases for added files. But it's all handled by magic
much lower in the stack. We document them, simplify the codes and move on.
Matt Mackall <mpm@selenic.com> [Fri, 15 Aug 2014 11:48:05 -0500] rev 22207
merge with stable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 15 Aug 2014 23:05:53 +0900] rev 22206
rebase: use "rebase.collapse" as "editform" for "--collapse" always
Before this patch, if both "--message" and "--collapse" are specified
for "hg rebase", "rebaes.normal" is used as "editform" unexpectedly.
Unlike patches before and after in this series for improvement, this
is bug fix patch.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 15 Aug 2014 23:05:53 +0900] rev 22205
ui: invoke editor for committing with HGEDITFORM environment variable
At the external editor invocation for committing, the value specified
as "editform" for "cmdutil.getcommiteditor" is in "HGEDITFORM".
This enables external editor to do own customization according to
commit types.
Mads Kiilerich <madski@unity3d.com> [Fri, 15 Aug 2014 04:37:46 +0200] rev 22204
cleanup: name unused variables using convention of leading _
This helps checker tools ... and readability for those who knows and follows
the convention.
Mads Kiilerich <madski@unity3d.com> [Fri, 15 Aug 2014 16:20:47 +0200] rev 22203
cleanup: rename check-translation.py checker function - don't hide global var
Mads Kiilerich <madski@unity3d.com> [Fri, 15 Aug 2014 04:37:45 +0200] rev 22202
cleanup: remove some unused / duplicate imports
Mads Kiilerich <madski@unity3d.com> [Fri, 15 Aug 2014 04:37:46 +0200] rev 22201
cleanup: fix some list comprehension redefinitions of existing vars
In all the remaining cases the comprehension variable is used for the same
thing as a previous loop variable.
This will mute some pyflakes "list comprehension redefines" warnings.
Mads Kiilerich <madski@unity3d.com> [Fri, 15 Aug 2014 16:20:47 +0200] rev 22200
cleanup: avoid local vars shadowing imports
This will mute some pyflakes "import ... shadowed by loop variable" warnings.
Mads Kiilerich <madski@unity3d.com> [Fri, 15 Aug 2014 16:20:47 +0200] rev 22199
cleanup: avoid _ for local unused tmp variables - that is reserved for i18n
_ is usually used for i18n markup but we also used it for I-don't-care
variables.
Instead, name don't-care variables in a slightly descriptive way but use the _
prefix to designate unused variable.
This will mute some pyflakes "import '_' ... shadowed by loop variable"
warnings.
Mads Kiilerich <madski@unity3d.com> [Fri, 15 Aug 2014 04:37:45 +0200] rev 22198
cleanup: make sure we always access members of imported modules
This will make sure we get import errors, even if demandimport is enabled.
This will also mute some pyflakes 'imported but unused' warnings.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 15 Aug 2014 20:28:51 +0900] rev 22197
largefiles: update lfdirstate for unchanged largefiles during linear merging
Before this patch, linear merging of modified largefiles causes
an unexpected result, if (1) largefile collides with same-name normal one
in the target revision and (2) "local" largefile is chosen, even
though branch merging between such revisions works correctly.
Expected result of such linear merging is marking the largefile as
(re-)"added", but the actual result is marking it as "modified".
The standin of modified "local largefile" is not changed by linear
merging, and updating/merging update lfdirstate entries only for
largefiles of which standins are changed.
This patch adds the code path to update lfdirstate only for largefiles
of which standins are not changed.
In this case, "synclfdirstate" should be invoked with True as
"normallookup" argument always to force using "normallookup" on
dirstate for "n" files, because "normal" may mark target files as
"clean" unexpectedly.
To reduce cost of "lfile not in filelist", this patch converts
"filelist" to a "set" object: "filelist" is used only in (1) the newly
added code path and (2) the next line of "filelist = set(filelist)".
This is a temporary way to fix with less changes. For fundamental
resolution of this kind of problems in the future, "lfdirstate" should
be updated with "dirstate" simultaneously during "merge.update"
execution: maybe by hooking "recordupdates" (+ total refactoring
around lfdirstate handling)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 15 Aug 2014 20:28:51 +0900] rev 22196
largefiles: keep largefiles from colliding with normal one during linear merge
Before this patch, linear merging of modified or newly added largefile
causes unexpected result, if (1) largefile collides with same name
normal one in the target revision and (2) "local" largefile is chosen,
even though branch merging between such revisions doesn't.
Expected result of such linear merging is:
(1) (not yet recorded) largefile is kept in the working directory
(2) largefile is marked as (re-)"added"
(3) colliding normal file is marked as "removed"
But actual result is:
(1) largefile in the working directory is unlinked
(2) largefile is marked as "normal" (so treated as "missing")
(3) the dirstate entry for colliding normal file is just dropped
(1) is very serious, because there is no way to restore temporarily
modified largefiles.
(3) prevents the next commit from adding the manifest with correct
"removal of (normal) file" information for newly created changeset.
The root cause of this problem is putting "lfile" into "actions['r']"
in linear-merging case. At liner merging, "actions['r']" causes:
- unlinking "target file" in the working directory, but "lfile" as
"target file" is also largefile itself in this case
- dropping the dirstate entry for target file
"actions['f']" (= "forget") does only the latter, and this is reason
why this patch doesn't choose putting "lfile" into it instead of
"actions['r']".
This patch newly introduces action "lfmr" (LargeFiles: Mark as
Removed) to mark colliding normal file as "removed" without unlinking
it.
This patch uses "hg debugdirstate" instead of "hg status" in test,
because:
- choosing "local largefile" hides "removed" status of "remote
normal file" in "hg status" output, and
- "hg status" for "large2" in this case has another problem fixed in
the subsequent patch
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 15 Aug 2014 20:28:51 +0900] rev 22195
largefiles: add test for large/normal conflict at linear merging
Before this patch, there is no explicit test for it: test-
issue3084.t
seems to test such conflict only at branch merging.
This patch uses "[debug] dirstate.delaywrite" feature for the tests
expecting "M" status of largefiles, to confirm certainly whether files
are marked unexpectedly as "clean".
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 15 Aug 2014 20:28:51 +0900] rev 22194
largefiles: put whole "hgmerge" process into the same "wlock" scope
Before this patch, there are two distinct "wlock" scopes below in
"hgmerge":
1. "merge.update" via original "hg.merge" function
2. "updatelfiles" specific "wlock" scope (to synchronize largefile
dirstate)
But these should be executed in the same "wlock" scope for
consistency, because users of "hg.merge" don't get "wlock" explicitly
before invocation of it.
- merge in commands
This patch puts almost all of the original "hgmerge" implementation into
"_hgmerge" to reduce changes.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 15 Aug 2014 20:28:51 +0900] rev 22193
largefiles: put whole "hgupdaterepo" process into the same "wlock" scope
Before this patch, there are two distinct "wlock" scopes below in
"hgupdaterepo":
1. "merge.update" via original "hg.updaterepo" function
2. "updatelfiles" specific "wlock" scope (to synchronize largefile
dirstate)
In addition to them, "dirstate.walk" is executed between these "wlock"
scopes.
But these should be executed in the same "wlock" scope for
consistency, because many (indirect) users of "hg.updaterepo" don't
get "wlock" explicitly before invocation of it.
"hg.clean" is invoked without "wlock" from:
- mqrepo.restore in mq
- bisect in commands
- update in commands
"hg.update" is invoked without "wlock" from:
- clone in mq
- pullrebase in rebase
- postincoming in commands (used in "hg pull -u", "hg unbundle")
- update in commands
This patch puts almost all original "hgupdaterepo" implementation into
"_hgupdaterepo" to reduce changes.
Yuya Nishihara <yuya@tcha.org> [Fri, 15 Aug 2014 14:33:19 +0900] rev 22192
annotate: inline definition of decorate() functions
Yuya Nishihara <yuya@tcha.org> [Fri, 15 Aug 2014 14:29:30 +0900] rev 22191
annotate: rewrite long short-circuit statement by if-elif-else
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 24 Jun 2014 17:27:18 +0100] rev 22190
revert: use modified information from both statuses
Using status information against the target ensures we are catching all
files with modifications that need reverting.
We still need to distinguish fresh modifications for backup purpose.
test-largefile is affected because it reverted a file that needs no content
change.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 24 Jun 2014 16:57:16 +0100] rev 22189
revert: drop special case handling for file unknown in parent
We had a special case for file not caught by any categories. It was
aimed at files missing in wc and wc's parent but existing in the target
revision. This is now properly handled using status information.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 24 Jun 2014 16:53:22 +0100] rev 22188
revert: use "remove" information from both statuses
Using status information against the target to make sure we are catching all
files that need to be re-added.
We still need to distinguish fresh removal because they use a different
message.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 01 Aug 2014 18:27:47 -0700] rev 22187
revert: process removed files missing in target as clean
If a file does not exist in target and is marked as removed in the dirstate, we
can mark it as clean. There are no changes needed to revert it.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 31 Jul 2014 15:52:56 -0700] rev 22186
revert: also track clean files
Tracking clean files is the simplest way to be able to reports files that need
no changes. So we explicitly retrieve them.
This fixes a couple of test outputs where the lack of changes was not reported.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 01 Aug 2014 18:57:53 -0700] rev 22185
revert: triage "deleted" files into more appropriate categories
Status can return file as "deleted". This is only a special case
related to working directory state: file is recorded as tracked but no
file exists on disk. This will never be a state obtainable from
manifest comparisons.
"Deleted" files have another working directory status shadowed by the lack of
file. They will -alway- be touched by revert. The "lack of file" can be seen as
a modification. The file will never match the same "content" as in the revert
target. From there we have two options:
1. The file exists in the target and can be seen as "modified".
2. The file does not exist in the target and can be seen as "added".
So now we just dispatch elements from delete into appropriate categories.
Matt Mackall <mpm@selenic.com> [Fri, 15 Aug 2014 10:54:15 -0500] rev 22184
unshelve: silence internal revert
This prepares for upcoming revert changes.
Matt Mackall <mpm@selenic.com> [Fri, 15 Aug 2014 10:47:03 -0500] rev 22183
tests: fixup issue markers to make check-commit happy
Mads Kiilerich <madski@unity3d.com> [Fri, 15 Aug 2014 03:24:40 +0200] rev 22182
incoming: don't request heads that already are common
Pull would send a getbundle command where common heads were sent both as common
and head, even though there is no reason to request a common head.
The request was thus twice as big as necessary and more likely to hit HTTP
header size limits.
Instead, don't request heads that already are common.
This is fixed in bundlerepo.getremotechanges . It could perhaps also have been
fixed in discovery.findcommonincoming but that would have a bigger impact.
Mads Kiilerich <madski@unity3d.com> [Fri, 15 Aug 2014 03:24:40 +0200] rev 22181
tests: improve test coverage for discovery and actual parameters for pulling
Mads Kiilerich <madski@unity3d.com> [Fri, 15 Aug 2014 02:46:44 +0200] rev 22180
changectx: ancestor should only prefer merge.preferancestor if it is a revision
The value '*' currently designates that bid merge should be used. The best
way to test bid merge is to set preferancestor=* in the configuration file ...
but then it would abort with unknown revision '*' when other code paths ended
up in changectx.ancestor .
Instead, just skip and ignore the value '*' when looking for a preferred
ancestor.
Mads Kiilerich <madski@unity3d.com> [Fri, 15 Aug 2014 02:39:01 +0200] rev 22179
merge: show the scary multiple ancestor hint for merges only, not for updates
Updates with uncommited changes will always only have one ancestor - the parent
revision. Updates between existing revision should (and will) always give the
same result no matter which ancestor is used. The warning is thus only relevant
when doing a "real" merge.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 14 Aug 2014 16:26:41 -0700] rev 22178
discovery: prevent crash on unknown remote heads with old repo (
issue4337)
When a remote is not capable of the `branchmap` wireproto command, we denote
incoming heads with None. This leads to a crash in the code in charge of
displaying the list of unknown remote heads.
We now properly detect this case and display a shorter message in this case.
The reason for this `set([None])` value is now documented.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 14 Aug 2014 14:59:42 -0700] rev 22177
obsstore.create: add a simple safeguard against cyclic markers
We detect when there is a cycle in the marker itself (precursors being listed
as successors).
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 14 Aug 2014 14:57:03 -0700] rev 22176
debugobsolete: catch ValueError that may be raised by obsstore.create
There are already a couple of errors that obsstore.create can raise and we are
going to introduce a cycle check too.
Matt Mackall <mpm@selenic.com> [Thu, 14 Aug 2014 16:39:27 -0500] rev 22175
check-code: extend try/except/finally check for multiple except clauses
Matt Mackall <mpm@selenic.com> [Thu, 14 Aug 2014 16:39:02 -0500] rev 22174
repoview: fix try/except/finally for py2.4
Matt Mackall <mpm@selenic.com> [Thu, 14 Aug 2014 16:25:47 -0500] rev 22173
merge with stable
Matt Mackall <mpm@selenic.com> [Thu, 14 Aug 2014 16:18:45 -0500] rev 22172
test-run-tests: fix up slash/backslash on diff chunks for Windows
Siddharth Agarwal <sid0@fb.com> [Wed, 13 Aug 2014 15:55:45 -0700] rev 22171
test-largefiles: add test for hg log --follow --patch with path
This was the one case for test-largefiles that was not broken.
Siddharth Agarwal <sid0@fb.com> [Wed, 13 Aug 2014 15:51:33 -0700] rev 22170
largefiles: don't override matchandpats for always matchers (
issue4334)
This makes hg log --follow --patch work, since in cmdutil._makelogrevset we
use the non-follow matcher for hg log --follow --patch with no file arguments.
Siddharth Agarwal <sid0@fb.com> [Wed, 13 Aug 2014 15:18:41 -0700] rev 22169
largefiles: in overridelog, use non-lf matcher for patch generation (
issue4334)
This has actually been broken since at least Mercurial 2.8 -- hg log --patch
with largefiles only used to work when no largefiles existed. Rev
5809d62e7106
exposed this bug for all cases.
Siddharth Agarwal <sid0@fb.com> [Wed, 13 Aug 2014 15:13:50 -0700] rev 22168
largefiles: drop setting lfstatus in overridelog (
issue4334)
lfstatus should only be True for operations where we want standins to be
printed out. We explicitly do not want that for historical operations like log.
Other historical operations like hg diff -r A -r B don't print out standins
either.
This is required to fix
issue4334, but doesn't fix anything by itself. That's
why there aren't any tests accompanying this patch.
Siddharth Agarwal <sid0@fb.com> [Wed, 13 Aug 2014 15:17:03 -0700] rev 22167
cmdutil: add a hook for making custom non-follow log file matchers
This will be used by largefiles (and basically only by largefiles) in an
upcoming patch.
Siddharth Agarwal <sid0@fb.com> [Wed, 13 Aug 2014 15:15:13 -0700] rev 22166
cmdutil: rename _makelogfilematcher to _makefollowlogfilematcher
We're going to add a _makenofollowlogfilematcher in an upcoming patch.
Matt Mackall <mpm@selenic.com> [Thu, 14 Aug 2014 15:21:48 -0500] rev 22165
merge with stable
Yuya Nishihara <yuya@tcha.org> [Wed, 13 Aug 2014 22:22:24 +0900] rev 22164
alias: exit from bad definition by Abort
Yuya Nishihara <yuya@tcha.org> [Wed, 13 Aug 2014 22:18:28 +0900] rev 22163
alias: show one-line hint for command provided by disabled extension
It will be a hint of Abort exception. "hg help <alias>" provides the detailed
version as before.
Yuya Nishihara <yuya@tcha.org> [Wed, 13 Aug 2014 19:38:47 +0900] rev 22162
help: provide help of bad alias without executing aliascmd()
The output is slightly changed because of minirst formatting. Previously,
ui.pushbuffer() had no effect because "badalias" message was written to stderr.
"if not unknowncmd" should no longer be needed because there's no call loop.
Yuya Nishihara <yuya@tcha.org> [Wed, 13 Aug 2014 19:28:42 +0900] rev 22161
alias: provide "unknowncmd" flag to tell help to look for disabled command
This patch prepares for breaking the call loop: help.help_() -> cmdalias() ->
commands.help_() -> help.help_().
Yuya Nishihara <yuya@tcha.org> [Sat, 17 May 2014 21:13:31 +0900] rev 22160
alias: keep error message in "badalias" so that help can see it
Upcoming patches will
- change help_() to get badalias message without executing cmdalias()
- raise Abort on bad alias
Yuya Nishihara <yuya@tcha.org> [Sat, 17 May 2014 20:47:31 +0900] rev 22159
alias: add test for alias command provided by disabled extension
This should complete cases where "badalias" is set.
Siddharth Agarwal <sid0@fb.com> [Wed, 13 Aug 2014 23:21:52 -0700] rev 22158
alias: expand "$@" as list of parameters quoted individually (BC) (
issue4200)
Before this patch, there was no way to pass in all the positional parameters as
separate words down to another command.
(1) $@ (without quotes) would expand to all the parameters separated by a space.
This would work fine for arguments without spaces, but arguments with spaces
in them would be split up by POSIX shells into separate words.
(2) '$@' (in single quotes) would expand to all the parameters within a pair of
single quotes. POSIX shells would then treat the entire list of arguments
as one word.
(3) "$@" (in double quotes) would expand similarly to (2).
With this patch, we expand "$@" (in double quotes) as all positional
parameters, quoted individually with util.shellquote, and separated by spaces.
Under standard field-splitting conditions, POSIX shells will tokenize each
argument into exactly one word.
This is a backwards-incompatible change, but the old behavior was arguably a
bug: Bourne-derived shells have expanded "$@" as a tokenized list of positional
parameters for a very long time. I could find this behavior specified in IEEE
Std 1003.1-2001, and this probably goes back to much further before that.
Siddharth Agarwal <sid0@fb.com> [Wed, 13 Aug 2014 22:37:09 -0700] rev 22157
test-alias: add some tests to ensure we aren't double-substituting
An earlier iteration of an upcoming patch caused inadvertent
double substitution. Ensure we have test coverage for this.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 31 Jul 2014 16:03:26 -0700] rev 22156
revert: issue "no changes needed" message for files missing on both side
When a file was marked as removed in the working copy and did not existed in the
target of the revert, we did not issued any message pointing that no change was
needed to the file (implicitly saying that revert had changed the file).
We now properly issue a message in this situation. Tests change in and handful
of case where the message was documented as missing.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 24 Jun 2014 15:47:12 +0100] rev 22155
revert: call status against revert target too
We now call status against the target (and possibly against the working
directory parent is different). We do not use the information from the two
sources yet, but this is coming soon.
We need the status information aganst the dirstate in all case because we need
to be able to backup local modification.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 24 Jun 2014 15:35:43 +0100] rev 22154
revert: prefix variable names for dirstate status with "ds"
As we are going to introduce status again other revision we needs to distinguish
between data from dirstate status and the other one. We prefix the existing data
with "ds" to highlight this.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 24 Jun 2014 15:28:22 +0100] rev 22153
revert: move manifest membership condition outside of the loop
Currently, revset is using information from dirstate status and alter its
behavior whenever the file exist in the target manifest or not. This tests are
done a big for loop. We move this member ship testing outside of the loop and
simplifies associates data structure.
This is a step toward a cleaner implementation of revert based on status.
Mike Edgar <adgar@google.com> [Wed, 06 Aug 2014 16:51:41 -0400] rev 22152
histedit: add "roll" command to fold commit data and drop message (
issue4256)
This new histedit command (short for "rollup") is a variant of "fold" akin to
"hg amend" for working copy: it accumulates changes without interrupting
the user and asking for an updated commit message.
David Soria Parra <davidsp@fb.com> [Tue, 12 Aug 2014 09:39:14 -0700] rev 22151
repoview: cache hidden changesets
Use the introduced caching infrastructure to cache hidden
changesets. We crosscheck if the content of the cache unless
experimental.verifyhiddencache is set to False. This will be removed
in the future. Without crosschecking the caches speed ups hg status and
other commands:
without caching:
$ time hg status
hg status 0.72s user 0.20s system 100% cpu 0.917 total
with caching
$ time hg status
hg status 0.49s user 0.15s system 100% cpu 0.645 total
David Soria Parra <davidsp@fb.com> [Tue, 12 Aug 2014 16:48:54 -0700] rev 22150
repoview: add caching bits
Add a caching infrastructure to cache hidden changesets. The cache tries to read
the cache lazily and falls back to recomputing if no wlock can be obtain.
To validate the cache we store a sha of the obstore content and repo heads in
the beginning of the cache which we check every request.
David Soria Parra <davidsp@fb.com> [Wed, 06 Aug 2014 13:26:04 -0700] rev 22149
repoview: split _gethiddenblockers
Split up _gethiddenblockers into two categories: (1) "static' blockers
that solely rely on the contents of obstore and are visible children of
hidden changsets. (2) "dynamic" blockers, appearing by having wd parents,
bookmarks or tags pointing to hidden changesets.
We assume that (1) doesn't change often and can be easily cached with a good
invalidation strategy. (2) change often, but barely produce blockers, so we
can recompute them if necessary.
David Soria Parra <davidsp@fb.com> [Tue, 12 Aug 2014 16:42:24 -0700] rev 22148
repoview: use set for blockers
Blockers should be unique but tags and bookmarks could point to the same rev,
therefore use a set to ensure that we don't have duplicates.
Martin von Zweigbergk <martinvonz@gmail.com> [Wed, 13 Aug 2014 11:50:13 -0700] rev 22147
histedit: preserve initial author on fold (
issue4296)
When the authorship of the changeset folded in does not match that of
the base changeset, we currently use the configured ui.username
instead. This is especially surprising when the user is not the author
of either of the changesets. In such cases, the resulting authorship
(the user's) is clearly incorrect. Even when the user is folding in a
patch they authored themselves, it's not clear whether they should
take over the authorship. Let's instead keep it simple and always
preserve the base changeset's authorship. This is also how
"git rebase -i" handles folding/squashing.
Matt Mackall <mpm@selenic.com> [Wed, 13 Aug 2014 18:50:35 -0500] rev 22146
run-tests: fix some io ordering
backported from default
Matt Mackall <mpm@selenic.com> [Wed, 13 Aug 2014 15:06:58 -0500] rev 22145
merge with stable
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 25 Jun 2014 17:40:41 +0100] rev 22144
test-revert: add case where file is tracked but deleted in working directory
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 27 Jun 2014 18:25:19 +0200] rev 22143
test-revert: add case with untracked files with unique content
This test highlights similar misbehavior as its parent changesets.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 27 Jun 2014 18:23:45 +0200] rev 22142
test-revert: add case with untracked files with reverted content
This test highlights similar misbehaviors as its parent changesets.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 27 Jun 2014 18:10:45 +0200] rev 22141
test-revert: add case where file exists but is untracked in working directory
This test highlights a small misbehavior in output when reverting to another
revision not including the untracked file.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 27 Jun 2014 18:09:46 +0200] rev 22140
test-revert: add case where the file is marked as removed in the wc
Unlike untracked, the file is also missing from the working directory.
This test highlights a small misbehavior in output when reverting to another
revision.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 27 Jun 2014 18:08:16 +0200] rev 22139
test-revert: add case where wc content is different from "base" and "parent"
This test highlights a case where backups are not created and the user may
lose data.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 27 Jun 2014 18:07:33 +0200] rev 22138
test-revert: add case where wc content is already reverted to base content
This test highlights multiple misbehaviors of revert. We augment the test
comments accordingly.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 27 Jun 2014 18:02:09 +0200] rev 22137
test-revert: add case where file exists neither in "base" nor in "parent"
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 27 Jun 2014 18:01:16 +0200] rev 22136
test-revert: add case where the file is removed between "base" and "parent"
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 27 Jun 2014 18:00:49 +0200] rev 22135
test-revert: add case where file is unchanged between "base" and "parent"
This test highlights a minor misbehavior in the message displayed
during an explicit revert with a target revision.
Matt Mackall <mpm@selenic.com> [Wed, 13 Aug 2014 14:05:08 -0500] rev 22134
test-run-tests: fix stdout/stderr io ordering
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 25 Jun 2014 17:37:13 +0100] rev 22133
test-revert: add case where file is added between "base" and "parent"
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 17:22:57 -0500] rev 22132
merge with stable
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 25 Jun 2014 17:31:53 +0100] rev 22131
test-revert: add methodical revert to "base" with explicit file path
We now also test reverting file to another revision's content. However
this differs from previously introduced test by using the explicit path
of each "case file" when calling revert. This should result in the
same result regarding file content and backup creation, but the output
of the `hg revert` call should differ.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 25 Jun 2014 17:22:47 +0100] rev 22130
test-revert: add methodical revert with explicit file path
We now also test reverting file to the working directory parent
content. However this differs from the previously introduced test by using
the explicit path of each "case file" when calling revert. This should
result in the same result regarding file content and backup creation,
but the output of the `hg revert` call should differ.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 25 Jun 2014 17:16:05 +0100] rev 22129
test-revert: add methodical revert to "base"
We now also test reverting s file to the content of another revision. This is
still done using the `--all` flag.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 25 Jun 2014 17:03:55 +0100] rev 22128
test-revert: add methodical revert to parent for working directory
Now that we can automatically generate states, we need to actually run
revert on them and check the result. While running such tests we are
checking multiple elements. The output of the `hg revert` command, the
resulting content of file, and the creation of backup file.
The first practical test is using the simple case `hg revert --all`, reverting
all files to working directory parent content.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 25 Jun 2014 17:24:18 +0100] rev 22127
test-revert: display the list of all generated cases
This will help to track all existing cases.
(still very simple now)
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 27 Jun 2014 16:08:09 +0200] rev 22126
test-revert: also create a text version of the snapshot
The text version is just a list of existing files with their content. We use a
small custom script for that.
This is going to be very useful for comparing revert results with
revert target content.
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 12:53:23 -0500] rev 22125
hg-test-mode: make exit code highlight work again
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 25 Jun 2014 16:37:06 +0100] rev 22124
test-revert: prepare methodical testing of revert cases
We introduce a script to generate revert cases and use it to prepare a test
repo. See the inline documentation for details.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 25 Jun 2014 15:59:21 +0100] rev 22123
test-revert: drop useless comments
There are multiple comments explaining the expected output of commands. This is
an old relic of the pre-unified test era. We remove them for uselessness.
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 11:17:29 -0500] rev 22122
run-tests: don't double lines on build failure output
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 11:10:57 -0500] rev 22121
test-run-tests: filter pwd alias for Windows
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 11:02:30 -0500] rev 22120
run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 04:50:58 -0500] rev 22119
merge with stable
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 04:11:32 -0500] rev 22118
help: normalize helplist hints
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 04:00:42 -0500] rev 22117
help: fold repeatable option message into option table header
This will hopefully conserve some limited user attention.
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 03:53:33 -0500] rev 22116
help: roll option list header into option formatter
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 03:42:09 -0500] rev 22115
help: refactor helplist optlist mess
No output changes
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 03:25:51 -0500] rev 22114
help: normalize topic and extension verbose hints
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 03:18:50 -0500] rev 22113
help: normalize hint about enabling extensions
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 03:12:24 -0500] rev 22112
help: normalize extension shadow hint
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 03:09:26 -0500] rev 22111
help: improve command summary hint
This adds our normal hint parentheses, corrects the command syntax
(consider config), and corrects the fullness of help you'll get.
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 03:01:37 -0500] rev 22110
help: tweak --verbose command help hint
We used to have two slightly different message which people wouldn't read...
and then complain that they couldn't find the global options or examples.
So we unify them into one message that's upfront that STUFF IS
INTENTIONALLY HIDDEN and that looks more like our normal hint style.
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 00:42:05 -0500] rev 22109
hg-test-mode: don't highlight variables in output
This was disabling highlighting the rest of the line for $REASONS.
Instead, we only highlight when we think we're on a 'command' line.
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 00:40:24 -0500] rev 22108
test-run-tests: test --view
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 00:33:48 -0500] rev 22107
run-tests: don't show 'i' for tests that don't match a keyword
Matt Mackall <mpm@selenic.com> [Tue, 12 Aug 2014 02:40:42 -0500] rev 22106
repoview: filter tags to non-existent nodes from blockers (
issue4328)
Michael O'Connor <mkoconnor@gmail.com> [Mon, 11 Aug 2014 23:45:08 -0400] rev 22105
revset: bookmark revset interprets 'literal:' prefix correctly (
issue4329)
Matt Mackall <mpm@selenic.com> [Mon, 11 Aug 2014 17:45:50 -0500] rev 22104
run-tests: attempt to fix iolock handling
Ideally, when using -j and -i together, when a prompt comes up, we'd
like all other output to wait (but testing to continue!). This gets
other output to wait by adding back a bunch of the locking that
formerly existed. We switch to a recursive lock to deal with the
restructuring due to unittest compatibility.
Running tests continue to run, but now the scheduler doesn't schedule
any new tasks while waiting at a prompt because no task slots become
available due to result output happening in the thread and
blocking on the iolock.
Matt Mackall <mpm@selenic.com> [Mon, 11 Aug 2014 13:10:00 -0500] rev 22103
unbundle: fix pyflakes warning about wc
Matt Mackall <mpm@selenic.com> [Mon, 11 Aug 2014 11:24:05 -0500] rev 22102
merge with stable
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 02 Aug 2014 17:04:53 -0700] rev 22101
check-code: allow an escape pattern to be specified for testpattern
Before this patch it was impossible to introduce a #no-xxx comment to disable a
test pattern warning.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 02 Aug 2014 17:01:55 -0700] rev 22100
check-code: capture "wc" as a word
Otherwise entries such as "wcchange" give false negative
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 25 Jun 2014 15:58:05 +0100] rev 22099
test-revert: improve comment
We highlight the behavior tested by each sections. (This is a gratuitous
improvement before significant upgrade of the test and massive refactoring of
the revert code)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 11 Aug 2014 22:29:43 +0900] rev 22098
largefiles: synchronize lfdirstate with dirstate after automated committing
Before this patch, after successful "hg rebase" of the revision
removing largefiles, "hg status" may still show ""R" for such
largefiles unexpectedly.
"lfilesrepo.commit" executes the special code path for automated
committing while rebase/transplant, and lfdirstate entries for removed
files aren't updated in this code path, even after successful
committing.
Then, "R" entries still existing in lfdirstate cause unexpected "hg
status" output.
This patch synchronizes lfdirstate with dirstate after automated
committing.
This patch passes False as "normallookup" to "synclfdirstate", because
modified files in "files()" of the recent (= just committed) context
should be "normal"-ed.
This is a temporary way to fix with less changes. For fundamental
resolution of this kind of problems in the future, lfdirstate should
be updated with dirstate simultaneously. Hooking "markcommitted" of
ctx in "localrepository.commitctx" may achieve this.
This problem occurs, only when (1) the parent of the working directory
is rebased and (2) it removes largefiles, because:
- if the parent of the working directory isn't rebased, returning to
the initial revision (= update) after rebase hides this problem
- files added on "other" branch (= rebase target) are treated not as
"added" but as "modified" (= "normal" status and "unset"
timestamp) at merging
This patch tests also the status of added largefile, but it is only
for avoiding regression.
In addition to conditions above, "hg status" must not take existing
files to reproduce this problem, because existing files make
"match._files" not empty in "lfilesrepo.status" code path below:
def sfindirstate(f):
sf = lfutil.standin(f)
dirstate = self.dirstate
return sf in dirstate or sf in dirstate.dirs()
match._files = [f for f in match._files
if sfindirstate(f)]
Not empty "match._files" prevents "status" on lfdirstate from
returning the result containing problematic "R" files.
This is reason why "large1" (removed) and "largeX" (added) are checked
separately in this patch.
Problematic code path in "lfilesrepo.commit" is used also by "hg
transplant", but this problem doesn't occur at "hg transplant",
because invocation of "updatelfiles" after transplant-ing in
"overridetransplant" causes cleaning lfdirstate up.
This patch tests also "hg transplant" as same as "hg rebase", but it
is only for avoiding regression.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 11 Aug 2014 22:29:43 +0900] rev 22097
largefiles: drop orphan entries from lfdristat at "hg rollback"
Before this patch, newly added (but not yet committed) largefiles
aren't treated as unknown ("?") after "hg rollback".
After "hg rollback", lfdirstate still contains "A" status entries for
such largefiles, even though corresponding entries for standins are
already dropped from dirstate.
Such "orphan" entries in lfdirstate prevent unknown (large)files in
the working directory from being listed up in "unknown" list. The code
path in "if working" route of "lfilesrepo.status" below drops
largefiles tracked in lfdirstate from "unknown" list:
lfiles = set(lfdirstate._map)
# Unknown files
result[4] = set(result[4]).difference(lfiles)
This patch drops orphan entries from lfdristate at "hg rollback".
This is a temporary way to fix with less changes. For fundamental
resolution of this kind of problems in the future, lfdirstate should
be rollback-ed as a part of transaction, as same as dirstate.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 11 Aug 2014 22:29:43 +0900] rev 22096
largefiles: restore R status of removed largefiles correctly at "hg rollback"
Before this patch, removed or forgotten largefiles aren't treated as
removed ("R") after "hg rollback". Removed ones are treated as missing
("!") and forgotten ones are treated as clean ("C") unexpectedly.
"overriderollback" uses "normallookup" to restore status in lfdirstate
for largefiles other than ones not added in rollback-ed revision, but
this isn't correct for removed (or forgotten) largefiles.
This patch uses "lfutil.synclfdirstate" to restore "R" status of
removed (or forgotten) largefiles correctly at "hg rollback".
This is a temporary way to fix with less changes. For fundamental
resolution of this kind of problems in the future, lfdirstate should
be rollback-ed as a part of transaction, as same as dirstate.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 11 Aug 2014 22:29:43 +0900] rev 22095
largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 11 Aug 2014 22:29:43 +0900] rev 22094
largefiles: put whole rollback-ing process into the same "wlock" scope
Before this patch, there are three distinct "wlock" scopes in
"overriderollback":
1. "localrepository.rollback" via original "rollback" command,
2. "merge.update" for reverting standin files only, and
3. "overriderollback" specific "wlock" scope (to synchronize
largefile dirstate)
But these should be executed in the same "wlock" scope for
consistency.
Matt Mackall <mpm@selenic.com> [Mon, 11 Aug 2014 09:35:24 -0500] rev 22093
tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com> [Sun, 10 Aug 2014 23:13:12 -0500] rev 22092
hg-test-mode: colorize HGFOO and TESTFOO environment variables
Matt Mackall <mpm@selenic.com> [Sun, 10 Aug 2014 23:09:23 -0500] rev 22091
unbundle: don't advance bookmarks (
issue4322) (BC)
This behavior didn't make much sense and interacts badly with things
that use unbundle internally like shelve. Presumably, the original
rationale was that since bundles didn't contain bookmarks, this gave a
sense of keeping bookmarks up-to-date like would happen with a
corresponding pull. However, since it only updated the current active
bookmark, and bare update already did that anyway, this is pretty
slim.
Notably, the corresponding test actually works better without this
feature.
Matt Mackall <mpm@selenic.com> [Sun, 10 Aug 2014 15:26:33 -0500] rev 22090
merge with stable
Matt Mackall <mpm@selenic.com> [Sun, 10 Aug 2014 15:26:12 -0500] rev 22089
tests: more bundle2 non-binary file test fixes
Matt Mackall <mpm@selenic.com> [Sun, 10 Aug 2014 14:30:30 -0500] rev 22088
merge with stable
Matt Mackall <mpm@selenic.com> [Sun, 10 Aug 2014 13:53:36 -0500] rev 22087
hgweb: avoid config object race with hgwebdir (
issue4326)
Turns out hgwebdir passes full repo objects to each hgweb request
instance, but with a shared baseui. We explicitly break the sharing.
Matt Mackall <mpm@selenic.com> [Sat, 09 Aug 2014 16:15:52 -0500] rev 22086
test-commandserver.py: filter path separator
Was failing on Windows:
-bundle.mainreporoot=$TESTTMP/repo
+bundle.mainreporoot=$TESTTMP\repo
Matt Mackall <mpm@selenic.com> [Sat, 09 Aug 2014 16:06:01 -0500] rev 22085
merge with stable
Matt Mackall <mpm@selenic.com> [Sat, 09 Aug 2014 16:05:03 -0500] rev 22084
merge with i18n
Matt Mackall <mpm@selenic.com> [Sat, 09 Aug 2014 16:04:36 -0500] rev 22083
i18n-ru: fix RST breakage spotted by test-gendoc
test-gendoc complained:
% extracting documentation from ru
checking for parse errors
+ gendoc-ru.txt:5686: (WARNING/2) Field list ends without a blank
line; unexpected unindent.
+ gendoc-ru.txt:8327: (WARNING/2) Definition list ends without a
blank line; unexpected unindent.
Matt Mackall <mpm@selenic.com> [Sat, 09 Aug 2014 15:46:54 -0500] rev 22082
i18n-ru: undo fix buildbot breakage
Buildbot complained:
$ python check-translation.py *.po
+ ru.po:9576:fatal(promptchoice): number of choices differs between
msgid and msgstr
+ [1]
Prompt text was obviously wrong.. because it didn't include a prompt.
Matt Mackall <mpm@selenic.com> [Fri, 08 Aug 2014 17:45:36 -0500] rev 22081
contrib: add emacs mode for *.t files
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 07 Aug 2014 14:11:36 -0700] rev 22080
phase: attach phase to the transaction instead of the lock
The phase cache file is no longer written on lock release, it is now handled by
the transaction (as changesets and obsolescence markers are).
(Hooray)
As we stop relying on the lock to write phase, repos with no existing phase
information will need to wait for a phase move or a strip to happen in order to
get the first write in the `phaseroots` file. This explain the change in
test-inherit-mode.t.
This should not have any side effects but in very obscure cases where
people interact with pre-2.1 and post-2.1 versions of Mercurial on the
same repo while having MQ patches applied but the MQ extension
disabled from time to time. A case unlikely enough to not be worth
preserving the old behavior with awful hacks.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 07 Aug 2014 14:41:00 -0700] rev 22079
phase: extract the phaseroots serialization in a dedicated method
In most case, the file creation logic will be handled by the
transaction itself. The write method has to stay around for the case
where the repository is modified outside a transaction (strip).
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 07 Aug 2014 14:40:02 -0700] rev 22078
transaction: add a file generation mechanism
A new `transaction.addfilegenerator` function is added. It allows external code
to register files to be generated. See inline documentation for details.
It is important to gather all file creation logic on the transaction
as at some point we'll want to mimic the "pre-transaction-commit"
logic that we use for revlog. I'm refering to the logic that lets
hooks see the result of the transaction before it actually gets
committed.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 07 Aug 2014 10:54:17 -0700] rev 22077
transaction: backup file in a dedicated "namespace"
File backup may conflict with other "journal.*" file. We add a fixed part in the
backup name file to prevent it.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 07 Aug 2014 11:56:32 -0700] rev 22076
transaction: use `self.journal` to create backup file
Transaction journal name is "journal" in most case, but it can be something else.
We use the appropriate attribute to create the file.
Sean Farley <sean.michael.farley@gmail.com> [Tue, 17 Jun 2014 20:55:06 -0700] rev 22075
memctx: add note about p2
Sean Farley <sean.michael.farley@gmail.com> [Fri, 25 Jul 2014 20:20:26 -0500] rev 22074
memfilectx: add remove and write methods
Similar to the previous patch for workingfilectx, this patch will allow
abstracting localrepo.remove / write method to refactor working directory code
but instead operate on files in memory.
Sean Farley <sean.michael.farley@gmail.com> [Wed, 02 Jul 2014 14:01:01 -0500] rev 22073
workingfilectx: add remove and write methods
This patch will allow abstracting localrepo.remove / write method to refactor
working directory code.
Sean Farley <sean.michael.farley@gmail.com> [Fri, 25 Jul 2014 19:36:01 -0500] rev 22072
memctx: create a filectxfn if it is not callable
This will allow future patches to construct a memctx based on another context
or any other store-type object.
Augie Fackler <raf@durin42.com> [Thu, 07 Aug 2014 11:39:19 -0400] rev 22071
test-patchbomb.t: work around Python change
d579866d6419 (
issue4188)
Python 2.7.7 and later (as well as some ubuntu/debian packages of
2.7.6) include a fix that makes the email module more pedantically
correct for MIME boundaries, but this breaks our tests. We work around
this by filtering the output of any 'hg email' invocations in the test
that produce MIME messages.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 05 Aug 2014 23:52:21 -0700] rev 22070
phase: add a transaction argument to retractboundary
We now pass a transaction option to this phase movement function. The
object is currently not used by the function, but it will be in the
future.
All call sites have been updated. Most call sites were already enclosed in a
transaction for a long time. The handful of others have been recently
updated in previous commit.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 06 Aug 2014 01:54:19 -0700] rev 22069
phase: add a transaction argument to advanceboundary
We now pass a transaction option to this phase movement function. The object
is currently not used by the function, but it will be in the future.
All call sites have been updated. Most call sites were already enclosed in a
transaction for a long time. The handful of others have been recently
updated in previous commit.
The retractboundary function remains to be upgraded.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 06 Aug 2014 00:54:37 -0700] rev 22068
pull: pre-filter remote phases before moving local ones
We were relying on the phase internals to filter out redundant phase
information from remove. However as we plan to integrate phase
movement inside the transaction, we want to avoid useless transaction
creation on no-op pulls.
Therefore we filter out all the information that already matches the current
repository state. This will let us create a transaction only when there is
actual phase movement needed.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 06 Aug 2014 01:40:51 -0700] rev 22067
test-check-commit-hg.t: automatically test all 'draft() and ::.' changesets
We introduce a test-check-commit-hg.t file that will happily run the
check-commit file on all draft changeset under the working directory.
This should help newcomers to catch up with the rules. (And will helps old timer
from time to time).
Alexander Sauta <demosito@gmail.com> [Mon, 04 Aug 2014 16:08:42 +0100] rev 22066
i18n-ru: syncronized with
45a01832cad1
Alexander Sauta <demosito@gmail.com> [Mon, 04 Aug 2014 16:21:58 +0100] rev 22065
merge with i18n
Alexander Sauta <demosito@gmail.com> [Mon, 04 Aug 2014 18:51:18 +0400] rev 22064
i18n-ru: sync with
ad56fc55cbc3 (fuzzies)
Alexander Sauta <demosito@gmail.com> [Fri, 01 Aug 2014 19:49:28 +0400] rev 22063
i18n-ru: sync with
ad56fc55cbc3 (missing strings)
Vladimir Zakharov <zakharov.vv@gmail.com> [Wed, 30 Jul 2014 17:24:08 +0400] rev 22062
i18n-ru: update 'revisions' translation
Vladimir Zakharov <zakharov.vv@gmail.com> [Tue, 29 Jul 2014 19:08:41 +0400] rev 22061
i18n-ru: update 'revsets' translation
Alexander Sauta <demosito@gmail.com> [Wed, 16 Oct 2013 08:22:06 +0100] rev 22060
i18n-ru: prompts fixed
Matt Mackall <mpm@selenic.com> [Thu, 07 Aug 2014 14:58:12 -0500] rev 22059
whitespace: nuke triple blank lines in **.py
Matt Mackall <mpm@selenic.com> [Thu, 07 Aug 2014 14:57:20 -0500] rev 22058
check-commit: spot growing whitespace
We discourage PEP-8-style double blank lines, spot them creeping in.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Thu, 24 Jul 2014 15:06:08 -0400] rev 22057
strip: remove -b/--backup codepaths
cset
ba3bc6474bbf has removed this option. This commit just tidies the
code that was associated to it. It also fixes the internal calls to
the strip() function.
Before this change, any function that thought it would want as a final
safety to keep a partial backup bundle (bundling changes not linearly
related to the current change being stripped), had to explicitly pass
a backup="strip" option. With this change, these backups are always
kept in case of an exception and always removed if there is no
exception. Only full backups can be specified with backup=True or no
full backups with backup=False.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Thu, 07 Aug 2014 12:51:45 -0400] rev 22056
simplemerge: remove dead code
The following functions in simplemerge are dead code. I reran "make
test-merge*" after this change, and it passed. Looks like cruft that
we've been carrying since we nabbed this code from bzr.
Sean Farley <sean.michael.farley@gmail.com> [Tue, 17 Jun 2014 20:26:51 -0700] rev 22055
basectx: add missing, merge, and branch args to dirty method
This fixes a discrepency for basectx and classes that inherit from it. Now
callers can pass these arguments to any context without an exception being
raised.
Sean Farley <sean.michael.farley@gmail.com> [Fri, 25 Jul 2014 20:11:47 -0500] rev 22054
basefilectx: move isexec and islink from memfilectx
This will be used in the future for creating memctx objects from other
store-type objects, such as a patch store or even another context.
Matt Mackall <mpm@selenic.com> [Wed, 06 Aug 2014 12:16:58 -0500] rev 22053
tests: fix pyflakes test whitespace breakage
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 06 Aug 2014 00:54:58 -0700] rev 22052
pushkey: wrap pushkey phase movement in a transaction
Phases are not yet inside the transaction, but we need to prepare for it. So we
wrap the phase movement inside a transaction.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 06 Aug 2014 00:54:15 -0700] rev 22051
push: wrap local phase movement in a transaction
Phases are not yet inside the transaction, but we need to prepare for it. So we
wrap the phase movement inside a transaction.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 06 Aug 2014 00:50:53 -0700] rev 22050
phase: wrap `hg phases` phase movement in a transaction
Phases are not yet inside the transaction, but we need to prepare for it. So we
wrap the phase movement inside a transaction.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 06 Aug 2014 00:50:07 -0700] rev 22049
mq: wrap qimport phase movement in a transaction
Phases are not yet inside the transaction, but we need to prepare for it. So we
wrap the phase movement inside a transaction.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 06 Aug 2014 00:48:51 -0700] rev 22048
mq: wrap qfinish phase movement in a transaction
Phases are not yet inside the transaction, but we need to prepare for it. So we
wrap the phase movement inside a transaction.
Matt Mackall <mpm@selenic.com> [Wed, 06 Aug 2014 11:53:08 -0500] rev 22047
tests: change some #ifs to #requires
Matt Mackall <mpm@selenic.com> [Wed, 06 Aug 2014 11:43:59 -0500] rev 22046
tests: replace exit 80 with #require
Matt Mackall <mpm@selenic.com> [Wed, 06 Aug 2014 10:34:54 -0500] rev 22045
run-tests: add #require to abort full test
This allows nuking a bunch of ugly hghave || exit 80 lines.
Augie Fackler <raf@durin42.com> [Tue, 05 Aug 2014 21:17:11 -0400] rev 22044
run-tests: add support for xunit test reports
The Jenkins CI system understands xunit reports natively, so this will
be helpful for anyone that wants to use Jenkins for testing hg or
extensions that use run-tests.py for their testing.
Matt Mackall <mpm@selenic.com> [Wed, 06 Aug 2014 02:45:55 -0500] rev 22043
contrib: add check-commit hook script to sanity-check commits
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 05 Aug 2014 13:51:13 -0700] rev 22042
shelve: use `targetphase` while unbundling
This removes the last manual phase movement in shelve.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 05 Aug 2014 13:49:38 -0700] rev 22041
changegroup: add a `targetphase` argument to `addchangegroup`
This argument controls the phase used for the added changesets. This can be
useful to unbundle in "secret" phase as required by shelve.
This change aims at helping high-level code get rid of manual phase
movement. An important milestone for having phases part of the transaction.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 05 Aug 2014 14:37:45 -0700] rev 22040
shelve: do not retract phase boundary by hand
We rely on the internal mechanism to commit the changeset in the right state.
This is similar to what the mq extension is doing.
This is an important change as we plan to move phase movement with the
transaction. Avoiding phase movement from high level code will avoid them the
burden of transaction handling. It is also important to limit the need for
transaction handling as this limits the odds of people messing up. Most common
expected mess-up is to use a different transaction for changesets creation and
phase adjustment.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 05 Aug 2014 18:53:05 -0700] rev 22039
commit: update the --secret code to use backupconfig and restoreconfig
Those dedicated methods also preserve all associated data (eg:
sources, lack of value).
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 05 Aug 2014 13:22:44 -0700] rev 22038
rebase: do not retract phase boundary by hand
We rely on the internal mechanism to commit the changeset in the right phase.
This similar to what the mq extension is doing.
This is an important change as we plan to includes phase movement within the
transaction. Avoiding phase movement from high-level code will avoid the
burden of transaction handling. It is also important to limit the need for
transaction handling as this limits the odds of people messing up. Most common
expected mess-up is code using a different transaction for changeset creation
and phase adjustment.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 05 Aug 2014 21:16:24 -0700] rev 22037
config: fix restoreconfig of non existing config
When the section, but no value existed, the `del` call raised a key error.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 31 Jul 2014 13:51:17 -0700] rev 22036
push: use stepsdone for obsmarkers push
We do not have infrastructure to include obsolescence markers in the bundle2
push from core. But extensions may so we make sure it would not be sent twice.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 05 Jul 2014 19:32:20 +0200] rev 22035
push: introduce a discovery step for obsmarker
The discovery step is still not doing anything smart. But this will allow
extension to wrap it.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 05 Jul 2014 19:17:09 +0200] rev 22034
push: move the list of obsmarker to push into the push operation
The list is now carried in the push operation, this will let
extensions override it.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 04 Jul 2014 19:31:49 +0200] rev 22033
push: explicitly encode a list of obsmarkers to push
Sending obsmarkers through pushkey requires extra encoding (since pushkey can't
take binary content) and slicing (since we can hit http header limit). As we
send all obsolescences markers that exists in the repo for each push, we used to
just look at the content of the "obsolete" pushkey namespace (already encoded
and sliced) and send its
content.
However, future changeset will make it possible to push only parts of the
obsmarkers. To prepare this we now explicitly encode a list of markers. The list
of markers is still "all of them" but future changeset will takes care
of that.
The new code uses a "_protected" method but that seems reasonable to keep it
private as this is the is the only external user of it and this whole pushing
obsmarker through pushkey things in fairly hacky already)
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 04 Aug 2014 16:32:41 -0700] rev 22032
merge-tools: add a `premerge=keep-merge3` config option
This value leaves premerge markers that includes the merge base too. This is a
the same as what `internal:merge3` would do.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 04 Aug 2014 16:58:39 -0700] rev 22031
merge-tools: make premerge valid values extensible
We want to introduce a version leaving merge3 style markers.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 04 Aug 2014 16:50:15 -0700] rev 22030
mergetools: add a test for premerge --keep
It works! No surprise.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 04 Aug 2014 16:39:47 -0700] rev 22029
test-merge-tools: introduce a "revision 4" that merges with conflict
We need conflicts to test the premerge=keep configuration.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Tue, 05 Aug 2014 14:58:45 -0700] rev 22028
merge: add an internal:merge3 tool
This variant gives access to a feature already present in ``internal:merge``:
displaying merge base content.
In the basic merge (calling ``hg merge``) case, including more context to the
merge markers is an interesting addition.
But this extra information is the only viable option in case conflict from
grafting (, rebase, etc…).
When grafting ``source`` on ``destination``, the parent of ``source`` is
used as the ``base``. When all three changesets add content in the same
location, the marker for ``source`` will contains both ``base`` and ``source``
content. Without the content of base exposed, there is no way for the user
to discriminate content coming from ``base`` and content commit from ``source``.
Practical example (all addition are in the same place):
* ``destination`` adds ``Dest-Content``
* ``base`` adds ``Base-Content``
* ``source`` adds ``Src-Content``
Grafting ``source`` on ``destination`` will produce the following conflict:
<<<<<<< destination
Dest-Content
=======
Base-Content
Src-Content
>>>>>>> source
This that case there is no way to distinct ``base`` from ``source``. As a result
content from ``base`` are likely to slip in the resolution result.
However, adding the base make the situation very clear:
<<<<<<< destination
Dest-Content
||||||| base
Base-Content
======= base
Base-Content
Src-Content
>>>>>>> source
Once the base is added, the addition from the grafted changeset is made clear.
User can compare the content from ``base`` and ``source`` to make an enlightened
decision during merge resolution.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 05 Aug 2014 15:09:54 -0700] rev 22027
internal:merge: update documentation
Highlight the fact there are two regions in the markers and what their contents
are. This prepares for the arrival of merge3.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 05 Aug 2014 15:17:38 -0700] rev 22026
filemerge: allow the formatting of three labels instead of two
When a third label is provided (to included the base content) it is properly
processed as the two others. Nothing changes if only two labels are provided.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 05 Aug 2014 15:12:22 -0700] rev 22025
filemerge: drop extra white space
There should be no white space around the brace.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 05 Aug 2014 15:10:50 -0700] rev 22024
simplemerge: support three labels when merging
If a third label is provided it will be used for the "base" content:
<<<<<<< local
content
from
local
||||||| base
former
common
=======
other
conflicting
>>>>>>> other
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 05 Aug 2014 14:56:25 -0700] rev 22023
simplemerge: burn "minimal" feature to the ground
Matt Mackall said:
The goal of simplemerge should have always been to be a drop-in
replacement for RCS merge. Please nuke this minimization thing entirely.
This whole things is now dead.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 29 Jul 2014 11:55:01 -0700] rev 22022
merge: use no-minimal for premerge too
ecc1387138ba disabled minimal for `internal:merge` but forgot to also disabled
it for premerge. This is now done.
This gives me an occasion to shamelessly includes my explanation of why this
minimisation feature must disappear:
[this is why it's pointless to reject patches with misspellings in the
description - mpm]
Detailled explanation
=====================
The ``simplemerge`` code use in ``internal:merge`` has a feature called
"minimization". It reprocess conflicting chunks to find common changes
inside them and excludes such common sections from the marker.
This approach seems a significant win at first glance but produces very
confusing results in some other cases.
Simple example
--------------
A simple example is enough to show the benefit of this feature. In this merge,
both sides change all numbers from letters to digits, but one side is also
changing some values.
$ cat << EOF > base
> Small Mathematical Series.
> One
> Two
> Three
> Four
> Five
> Hop we are done.
> EOF
$ cat << EOF > local
> Small Mathematical Series.
> 1
> 2
> 3
> 4
> 5
> Hop we are done.
> EOF
$ cat << EOF > other
> Small Mathematical Series.
> 1
> 2
> 3
> 6
> 8
> Hop we are done.
> EOF
In the minimalists case, the markers focus on the disagreement between the two
sides.
$ $TESTDIR/../contrib/simplemerge --print local base other
Small Mathematical Series.
1
2
3
<<<<<<< local
4
5
=======
6
8
>>>>>>> other
Hop we are done.
warning: conflicts during merge.
[1]
In the non minimalist case, the whole chunk is included in the conflict marker.
Making it harder spot actual differences.
$ $TESTDIR/../contrib/simplemerge --print --no-minimal local base other
Small Mathematical Series.
<<<<<<< local
1
2
3
4
5
=======
1
2
3
6
8
>>>>>>> other
Hop we are done.
warning: conflicts during merge.
[1]
Practical Advantages of minimalisation: merge of grafted change
---------------------------------------------------------------
This feature can be very useful when a change have been grafted in another
branch and then some change have been made to the grafted code.
$ cat << EOF > base
> # empty file
> EOF
$ cat << EOF > local
> def somefunction(one, two):
> some = one
> stuff = two
> are(happening)
> here()
> EOF
$ cat << EOF > other
> def somefunction(one, two):
> some = one
> change = two
> are(happening)
> here()
> EOF
The minimalist case recognises the grafted content as similar and highlight the
actual change.
$ $TESTDIR/../contrib/simplemerge --print local base other
def somefunction(one, two):
some = one
<<<<<<< local
stuff = two
=======
change = two
>>>>>>> other
are(happening)
here()
warning: conflicts during merge.
[1]
Again, the non-minimalist case produces a larger conflict. Making it harder to
spot the actual conflict.
$ $TESTDIR/../contrib/simplemerge --print --no-minimal local base other
<<<<<<< local
def somefunction(one, two):
some = one
stuff = two
are(happening)
here()
=======
def somefunction(one, two):
some = one
change = two
are(happening)
here()
>>>>>>> other
warning: conflicts during merge.
[1]
Practical disadvantage: multiple functions on each side
---------------------------------------------------------------
So, if this "minimalist" help so much, why introduce a setting to disable it?
The issue is that this minimisation will grab any common lines for breaking
chunks. This may result in partial context when solving a merge. The most
simple example is a merge where both side added some (different) functions
separated by blank lines. The "minimalist" approach will recognise the blank
line as "common" and over slice the chunks, turning a simple conflict case into
multiple pairs of conflicting functions.
$ cat << EOF > base
> # empty file
> EOF
$ cat << EOF > local
> def function1():
> bla()
> bla()
> bla()
>
> def function2():
> ble()
> ble()
> ble()
> EOF
$ cat << EOF > other
> def function3():
> bli()
> bli()
> bli()
>
> def function4():
> blo()
> blo()
> blo()
> EOF
The minimal case presents each function as a separated context.
$ $TESTDIR/../contrib/simplemerge --print local base other
<<<<<<< local
def function1():
bla()
bla()
bla()
=======
def function3():
bli()
bli()
bli()
>>>>>>> other
<<<<<<< local
def function2():
ble()
ble()
ble()
=======
def function4():
blo()
blo()
blo()
>>>>>>> other
warning: conflicts during merge.
[1]
The non-minimalist approach produces a simpler version with more context in
each block. Solving such conflicts is usually as simple as dropping the 3 lines
dedicated to markers.
$ $TESTDIR/../contrib/simplemerge --prin --no-minimal local base other
<<<<<<< local
def function1():
bla()
bla()
bla()
def function2():
ble()
ble()
ble()
=======
def function3():
bli()
bli()
bli()
def function4():
blo()
blo()
blo()
>>>>>>> other
warning: conflicts during merge.
[1]
Practical disaster: programing language have a lot of common line
=================================================================
If only blank lines between function where the only frequent content of a code
file. But programming language tend to repeat them self much more often. In that
case, the minimalist approach turns a simple conflict into a massive mess.
Consider this example where two unrelated functions are added on each side.
Those function shares common programming constructs by chance.
$ cat << EOF > base
> # empty file
> EOF
$ cat << EOF > local
> def longfunction():
> if bla:
> foo
> else:
> bar
> try:
> ret = some stuff
> except Exception:
> ret = None
> if ret is not None:
> return ret
> return 0
>
> def shortfunction(foo):
> goo()
> ret = foo + 5
> return ret
> EOF
$ cat << EOF > other
> def otherlongfunction():
> for x in xxx:
> if coin:
> break
> tutu
> else:
> bar()
> baz()
> ret = week()
> try:
> groumpf = tutu
> fool()
> except Exception:
> zoo()
> pool()
> if cond:
> return ret
>
> # some big block
> ret ** 6
> koin()
> return ret
> EOF
The minimalist approach will hash the whole conflict into small chunks that
does not match any meaningful semantic and are impossible to solve.
$ $TESTDIR/../contrib/simplemerge --print local base other
<<<<<<< local
def longfunction():
if bla:
foo
=======
def otherlongfunction():
for x in xxx:
if coin:
break
tutu
>>>>>>> other
else:
<<<<<<< local
bar
=======
bar()
baz()
ret = week()
>>>>>>> other
try:
<<<<<<< local
ret = some stuff
=======
groumpf = tutu
fool()
>>>>>>> other
except Exception:
<<<<<<< local
ret = None
if ret is not None:
=======
zoo()
pool()
if cond:
>>>>>>> other
return ret
<<<<<<< local
return 0
=======
>>>>>>> other
<<<<<<< local
def shortfunction(foo):
goo()
ret = foo + 5
=======
# some big block
ret ** 6
koin()
>>>>>>> other
return ret
warning: conflicts during merge.
[1]
The non minimalist approach will properly produce a single set of conflict
markers. Highlighting that the two chunk are unrelated. Such conflict from
unrelated content added at the same place is usually solved by dropping the
marker an keeping both content. Something impossible with minimised markers.
$ $TESTDIR/../contrib/simplemerge --prin --no-minimal local base other
<<<<<<< local
def longfunction():
if bla:
foo
else:
bar
try:
ret = some stuff
except Exception:
ret = None
if ret is not None:
return ret
return 0
def shortfunction(foo):
goo()
ret = foo + 5
return ret
=======
def otherlongfunction():
for x in xxx:
if coin:
break
tutu
else:
bar()
baz()
ret = week()
try:
groumpf = tutu
fool()
except Exception:
zoo()
pool()
if cond:
return ret
# some big block
ret ** 6
koin()
return ret
>>>>>>> other
warning: conflicts during merge.
[1]
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 09 Jun 2014 23:37:36 -0700] rev 22021
merge: refactor labels selection code
The code is simplified to prepare the future introduction of a third labels for
the merge base.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 01 Jul 2014 23:08:17 +0200] rev 22020
push: include phase push in the unified bundle2 push
Phase push is now included in the same bundle2 push as changesets. We use
multiple pushkey parts to transmit the information. Note that phase moves are
still not part of the repository "transaction".
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 30 Jul 2014 19:26:47 -0700] rev 22019
push: perform phases discovery before the push
This will allow including phase information in the same bundle2 as the
changesets.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 01 Jul 2014 17:06:02 +0200] rev 22018
push: make discovery extensible
We need to gather all discovery before the unified bundle2 push. We
use the same pattern as bundle2 parts generation.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 30 Jul 2014 19:04:50 -0700] rev 22017
push: rework the bundle2partsgenerators logic
Instead of a single list of functions, we now have a list of names and
a mapping of names to functions. This simplifies wrapping of steps
from extensions. In the same move, declaration becomes decorator-based
(syntax sugar, nom nom nom!).
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 01 Jul 2014 17:27:22 +0200] rev 22016
push: move common heads computation into pushop
Now that both options (push succeed or fall back) live in pushop, we
can move the common heads computation there too. It is a very commonly
accessed attribute so it makes a lot of sense to have it in pushop.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 01 Jul 2014 17:20:47 +0200] rev 22015
push: extract fallback heads computation into pushop
Similar motivation to `futureheads`, we extract the computation into pushop
to make it available early to all possibly interested parties.
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 01 Jul 2014 17:20:31 +0200] rev 22014
push: extract future heads computation into pushop
Bundle2 will allow pushing all different parts of the push in a single bundle.
This mean that the discovery for each part needs to be done before trying to
push. Currently we may have different behaviors for phases and obsolescence markers
when the push of changesets fails. For example, information may still be
exchanged for a part of the history where changesets are common but where
phases mismatch. So the preparation of the push need to determine what
information need to be pushed in both situations. And it needs a different set of
heads for this. Therefore we are moving heads computation within pushop for easy
access by all parties. We start with the simplest set of heads.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 02 Aug 2014 21:46:27 +0900] rev 22013
cmdutil: use '[committemplate]' section like as map file for style definition
Before this patch, each template definitions for 'changeset*' in
'[committemplate]' section have to be written fully from scratch,
even though many parts of them may be common.
This patch uses '[committemplate]' section like as the map file for
the style definition. All items other than 'changeset' can be referred
from others.
This can reduce total cost of template customization in
'[committemplate]' section.
When the commit template other than '[committemplate] changeset'
is chosen by 'editform', putting '[committemplate] changeset'
value into the cache of the templater causes unexpected result,
because the templater stores the specified (= chosen) template
definition into own cache as 'changeset' at construction time.
This is the reason why '[committemplate] changeset' can't be referred
from others.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 02 Aug 2014 21:46:27 +0900] rev 22012
cmdutil: look commit template definition up by specified 'editform'
Before this patch, '[committemplate] changeset' definition is shared
between all actions invoking 'commitforceeditor()'.
This prevents template definition from showing action specific
messages: for example, 'hg tag --remove' may need specific
message to call attention, but showing it may be redundant for
other actions.
This patch looks commit template definition up by specified
'editform' introduced by prior patches. 'editform' are
dot-separated list of names, and treated as hierarchical one.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 02 Aug 2014 21:46:27 +0900] rev 22011
import: pass 'editform' argument to 'cmdutil.getcommiteditor'
This patch passes 'editform' argument according to the format below:
COMMAND[.ROUTE]
- ROUTE: name of route, if there are two or more routes in COMMAND
In this patch, 'normal' and 'bypass' are used as ROUTE.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 02 Aug 2014 21:46:27 +0900] rev 22010
commit: pass 'editform' argument to 'cmdutil.getcommiteditor'
This patch passes 'editform' argument according to the format below:
COMMAND[.ROUTE]
- ROUTE: name of route, if there are two or more routes in COMMAND
In this patch, 'normal' and 'amend' are used as ROUTE.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 02 Aug 2014 21:46:27 +0900] rev 22009
tag: pass 'editform' argument to 'cmdutil.getcommiteditor'
This patch passes 'editform' argument according to the format below:
COMMAND[.ROUTE]
- ROUTE: name of route, if there are two or more routes in COMMAND
In this patch, 'add' and 'remove' are used as ROUTE
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 02 Aug 2014 21:46:27 +0900] rev 22008
graft: pass 'editform' argument to 'cmdutil.getcommiteditor'
This patch passes 'editform' argument according to the format below:
COMMAND[.ROUTE]
- ROUTE: name of route, if there are two or more routes in COMMAND
In this patch, ROUTE is omitted.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 02 Aug 2014 21:46:27 +0900] rev 22007
backout: pass 'editform' argument to 'cmdutil.getcommiteditor'
This patch passes 'editform' argument according to the format below:
COMMAND[.ROUTE]
- ROUTE: name of route, if there are two or more routes in COMMAND
In this patch, ROUTE is omitted..
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 02 Aug 2014 21:46:26 +0900] rev 22006
transplant: pass 'editform' argument to 'cmdutil.getcommiteditor'
This patch passes 'editform' argument according to the format below:
EXTENSION[.COMMAND][.ROUTE]
- EXTENSION: name of extension
- COMMAND: name of command, if there are two or more commands in EXTENSION
- ROUTE: name of route, if there are two or more routes in COMMAND
In this patch, COMMAND and ROUTE are omitted.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 02 Aug 2014 21:46:26 +0900] rev 22005
shelve: pass 'editform' argument to 'cmdutil.getcommiteditor'
This patch passes 'editform' argument according to the format below:
EXTENSION[.COMMAND][.ROUTE]
- EXTENSION: name of extension
- COMMAND: name of command, if there are two or more commands in EXTENSION
- ROUTE: name of route, if there are two or more routes in COMMAND
In this patch:
- 'shelve' is used as COMMAND
- ROUTE is omitted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 02 Aug 2014 21:46:26 +0900] rev 22004
rebase: pass 'editform' argument to 'cmdutil.getcommiteditor'
This patch passes 'editform' argument according to the format below:
EXTENSION[.COMMAND][.ROUTE]
- EXTENSION: name of extension
- COMMAND: name of command, if there are two or more commands in EXTENSION
- ROUTE: name of route, if there are two or more routes in COMMAND
In this patch:
- COMMAND is omitted
- 'normal' and 'collapse' are used as ROUTE
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 02 Aug 2014 21:46:26 +0900] rev 22003
mq: pass 'editform' argument to 'cmdutil.getcommiteditor'
This patch passes 'editform' argument according to the format below:
EXTENSION[.COMMAND][.ROUTE]
- EXTENSION: name of extension
- COMMAND: name of command, if there are two or more commands in EXTENSION
- ROUTE: name of route, if there are two or more routes in COMMAND
In this patch:
- MQ command names (qnew/qrefresh/qfold) are used as COMMAND
- ROUTE is omitted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 02 Aug 2014 21:46:26 +0900] rev 22002
histedit: pass 'editform' argument to 'cmdutil.getcommiteditor'
This patch passes 'editform' argument according to the format below:
EXTENSION[.COMMAND][.ROUTE]
- EXTENSION: name of extension
- COMMAND: name of command, if there are two or more commands in EXTENSION
- ROUTE: name of route, if there are two or more routes for COMMAND
In this patch:
- 'edit', 'fold', 'mess' and 'pick' are used as COMMAND
- ROUTE is omitted
'histedit.pick' case is very rare, but possible if:
- target revision causes conflict at merging (= requires '--continue'), and
- description of it is empty ('hg commit -m " "' can create such one)
In the code path for 'histedit --continue' (the last patch hunk),
'canonaction' doesn't contain the entry for 'fold', because 'fold'
action causes:
- using temporary commit message forcibly, and
- making 'editopt' False always (= omit editor invocation if commit
message is specified)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 02 Aug 2014 21:46:26 +0900] rev 22001
gpg: pass 'editform' argument to 'cmdutil.getcommiteditor'
This patch passes 'editform' argument according to the format below:
EXTENSION[.COMMAND][.ROUTE]
- EXTENSION: name of extension
- COMMAND: name of command, if there are two or more commands in EXTENSION
- ROUTE: name of route, if there are two or more routes in COMMAND
In this patch, 'sign' is used as COMMAND, and ROUTE is omitted.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 02 Aug 2014 21:46:26 +0900] rev 22000
fetch: pass 'editform' argument to 'cmdutil.getcommiteditor'
This patch passes 'editform' argument according to the format below:
EXTENSION[.COMMAND][.ROUTE]
- EXTENSION: name of extension
- COMMAND: name of command, if there are two or more commands in EXTENSION
- ROUTE: name of route, if there are two or more routes in COMMAND
In this patch, COMMAND and ROUTE are omitted.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 02 Aug 2014 21:46:26 +0900] rev 21999
cmdutil: introduce 'editform' to distinguish the purpose of commit text editing
This information will be used to switch '[committemplate] changeset'
definition according to its purpose in the subsequent patch.
This information also makes it easier to hook commit text editing only
in the specific cases.
Durham Goode <durham@fb.com> [Tue, 22 Jul 2014 22:40:16 -0700] rev 21998
log: allow patterns with -f
It's not uncommon for a user to want to run log with a pattern or directory name
on the history of their current commit. Currently we prevent that, but
I can't think of any reason to continue blocking that.
This commit removes the restriction and allows 'hg log -f <dir/pat>'
Augie Fackler <raf@durin42.com> [Mon, 28 Jul 2014 19:48:59 -0400] rev 21997
run-tests: fix test result counts with --keyword specified or skips occurring
This preserves the current behavior that excludes ignored or skipped
tests from the number of tests run, except when tests are ignored due
to the --retest flag.
Augie Fackler <raf@durin42.com> [Tue, 29 Jul 2014 22:35:59 -0400] rev 21996
test-run-tests.t: add tests for skips
This will make some minor behavior changes in a future patch more obvious.
Augie Fackler <raf@durin42.com> [Mon, 28 Jul 2014 20:54:14 -0400] rev 21995
test-run-tests.t: add extra data to tests for keyword tests
This adds a fair amount of overall instability in the enclosing .t. As
such, this is performed in its own commit, and a test for --keyword on
run-tests.t will be added in a followup change.
Matt Mackall <mpm@selenic.com> [Mon, 04 Aug 2014 15:24:57 -0500] rev 21994
purge: drop stat import
Matt Mackall <mpm@selenic.com> [Mon, 04 Aug 2014 14:42:24 -0500] rev 21993
run-tests: add iolock to failure output
Matt Mackall <mpm@selenic.com> [Mon, 04 Aug 2014 14:32:34 -0500] rev 21992
merge with stable
Sean Farley <sean.michael.farley@gmail.com> [Fri, 01 Aug 2014 13:09:06 -0500] rev 21991
color: pass on key error for win32 (
issue4298)
This is a quick fix for some consoles on windows (consoles that are not mingw
based) so that the debugcolor command doesn't throw a KeyError when effects
aren't supported (e.g. italic).
Siddharth Agarwal <sid0@fb.com> [Fri, 01 Aug 2014 18:30:18 -0700] rev 21990
context: call normal on the right object
dirstate.normal is the method that marks files as unchanged/normal.
Rev
20a30cd41d21 started caching dirstate.normal in order to improve
performance. However, there was an error in the patch: taking the wlock, under
some conditions depending on platform, can cause a new dirstate object to be
created. Caching dirstate.normal before calling wlock would then cause the
fixup calls below to be on the old dirstate object, effectively disappearing
into the ether.
On Unix and Unix-like OSes, the condition under which we create a new dirstate
object is 'the dirstate file has been modified since the last time we opened
it'. This happens pretty rarely, so the object is usually the same -- there's
little impact.
On Windows, the condition is 'always'. This means files in the lookup state are
never marked normal, so the bug has a serious performance impact since all the
files in the lookup state are re-read every time hg status is run.
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 31 May 2014 16:48:29 -0700] rev 21989
getbundle: add a ``cg`` boolean argument to control changegroup inclusion
The ``getbundle`` function was initially design to return a changegroup bundle.
However, bundle2 allows transmitting a wide range of data. Some bundle2
requests may not include a changegroup at all.
Before this changeset, the client would request a changegroup for
``heads=[nullid]`` and receive an empty changegroup.
We introduce an official boolean parameter, ``cg``, that can be set
to false to disable changegroup generation on getbundle. A new bundle2
capability is introduced to let the client know.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 22 May 2014 17:20:52 -0700] rev 21988
wireproto: add a ``boolean`` type for getbundle parameters
This will be used to control inclusion of some parts in a bundle2.
Yuya Nishihara <yuya@tcha.org> [Sun, 03 Aug 2014 19:19:23 +0900] rev 21987
i18n: detect UI language without POSIX-style locale variable on Windows (BC)
On Windows, it isn't common to set LANG environment variable. This patch makes
gettext honor Windows-style UI language [1] if no locale variables are set.
Because of this change, LANG=C or HGPLAIN must be set in order to disable
translation on non-English Windows.
[1]: http://msdn.microsoft.com/en-us/library/
dd374098(v=VS.85).aspx
Siddharth Agarwal <sid0@fb.com> [Fri, 01 Aug 2014 22:16:54 -0700] rev 21986
locate: use ctx.matches instead of ctx.walk
On mozilla-central, which is around 100,000 files, best of 5:
$ hg --time locate > /dev/null
before: real 1.460 secs (user 1.140+0.000 sys 0.320+0.000)
after: real 0.620 secs (user 0.610+0.000 sys 0.020+0.000)
$ hg --time locate README > /dev/null
before: real 0.630 secs (user 0.330+0.000 sys 0.290+0.000)
after: real 0.120 secs (user 0.110+0.000 sys 0.020+0.000)
Larger repositories see correspondingly larger performance gains.
Siddharth Agarwal <sid0@fb.com> [Fri, 01 Aug 2014 22:07:29 -0700] rev 21985
context: add a method to efficiently filter by match if possible
For non-working contexts, walk and matches do the same thing. For working
contexts, walk stats all the files and looks for unknown files, while matches
just filters the dirstate by match.
Siddharth Agarwal <sid0@fb.com> [Fri, 01 Aug 2014 22:05:16 -0700] rev 21984
dirstate: add a method to efficiently filter by match
Current callers that require just this data call workingctx.walk, which calls
dirstate.walk, which stats all the files. Even worse, workingctx.walk looks for
unknown files, significantly slowing things down, even though callers might not
be interested in them at all.
Christian Ebert <blacktrash@gmx.net> [Sat, 02 Aug 2014 09:45:21 +0100] rev 21983
purge: prefer util.unlink instead over own removefile
Christian Ebert <blacktrash@gmx.net> [Sat, 02 Aug 2014 09:44:45 +0100] rev 21982
keyword: bump copyright year
Christian Ebert <blacktrash@gmx.net> [Sat, 02 Aug 2014 09:44:11 +0100] rev 21981
keyword: really clean up kwdemo temp tree
Siddharth Agarwal <sid0@fb.com> [Sat, 26 Jul 2014 14:54:36 -0700] rev 21980
graft: make --force apply across continues (
issue3220)
Since --force determines the list of revisions to be grafted, it doesn't really
make sense for users to have to keep typing --force --continue as they continue
grafting.
Siddharth Agarwal <sid0@fb.com> [Fri, 25 Jul 2014 18:21:16 -0700] rev 21979
graft: allow regrafting ancestors with --force (
issue3220)
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 04 Jul 2014 19:52:39 +0200] rev 21978
test-obsolete: better logging template
Gratuitous improvement of the test readability.
anuraggoel <anurag.dsps@gmail.com> [Thu, 26 Jun 2014 01:22:50 +0530] rev 21977
run-tests: '--time' option provide more details to Linux users
As our tests execute in child processes, this patch uses os.times()
module in replace of time.time() module to provide additional info like
user time and system time spent by child's processes along with real elapsed
time taken by a process.
There is one limitation of this patch. It can work only for Linux users and
not for Windows.
"os.times" module returns a 5-tuple of a floaing point numbers.
1) User time
2) System time
3) Child's user time
4) Child's system time
5) Ellapsed real time
On Windows, only the first two items are filled, the others are zero.
Therefore, below test cases does not break on Windows but instead gives the
zero value.
Matt Mackall <mpm@selenic.com> [Fri, 01 Aug 2014 18:32:52 -0500] rev 21976
merge with stable
Matt Mackall <mpm@selenic.com> [Fri, 01 Aug 2014 18:23:18 -0500] rev 21975
Added signature for changeset
3178e4989202
Matt Mackall <mpm@selenic.com> [Fri, 01 Aug 2014 18:22:56 -0500] rev 21974
Added tag 3.1 for changeset
3178e4989202
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 01 Aug 2014 13:01:35 -0700] rev 21973
status: do not reverse deleted and unknown
When reversing a status, trading "added" and "removed" make sense.
Reversing "deleted" and "unknown" does not. We stop doing it.
The reversing is documented in place for the poor soul not even able to remember
the index of all status elements by heart.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 01 Aug 2014 12:49:00 -0700] rev 21972
status: don't drop unknown and ignored information (
issue4321)
By the magic of code movement, we ended up dropping unknown and ignored
information when comparing the working directory with a non-parent revision.
Let's stop doing it and add a test.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 01 Aug 2014 13:13:24 -0700] rev 21971
status: explicitly exclude removed file from unknown and ignored
Changeset
64fe488b5179 introduced a test to validate that file were not reported
twice when both unknown and removed. This behavior change was introduced by
65cdc6bab91e alongside a bug that dropped ignored and unknown completely
(
issue4321). As we are going to fix the bug, we need a proper implementation of
the behavior tested in
64fe488b5179.
Matt Mackall <mpm@selenic.com> [Fri, 01 Aug 2014 11:45:26 -0500] rev 21970
merge with i18n some more
Matt Mackall <mpm@selenic.com> [Fri, 01 Aug 2014 11:44:50 -0500] rev 21969
merge with i18n
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 01 Aug 2014 17:29:02 +0900] rev 21968
i18n-ja: synchronized with
f582fa1167f7
Wagner Bruna <wbruna@yahoo.com> [Fri, 01 Aug 2014 02:02:06 -0300] rev 21967
i18n-pt_BR: synchronized with
dccbf52ffe9f
Yuya Nishihara <yuya@tcha.org> [Fri, 01 Aug 2014 21:36:56 +0900] rev 21966
log: do not use exact matcher for --patch --follow without file (
issue4319)
e2530d4a47c1 is valid only if file argument is specified. If no pattern
specified, it can simply fall back to the original matcher.
Matt Mackall <mpm@selenic.com> [Thu, 31 Jul 2014 16:32:12 -0500] rev 21965
qimport: record imported revs incrementally (
issue3874)
When an import fails, this doesn't lose the state for the earlier
revisions.
Matt Mackall <mpm@selenic.com> [Thu, 31 Jul 2014 16:01:01 -0500] rev 21964
test-bundle2: add missing os import
Matt Mackall <mpm@selenic.com> [Thu, 31 Jul 2014 14:42:14 -0500] rev 21963
merge with i18n
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 01 Aug 2014 01:13:53 +0900] rev 21962
i18n-ja: synchronized with
838025b15925
Matt Mackall <mpm@selenic.com> [Thu, 31 Jul 2014 14:31:31 -0500] rev 21961
help: always show command help with -h (
issue4240)
Old behavior:
hg help x hg x -h hg help -e x hg help -c x
config topic topic (!) - cmd
showconfig cmd topic (!) - cmd
rebase cmd cmd ext cmd
New behavior:
hg help x hg x -h hg help -e x hg help -c x
config topic cmd - cmd
showconfig cmd cmd - cmd
rebase cmd cmd ext cmd
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 01 Aug 2014 02:14:24 +0900] rev 21960
templater: add i18n comments to error messages of newly added functions
This patch adds i18n comments to error messages of newly added
functions "startswith" (introduced by
4a445dc5abff) and "word" (by
8f23f8096606).
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 01 Aug 2014 02:14:24 +0900] rev 21959
commands: make the warning message for "patch --partial" translatable
This patch makes the warning message for "patch --partial"
translatable: this message was introduced by
bee0e1cffdd3, and there is
no reason to prevent this from being translatable.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 01 Aug 2014 02:14:24 +0900] rev 21958
convert: fix argument mismatch at formatting the abort message
This patch fixes argument mismatch at formatting the abort message,
introduced by
a204fd9b5ba9: the last '%s' doesn't have corresponded
argument.
This patch uses "unexpected size" in the abort message, to distinguish
the reason of failure from "unexpected type" failure checked in the
prior code path below:
if info[1] != type:
raise util.Abort(_('cannot read %r object at %s') % (type, rev))
Alexandre Garnier <zigarn@gmail.com> [Thu, 31 Jul 2014 10:31:56 +0100] rev 21957
debuginstall: handle quoted path for editor (
issue4316)
When using an editor path with spaces and options, you can set 'ui.editor'
to '"/path to your/editor" -opt' and it works fine but 'hg debuginstall'
is complaining about it because it simply splits the editor and
tests presence of '"/path'.
Now correctly parse 'ui.editor' string by handling quoted path.
Matt Mackall <mpm@selenic.com> [Wed, 30 Jul 2014 18:28:37 -0500] rev 21956
test-bundle2: move file mode setting after sys import
anatoly techtonik <techtonik@gmail.com> [Sat, 26 Jul 2014 09:27:11 +0300] rev 21955
config: allow 'user' in .hgrc ui section (
issue3169)
Matt Mackall <mpm@selenic.com> [Wed, 30 Jul 2014 14:51:56 -0500] rev 21954
merge with i18n
Wagner Bruna <wbruna@yahoo.com> [Tue, 29 Jul 2014 19:29:02 -0300] rev 21953
i18n-pt_BR: synchronized with
ad56fc55cbc3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 30 Jul 2014 00:14:52 +0900] rev 21952
doc: unify help text for "--edit" option
This patch changes help text for "--edit" option of commands below:
- fetch
- qnew
- qrefresh
- qfold
- commit
- tag
This unification reduces translation cost, too.
This patch chooses not "further edit commit message already specified"
(of "hg commit") but "invoke editor on commit messages" as unified
help text for "--edit" option, because the latter is much older than
the former.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 30 Jul 2014 00:13:59 +0900] rev 21951
doc: unify help text for "--message" option
This patch changes help text for "--message" option of commands below
for unification.
- sign (of gpg)
- tag
This unification reduces translation cost, too.
This patch doesn't change the description for "--message" of "hg
rebase" below, because this should contain "collapse" word to explain
its purpose (only for "--collapse") clearly.
use text as collapse commit message
Augie Fackler <raf@durin42.com> [Mon, 28 Jul 2014 19:20:13 -0400] rev 21950
histedit: respect revsetalias entries (
issue4311)
We now expand user-provided revsets before using repo.revs() to locate
the root(s) of the user-specified set.
Alexander Becher <Alexander.Becher@RuD-Steuerungstechnik.De> [Mon, 28 Jul 2014 10:05:17 +0200] rev 21949
graft: add a reference to revsets to the help text (
issue3362)
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 26 Jul 2014 03:35:42 +0200] rev 21948
i18n: add parenthesis in Brazilian translation of the resolve message
Eu falo brasileiro agora. Eu não sou uma batata!
Pierre-Yves David <pierre-yves.david@fb.com> [Sat, 26 Jul 2014 03:32:49 +0200] rev 21947
resolve: add parenthesis around "no more unresolved files" message
This message may be confused with an error message. Adding parenthesis around it
will make it more recognisable as an informative message.
Matt Mackall <mpm@selenic.com> [Fri, 25 Jul 2014 15:51:42 -0500] rev 21946
help: mention '-T list' in templater topic
Matt Mackall <mpm@selenic.com> [Fri, 25 Jul 2014 15:38:26 -0500] rev 21945
help: drop reference to glog in templates topic
Matt Mackall <mpm@selenic.com> [Fri, 25 Jul 2014 15:35:09 -0500] rev 21944
templates: re-add template listing support
We used to have --style nosuch to list templates, but --style is now
merged with --template/-T where random strings are acceptable
templates. So we reserve 'list' to allow listing templates.
Yuya Nishihara <yuya@tcha.org> [Mon, 21 Jul 2014 11:44:20 +0900] rev 21943
help: use --template to specify existing style
--style is deprecated since
3a35ba2681ec and
870d60294b04.
Yuya Nishihara <yuya@tcha.org> [Thu, 24 Jul 2014 23:39:25 +0900] rev 21942
test-status: add test for removed-and-untracked state (BC)
In Mercurial 3.0, "hg status" can list the same file twice if it was removed
but still exists in working directory, i.e. removed by "hg forget":
$ hg status --rev 0 removed
R removed
? removed
But since
65cdc6bab91e, untracked state, "?", is no longer displayed in this
example.
I think the new behavior is correct since a file should have single state, but
if it is a bug, this patch should be dropped.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 02 Jul 2014 16:13:48 +0200] rev 21941
bundle2: only use callable return as reply handler
When a bundle2 parts generator returns a non callable value, it should not be
used as a reply handler. The changegroup part generator is already having this
case of behavior when there is no changegroup to push. This changeset prevent a
crash for user of the experimentable bundle2 feature.
Nathan Goldbaum <ngoldbau@ucsc.edu> [Thu, 24 Jul 2014 14:29:08 -0700] rev 21940
resolve: report no argument warning using a hint
With this change resolve and revert produce consistent output when run with no
arguments:
$ hg resolve
abort: no files or directories specified
(use --all to remerge all files)
$ hg revert
abort: no files or directories specified
(use --all to revert all files)
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 24 Jul 2014 12:12:12 -0700] rev 21939
revset: optimize baseset.__sub__ (
issue4313)
dd716807fd23 regressed performance of baseset.__sub__ by introducing
a lazyset. This patch restores that lost performance by eagerly
evaluating baseset.__sub__ if the other set is a baseset.
revsetbenchmark.py results impacted by this change:
revset #6: roots(0::tip)
0) wall 2.923473 comb 2.920000 user 2.920000 sys 0.000000 (best of 4)
1) wall 0.077614 comb 0.080000 user 0.080000 sys 0.000000 (best of 100)
revset #23: roots((0:tip)::)
0) wall 2.875178 comb 2.880000 user 2.880000 sys 0.000000 (best of 4)
1) wall 0.154519 comb 0.150000 user 0.150000 sys 0.000000 (best of 61)
On the author's machine, this slowdown manifested during evaluation of
'roots(%ln::)' in phases.retractboundary after unbundling the Firefox
repository. Using `time hg unbundle firefox.hg` as a benchmark:
Before: 8:00
After: 4:28
Delta: -3:32
For reference, the subset and cs baseset instances impacted by this
change were of lengths 193634 and 193627, respectively.
Explicit test coverage of roots(%ln::), while similar to the existing
roots(0::tip) benchmark, has been added.
Sean Farley <sean.michael.farley@gmail.com> [Wed, 16 Jul 2014 13:07:39 -0500] rev 21938
memctx: substate needs to be {} instead of None
Setting substate to None was an oversight in
7cfd94ec5d30 and this patch
corrects it by setting substate to an empty dictionary which matches what
subrepo code expects.
Matt Mackall <mpm@selenic.com> [Wed, 23 Jul 2014 11:16:22 -0500] rev 21937
version: don't traceback if no extensions to list (
issue4312)
Matt Mackall <mpm@selenic.com> [Wed, 23 Jul 2014 10:50:21 -0500] rev 21936
merge with i18n
Wagner Bruna <wbruna@yahoo.com> [Sun, 20 Jul 2014 18:08:29 -0300] rev 21935
i18n-pt_BR: synchronized with
6c36dc6cd61a
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 23 Jul 2014 00:10:24 +0900] rev 21934
largefiles: use "normallookup" on "lfdirstate" while reverting
Before this patch, largefiles gotten from revisions other than the
parent of the working directory at "hg revert" become "clean"
unexpectedly in steps below:
1. "repo.status()" is invoked (for status check before reverting)
1-1 "dirstate" entry for standinfile SF is "normal"-ed
(1-2 "lfdirstate" entry of largefile LF (for SF) is "normal"-ed)
2. "cmdutil.revert()" is invoked
2-1 standinfile SF is updated in the working directory
2-2 "dirstate" entry for SF is NOT updated
3. "lfcommands.updatelfiles()" is invoked (by "overrides.overriderevert()")
3-1 largefile LF (for SF) is updated in the working directory
3-2 "dirstate" returns "n" and valid timestamp for SF (by 1-1 and 2-2)
3-3 "lfdirstate" entry for LF is "normal"-ed
3-4 "lfdirstate" is written into ".hg/largefiles/dirstate", and
timestamp of LF is stored into "lfdirstate" file (by 3-3)
(ASSUMPTION: timestamp of LF differs from one of "lfdirstate" file)
Then, "hs status" treats LF as "clean", even though LF is updated by
"other" revision (by 3-1), because "lfilesrepo.status()" always treats
"normal"-ed files (by 3-3 and 3-4) as "clean".
When largefiles are reverted, they should be "normallookup"-ed
forcibly.
This patch uses "normallookup" on "lfdirstate" while reverting, by
passing "True" to newly added argument "normallookup".
Forcible "normallookup"-ing is not so expensive, because list of
target largefiles is explicitly specified in this case.
This patch uses "[debug] dirstate.delaywrite" feature in the test, to
ensure that timestamp of the largefile gotten from "other" revision is
stored into ".hg/largefiles/dirstate" (for ASSUMPTION at 3-4)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 23 Jul 2014 00:10:24 +0900] rev 21933
largefiles: invoke "normallookup" on "lfdirstate" for merged files
Before this patch, largefiles gotten from "other" revision (with
conflict) at "hg merge" become "clean" unexpectedly in steps below:
1. "repo.status()" is invoked (for status check before merging)
1-1 "dirstate" entry for standinfile SF is "normal"-ed
1-2 "lfdirstate" entry of largefile LF (for SF) is "normal"-ed
2. "merge.update()" is invoked
2-1 SF is updated in the working directory
(ASSUMPTION: user choice "other" at conflict)
2-2 "dirstate" entry for SF is "merge"-ed
3. "lfcommands.updatelfiles()" is invoked (by "overrides.hgmerge()")
3-1 largefile LF (for SF) is updated in the working directory
3-2 "dirstate" returns "m" for SF (by 2-2)
3-3 "lfdirstate" entry for LF is left as it is
3-4 "lfdirstate" is written into ".hg/largefiles/dirstate", and
timestamp of LF is stored into "lfdirstate" file (by 1-2)
(ASSUMPTION: timestamp of LF differs from one of "lfdirstate" file)
Then, "hs status" treats LF as "clean", even though LF is updated by
"other" revision (by 3-1), because "lfilesrepo.status()" always treats
"normal"-ed files (by 1-2 and 3-4) as "clean".
When state of standinfile in "dirstate" is "m", largefile should be
"normallookup"-ed.
This patch invokes "normallookup" on "lfdirstate" for merged files.
This patch uses "[debug] dirstate.delaywrite" feature in the test, to
ensure that timestamp of the largefile gotten from "other" revision is
stored into ".hg/largefiles/dirstate". (for ASSUMPTION at 3-4)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 22 Jul 2014 23:59:34 +0900] rev 21932
largefiles: use "normallookup", if "mtime" of standin is unset
Before this patch, largefiles gotten from "other" revision (without
conflict) at "hg merge" become "clean" unexpectedly in steps below:
1. "merge.update()" is invoked
1-1 standinfile SF is updated in the working directory
1-2 "dirstate" entry for SF is "normallookup"-ed
2. "lfcommands.updatelfiles()" is invoked (by "overrides.hgmerge()")
2-1 largefile LF (for SF) is updated in the working directory
2-2 "dirstate" returns "n" for SF (by 1-2)
2-3 "lfdirstate" entry for LF is "normal"-ed
2-4 "lfdirstate" is written into ".hg/largefiles/dirstate", and
timestamp of LF is stored into "lfdirstate" file
(ASSUMPTION: timestamp of LF differs from one of "lfdirstate" file)
Then, "hs status" treats LF as "clean", even though LF is updated by
"other" revision (by 2-1), because "lfilesrepo.status()" always treats
"normal"-ed files (by 2-3 and 2-4) as "clean".
When timestamp is not set (= negative value) for standinfile in
"dirstate", largefile should be "normallookup"-ed regardless of
rebasing or not, because "n" state in "dirstate" doesn't ensure
"clean"-ness of a standinfile at that time.
This patch uses "normallookup" instead of "normal", if "mtime" of
standin is unset
This is a temporary way to fix with less changes. For fundamental
resolution of this kind of problems in the future, "lfdirstate" should
be updated with "dirstate" simultaneously while "merge.update"
execution: maybe by hooking "recordupdates"
It is also why this patch (temporarily) uses internal field "_map" of
"dirstate" directly.
This patch uses "[debug] dirstate.delaywrite" feature in the test, to
ensure that timestamp of the largefile gotten from "other" revision is
stored into ".hg/largefiles/dirstate". (for ASSUMPTION at 2-4)
This patch newly adds "test-largefiles-update.t", to avoid increasing
cost to run other tests for largefiles by subsequent patches
(especially, "[debug] dirstate.delaywrite" causes so).
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 22 Jul 2014 23:59:30 +0900] rev 21931
dirstate: delay writing out to ensure timestamp of each entries explicitly
Even though "dirstate.write()" is invoked explicitly after "normal"
invocations, timestamp field of entries may be still "unset" in the
"dirstate" file itself , because "pack_dirstate" drops it when it is
equal to the timestamp of "dirstate" file itself.
This can avoid overlooking modification of files, which are updated at
same time in the second. But on the other hand, this may hide timing
critical problems.
For example, incorrect "normal"-ing (or lack of "normallookup"-ing on
the already "normal"-ed entry) is visible only when:
- the target file is modified in the working directory at T1, and
- "dirstate" file is written out at T2 (!= T1)
Otherwise, T1 is dropped by "pack_dirstate" in "dirstate.write()"
invocation, and "unset" is stored into "dirstate" file.
It often fails to reproduce problems from incorrect "normal"-ing by
Mercurial testset, because automated actions in the small repository
almost always causes that T1 and T2 are same.
This patch adds the debug feature to delay writing out to ensure
timestamp of each entries explicitly.
This feature is used to make timing critical "dirstate" problems
reproducable in subsequent patches.
Danek Duvall <danek.duvall@oracle.com> [Mon, 21 Jul 2014 11:27:24 -0700] rev 21930
tests: cat error messages are different on Solaris
Wagner Bruna <wbruna@yahoo.com> [Sun, 20 Jul 2014 15:06:12 -0300] rev 21929
commands: fix typo in import documentation
Matt Mackall <mpm@selenic.com> [Sat, 19 Jul 2014 00:11:40 -0500] rev 21928
Added signature for changeset
6c36dc6cd61a
Matt Mackall <mpm@selenic.com> [Sat, 19 Jul 2014 00:11:10 -0500] rev 21927
Added tag 3.1-rc for changeset
6c36dc6cd61a
Matt Mackall <mpm@selenic.com> [Sat, 19 Jul 2014 00:10:22 -0500] rev 21926
merge default into stable for 3.1 code freeze
Matt Harbison <matt_harbison@yahoo.com> [Fri, 18 Jul 2014 19:46:56 -0400] rev 21925
revset: avoid a ValueError when 'only()' is given an empty set
This previously died in _revdescendants() taking the min() of the first set to
only(), when it was empty. An empty second set already worked. Likewise,
descendants() already handled an empty set.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 15 Jul 2014 23:34:13 +0900] rev 21924
cmdutil: make commit message shown in text editor customizable by template
This patch makes commit message shown in text editor customizable by
template. For example, this can advertise:
- sample commit messages for routine works,
- points to call attention before commit,
- message of the day, and so on
To show commit message correctly even in problematic encoding, this
patch chooses the latter below:
- replace "buildcommittext" with "buildcommittemplate" completely
- invoke "buildcommittemplate" only if '[committemplate] changeset'
is configured explicitly
For example, if multibyte character ending with backslash (0x5c) is
followed by ASCII character 'n' in the customized template, sequence
of backslash and 'n' is treated as line-feed unexpectedly (and
multibyte character is broken, too).
This corruption occurs in 'decode("string-escape")' while parsing
template string.
Matt Mackall <mpm@selenic.com> [Fri, 18 Jul 2014 23:15:28 -0500] rev 21923
commiteditor: refactor default extramsg
Angel Ezquerra <angel.ezquerra@gmail.com> [Thu, 26 Jun 2014 01:20:25 +0200] rev 21922
filemerge: add internal:tagmerge merge tool
Add a new internal:tagmerge merge tool which implements an automatic merge
algorithm for mercurial's tag files
The tagmerge algorithm is able to resolve most merge conflicts that
currently would trigger a .hgtags merge conflict. The only case that
it does not (and cannot) handle is that in which two tags point to
different revisions on each merge parent _and_ their corresponding tag
histories have the same rank (i.e. the same length). In all other
cases the merge algorithm will choose the revision belonging to the
parent with the highest ranked tag history. The merged tag history is
the combination of both tag histories (special care is taken to try to
combine common tag histories where possible).
The algorithm also handles cases in which tags have been manually
removed from the .hgtags file and other similar corner cases.
In addition to actually merging the tags from two parents, taking into
account the base, the algorithm also tries to minimize the difference
between the merged tag file and the first parent's tag file (i.e. it
tries to make the merged tag order as as similar as possible to the
first parent's tag file order).
The algorithm works as follows:
1. read the tags from p1, p2 and the base
- when reading the p1 tags, also get the line numbers associated to each
tag node (these will be used to sort the merged tags in a way that
minimizes the diff to p1). Ignore the file numbers when reading p2 and
the base
2. recover the "lost tags" (i.e. those that are found in the base but not on p1
or p2) and add them back to p1 and/or p2
- at this point the only tags that are on p1 but not on p2 are those new
tags that were introduced in p1. Same thing for the tags that are on p2
but not on p2
3. take all tags that are only on p1 or only on p2 (but not on the base)
- Note that these are the tags that were introduced between base and p1 and
between base and p2, possibly on separate clones
4. for each tag found both on p1 and p2 perform the following merge algorithm:
- the tags conflict if their tag "histories" have the same "rank" (i.e.
length) _AND_ the last (current) tag is _NOT_ the same
- for non conflicting tags:
- choose which are the high and the low ranking nodes
- the high ranking list of nodes is the one that is longer.
In case of draw favor p1
- the merged node list is made of 3 parts:
- first the nodes that are common to the beginning of both the
low and the high ranking nodes
- second the non common low ranking nodes
- finally the non common high ranking nodes (with the last one
being the merged tag node)
- note that this is equivalent to putting the whole low ranking node
list first, followed by the non common high ranking nodes
- note that during the merge we keep the "node line numbers", which will
be used when writing the merged tags to the tag file
5. write the merged tags taking into account to their positions in the first
parent (i.e. try to keep the relative ordering of the nodes that come
from p1). This minimizes the diff between the merged and the p1 tag files
This is done by using the following algorithm
- group the nodes for a given tag that must be written next to each other
- A: nodes that come from consecutive lines on p1
- B: nodes that come from p2 (i.e. whose associated line number is None)
and are next to one of the a nodes in A
- each group is associated with a line number coming from p1
- generate a "tag block" for each of the groups
- a tag block is a set of consecutive "node tag" lines belonging to the
same tag and which will be written next to each other on the merged
tags file
- sort the "tag blocks" according to their associated number line
- put blocks whose nodes come all from p2 first
- write the tag blocks in the sorted order
Notes:
- A few tests have been added to test-tag.t. These tests are very specific to
the new internal:tagmerge tool, so perhaps they should be moved to their own
test file.
- The merge algorithm was discussed in a thread on the mercurial mailing list.
In http://markmail.org/message/anqaxldup4tmgyrx a slightly different algorithm
was suggested. In it the p1 and p2 tags would have been interleaved instead of
put one before the other. It would be possible to implement that but my tests
suggest that the merge result would be more confusing and harder to understand.
Matt Mackall <mpm@selenic.com> [Fri, 18 Jul 2014 21:49:52 -0500] rev 21921
filemerge: use non-minimal conflict marker regions (BC)
As extensively detailed by Pierre-Yves[1], simplemerge's minimal
markers can result in hopeless confusion for many common merges. As it
happens, we accidentally inherited this behavior when we borrowed
simplemerge from bzr; it is not the behavior used by RCS's merge(1),
Since merge(1) (and not bzr) is what we aim to emulate when emulating
RCS's merge markers, we simply turn this feature off. This brings us
in line with the behavior of CVS, SVN, and Git as a bonus.
(NB: using conflict markers with Mercurial is discouraged.)
[1] http://markmail.org/message/wj5mh3lc46czlvld
convert glob tessa
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 09 Jun 2014 03:49:07 -0700] rev 21920
test: use more elaborated content in ``test-conflict.t``
We are going to introduce a setting to control the "minimisation" feature of
``internal:merge``. So we need more interesting conflicting content. We change
the content in an independent changeset to make sure the coming code change
leave the output unchanged.
Matt Mackall <mpm@selenic.com> [Fri, 18 Jul 2014 17:52:18 -0500] rev 21919
run-tests: make --view work again
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 06 Jul 2014 02:56:41 +0900] rev 21918
filemerge: use 'basic' as the default of '[ui] mergemarkers' for safety
Before this patch, 'detailed' is used as the default of '[ui]
mergemarkers'. This embeds non-ASCII characters in tags, branches,
bookmarks, author and/or commit descriptions into merged files in the
encoding specified by '--encoding' global option, 'HGENCODING' or
other locale setting environment variables.
But, if files to be merged use another encoding, this behavior breaks
consistency of encoding in merged files.
For example, ISO-2022-JP or EUC-JP are sometimes used as the file
encoding for Japanese characters, because of historical and/or
environmental reasons, even though UTF-8 or Shift-JIS are ordinarily
used as the terminal encoding.
This can't be resolved automatically, because Mercurial doesn't aware
encoding of managed files.
This patch uses 'basic' as the default of '[ui] mergemarkers' to avoid
embedding encoding sensitive characters for safety.
This patch puts '[ui] mergemarkers = detailed' into default hgrc file
for tests, to reduce changes for tests in this patch.
Matt Harbison <matt_harbison@yahoo.com> [Thu, 17 Jul 2014 20:17:17 -0400] rev 21917
largefiles: avoid unnecessary creation of .hg/largefiles when opening lfdirstate
Previously, the directory '.hg/largefiles' would always be created if it didn't
exist when the lfdirstate was opened. If there were no standin files, no
dirstate file would be created in the directory. The end result was that
enabling the largefiles extension globally, but not explicitly adding a
largefile would result in the repository eventually sprouting this directory.
Creation of this directory effectively changes readonly operations like summary
and status into operations that require write access. Without write access,
commands that would succeed without the extension loaded would abort with a
surprising error when the extension is loaded, but not actively used:
$ hg sum -R /tmp/thg --config extensions.largefiles=
parent: 16541:
00dc703d5aed
repowidget: specify incoming bundle by plain file path to avoid url parsing
branch: default
abort: Permission denied: '/tmp/thg/.hg/largefiles'
This change is simpler than changing the callers of openlfdirstate() to use the
'create' parameter that was introduced in
ae57920ac188, and probably how that
should have been implemented in the first place.
Augie Fackler <raf@durin42.com> [Tue, 05 Nov 2013 14:47:35 -0500] rev 21916
run-tests: write out scripts in binary mode
Caught because Python 3 refuses to write bytes to a non-binary fd.
Siddharth Agarwal <sid0@fb.com> [Tue, 15 Jul 2014 15:34:50 -0700] rev 21915
match: use util.re.escape instead of re.escape
For a pathological .hgignore with over 2500 glob lines and over 200000 calls to
re.escape, and with re2 available, this speeds up parsing the .hgignore from
0.75 seconds to 0.20 seconds. This causes e.g. 'hg status' with hgwatchman
enabled to go from 1.02 seconds to 0.47 seconds.
Siddharth Agarwal <sid0@fb.com> [Tue, 15 Jul 2014 15:14:45 -0700] rev 21914
util.re: add an escape method
The escape method in at least one of the modules called 're2' is in C. This
means it is significantly faster than the Python code written in 're'.
An upcoming patch will have benchmarks.
Siddharth Agarwal <sid0@fb.com> [Tue, 15 Jul 2014 15:01:52 -0700] rev 21913
util.re: move check for re2 into a separate method
We're going to use the same check for another method in an upcoming patch.
Siddharth Agarwal <sid0@fb.com> [Tue, 15 Jul 2014 14:52:40 -0700] rev 21912
util: remove no longer used compilere
Siddharth Agarwal <sid0@fb.com> [Tue, 15 Jul 2014 14:52:22 -0700] rev 21911
commands: use util.re.compile instead of util.compilere
Siddharth Agarwal <sid0@fb.com> [Tue, 15 Jul 2014 14:50:58 -0700] rev 21910
config: use util.re.compile instead of util.compilere
Siddharth Agarwal <sid0@fb.com> [Tue, 15 Jul 2014 14:49:45 -0700] rev 21909
match: use util.re.compile instead of util.compilere
Siddharth Agarwal <sid0@fb.com> [Tue, 15 Jul 2014 14:40:43 -0700] rev 21908
util: move compilere to a class
We do this to allow us to use descriptors for other related methods.
For now, util.compilere does the same thing. Upcoming patches will remove it.
Siddharth Agarwal <sid0@fb.com> [Tue, 15 Jul 2014 14:35:19 -0700] rev 21907
util: rename 're' to 'remod'
Upcoming patches will introduce a binding called 're'.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 02 Jul 2014 15:47:39 +0200] rev 21906
bundle2-push: drop _pushbundle2extraparts
All core user are now using the new way. We drop the old way.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 02 Jul 2014 16:10:14 +0200] rev 21905
bundle2-test: use the new way to extend push content
The only core user of the old way were tests. We update them.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 02 Jul 2014 15:26:04 +0200] rev 21904
bundle2-push: introduce a list of part generating functions
Instead of explicitly calling a few function to generate part in the bundle, we
now have a list of all part generators. This should make it easier for
extensions to adds new part in the bundle.
This new way to extend the push deprecates the old `_pushbundle2extraparts` way.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 02 Jul 2014 12:55:09 +0200] rev 21903
bundle2-push: move changegroup push validation inside _pushb2ctx
When bundle2 push includes more than just changesets, we may have no
changegroup to push yet still have other data to push.
So we now try to performs a bundle2 push in all cases. The check for changegroup
inclusion is moved into the ``_pushb2ctx`` function in charge of creating the
changegroup part.
The bundle2 part is aborted if no actual payload part have been added to the
bundle2.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 07 Jul 2014 12:30:31 +0200] rev 21902
push: use `stepsdone` to control changegroup push through bundle10 or bundle20
We use the newly introduced `pushop.stepsdone` attribute to inform
older methods than changegroup have already been pushed using a newer
method.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 02 Jul 2014 12:48:54 +0200] rev 21901
push: add a ``pushop.stepsdone`` attribute
This attribute will record what steps were performed during the bundle2 push.
This will control whenever the old way push must be performed or skipped. This
will ultimately be used by changegroup, phases, obsmarkers, bookmarks and any
other kind of data ones may want to exchange even when bundle2 support is
missing.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 02 Jul 2014 16:17:54 +0200] rev 21900
bundle2: add a ``bundle20.nbparts`` property
This property can be used to know how much parts have been added to the bundle2.
This will be useful to check if any part have been generated for a push.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 02 Jul 2014 11:42:35 +0200] rev 21899
bundle2-push: extract changegroup logic in its own function
We extract the creation of changegroup related parts into its own function.
This precludes the inclusion of more diverse data during the bundle2 push.
We use a closure to carry the logic that need to be perform when processing the
server reply.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 02 Jul 2014 14:09:24 +0200] rev 21898
bundle2: call _pushbundle2extraparts a bit sooner
This is the first step of a refactoring that will ease the inclusion of new part
in the bundle2 push and includes more information (like phases) in this push
We need to move the function a bit sooner to be able to group the generation of
`b2x:check:heads` and `b2x:changegroup` part in an external function. We move it
sooner to preserve parts creation order bundle2 tests rely on. At the ends of this
refactoring the `_pushbundle2extraparts` will be replaced by another mechanism
anyway.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 15 Jul 2014 23:34:13 +0900] rev 21897
templatekw: add 'subrepos' keyword to show updated subrepositories
'subrepos' template keyword newly added by this patch shows updated
subrepositories.
For the compatibility with the list of subrepositories shown in the
editor at commit:
- 'subrepos' is empty, at revisions removing '.hgsub' itself
- 'subrepos' is calculated between the revision and the first parent
of it, at merge revisions
To avoid silent regression, this patch also confirms "hg diff" of
".hgsubstate" and parents for each target revisions in the test.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 15 Jul 2014 23:34:13 +0900] rev 21896
templatekw: add 'currentbookmark' keyword to show current bookmark easily
Before this patch, complicated template expression below is required
to show current active bookmark if it is associated with the
changeset.
"{bookmarks % '{ifeq(bookmark, current, \"{bookmark}\")}'}"
This patch add 'currentbookmark' keyword to show current bookmark
easily.
Siddharth Agarwal <sid0@fb.com> [Wed, 16 Jul 2014 14:53:03 -0700] rev 21895
context: extend efficient manifest filtering to when all paths are files
On a repository with over 250,000 files and 700,000 commits, this improves
cases like
hg status --rev <rev> -- <file> # rev is not .
from 2.1 seconds to 1.4 seconds.
There is further scope for improvement here: for a single file or a small set
of files, it is probably more efficient to use filelog linkrevs when possible.
However there will always be cases where that will fail (multiple commits
pointing to the same file revision, removed files...), so this is independently
useful.
Siddharth Agarwal <sid0@fb.com> [Sat, 12 Jul 2014 00:37:08 -0700] rev 21894
revset: remove no longer used _missingancestors revset
This was undocumented.
Siddharth Agarwal <sid0@fb.com> [Sat, 12 Jul 2014 00:31:36 -0700] rev 21893
revset: replace _missingancestors optimization with only revset
(::a - ::b) is equivalent to only(a, b).
Angel Ezquerra <angel.ezquerra@gmail.com> [Sat, 28 Jun 2014 01:42:39 +0200] rev 21892
tags: introduce _readtaghist function
The existing _readtags function has been modified a little and renamed
_readtaghist. A new _readtaghist function has been added, which is a wrappger
around _readtaghist. Its output is the same as the old _readtaghist.
The purpose of this change is to make it possible to automatically merge tag
files. In order to do so we will need to get the line numbers for each of the
tag-node pairs on the first merge parent.
This is not used yet, but will be used on a follow up patch that will introduce
an automatic tag merge algorithm.
I performed some tests to compare the effect of this change. I used timeit to
run the test-tags.t test a 9 times with and without this patch. The results
were:
- without this patch: 3 loops, best of 3: 8.55 sec per loop
- with this patch: 3 loops, best of 3: 8.49 sec per loop
The the test was on average was slightly faster with this patch (although the
difference was probably not statistically significant).
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 20 Jun 2014 00:42:35 +0900] rev 21891
subrepo: ensure "close()" execution at the end of "_initrepo()"
Before this patch, "close()" for the file object opened in
"_initrepo()" may not be executed, if unexpected exception is raised,
because it isn't executed in "finally" clause.
This patch ensures "close()" execution at the end of "_initrepo()" by
moving it into "finally" clause.
This patch puts configuration lines into "lines" array and write them
out at once, to narrow the scope of "try"/"finally" for review-ability.
This patch doesn't use "vfs.write()", because:
- current "vfs.write()" implementation doesn't take "mode" argument
to open file in "text" mode
- writing hgrc file out in binary mode may break backward compatibility
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 20 Jun 2014 00:41:31 +0900] rev 21890
subrepo: add test whether "[paths]" is configured correctly at subrepo creation
This test is added for changes in the subsequent patch.
This test doesn't use "(glob)" for expected output, because "[paths]"
is configured at subrepo creation by "_abssource()" using
"posixpath.join()" to join path components.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 20 Jun 2014 00:21:19 +0900] rev 21889
subrepo: ensure "close()" execution at the end of "_cachestorehash()"
Before this patch, "close()" for the file object opened in
"_cachestorehash()" may not be executed, if unexpected exception is
raised, because it isn't executed in "finally" clause.
This patch ensures "close()" execution at the end of
"_cachestorehash()" by moving it into "finally" clause.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 20 Jun 2014 00:21:19 +0900] rev 21888
subrepo: ensure "close()" execution at the end of "_readstorehashcache()"
Before this patch, "close()" for the file object opened in
"_readstorehashcache()" may not be executed, if unexpected exception
is raised, because it isn't executed in "finally" clause.
This patch ensures "close()" execution at the end of
"_readstorehashcache()" by moving it into "finally" clause.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 20 Jun 2014 00:21:19 +0900] rev 21887
subrepo: ensure "close()" execution at the end of "_calcfilehash()"
Before this patch, "close()" for the file object opened in
"_calcfilehash()" may not be executed, if unexpected exception is
raised, because it isn't executed in "finally" clause.
This patch ensures "close()" execution at the end of "_calcfilehash()"
by moving it into "finally" clause.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 20 Jun 2014 00:21:19 +0900] rev 21886
subrepo: ensure "lock.release()" execution at the end of "_cachestorehash()"
Before this patch, "lock.release()" for "self._repo" in
"_cachestorehash()" of "hgsubrepo" may not be executed, if unexpected
exception is raised, because it isn't executed in "finally" clause.
This patch ensures "lock.release()" execution at the end of
"_cachestorehash()" by moving it into "finally" clause.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 20 Jun 2014 00:21:19 +0900] rev 21885
subrepo: ensure "lock.release()" execution at the end of "storeclean()"
Before this patch, "lock.release()" for "self._repo" in "storeclean()"
of "hgsubrepo" may not be executed, if unexpected exception is raised,
because it isn't executed in "finally" clause.
This patch ensures "lock.release()" execution at the end of
"storeclean()" by moving it into "finally" clause.
This patch chooses moving almost all lines in "storeclean()" into
"_storeclean()" instead of indenting them for "try/finally" clauses,
to keep diff simple for review-ability.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 07 Jul 2014 18:45:46 +0900] rev 21884
largefiles: confirm existence of outgoing largefile entities in remote store
Before this patch, "hg summary" and "hg outgoing" show and count up
all largefiles changed/added in outgoing revisions, even though some
of them are already uploaded into remote store.
This patch confirms existence of outgoing largefile entities in remote
store, to show and count up only really outgoing largefile entities at
"hg summary" and "hg outgoing".
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 07 Jul 2014 18:45:46 +0900] rev 21883
largefiles: show also how many data entities are outgoing at "hg outgoing"
Before this patch, "hg outgoing --large" shows which largefiles are
changed or added in outgoing revisions only in the point of the view
of filenames.
For example, according to the list of outgoing largefiles shown in "hg
outgoing" output, users should expect that the former below costs much
more to upload outgoing largefiles than the latter.
- outgoing revisions add a hundred largefiles, but all of them refer
the same data entity
in this case, only one data entity is outgoing, even though "hg
summary" says that a hundred largefiles are outgoing.
- a hundred outgoing revisions change only one largefile with
distinct data
in this case, a hundred data entities are outgoing, even though
"hg summary" says that only one largefile is outgoing.
But the latter costs much more than the former, in fact.
This patch shows also how many data entities are outgoing at "hg
outgoing" by counting number of unique hash values for outgoing
largefiles.
When "--debug" is specified, this patch also shows what entities (in
hash) are outgoing for each largefiles listed up, for debug purpose.
In "ui.debugflag" route, "addfunc()" can append given "lfhash" to the
list "toupload[fn]" always without duplication check, because
de-duplication is already done in "_getoutgoings()".
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 07 Jul 2014 18:45:46 +0900] rev 21882
largefiles: show also how many data entities are outgoing at "hg summary"
Before this patch, "hg summary --large" shows how many largefiles are
changed or added in outgoing revisions only in the point of the view
of filenames.
For example, according to the number of outgoing largefiles shown in
"hg summary" output, users should expect that the former below costs
much more to upload outgoing largefiles than the latter.
- outgoing revisions add a hundred largefiles, but all of them refer
the same data entity
in this case, only one data entity is outgoing, even though "hg
summary" says that a hundred largefiles are outgoing.
- a hundred outgoing revisions change only one largefile with
distinct data
in this case, a hundred data entities are outgoing, even though
"hg summary" says that only one largefile is outgoing.
But the latter costs much more than the former, in fact.
This patch shows also how many data entities are outgoing at "hg
summary" by counting number of unique hash values for outgoing
largefiles.
This patch introduces "_getoutgoings" to centralize the logic
(de-duplication, too) into it for convenience of subsequent patches,
even though it is not required in "hg summary" case.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 07 Jul 2014 18:45:46 +0900] rev 21881
largefiles: add tests for summary/outgoing improved in subsequent patches
This patch adds tests for summary/outgoing improved in subsequent
patches, to reduce amount of diffs in each patches.
This patch adds new revisions below:
- revision #2 adds new largefiles, but they contain as same data as
one already existing
this causes that multiple standins refer the same data entity
- revision #3, #4 and #5 change the already existing largefile
this causes that multiple data entities are outgoing for the standin.
#5 can be used to check de-duplication of "(hash, filename)" pair.
Siddharth Agarwal <sid0@fb.com> [Sat, 12 Jul 2014 17:59:03 -0700] rev 21880
context: generate filtered manifest efficiently for exact matchers
When the matcher is exact, there's no reason to iterate over the entire
manifest. It's much more efficient to iterate over the list of files instead.
For a repository with approximately 300,000 files, this speeds up
hg log -l10 --patch --follow for a frequently modified file from 16.5 seconds
to 10.5 seconds.
Siddharth Agarwal <sid0@fb.com> [Sat, 12 Jul 2014 17:57:25 -0700] rev 21879
manifestdict: add a new method to intersect with a set of files
This is meant to be used when the set of files is known in advance, e.g. with a
match object with no patterns.
Siddharth Agarwal <sid0@fb.com> [Sat, 12 Jul 2014 18:31:18 -0700] rev 21878
log: use an exact matcher for --patch --follow
The arguments to log --patch --follow are expected to be exact paths.
This will be used to make manifest filtering for these cases more efficient in
upcoming patches.
Matt Mackall <mpm@selenic.com> [Wed, 16 Jul 2014 17:35:04 -0500] rev 21877
merge with stable
Siddharth Agarwal <sid0@fb.com> [Sat, 12 Jul 2014 02:23:17 -0700] rev 21876
log: make --patch --follow work inside a subdirectory
Previously, the 'patch' code for hg log --patch --follow would try to resolve
patterns relative to the repository root rather than the current working
directory. Fix that by using match.files instead of pats, as done elsewhere
nearby.
Yuya Nishihara <yuya@tcha.org> [Sat, 12 Jul 2014 20:07:24 +0900] rev 21875
mergetools: add --nofork option to gvimdiff.diffargs for extdiff
Without --nofork, temporary files are removed immediately before gvimdiff
starts. "-d -g -O" are put just for consistency with gvimdiff.args.
anatoly techtonik <techtonik@gmail.com> [Sat, 05 Jul 2014 16:32:28 +0300] rev 21874
contrib/vagrant: use Vagrant for running tests on virtual machine
$ cd contrib/vagrant
$ vagrant up
$ vagrant ssh -c ./run-tests.sh
Repository is shared at /hgshared in guest machine.
Matt Mackall <mpm@selenic.com> [Mon, 14 Jul 2014 18:53:03 -0500] rev 21873
merge with stable
Siddharth Agarwal <sid0@fb.com> [Sat, 12 Jul 2014 20:44:00 -0700] rev 21872
log: allow revset for --follow to be lazily evaluated
It is unclear to me why evaluation was forced.
For a repository with over 700,000 commits, 'hg log -f' drops from 1.2 seconds
to 0.2 seconds.
Siddharth Agarwal <sid0@fb.com> [Mon, 14 Jul 2014 15:42:31 -0700] rev 21871
parsers: remove unused getintat function
Warning detected by clang.
Matt Mackall <mpm@selenic.com> [Mon, 14 Jul 2014 17:55:31 -0500] rev 21870
revset: maintain ordering when subtracting from a baseset (
issue4289)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 15 Jul 2014 00:59:09 +0900] rev 21869
cmdutil: separate building commit text from 'commitforceeditor'
This separation makes it easier to extend/hook building commit text
from the specified context.
This patch uses 'committext' instead of 'edittext' for names of newly
added variable and function, because the former is more purpose
specific than the latter, even though 'edittext' in 'buildcommittext'
is left as it is to reduce amount of diff.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 14 Jul 2014 23:33:59 +0900] rev 21868
convert: detect removal of ".gitmodules" at git source revisions correctly
Before this patch, all operations applied on ".gitmodules" at git
source revisions are treated as modification, even if they are
actually removal of it.
If removal of ".gitmodules" is treated as modification unexpectedly,
"hg convert" is aborted by the exception raised in
"retrievegitmodules()" for ".gitmodules" at the git source revision
removing it, because that revision doesn't have any information of
".gitmodules".
This patch detects removal of ".gitmodules" at git source revisions
correctly.
If ".gitmodules" is removed at the git source revision, this patch
records "hex(nullid)" as the contents hash value for ".hgsub" and
".hgsubstate" at the destination revision.
This patch makes "getfile()" raise IOError also for ".hgstatus" and
".hgsubstate" if the contents hash value is "hex(nullid)", and this
tells removal of ".hgstatus" and ".hgsubstate" at the destination
revision to "localrepository.commitctx()" correctly.
For files other than ".hgstatus" and ".hgsubstate", checking the
contents hash value in "getfile()" may be redundant, because
"catfile()" for them also does so.
But this patch chooses writing it only once at the beginning of
"getfile()", to avoid writing same code twice both for ".hgsub" and
".hgsubstate" separately.
Matt Mackall <mpm@selenic.com> [Mon, 14 Jul 2014 12:44:45 -0500] rev 21867
templates: escape NUL bytes in jsonescape (
issue4303)
It's currently possible for various fields to contain NUL bytes, which
are disallowed in JSON.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 12 Jul 2014 10:52:58 -0700] rev 21866
localrepo: document localrepo.hook()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 06 Jul 2014 02:56:41 +0900] rev 21865
filemerge: use 'util.ellipsis' to trim custom conflict markers correctly
Before this patch, filemerge slices byte sequence directly to trim
conflict markers, but this may cause:
- splitting at intermediate multi-byte sequence
- incorrect calculation of column width (length of byte sequence is
different from columns in display in many cases)
This patch uses 'util.ellipsis' to trim custom conflict markers
correctly, even if multi-byte characters are used in them.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 06 Jul 2014 02:56:41 +0900] rev 21864
filemerge: use only the first line of the generated conflict marker for safety
Before this patch, with careless configuration (missing '|firstline'
filtering for '{desc}' keyword, for example), '[ui]
mergemarkertemplate' can make conflict markers multiple lines.
For ordinary users, advantage of allowing '[ui] mergemarkertemplate'
to generate multiple lines for customizing seems to be less than
advantage of disallowing it for safety.
This patch uses only the first line of the conflict marker generated
from '[ui] mergemarkertemplate' configuration for safety.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 06 Jul 2014 02:56:41 +0900] rev 21863
progress: use 'encoding.colwidth' to get column width of items correctly
Before this patch, 'progress' extension applies 'len' on byte sequence
to get column width of it, but it causes incorrect result, when length
of byte sequence and columns in display are different from each other
in multi-byte characters.
This patch uses 'encoding.colwidth' to get column width of items in
output line correctly, even if it contains multi-byte characters.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 06 Jul 2014 02:56:41 +0900] rev 21862
progress: use 'encoding.trim' to trim items in output line correctly
Before this patch, 'progress' extension trims items in output line by
directly slicing byte sequence, but it may split at intermediate
multi-byte sequence.
This patch uses 'encoding.trim' to trim items in output line
correctly, even if it contains multi-byte characters.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 06 Jul 2014 02:56:41 +0900] rev 21861
encoding: add 'leftside' argument into 'trim' to switch trimming side
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 06 Jul 2014 02:56:41 +0900] rev 21860
progress: use 'encoding.colwidth' to get column width of output line correctly
Before this patch, 'progress' extension applies 'len' on byte sequence
to get column width of it, but it causes incorrect result, when length
of byte sequence and columns in display are different from each other
in multi-byte characters.
This patch uses 'encoding.colwidth' to get column width of output line
correctly, even if it contains multi-byte characters.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 06 Jul 2014 02:56:41 +0900] rev 21859
progress: use 'encoding.trim' to trim output line correctly
Before this patch, 'progress' extension trims output line by directly
slicing byte sequence, but it may split at intermediate multi-byte
sequence.
This patch uses 'encoding.trim' to trim output line correctly, even if
it contains multi-byte characters.
"rm -f loop.pyc" before changing "loop.py" in "test-progress.t"
ensures that re-compilation of "loop.py", even if "loop.py" and
"loop.pyc" have same timestamp in seconds.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 06 Jul 2014 02:56:41 +0900] rev 21858
histedit: use 'util.ellipsis' to trim description of each changesets
Before this patch, trimming description of each changesets in histedit
may split at intermediate multi-byte sequence.
This patch uses 'util.ellipsis' to trim description of each changesets
instead of directly slicing byte sequence.
Even though 'util.ellipsis' adds '...' as ellipsis when specified
string is trimmed (= this changes result of trimming), this patch uses
it, because:
- it can be used without any additional 'import', and
- ellipsis seems to be better than just trimming, for usability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 06 Jul 2014 02:56:41 +0900] rev 21857
util: replace 'ellipsis' implementation by 'encoding.trim'
Before this patch, 'util.ellipsis' tried to avoid splitting at
intermediate multi-byte sequence, but its implementation was incorrect.
Internal function '_ellipsis' trims specified unicode sequence not at
most maxlength 'columns in display', but at most maxlength number of
'unicode characters'.
def _ellipsis(text, maxlength):
if len(text) <= maxlength:
return text, False
else:
return "%s..." % (text[:maxlength - 3]), True
In many encodings, number of unicode characters can be different from
columns in display.
This patch replaces 'ellipsis' implementation by 'encoding.trim',
which can trim string at most maxlength columns in display correctly,
even though specified string contains multi-byte characters.
'_ellipsis' is removed in this patch, because it is referred only from
'ellipsis'.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 06 Jul 2014 02:56:41 +0900] rev 21856
encoding: add 'trim' to trim multi-byte characters at most specified columns
Newly added 'trim' is used to trim multi-byte characters at most
specified columns correctly: directly slicing byte sequence should be
replaced with 'encoding.trim', because the former may split at
intermediate multi-byte sequence.
Slicing unicode sequence ('uslice') and concatenation with ellipsis
('concat') are defined as function, to make enhancement in subsequent
patch easier.
Jim Hague <jim.hague@acm.org> [Thu, 03 Jul 2014 10:48:37 +0100] rev 21855
bugzilla: stop trying to cache setup across hook invocation
In the context of standalone Hg receiving a set of incoming changes, it makes
sense for the Bugzilla module to cache basic setup to avoid reconnecting
to Bugzilla for each change. After processing the changes, Hg will exit
and so the connection is short-lived.
But this doesn't work too well when used from a long-lived environment
such as hgweb or Kallithea where, for example, the connection can time out.
So take the simple approach, abandon the cache and do the basic setup on
each call. This fixes current problems with Kallithea.
Matt Mackall <mpm@selenic.com> [Fri, 11 Jul 2014 18:04:51 -0500] rev 21854
strip: drop -b/--backup option (BC)
This option had very limited utility and counterintuitive behavior and
collided unfortunately with the much later -B option.
Normally we would no-op such a feature so as to avoid annoying existing
scripts. However, we have to weigh that against the silent misbehavior
that results when users mistakenly intended to use -B: because -b
takes no arg, the bookmark gets interpreted as a normal revision, and
gets stripped without removing the associated bookmark, while also not
backing up the revision in question. A no-op behavior or warning would only
remove the latter half of the misadventure.
The only users I can find of this feature were using it in error and
have since stopped. The few (if any) remaining users of this feature
would be better served by --no-backup.
Ben Kehoe <benk@berkeley.edu> [Thu, 07 Nov 2013 17:24:14 -0800] rev 21853
purge: add options for deleting only files or only directories
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 20 Jun 2014 16:15:38 +0900] rev 21852
shelve: accept '--edit' like other commands creating new changeset
After this patch, users can invoke editor for the commit message by
'--edit' option regardless of '--message'.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 20 Jun 2014 16:15:38 +0900] rev 21851
shelve: refactor option combination check to easily add new ones
Before this patch, the name of a newly added option had to be added
into each string that was passed to the "checkopt()" internal
function: these are white-space-separated list of un-acceptable option
names (= "black list" for the specified "opt").
This new option had to be added into multiple strings because each
option could belong to only one action of "create", "cleanup",
"delete" or "list".
In addition to this redundancy, each string passed to "checkopt()" was
already too long to include a new one.
This patch refactors option combination check to make it easier to add
a new option in a subsequent patch.
New "checkopt()" only takes one action ("cleanup", "delete" or
"list"), and checks whether all explicitly activated options are
allowed for it or not (if specified action is activated in "opts").
The "date" entry is listed in "allowables", but commented out,
because:
- "date" shouldn't be checked for test
checking "date" causes unexpected failure of "test-shelve.t",
because "run-test.py" puts "[default] shelve = --date '0 0'" into
hgrc.
- explicitly listing it can advertise that ignoring it is intentional
This patch doesn't choose "white list" for the specified "opt", to
avoid treating global options.
Matt Mackall <mpm@selenic.com> [Wed, 09 Jul 2014 12:30:12 -0500] rev 21850
merge with stable
Augie Fackler <raf@durin42.com> [Tue, 08 Jul 2014 22:57:54 -0400] rev 21849
test-extension: add check for 'hg version -v' listing enabled extensions
anatoly techtonik <techtonik@gmail.com> [Tue, 10 Jun 2014 13:44:37 +0300] rev 21848
version: show enabled extensions (
issue4209)
This code is based by hg-versions extension (GPLv2)
by Markus Zapke-Gruendemann <info@keimlink.de>
http://mercurial.selenic.com/wiki/VersionsExtension
David Soria Parra <davidsp@fb.com> [Tue, 08 Jul 2014 16:24:23 -0700] rev 21847
strip: remove bookmarks after strip succeed (
issue4295)
In case we have revs to strip, delete the bookmark after the strip succeeds, not
beforehand as we might still abort due to dirty working directory, etc.
Ryan McElroy <rmcelroy@fb.com> [Thu, 12 Jun 2014 18:02:23 -0700] rev 21846
templater: introduce word function
This function allows returning only the nth "word" from a string. By default
a string is split as by Python's split() function default, but an optional
third parameter can also override what string the string is split by.
Sean Farley <sean.michael.farley@gmail.com> [Thu, 03 Jul 2014 23:01:37 -0500] rev 21845
committablectx: move __contains__ into workingctx
This was mistakenly moved from workingctx to committablectx in
9d56a3359011. Since the method is querying the dirstate, the only logical place
is for it to reside is in workingctx.
Sean Farley <sean.michael.farley@gmail.com> [Wed, 02 Jul 2014 15:24:43 -0500] rev 21844
memctx: explicitly set substate to None
In
d2743be1bb06, memctx was changed to inherit from committablectx, this in
turn added the 'substate' property to memctx. It turns out that the
newcommitphase method tested for this property:
def newcommitphase(ui, ctx):
commitphase = phases.newcommitphase(ui)
substate = getattr(ctx, "substate", None)
if not substate:
return commitphase
Currently, memctx isn't ready to handle substates, nor removed files, so we
explicitly must set substate=None to get the old behavior back. In the future,
we can decide how memctx should play with substate. For now, this fixes
third-party extensions and some internal code dealing with subrepos.
Matt Mackall <mpm@selenic.com> [Tue, 08 Jul 2014 14:45:55 -0500] rev 21843
bookmarks: avoid deleting primary bookmarks on rebase
Prior to this, doing "hg rebase -s @foo -d @" would delete @, which is
obviously wrong: a primary bookmark should never be automatically deleted.
This change blocks the deletion, but doesn't yet properly clean up the
divergence: @ should replace @foo.
Jim Hague <jim.hague@acm.org> [Thu, 03 Jul 2014 10:56:03 +0100] rev 21842
bugzilla: correct config documentation error
The config documentation specifies the wrong access method in the XMLRPC+email
configuration.
Augie Fackler <raf@durin42.com> [Sun, 06 Jul 2014 15:43:26 -0400] rev 21841
Merge with crew.
Augie Fackler <raf@durin42.com> [Sun, 06 Jul 2014 15:39:01 -0400] rev 21840
Merge with stable.
Alex Gaynor <alex.gaynor@gmail.com> [Sat, 05 Jul 2014 07:31:08 -0700] rev 21839
setup: fixed for Pythons which don't have a CFLAGS
Specifically this is observed to happen on the PyPy one gets from homebrew
André Sintzoff <andre.sintzoff@gmail.com> [Thu, 03 Jul 2014 19:05:04 +0200] rev 21838
util.h: declare dirstateTupleType variable instead of defining it
The definition is already in parsers.c
This patch avoids, at least on Mac OS X 10.6.8, build issue since
e250b8300e6e
Sean Farley <sean.michael.farley@gmail.com> [Fri, 13 Jun 2014 15:59:18 -0700] rev 21837
test-context: add test for performing a diff on a memctx
We now see the first result of all that refactoring of memctx: we can now diff
against a memctx.
Sean Farley <sean.michael.farley@gmail.com> [Fri, 13 Jun 2014 15:56:11 -0700] rev 21836
test-context: add test for memctx status
Sean Farley <sean.michael.farley@gmail.com> [Thu, 29 May 2014 16:12:59 -0500] rev 21835
memctx: add _manifest implementation that computes the filenode
This is an initial implementation of having a manifest for memctx that computes
the hash in the same way that filenodes are computed elsewhere.
Sean Farley <sean.michael.farley@gmail.com> [Tue, 29 Apr 2014 16:43:59 -0500] rev 21834
basectx: pass raw context objects to patch.diff
Sean Farley <sean.michael.farley@gmail.com> [Wed, 14 Aug 2013 13:10:27 -0500] rev 21833
patch: use ctx.node() instead of bare node variable
Future patches will allow patch.diff to take a basectx so node1 (and node2)
could make hexfunc error out. Instead, we'll call the node function on the
context object directly.
Matt Mackall <mpm@selenic.com> [Wed, 02 Jul 2014 00:01:13 -0500] rev 21832
merge with stable
Matt Mackall <mpm@selenic.com> [Tue, 01 Jul 2014 23:32:18 -0500] rev 21831
Added signature for changeset
2d8cd3d0e83c
Matt Mackall <mpm@selenic.com> [Tue, 01 Jul 2014 23:32:11 -0500] rev 21830
Added tag 3.0.2 for changeset
2d8cd3d0e83c
Matt Mackall <mpm@selenic.com> [Tue, 01 Jul 2014 23:27:32 -0500] rev 21829
merge with i18n
Wagner Bruna <wbruna@softwareexpress.com.br> [Mon, 30 Jun 2014 18:52:57 -0300] rev 21828
i18n-pt_BR: synchronized with
a4b67bf1f0a5
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 30 Jun 2014 19:09:01 +0900] rev 21827
i18n-ja: synchronized with
a4b67bf1f0a5
Augie Fackler <raf@durin42.com> [Sat, 07 Jun 2014 15:23:12 -0400] rev 21826
rebase: fix bug that caused transitive copy records to disappear (
issue4192)
The defect was that copies were always duplicated against the target
revision, rather than the first parent of the revision being
rebased. This produced nominally correct results if changes were
rebased one at a time (or with --collapse), but was wrong if we
rebased a sequence of changesets which contained a sequence of copies.
Augie Fackler <raf@durin42.com> [Sat, 07 Jun 2014 15:14:36 -0400] rev 21825
cmdutil: add copy-filtering support to duplicatecopies
In order to fix issue 4192 we need to be able to skip some copies
while doing duplicatecopies.
Matt Mackall <mpm@selenic.com> [Tue, 01 Jul 2014 19:54:48 -0500] rev 21824
dispatch: handle empty IOError args
We occasionally throw bare IOError objects (especially in convert),
don't choke on them.
Angel Ezquerra <angel.ezquerra@gmail.com> [Sun, 29 Jun 2014 13:52:35 +0200] rev 21823
repoview: do not crash when localtags refers to non existing revisions
This fixes a crash that may happen when using mercurial 3.0.x.
The _gethiddenblockers function assumed that the output of tags.readlocaltags()
was a dict mapping tags to of valid nodes. However this was not necessarily the
case. When a repository had obsolete revisions and had local tag pointing to a
non existing revision was found, many mercurial commands would crash.
This revision fixes the problem by removing any tags from the output of
tags.readlocaltags() which point to invalid nodes.
We may want to add a warning when this happens (although it might be
annoying to get that warning for every command, possibly even more than once per
command).
A test for this problem has been added to test-obsolete.t. Without this fix the
test would output:
$ hg tags
abort: 00changelog.i@
3816541e5485: no node!
[255]
Instead of:
$ hg tags
tiptag 2:
3816541e5485
tip 2:
3816541e5485
visible 0:
193e9254ce7e
Ryan McElroy <rmcelroy@fb.com> [Thu, 12 Jun 2014 18:07:21 -0700] rev 21822
templater: add symbol to error
This patch makes it easier to debug writing templater functions by
telling the user exactly what was sent to the templater.
Ryan McElroy <rmcelroy@fb.com> [Thu, 12 Jun 2014 17:53:37 -0700] rev 21821
templater: introduce startswith function
This function returns a string only if it starts with a given string.
It is particularly useful when combined with splitlines and/or used with
conditionals that fail when empty strings are passed in to take action
based on the contents of a line.
Ryan McElroy <rmcelroy@fb.com> [Thu, 12 Jun 2014 17:45:41 -0700] rev 21820
templatefilter: add splitlines function
This is useful for applying changes to each line, and it's especially powerful
when used in conjunction with conditionals to modify lines based on content.
Yuya Nishihara <yuya@tcha.org> [Thu, 01 May 2014 19:57:25 +0900] rev 21819
serve: tidy up indent level of repository not found message
Yuya Nishihara <yuya@tcha.org> [Thu, 01 May 2014 19:54:43 +0900] rev 21818
serve: inline checkrepo() that is used only when --stdio is specified
Since
e811b93f2cb1, --cmdserver is allowed to start without repository, so
checkrepo() function is meaningless.
Yuya Nishihara <yuya@tcha.org> [Sat, 28 Jun 2014 13:02:44 +0900] rev 21817
serve: make sure to print "listening at" message immediately
If stdout is piped, status message won't be flushed until client connects to
the server and access log is written to stdout. It seems bad idea to queue
start-up banner of server process.
Matt Mackall <mpm@selenic.com> [Fri, 27 Jun 2014 15:20:50 -0700] rev 21816
merge with stable
Siddharth Agarwal <sid0@fb.com> [Wed, 25 Jun 2014 14:50:48 -0700] rev 21815
match: make glob '**/' match the empty string
Previously, a glob pattern of the form 'foo/**/bar' would match 'foo/a/bar' but
not 'foo/bar'. That was because the '**' in 'foo/**/bar' would be translated to
'.*', making the final regex pattern 'foo/.*/bar'. That pattern doesn't match
the string 'foo/bar'.
This is a bug because the '**/' glob matches the empty string in standard Unix
shells like bash and zsh.
Fix that by making the ending '/' optional if an empty string can be matched.
Angel Ezquerra <angel.ezquerra@gmail.com> [Sun, 23 Feb 2014 03:13:21 +0100] rev 21814
tags: read tag info into a sorted dict (rather than into a regular dict)
This lets us preserve the original tag order (as specified on the .hgtags file
that is being read). This will be useful to preserve the tag order when saving
the result of a successful automated .hgtags merge (which will be introduced on
a future patch).
There shouldn't be much impact on performance because the sortdict that
_readtags returns is then used to update the alltags regular dict (which
remains a regular dict).
Angel Ezquerra <angel.ezquerra@gmail.com> [Sun, 23 Feb 2014 01:56:31 +0100] rev 21813
config: move config.sortdict class into util
This makes it more natural to use the sortdict class from outside config.py.
Augie Fackler <raf@durin42.com> [Mon, 23 Jun 2014 09:33:07 -0400] rev 21812
hg: add support for HGUNICODEPEDANTRY environment variable
This lets us easily verify that there are no implicit conversions
between unicodes and bytes in Mercurial's codebase. Based on something
mpm did by hand periodically, but it kept regressing, so just open the
door to running it in a buildbot.
Siddharth Agarwal <sid0@fb.com> [Tue, 27 May 2014 21:02:16 -0700] rev 21811
dirstate.status: assign members one by one instead of unpacking the tuple
With this patch, hg status and hg diff regain their previous speed.
The following tests are run against a working copy with over 270,000 files.
Here, 'before' means without this or the previous patch applied.
Note that in this case `hg perfstatus` isn't representative since it doesn't
take dirstate parsing time into account.
$ time hg status # best of 5
before: 2.03s user 1.25s system 99% cpu 3.290 total
after: 2.01s user 1.25s system 99% cpu 3.261 total
$ time hg diff # best of 5
before: 1.32s user 0.78s system 99% cpu 2.105 total
after: 1.27s user 0.79s system 99% cpu 2.066 total
Siddharth Agarwal <sid0@fb.com> [Tue, 27 May 2014 21:02:16 -0700] rev 21810
dirstate.status: assign members one by one instead of unpacking the tuple
With this patch, hg status and hg diff regain their previous speed.
The following tests are run against a working copy with over 270,000 files.
Here, 'before' means without this or the previous patch applied.
Note that in this case `hg perfstatus` isn't representative since it doesn't
take dirstate parsing time into account.
$ time hg status # best of 5
before: 2.03s user 1.25s system 99% cpu 3.290 total
after: 2.01s user 1.25s system 99% cpu 3.261 total
$ time hg diff # best of 5
before: 1.32s user 0.78s system 99% cpu 2.105 total
after: 1.27s user 0.79s system 99% cpu 2.066 total
Siddharth Agarwal <sid0@fb.com> [Tue, 27 May 2014 14:27:41 -0700] rev 21809
parsers: inline fields of dirstate values in C version
Previously, while unpacking the dirstate we'd create 3-4 new CPython objects
for most dirstate values:
- the state is a single character string, which is pooled by CPython
- the mode is a new object if it isn't 0 due to being in the lookup set
- the size is a new object if it is greater than 255
- the mtime is a new object if it isn't -1 due to being in the lookup set
- the tuple to contain them all
In some cases such as regular hg status, we actually look at all the objects.
In other cases like hg add, hg status for a subdirectory, or hg status with the
third-party hgwatchman enabled, we look at almost none of the objects.
This patch eliminates most object creation in these cases by defining a custom
C struct that is exposed to Python with an interface similar to a tuple. Only
when tuple elements are actually requested are the respective objects created.
The gains, where they're expected, are significant. The following tests are run
against a working copy with over 270,000 files.
parse_dirstate becomes significantly faster:
$ hg perfdirstate
before: wall 0.186437 comb 0.180000 user 0.160000 sys 0.020000 (best of 35)
after: wall 0.093158 comb 0.100000 user 0.090000 sys 0.010000 (best of 95)
and as a result, several commands benefit:
$ time hg status # with hgwatchman enabled
before: 0.42s user 0.14s system 99% cpu 0.563 total
after: 0.34s user 0.12s system 99% cpu 0.471 total
$ time hg add new-file
before: 0.85s user 0.18s system 99% cpu 1.033 total
after: 0.76s user 0.17s system 99% cpu 0.931 total
There is a slight regression in regular status performance, but this is fixed
in an upcoming patch.
Siddharth Agarwal <sid0@fb.com> [Tue, 27 May 2014 17:10:28 -0700] rev 21808
dirstate: add dirstatetuple to create dirstate values
Upcoming patches will switch away from using Python tuples for dirstate values
in compiled builds. Make that easier by introducing a variable called
dirstatetuple, currently set to tuple. In upcoming patches, this will be set to
an object from the parsers module.
Siddharth Agarwal <sid0@fb.com> [Tue, 27 May 2014 15:22:23 -0700] rev 21807
parsers: remove no longer used dirstate_unset
Siddharth Agarwal <sid0@fb.com> [Tue, 27 May 2014 15:17:38 -0700] rev 21806
pack_dirstate: in C version, for invalidation set dict to what we write to disk
For files written out in the last second, Mercurial used to invalidate all the
stat data (state, size, mode, mtime) while persisting to disk. This included
invalidating the data in the dirstate dict as well.
In commit
187bf2dde7c1, this was found to be unnecessary, and Mercurial
switched to invalidating only the mtime. However, in the C version of
pack_dirstate the value set in the dict was still the fully invalidated one.
Switch to invalidating just the mtime in the dict as well.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Thu, 26 Jun 2014 11:10:28 -0400] rev 21805
record: update comment to match code
Commit
205599e31870 changed how newfiles get passed to commitfunc, but
did not change the corresponding comment that explains this. This
commit also updates this comment.
Chinmay Joshi <c@chinmayjoshi.com> [Sat, 21 Jun 2014 14:49:49 +0530] rev 21804
hg: update newly added listdir function of vfs in clone
This change invokes os.listdir() via newly added vfs function in clone.
Chinmay Joshi <c@chinmayjoshi.com> [Sat, 21 Jun 2014 14:44:09 +0530] rev 21803
hg: use vfs functions in clone
This change applies vfs functions in clone. destvfs.exists will invoke
os.path.lexists via lexists of vfs to check for broken symbolic links.
Chinmay Joshi <c@chinmayjoshi.com> [Sat, 21 Jun 2014 14:40:29 +0530] rev 21802
hg: update util.writefile method to use write with vfs in share
This patch replaces util.writefile() to use destvfs.write().
Chinmay Joshi <c@chinmayjoshi.com> [Sat, 21 Jun 2014 14:37:39 +0530] rev 21801
hg: update to use vfs functions in shared destination repository
This patch uses destvfs with base as .hg directory in shared destination
repository to update filesystem function with vfs. Some methods are changed to
use vfs functions with destvfs.
branch 'default' HG: bookmark '@' HG: changed mercurial/hg.py
Chinmay Joshi <c@chinmayjoshi.com> [Sat, 21 Jun 2014 14:29:20 +0530] rev 21800
hg: use vfs functions in destination repository with share
In this patch, dstwvfs is added to use vfs functions in working directory of
destination shared repository. Existing filesystem operations are updated
to use vfs functions through dstwvfs.
Chinmay Joshi <c@chinmayjoshi.com> [Fri, 20 Jun 2014 21:18:14 +0530] rev 21799
vfs: add listdir for os.listdir in vfs
This patch adds listdir() in vfs to use os.listdir().
Augie Fackler <raf@durin42.com> [Mon, 23 Jun 2014 09:24:56 -0400] rev 21798
templater: restore use of callable() since it was readded in Python 3.2
Augie Fackler <raf@durin42.com> [Mon, 23 Jun 2014 09:24:38 -0400] rev 21797
hook: restore use of callable() since it was readded in Python 3.2
Augie Fackler <raf@durin42.com> [Mon, 23 Jun 2014 09:24:24 -0400] rev 21796
help: restore use of callable() since it was readded in Python 3.2
Augie Fackler <raf@durin42.com> [Mon, 23 Jun 2014 09:24:06 -0400] rev 21795
extensions: restore use of callable() since it was readded in Python 3.2
Augie Fackler <raf@durin42.com> [Mon, 23 Jun 2014 09:24:16 -0400] rev 21794
fancyopts: restore use of callable() since it was readded in Python 3.2
Augie Fackler <raf@durin42.com> [Mon, 23 Jun 2014 09:23:57 -0400] rev 21793
gendoc: restore use of callable() since it was readded in Python 3.2
Augie Fackler <raf@durin42.com> [Mon, 23 Jun 2014 09:23:47 -0400] rev 21792
check-seclevel: restore use of callable() since it was readded in Python 3.2
Augie Fackler <raf@durin42.com> [Mon, 23 Jun 2014 09:22:53 -0400] rev 21791
check-code: drop ban on callable() which was restored in Python 3.2
A followup will restore use of callable() in place of the awkward
hasattr() construction we were using to be one step closer to Python
3.
Stephen Lee <sphen.lee@gmail.com> [Sat, 21 Jun 2014 15:56:49 +1000] rev 21790
diff: add nobinary config to suppress git-style binary diffs
Matt Mackall <mpm@selenic.com> [Mon, 23 Jun 2014 13:50:44 -0500] rev 21789
branchmap: don't use ui.warn for debug message
Matt Mackall <mpm@selenic.com> [Mon, 23 Jun 2014 13:46:42 -0500] rev 21788
branch: add debug message for branch cache write failure
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:36:07 -0700] rev 21787
record: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:30:47 -0700] rev 21786
mq: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:23:45 -0700] rev 21785
largefiles: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:32:15 -0700] rev 21784
keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:33:22 -0700] rev 21783
hgk: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:28:46 -0700] rev 21782
graphlog: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:29:27 -0700] rev 21781
extdiff: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:25:28 -0700] rev 21780
children: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:24:38 -0700] rev 21779
churn: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:22:59 -0700] rev 21778
commands: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:20:00 -0700] rev 21777
cmdutil: support inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:16:56 -0700] rev 21776
keyword: define optionalrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:16:05 -0700] rev 21775
commands: define optionalrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:12:34 -0700] rev 21774
cmdutil: add optionalrepo argument to command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:07:45 -0700] rev 21773
tests: define norepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:03:11 -0700] rev 21772
share: define norepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:04:14 -0700] rev 21771
mq: define norepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 21:11:15 -0700] rev 21770
largefiles: define norepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 22:02:25 -0700] rev 21769
convert: define norepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 20:57:01 -0700] rev 21768
commands: define norepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 20:58:25 -0700] rev 21767
commands: add norepo argument to command decorator
Since decorators are evaluated at module load time and since the
@command decorator imports commands, the norepo variable (along with
its friends) may not be declared yet. These variables are now declared
before @command usage to ensure they are present.
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 May 2014 18:45:04 -0700] rev 21766
cmdutil: better document command()
Matt Harbison <matt_harbison@yahoo.com> [Wed, 11 Jun 2014 22:19:29 -0400] rev 21765
convert: update the transplant, rebase and graft references in 'extra'
This change allows the origin() and destination() revsets to yield the same
results in the new and old repos after a conversion. Previously, nothing would
be listed for queries in the new repo.
Like the SHA1 updates to the commit messages, this is only operational when the
'convert.hg.saverev=True' option is specified. If the old reference cannot be
found, it is left as-is. It seems slightly better to leave stale evidence of
the graft/transplant/rebase than to eliminate it entirely.
Matt Mackall <mpm@selenic.com> [Wed, 18 Jun 2014 20:59:36 -0500] rev 21764
merge with stable
Matt Mackall <mpm@selenic.com> [Wed, 18 Jun 2014 20:51:49 -0500] rev 21763
run-tests: hold iolock across diff/prompt when interactive
Otherwise diff may get separated from the corresponding prompt by
other threads. This required moving the interactive prompting from one
helper method to another.
Matt Mackall <mpm@selenic.com> [Wed, 18 Jun 2014 15:26:07 -0500] rev 21762
bookmarks: improve the bookmark help (
issue4244)
Matt Mackall <mpm@selenic.com> [Wed, 18 Jun 2014 19:46:18 -0500] rev 21761
push: restore contents of HG_URL for hooks (
issue4268)
Matt Mackall <mpm@selenic.com> [Wed, 18 Jun 2014 13:47:14 -0500] rev 21760
tests: ignore missing file with PYTHONDONTWRITEBYTECODE (
issue4239)
Matt Mackall <mpm@selenic.com> [Mon, 16 Jun 2014 13:30:46 -0500] rev 21759
hgweb: avoid initialization race (
issue4280)
Matt Mackall <mpm@selenic.com> [Mon, 16 Jun 2014 12:04:48 -0500] rev 21758
p4: accept changesets with no description (
issue4282)
Matt Mackall <mpm@selenic.com> [Sat, 14 Jun 2014 11:56:20 -0500] rev 21757
merge with stable
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 30 May 2014 12:57:58 -0700] rev 21756
test-run-tests.t: test the --nodiff option
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 30 May 2014 12:12:12 -0700] rev 21755
test-run-tests.t: test the --interactive option
anuraggoel <anurag.dsps@gmail.com> [Fri, 13 Jun 2014 14:45:23 +0530] rev 21754
run-tests: fixes the '--interactive' option error
This patch fixes a regression recently introduced by a refactoring.
Previously when failure occurs while testing with '--interactive' was enable,
it didn't prompt user by asking whether he wants to accept this failure
changes or not.
This was happening beacuse of the 'if' condition
if ret or not self._options.interactive or \
not os.path.exists(test.errpath):
Everytime failure occurs, this condition gets true and returns back even
when '--interactive' is enabled. This condition don't led the function to
execute further, which consist the '--interactive' functionality.
Now, on failure with '--interactive' enabled, it prompts user whether he wants
to accepts failure changes or not.
If yes then test gets passed and returns true, else test gets failed.
On every failure, results gets stored in "self.failures.append((test, reason))"
But if failure changes accepted by user then test must get "pop out" from
failed test list.
anuraggoel <anurag.dsps@gmail.com> [Fri, 13 Jun 2014 14:33:02 +0530] rev 21753
run-tests: checks behaviour of test on failure while testing
On failure while testing, if this function "result.addFailure(self, str(e))"
returns true then test get 'passed' else count as 'failed'.
Matt Mackall <mpm@selenic.com> [Sat, 14 Jun 2014 11:49:02 -0500] rev 21752
revlog: fix check-code error
Matt Mackall <mpm@selenic.com> [Fri, 13 Jun 2014 17:42:04 -0500] rev 21751
merge with stable
Matt Mackall <mpm@selenic.com> [Fri, 13 Jun 2014 14:17:14 -0500] rev 21750
revlog: hold a private reference to self._cache
This keeps other threads from modifying self._cache out from under us.
With this and the previous fix, 'hg serve' survives 100k hits with siege.
Matt Mackall <mpm@selenic.com> [Fri, 13 Jun 2014 14:16:03 -0500] rev 21749
revlog: make _chunkcache access atomic
With this and related fixes, 'hg serve' survived 100000 hits with
siege.
Danek Duvall <danek.duvall@oracle.com> [Mon, 09 Jun 2014 10:34:21 -0700] rev 21748
tests: cat error messages are different on Solaris
Brendan Cully <brendan@kublai.com> [Tue, 10 Jun 2014 17:00:31 -0700] rev 21747
error: restore python 2.4 compatibility for BundleValueError
Under python 2.4, this:
super(BundleValueError, self).__init__(msg)
raises this:
TypeError: super() argument 1 must be type, not classobj
Matt Mackall <mpm@selenic.com> [Thu, 12 Jun 2014 14:40:45 -0500] rev 21746
i18n: explicitly decode paragraphs
This was triggering an exception when the default encoding was disabled.
Matt Mackall <mpm@selenic.com> [Fri, 13 Jun 2014 14:14:02 -0500] rev 21745
minirst: explicitly decode substitutions
Caught by Augie and sys.setdefaultencoding("undefined")
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 30 May 2014 12:12:03 -0700] rev 21744
test-run-tests.t: tests --jobs option
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 30 May 2014 12:11:51 -0700] rev 21743
test-run-tests.t: test --debug option
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 30 May 2014 12:11:39 -0700] rev 21742
test-run-tests.t: test selection of testfile from the command line
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 30 May 2014 12:11:17 -0700] rev 21741
test-run-tests.t: tests the --retest option
anuraggoel <anurag.dsps@gmail.com> [Thu, 12 Jun 2014 03:20:28 +0530] rev 21740
run-tests: fixes the number of tests ran when '--retest' is enabled
This patch fixes a regression recently introduced by a refactoring. (see
92a6b16c9186 and about 200 previous changesets from Gregory Szorc)
While retesting, that is when '--retest' is enabled, only failure tests run
and others either skipped or ignored.
During retesting, "result.testsRun" holds the count of failure test that has
run. But as while printing output, we have subtracted the skipped and ignored
count from "result.testsRun". Therefore, to make the count remain
the same, we need to add skipped and ignored count before printing.
anuraggoel <anurag.dsps@gmail.com> [Thu, 12 Jun 2014 02:36:52 +0530] rev 21739
run-tests: skipped test should not produce 'i' mark while retesting
When '--retest' option is enabled then skipped test should not produce 'i' mark.
This fixes a regression introduced by
92a6b16c9186 and about 200 previous
changesets from Gregory Szorc.