Augie Fackler <augie@google.com> [Mon, 13 Apr 2015 16:37:53 -0400] rev 25054
test-run-tests.t: work around file.write() returning an int
In Python 3.5, file.write() returns the number of bytes it wrote
instead of None.
Augie Fackler <augie@google.com> [Tue, 14 Apr 2015 16:24:32 -0400] rev 25053
run-tests: write bytes to the binary buffer on sys.{stdout,stderr}
Augie Fackler <augie@google.com> [Tue, 14 Apr 2015 16:21:10 -0400] rev 25052
run-tests: record faildata using bytes instead of str
lines is already bytes, so this is just fixing a bug on python 3.
Augie Fackler <augie@google.com> [Tue, 14 Apr 2015 16:18:11 -0400] rev 25051
run-tests: do cdata escaping using bytes instead of str
Augie Fackler <augie@google.com> [Mon, 13 Apr 2015 16:33:12 -0400] rev 25050
run-tests: make sure keyword(s) are in bytes and not str
Augie Fackler <augie@google.com> [Mon, 13 Apr 2015 16:31:19 -0400] rev 25049
run-tests: use items instead of iteritems on dicts
This works the same-enough on 2.6 and 3.5 to be fine.
Augie Fackler <augie@google.com> [Mon, 13 Apr 2015 16:30:40 -0400] rev 25048
run-tests: refer to test.bname when sniffing for keywords
Augie Fackler <augie@google.com> [Mon, 13 Apr 2015 15:57:10 -0400] rev 25047
run-tests: string-escape no longer exists in python 3, use unicode_escape
Augie Fackler <augie@google.com> [Mon, 13 Apr 2015 15:55:48 -0400] rev 25046
run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com> [Tue, 21 Apr 2015 12:24:34 -0400] rev 25045
run-tests: use difflib.diff_bytes on Python 3
This method was introduced in Python 3.5 to satisfy our
diffing-strings-of-bytes needs.
Augie Fackler <augie@google.com> [Sun, 12 Apr 2015 16:14:07 -0400] rev 25044
run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com> [Sun, 12 Apr 2015 16:13:38 -0400] rev 25043
setup: decode xcode version number on python3
Augie Fackler <augie@google.com> [Sun, 12 Apr 2015 15:35:57 -0400] rev 25042
run-tests: work around with_hg being bytes or string depending on provenance
Augie Fackler <augie@google.com> [Tue, 14 Apr 2015 16:03:04 -0400] rev 25041
run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com> [Tue, 14 Apr 2015 16:02:49 -0400] rev 25040
run-tests: write bytes to sys.stdout.buffer in python 3
Augie Fackler <augie@google.com> [Tue, 14 Apr 2015 15:59:59 -0400] rev 25039
run-tests: be more judicious about bytes vs string on test attrs
This introduces a bname attribute for when we need to use the test
name in a path, and retains name for when we need it as a
string. Sadly, we seem to need both of these.
Augie Fackler <augie@google.com> [Tue, 14 Apr 2015 15:56:44 -0400] rev 25038
run-tests: fix _findprogram to reliably return bytes
Augie Fackler <augie@google.com> [Tue, 14 Apr 2015 15:54:13 -0400] rev 25037
run-tests: introduce a name for os.environb
On python 2 this is just os.environ, but on python 3 we need to get to
os.environb in several places.
Augie Fackler <augie@google.com> [Tue, 14 Apr 2015 15:52:45 -0400] rev 25036
run-tests: work around chr() producing unicode in Python 3
Augie Fackler <augie@google.com> [Sat, 11 Apr 2015 18:28:32 -0400] rev 25035
run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com> [Sat, 11 Apr 2015 18:26:58 -0400] rev 25034
run-tests: use bytes explicitly for tmpdir and hgrc construction
We now get slightly further on Python 3. Python 2.6 still works.
Augie Fackler <augie@google.com> [Sat, 11 Apr 2015 18:22:25 -0400] rev 25033
run-tests: work around the rename of xrange to range
Augie Fackler <augie@google.com> [Sun, 12 Apr 2015 15:34:17 -0400] rev 25032
heredoctest: 2to3 -w -f numliterals -f except -f print tests/heredoctest.py
Augie Fackler <augie@google.com> [Sat, 11 Apr 2015 18:20:44 -0400] rev 25031
python3: update killdaemons and run-tests print and exception syntax
test-run-tests.t still passes fine on Python 2.6. run-tests.py --local
no longer fails with syntax errors, and now fails looking for xrange.
Most changes done with
2to3 -w -f numliterals -f except -f print tests/run-tests.py tests/killdaemons.py
after which one import was fixed in run-tests and a __future__ import
was added.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 13 May 2015 11:49:38 -0700] rev 25030
check-code: allow with statements
We dropped python 2.4 compatibility.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 13 May 2015 11:41:17 -0700] rev 25029
check-code: allow 'Except EClass as variable:'
Python 2.4 compatibility has been dropped.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 13 May 2015 11:39:48 -0700] rev 25028
check-code: allow print and exec as a function
This is required to move forward on python3 compatibility.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 06 May 2015 15:58:14 -0700] rev 25027
pathencode: for long paths, strip first 5 chars, not first dir
When encoding long paths, the pure Python code strips the first
directory from the path, while the native code currently strips the
first 5 characters. This discrepancy has not been a problem so far,
since we have not stored anything in directories other than
data/. However, we will soon be storing submanifest revlogs in
metadata/, so the discrepancy will have to go [1]. Since file
collisions are avoided by the hashing alone (which is done on the full
unencoded path), it doesn't really matter whether we drop the first
dir, the first 5 characters, or special-case non-data/. To avoid
touching the C code, let's always strip the first 5 characters.
[1] Or maybe elsewhere, but the discrepancy is ugly either way.
Adrian Buehlmann <adrian@cadifra.com> [Wed, 13 May 2015 18:57:38 +0200] rev 25026
util.h: kill no longer needed definitions for Python < 2.5
see
e1fb276d4619
Nat Mote <nmote@fb.com> [Tue, 12 May 2015 15:04:19 -0700] rev 25025
rebase: add short -k option for --keep
histedit and strip already have a short option for keep, so this makes the
interface more consistent
Yuya Nishihara <yuya@tcha.org> [Mon, 30 Mar 2015 19:51:40 +0900] rev 25024
revset: test current behavior of addset class
The addset class isn't simple and it has a hidden bug that will be fixed by
future patches. So let's test the current behavior.
Yuya Nishihara <yuya@tcha.org> [Mon, 27 Apr 2015 23:03:20 +0900] rev 25023
revset: remove duplicated definition of choice() from addset._iterordered()
choice() is already defined before val1 = None. Perhaps there was merge or
rebase error.
Matt Mackall <mpm@selenic.com> [Tue, 12 May 2015 19:40:45 -0500] rev 25022
canonpath: fix infinite recursion
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 12 May 2015 11:44:14 -0700] rev 25021
commit: no longer allow empty commit with the 'force' argument (API)
The new way to allow empty commit is to temporarily set the
'ui.allowemptycommit' config option.
allowemptyback = repo.ui.backupconfig('ui', 'allowemptycommit')
try:
repo.ui.setconfig('ui', 'allowemptycommit', True)
repo.commit(...)
finally:
repo.ui.restoreconfig(allowemptyback)
All known uses of force for allowing empty commits have been removed, so let's
remove it from the allowemptycommits condition.
Durham Goode <durham@fb.com> [Mon, 11 May 2015 20:15:41 -0700] rev 25020
import: use ui.allowemptycommit to allow empty commits
Previously import used force=partial to allow empty commits to be made. Let's
switch it to using the new ui.allowemptycommit option. Tests says we can drop
the 'force' argument in the processs.
Durham Goode <durham@fb.com> [Mon, 11 May 2015 17:51:22 -0700] rev 25019
mq: use ui.allowemptycommit to allow empty commits
Previously, mq used the force flag to allow empty commits. Now that we have
ui.allowemptycommit let's switch to that instead. We can't completely remove the
force flag since it is used for a bunch of other behavior in localrepo.commit.
Durham Goode <durham@fb.com> [Mon, 11 May 2015 16:18:28 -0700] rev 25018
commit: add ui.allowemptycommit config option
This adds a config flag that enables a user to make empty commits.
This is useful in a number of cases.
For instance, automation that creates release branches via
bookmarks may want to make empty commits to that release bookmark so that it
can't be fast-forwarded and so it can record information about the release
bookmark's creation. This is already possible with named branches, so making it
possible for bookmarks makes sense.
Another case we've wanted it is for mirroring repositories into Mercurial. We
have automation that syncs commits into hg by running things from the command
line. The ability to produce empty commits is useful for syncing unusual commits
from other VCS's.
In general, allowing the user to create the DAG as they see fit seems useful,
and when I mentioned this in IRC more than one person piped up and said they
were already hacking around this limitation by using mq, import, and
commit-dummy-change-then-amend-the-content-away style solutions.
Durham Goode <durham@fb.com> [Mon, 11 May 2015 16:16:22 -0700] rev 25017
commit: move empty commit condition to a new line
The empty commit condition was a messy if condition. Let's move it to a new line
and change it to 'or' statements so it's cleaner and more readable. A future
commit will add additional logic to this line.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 08 May 2015 15:04:14 -0700] rev 25016
dirs: speed up by storing number of direct children per dir
The Python version of the dirs type stores only the number of direct
children associated with each directory. That means that while adding
a directory, it only has to walk backwards until it runs into a
directory that is already in its map. The C version walks all the way
to the top-most directory. By copying the Python version's clever
trick to the C code, we can speed it up quite a bit.
On the Firefox repo, perfdirs now runs in 0.031390, from 0.056518
before the undoing Sid's optimization in the previous change, and
0.061835 before previous his optimization. More practically, it speeds
up 'hg status nonexistent' on the Firefox repo from 0.176s to 0.155s.
It's unclear why the C version did not have the same cleverness
implemented from the start, especially given that they were both
written by the same person (Bryan O'Sullivan) very close in time:
856960173630 (scmutil: add a dirs class, 2013-04-10)
02ee846b246a (scmutil: rewrite dirs in C, use if available, 2013-04-10)
Martin von Zweigbergk <martinvonz@google.com> [Fri, 08 May 2015 15:09:28 -0700] rev 25015
dirs: back out forward-searching in finddirs()
This backs out the changes below. The next patch will implement a
faster algorithm based on backward-walking in finddirs().
67241ee427cf (dirs._addpath: reinstate use of Py_CLEAR, 2015-04-07)
6f0e6fa9fdd7 (dirs._addpath: don't mutate Python strings after exposing them (
issue4589), 2015-04-06)
1a9efc312700 (dirs.addpath: rework algorithm to search forward, 2015-03-27)
Ryan McElroy <rmcelroy@fb.com> [Wed, 15 Apr 2015 08:19:36 -0700] rev 25014
templatekw: replace currentbookmark with activebookmark keyword
Today, the terms 'active' and 'current' are interchangeably used throughout the
codebase in reference to the active bookmark (the bookmark that will be updated
with the next commit). This leads to confusion among developers and users.
This patch is part of a series to standardize the usage to 'active' throughout
the mercurial codebase and user interface.
Ryan McElroy <rmcelroy@fb.com> [Wed, 15 Apr 2015 08:12:04 -0700] rev 25013
templatekw: introduce activebookmark keyword
Today, the terms 'active' and 'current' are interchangeably used throughout the
codebase in reference to the active bookmark (the bookmark that will be updated
with the next commit). This leads to confusion among developers and users.
This patch is part of a series to standardize the usage to 'active' throughout
the mercurial codebase and user interface.
Ryan McElroy <rmcelroy@fb.com> [Wed, 15 Apr 2015 08:26:01 -0700] rev 25012
templatekw: rename variable current to active
Today, the terms 'active' and 'current' are interchangeably used throughout the
codebase in reference to the active bookmark (the bookmark that will be updated
with the next commit). This leads to confusion among developers and users.
This patch is part of a series to standardize the usage to 'active' throughout
the mercurial codebase and user interface.
Matt Harbison <matt_harbison@yahoo.com> [Mon, 11 May 2015 21:26:13 -0400] rev 25011
pathutil: hint if a path is root relative instead of cwd relative (
issue4663)
Given that this path is going to abort, it seems OK to spend the time to do an
alternate lookup to better inform the user. The path returned by util.pathto()
ends with '/' at least in some cases, so os.path.relpath() is used instead,
which requires python 2.6.
Matt Harbison <matt_harbison@yahoo.com> [Mon, 11 May 2015 22:47:01 -0400] rev 25010
check-code: drop the python 2.5 warning for os.path.relpath()
There's plenty of other cleanup to do in here, but this specific one is used in
the next patch.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 08 May 2015 23:44:15 -0700] rev 25009
setup.py: drop compatibility with Python 2.4 and 2.5 (BC)
The last blocker for dropping Python 2.4 was Centos 5. We now provide our own
Mercurial package for Centos 5 with a bundled Python2.7.
I'm therefore happy to officially drop compatibility with Python 2.4 (and
Python 2.5 that nobody really cares about). This open the season for code
cleanup.
It is war's prize to take all vantage.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 08 May 2015 23:28:33 -0700] rev 25008
rpm.spec: bump python dependency to 2.6
We are about to drop 2.4 requirement in Mercurial's setup.py, we bump rpm
dependency first for the sake of smaller changeset. Clean up of the spec file
can come after the dependency is actually dropped.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Sun, 10 May 2015 13:48:10 -0400] rev 25007
map-cmdline.bisect: rewrite to just %include the default template
This also adds labels to the output, as the tests now show.
I took the liberty to give two labels to the bisection status, just
like revisions get the log.changeset and changeset.phase statuses.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Sun, 10 May 2015 14:04:43 -0400] rev 25006
log: add a status template
It appears that git users like having a --name-status option on `git
log`. There exist at least three questions on StackOverflow on how to
do this for hg. The desired output is not difficult to build with
templates, and since this is something that svn users might also want,
it seems desirable to have this as another standard template.
This mimics the output of `hg status` and adds it to the log output.
It also follows status's convention of displaying copies with a -C
option. Brief example:
$ hg log -T status -C
changeset: 24883:
7d1b9b7ac9fd
bookmark: statustemplate
tag: tip
parent: 24864:
c560d8c68791
user: Jordi GutiƩrrez Hermoso <jordigh@octave.org>
date: Wed Apr 22 14:05:04 2015 -0400
summary: log: add a status template
files:
A added
A copied
original
M modified
R removed
Of course, everything is also coloured correctly, and there are tests
to prove it.
Matt Mackall <mpm@selenic.com> [Tue, 12 May 2015 12:33:42 -0500] rev 25005
tests: fix hidden repeatability problem with age filter test
This test was corrupting later cases in mysterious ways because the
hash of the changeset was changing every day at midnight. This made it
hard to figure out why tests were consistently breaking after they
were consistently working.
Yuya Nishihara <yuya@tcha.org> [Sat, 02 May 2015 15:51:57 +0900] rev 25004
help: rewrite template examples to use integer literals where appropriate
Yuya Nishihara <yuya@tcha.org> [Sat, 02 May 2015 15:49:38 +0900] rev 25003
templater: update error message of invalid number passed to word() function
"word(3, desc)" is valid now.
Yuya Nishihara <yuya@tcha.org> [Fri, 01 May 2015 20:43:55 +0900] rev 25002
templater: tokenize decimal integer literal (
issue4638) (BC)
Before this patch, we had to quote integer literals to pass to template
functions. It was error-prone, so we should allow "word(0, x)" syntax.
Currently only decimal integers are allowed. It's easy to support 0x, 0b and 0
prefixes, but I don't think they are useful.
This patch assumes that template keywords and names defined in map files do
not start with digits, except for positional variables seen in the schemes
extension.
Yuya Nishihara <yuya@tcha.org> [Sat, 02 May 2015 18:05:04 +0900] rev 25001
templater: switch methods table on compileexp() of func args and inner expr
The next patch will introduce integer literals, but the schemes extension
expects that '{1}', '{2}', ... are interpreted as keywords. This patch allows
us to process '{foo(1)}' as 'func(integer)', whereas '{1}' as 'symbol'.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Sun, 10 May 2015 13:33:51 -0400] rev 25000
templatefilters: don't stringify None into "None"
A few template keywords can in fact return None, such as {bisect}. In
some contexts, these get stringified into None instead of "". This is
leaking Python details into the UI.
Anton Shestakov <engored@ya.ru> [Sun, 10 May 2015 19:02:14 +0800] rev 24999
hgweb: clearly outline <tr> block in gitweb and spartan styles
It's easy to miss the closing </tr> tag when it's not on its own line. Some
neighboring blocks also already use this clearer style.
(In
03f692eee31d I didn't even think grepping for this, but this patch should
now cover every occurrence).
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 07 May 2015 12:07:11 +0900] rev 24998
rebase: use dirstateguard instead of dirstate.invalidate
Before this patch, "rebase.concludenode()" uses "dirstate.invalidate()"
as a kind of "restore .hg/dirstate to the original status" during a failure.
But it just discards changes in memory, and doesn't actually restore
".hg/dirstate". Then, it can't work as expected, if "dirstate.write()"
is executed while processing.
This patch uses "dirstateguard" instead of "dirstate.invalidate()" to
restore ".hg/dirstate" during a failure even if "dirstate.write()" is
executed before a failure.
This patch also removes "beginparentchage()" and "endparentchange()",
because "dirstateguard" makes them useless.
This is a part of preparations to fix the issue that the recent (in
memory) dirstate isn't visible to external processes (e.g. "precommit"
hook).
After this patch, the changed dirstate becomes visible to external
"precommit" hooks during "hg rebase" in "test-largefiles-misc.t",
because "dirstateguard()" writes it out. But this content isn't yet
correct, because:
- "normal3" should be marked as "A"(dded) at committing
It is newly added in the changeset being rebased.
- but it is marked as "M"(odified)
The result of "repo.setparents()" after "dirstateguard()" isn't
yet written out before "precommit". So, merging is still in
progress for "hg status" in it.
This causes marking the file newly added on "other" branch as "A".
This will be fixed by subsequent patch.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 07 May 2015 12:07:11 +0900] rev 24997
mq: use dirstateguard instead of dirstate.invalidate (qrefresh)
Before this patch, "mq.queue.refresh()" uses "dirstate.invalidate()"
as a kind of "restore .hg/dirstate to the original status" during a failure.
But it just discards changes in memory, and doesn't actually restore
".hg/dirstate". Then, it can't work as expected, if "dirstate.write()"
is executed while processing.
This patch uses "dirstateguard" instead of "dirstate.invalidate()" to
restore ".hg/dirstate" during a failure even if "dirstate.write()" is
executed before a failure.
This patch also removes "beginparentchage()" and "endparentchange()",
because "dirstateguard" makes them useless.
This is a part of preparations to fix the issue that the recent (in
memory) dirstate isn't visible to external processes (e.g. "precommit"
hook).
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 07 May 2015 12:07:11 +0900] rev 24996
mq: use dirstateguard instead of dirstate.invalidate (qpush)
Before this patch, "mq.queue.apply()" uses "dirstate.invalidate()" as
a kind of "restore .hg/dirstate to the original status" during afailure.
But it just discards changes in memory, and doesn't actually restore
".hg/dirstate". Then, it can't work as expected, if "dirstate.write()"
is executed while processing.
This patch uses "dirstateguard" instead of "dirstate.invalidate()" to
restore ".hg/dirstate" at failure even if "dirstate.write()" is
executed before failure.
This is a part of preparations to fix the issue that the recent (in
memory) dirstate isn't visible to external processes (e.g. "precommit"
hook).
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 07 May 2015 12:07:11 +0900] rev 24995
tryimportone: use dirstateguard instead of beginparentchange/endparentchange
To fix the issue that the recent (in memory) dirstate isn't visible to
external process (e.g. "precommit" hook), a subsequent patch makes
"localrepository.commit()" invoke "dirstate.write()" in it.
This change will make "beginparentchange()" and "endparentchange()" on
dirstate in "cmdutil.tryimportone()" meaningless, because:
- "dirstate.write()" writes changed data into ".hg/dirstate", but
- aborting between "beginparentchange()" and "endparentchange()"
doesn't cause any restoring ".hg/dirstate"
it just discards changes in memory.
This patch uses "dirstateguard" instead of "beginparentchange()" and
"endparentchange()" in "cmdutil.tryimportone()" to restore
".hg/dirstate" during a failure even if "dirstate.write()" is executed
before a failure.
This patch uses "lockmod.release(dsguard)" instead of
"dsguard.release()", because processing may be aborted before
assignment to "dsguard" , and the "if dsguard" examination for safety is
redundant.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 07 May 2015 12:07:10 +0900] rev 24994
import: use dirstateguard instead of dirstate.invalidate
Before this patch, "commands.import()" uses "dirstate.invalidate()" as
a kind of "restore .hg/dirstate to the original status" during a failure.
But it just discards changes in memory, and doesn't actually restore
".hg/dirstate". Then, it can't work as expected, if "dirstate.write()"
is executed while processing.
This patch uses "dirstateguard" instead of "dirstate.invalidate()" to
restore ".hg/dirstate" at failure even if "dirstate.write()" is
executed before failure.
This patch also removes "beginparentchage()" and "endparentchange()",
because "dirstateguard" makes them useless, too.
This is a part of preparations to fix the issue that the recent (in
memory) dirstate isn't visible to external process (e.g. "precommit"
hook).
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 07 May 2015 12:07:10 +0900] rev 24993
amend: use dirstateguard instead of dirstate.invalidate
Before this patch, "cmdutil.amend()" uses "dirstate.invalidate()" as a
kind of "restore .hg/dirstate to the original status" during a failure.
But it just discards changes in memory, and doesn't actually restore
".hg/dirstate". Then, it can't work as expected, if "dirstate.write()"
is executed while processing.
This patch uses "dirstateguard" instead of "dirstate.invalidate()" to
restore ".hg/dirstate" at failure even if "dirstate.write()" is
executed before failure.
This is a part of preparations to fix the issue that the recent (in
memory) dirstate isn't visible to external process (e.g. "precommit"
hook).
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 07 May 2015 12:07:10 +0900] rev 24992
localrepo: use changelog.hasnode instead of self.__contains__
Before this patch, releasing the store lock implies the actions below, when
the transaction is aborted:
1. "commithook()" scheduled in "localrepository.commit()" is invoked
2. "changectx.__init__()" is invoked via "self.__contains__()"
3. specified ID is examined against "repo.dirstate.p1()"
4. validation function is invoked in "dirstate.p1()"
In subsequent patches, "dirstate.invalidate()" invocations for
discarding changes are replaced with "dirstateguard", but discarding
changes by "dirstateguard" is executed after releasing the store lock:
resources are acquired in "wlock => dirstateguard => store lock" order,
and are released in reverse order.
This may cause that "dirstate.p1()" still refers to the changeset to be
rolled-back at (4) above: pushing multiple patches by "hg qpush" is
a typical case.
When releasing the store lock, such changesets are:
- not contained in "repo.changelog", if it is reloaded from
".hg/00changelog.i", as that file was already truncated by
"transaction.abort()"
- still contained in it, otherwise
(this "dirty read" problem is discussed in "Transaction Plan"
http://mercurial.selenic.com/wiki/TransactionPlan)
Validation function shows "unknown working parent" warning in the
former case, but reloading "repo.changelog" depends on the timestamp
of ".hg/00changelog.i". This causes occasional test failures.
In the case of scheduled "commithook()", it just wants to examine
whether "node ID" of committed changeset is still valid or not. Other
examinations implied in "changectx.__init__()" are meaningless.
To avoid showing the "unknown working parent" warning irregularly, this
patch uses "changelog.hasnode()" instead of "node in self" to examine
existence of committed changeset.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 07 May 2015 12:07:10 +0900] rev 24991
cmdutil: add class to restore dirstate during unexpected failure
Before this patch, after "dirstate.write()" execution, there was no way to
restore dirstate to the original status before "dirstate.write()".
In some code paths, "dirstate.invalidate()" is used as a kind of "restore
.hg/dirstate to the original status", but it just avoids writing changes in
memory out, and doesn't actually restore the ".hg/dirstate" file.
To fix the issue that the recent (in memory) dirstate isn't visible to external
processes (e.g. "precommit" hooks), "dirstate.write()" should be invoked before
invocation of external processes. But at the same time, ".hg/dirstate" should be
restored to its content before "dirstate.write()" during an unexpected failure
in some cases.
This patch adds the class "dirstateguard" to easily restore ".hg/dirstate"
during unexpected failures. Typical usecase of it is:
# (1) build dirstate up
....
# (2) write dirstate out, and backup ".hg/dirstate"
dsguard = dirstateguard(repo, 'scopename')
try:
# (3) execute somethig to do:
# this may imply making some additional changes on dirstate
....
# (4) unlink backed-up dirstate file at the end of dsguard scope
dsguard.close()
finally:
# (5) if execution is aborted before "dsguard.close()",
# ".hg/dirstate" is restored from the backup
dsguard.release()
For this kind of issue, an "extending transaction" approach (in
https://titanpad.com/mercurial32-sprint) seems to not be suitable, because:
- transaction nesting occurs in some cases (e.g. "shelve => rebase"), and
- "dirstate" may be already modified since the beginning of OUTER
transaction scope, then
- dirstate should be backed up into the file other than
"dirstate.journal" at the beginning of INNER transaction scope, but
- such alternative backup files are useless for transaction itself,
and increases complication of its implementation
"transaction" and "dirstateguard" differ from each other also in "what
it should do for .hg/dirstate" in cases other than success.
============== ======= ======== =============
type success fail "hg rollback"
============== ======= ======== =============
transaction keep keep restore
dirstateguard keep restore (not implied)
============== ======= ======== =============
Some collaboration between transaction and dirstate will probably be introduced
in the future. But this layer is needed in all cases.
Matt Mackall <mpm@selenic.com> [Sun, 10 May 2015 14:45:13 -0500] rev 24990
merge with stable
Steve Borho <steve@borho.org> [Sat, 09 May 2015 16:06:04 -0500] rev 24989
wix: add new json templates folder to MSI installers
Yuya Nishihara <yuya@tcha.org> [Mon, 04 May 2015 10:03:13 +0900] rev 24988
templater: rename parsestring() to unquotestring() (API)
Since
db7463aa080f, it doesn't parse string escapes.
Yuya Nishihara <yuya@tcha.org> [Mon, 04 May 2015 10:01:03 +0900] rev 24987
templater: remove noop calls of parsestring(s, quoted=False) (API)
Since
db7463aa080f, parsestring(s, quoted=False) just returns s.
Ryan McElroy <rmcelroy@fb.com> [Tue, 14 Apr 2015 12:45:15 -0700] rev 24986
bookmarks: simplify iscurrent to isactivewdirparent (API)
Previously this function accepted two optional parameters that were unused by
any callers and complicated the function.
Today, the terms 'active' and 'current' are interchangeably used throughout the
codebase in reference to the active bookmark (the bookmark that will be updated
with the next commit). This leads to confusion among developers and users.
This patch is part of a series to standardize the usage to 'active' throughout
the mercurial codebase and user interface.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Tue, 05 May 2015 14:45:09 -0400] rev 24985
tests: add a new commit to test-commandline-template
This commit modifies, adds, renames, removes files all at once. It
will be mostly interesting for an upcoming test relating to the status
log template.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 07 May 2015 23:25:13 -0700] rev 24984
run-tests: spread and document the content of time tuple
The spreading will make future modification clearer. The documentation improve
code readability.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 07 May 2015 23:16:57 -0700] rev 24983
run-tests: when building json, get time data in the same order as elsewhere
The json code was changing the order of the time tuple for unclear reasons. We
now use the same order as everywhere else.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 07 May 2015 20:45:51 -0700] rev 24982
run-tests: stop explicit expansion of time data
We are about to record more complex time-related data, which will require
repeated changes of every loop touching times data. That will also extend such
lines to a point where things become too long. Instead, we iterate on each entry
and expand values in the loops. We keep intermediate variables in most cases to
preserve readability.
The loop producing json data does a strange inversion for no obvious reason. We
preserved that for now and will fix it in another changeset.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 08 May 2015 10:51:18 -0700] rev 24981
run-tests: refactor json entry creation logic
We are about to add more timing related information to each entry. Having a
single place where the json entry is created is going to be much simpler.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 07 May 2015 23:20:24 -0700] rev 24980
run-tests: when building json, use result.failures instead of result.faildata
It is unclear to me why 'faildata' was used. Let's use the same kind of attribute
as for the other groups.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 08 May 2015 19:32:11 -0700] rev 24979
run-test: add a test for json output when -i is used
The -i can apparently confused some internal data structure, we want to make
sure we do not regress.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 30 Apr 2015 16:45:03 -0700] rev 24978
changegroup: drop _changelog and _manifest properties
We already have a _repo property on the packer, and we only access the
changelog and manifest revlog in one place, so it's just as easy to
get them from self._repo.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 29 Apr 2015 13:25:07 -0700] rev 24977
changegroup: document the cases where reordering complicates linkrevs
Martin von Zweigbergk <martinvonz@google.com> [Wed, 29 Apr 2015 10:34:28 -0700] rev 24976
changegroup: extract condition for linkrev fastpath
The condition for taking the fastpath (or not) is used in two
places. By extracting it, we also provide a place to document what
it's about.
Martin von Zweigbergk <martinvonz@google.com> [Sun, 12 Apr 2015 07:14:53 -0700] rev 24975
lazymanifest: drop SP before some labels
These seem to be the only occurrences in our code base, so let's make
it consistent.
Martin von Zweigbergk <martinvonz@google.com> [Sun, 12 Apr 2015 07:12:39 -0700] rev 24974
lazymanifest: avoid 'bail' label when used on success path
3d485727e45e (lazymanifest: extract function for iterating to next
line, 2015-03-11) introduced a large memory leak because I stopped
running the 'bail' block in the successful case. Let's rename 'bail'
to 'done', since it has to run not only in the error case.
Augie Fackler <augie@google.com> [Wed, 06 May 2015 13:15:39 -0400] rev 24973
dockerdeb: rules to build a debian package using docker
Currently only supports jessie (current stable), but other version
should be trivial.
Augie Fackler <augie@google.com> [Thu, 07 May 2015 10:28:58 -0400] rev 24972
packaging: extract packagelib for common code from builddeb and buildrpm
Augie Fackler <augie@google.com> [Wed, 06 May 2015 13:13:54 -0400] rev 24971
builddeb: new script for building a deb package
Future work will allow us to use docker to build debs.
Right now this doesn't install any config files. I plan to do that as
a followup, but getting something basic and working checked in seems
like more of a priority than getting everything done in one big step.
This also does not create a source deb yet. I haven't looked into that
process.
Note that this declares incompatibility with the `mercurial-common`
package. It's typical for debian packages to be split between
architecture-independent bits and native bits, meaning the python bits
downstream live in mercurial-common and the c extension bits live in
mercurial. We don't do that because we want to (ideally) give users a
single deb file to install.
Augie Fackler <augie@google.com> [Wed, 06 May 2015 14:36:17 -0400] rev 24970
dockerlib: fix initcontainer for boot2docker users
This allows me to build rpm packages using boot2docker on my Mac. It's
probably a very fragile hack, but it seems to work well enough for now
that I felt it was worth sharing.
Augie Fackler <augie@google.com> [Wed, 06 May 2015 10:45:51 -0400] rev 24969
dockerlib: extract initcontainer() method
This helps contain all the logic around creating containers.
Augie Fackler <augie@google.com> [Wed, 06 May 2015 10:45:07 -0400] rev 24968
dockerlib: start extracting common functions for setting up docker
I'm about to start interacting with docker for Debian packaging too,
so it's time to centralize this so that any bugfixes I figure out
apply to both codepaths.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 07 May 2015 17:14:00 -0700] rev 24967
run-test: ensure the test ports are available before launching test
I'm running into a systematic issue because there is always some port taken in the
1500-wide range of ports used by the test (3 for each test file).
Yuya Nishihara <yuya@tcha.org> [Fri, 08 May 2015 18:11:26 +0900] rev 24966
templater: strip single backslash before quotation mark in quoted template
db7463aa080f fixed the issue of double escapes, but it made the following
template fail with syntax error because of <\">. Strictly speaking, <\">
appears to be invalid in non-string part, but we are likely to escape <">
if surrounded by quotes, and we are used to write such templates by trial
and error.
[templates]
sl = "{tags % \"{ifeq(tag,'tip','',label('log.tag', ' {tag}'))}\"}"
So, for backward compatibility between 2.8.1 and 3.4, a single backslash
before quotation mark is stripped only in quoted template. We don't care
for <\"> in string literal in quoted template, which never worked as expected
before.
template result
--------- ------------------------
{\"\"} parse error
"{""}" {""} -> <>
"{\"\"}" {""} -> <>
{"\""} {"\""} -> <">
'{"\""}' {"\""} -> <">
"{"\""}" parse error (don't care)
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 07 May 2015 23:18:48 -0700] rev 24965
run-tests: implement Test._testMethodName
This methods is needed internally by utilities like __repr__. I do not see any
harm in having it declared. Any actual attempt to use it to call a test would
crash, but at least random debug print in the test runner will no longer crash.
Another approach would have been to redefine the __repr__ function, but I think
it a good thing to have some respect for the base class API.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 07 May 2015 16:43:58 -0700] rev 24964
test-subrepo-git: ignore pax_global_header when listing archive
5115d03440f4 is adding a new tar call but forgot to filter out the
pax_global_header file that some tar versions write. This is similar to what
happened in
5dda6c708138.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 07 May 2015 14:57:02 -0700] rev 24963
test-subrepo-recursion: glob out all the date listed by unzip -l
This date output is unstable (01-01-1980 vs 1980-01-01). As the test is not
about the modification date, we glob the data out.
Caught by buildbot.
Ryan McElroy <rmcelroy@fb.com> [Tue, 14 Apr 2015 13:31:50 -0700] rev 24962
bookmarks: remove unused updatecurrentbookmark function (API)
This function was not used anywhere in core and there is no indication that
it is used elsewhere either.
Yuya Nishihara <yuya@tcha.org> [Sun, 10 May 2015 11:39:01 -0500] rev 24961
changelog: drop unnecessary override of "hasnode"
revlog.hasnode() calls self.rev(node) that takes filtering into account.
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 08 May 2015 11:32:24 -0700] rev 24960
test-run-test: unset run-test specific environment variables
Otherwise variable set for the real test run interfere with the test runner
tests.
Durham Goode <durham@fb.com> [Fri, 01 May 2015 15:45:07 -0700] rev 24959
histedit: fix --continue when rules are finished
If histedit failed after all the rules were complete (for instance, if there was
an exception in the cleanup phase), you couldn't --continue because it was
unable to pop a rule. Let's just skip the rule execution phase of --continue if
there are no more rules.
Durham Goode <durham@fb.com> [Fri, 01 May 2015 15:28:47 -0700] rev 24958
histedit: fix serializing of None backupfile
If the histedit backupfile was None (like if evolve is enabled) it would get
serialized as 'None' into the state file. Later if the histedit was aborted and
the top most commit was unreachable (ex: if it was obsolete or stripped),
histedit would try to unbundle the backupfile and try to read .hg/None.
This fixes it to not serialize None. Since it only happens with evolve, I'm not
sure how to add test coverage here.
Matt Mackall <mpm@selenic.com> [Thu, 07 May 2015 14:19:20 -0500] rev 24957
merge with stable
Martin von Zweigbergk <martinvonz@google.com> [Tue, 05 May 2015 08:40:59 -0700] rev 24956
treemanifest: set requires at repo creation time, ignore config after
The very next changeset will start writing one revlog per directory
when tree manifests are enabled. That is backwards incompatible, so it
requires .hg/requires to be updated. Just like with generaldelta, we
want to update .hg/requires only when the repo is created. Updating
..hg/requires is bad for repos on shared disk. Instead, those who do
want to upgrade a repo to using treemanifest (or manifestv2, etc) can
run
hg clone --config experimental.treemanifest repo clone
which will create a new repo with the requirement set. Unlike the case
of e.g. generaldelta, it will not rewrite the changesets, since tree
manifests hash differently.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 21 Apr 2015 09:29:59 -0700] rev 24955
remove: use ctx.hasdir(f) instead of 'f in ctx.dirs()'
This speeds up 'hg remove python/README' on the Firefox repo from
2.479s to 0.664s with lazily loaded treemanifests (which is not yet in
core) and has no measurable effect on flat manifests.
Matt Harbison <matt_harbison@yahoo.com> [Mon, 04 May 2015 23:04:12 -0400] rev 24954
largefiles: drop os.path.join() in subrepo archive override
This is related to
41cd8171e58f, but not required for that to function correctly
because 'prefix' always ends with '/', so os.path.join(prefix, _path) simply
concatenates the strings. Take the opportunity to drop the os.path usage, and
avoid confusion by using the same pattern as the overridden subrepo method.
Matt Harbison <matt_harbison@yahoo.com> [Tue, 05 May 2015 20:52:38 -0400] rev 24953
archive: drop the leading '.' path component from the prefix (
issue4634)
Unix utilities like tar will happily prefix the files it packs with './', but
annoyingly, Windows Explorer will not show these packed files when it opens the
archive. Since there doesn't seem to be a point in including './' in the path
names, just drop it. The default 'hg archive' prefix is the basename of the
archive, so specifying '.' allows for that default to be disabled completely.
Yuya Nishihara <yuya@tcha.org> [Thu, 07 May 2015 07:46:39 +0900] rev 24952
hgweb: bring back infinite scroll in shortlog of paper style
Since
fdf7794be41d, column headers are wrapped by <thead> element, so the first
and only <tbody> contains changelog data. I got the following error without
this patch:
Uncaught TypeError: Cannot read property 'lastElementChild' of null
scrollHandler @ mercurial.js:375
Matt Mackall <mpm@selenic.com> [Thu, 07 May 2015 13:47:45 -0500] rev 24951
merge with stable
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 06 May 2015 09:52:10 -0700] rev 24950
extensions: clear aftercallbacks after execution (
issue4646)
It was reported that enabling pager without color could cause a hang.
Inserting print statements revealed that the callbacks in
extensions._aftercallbacks were being invoked twice.
extensions.loadall can be called multiple times. If entries in
extensions._aftercallbacks linger between calls, this could result
in double execution of the callbacks. This can lead to unwanted
behavior.
The reproduce steps in the bug seem to only occur when the output of
a command is less than the size of the current screen. This is not
something that can easily be tested. I verified the test case works
with this patch and that pager and color interaction continues to
work. Since we have no existing automated tests for pager, this sadly
appears to be the best testing I can do.
Yuya Nishihara <yuya@tcha.org> [Mon, 04 May 2015 10:17:34 +0900] rev 24949
templater: strictly parse leading backslashes of '{' (
issue4569) (BC)
Because double backslashes are processed as a string escape sequence, '\\{'
should start the template syntax. On the other hand, r'' disables any sort
of \-escapes, so r'\{' can go either way, never start the template syntax
or always start it. I simply chose the latter, which means r'\{' is the same
as '\\{'.
Yuya Nishihara <yuya@tcha.org> [Mon, 04 May 2015 09:54:01 +0900] rev 24948
templater: do not process \-escapes at parsestring() (
issue4290)
This patch brings back pre-2.8.1 behavior.
The result of parsestring() is stored in templater's cache, t.cache, and then
it is parsed as a template string by compiletemplate(). So t.cache should keep
an unparsed string no matter if it is sourced from config value. Otherwise
backslashes would be processed twice.
The test vector is borrowed from
64b4f0cd7336.
Ryan McElroy <rmcelroy@fb.com> [Tue, 14 Apr 2015 13:17:33 -0700] rev 24947
bookmarks: rename bookmarkcurrent to activebookmark (API)
Today, the terms 'active' and 'current' are interchangeably used throughout the
codebase in reference to the active bookmark (the bookmark that will be updated
with the next commit). This leads to confusion among developers and users.
This patch is part of a series to standardize the usage to 'active' throughout
the mercurial codebase and user interface.
Ryan McElroy <rmcelroy@fb.com> [Mon, 13 Apr 2015 23:03:13 -0700] rev 24946
bookmarks: rename readcurrent to readactive (API)
Today, the terms 'active' and 'current' are interchangeably used throughout the
codebase in reference to the active bookmark (the bookmark that will be updated
with the next commit). This leads to confusion among developers and users.
This patch is part of a series to standardize the usage to 'active' throughout
the mercurial codebase and user interface.
Ryan McElroy <rmcelroy@fb.com> [Mon, 13 Apr 2015 22:27:01 -0700] rev 24945
bookmarks: rename setcurrent to activate (API)
Today, the terms 'active' and 'current' are interchangeably used throughout the
codebase in reference to the active bookmark (the bookmark that will be updated
with the next commit). This leads to confusion among developers and users.
This patch is part of a series to standardize the usage to 'active' throughout
the mercurial codebase and user interface.
Ryan McElroy <rmcelroy@fb.com> [Mon, 13 Apr 2015 21:53:37 -0700] rev 24944
bookmarks: rename unsetcurrent to deactivate (API)
Today, the terms 'active' and 'current' are interchangeably used throughout the
codebase in reference to the active bookmark (the bookmark that will be updated
with the next commit). This leads to confusion among developers and users.
This patch is part of a series to standardize the usage to 'active' throughout
the mercurial codebase and user interface.
Mathias De Maré <mathias.demare@gmail.com> [Wed, 06 May 2015 17:15:38 +0200] rev 24943
subrepo: correctly handle git subdirectory status change
'git diff-index' by default does not recurse into subdirectories
when changes are found. As a result, the directory is shown as changed,
rather than the files in this directory.
Adding '-r' results in recursing until the blobs themselves are checked.
Matt Mackall <mpm@selenic.com> [Wed, 06 May 2015 16:56:28 -0500] rev 24942
merge with stable
Augie Fackler <augie@google.com> [Sun, 12 Apr 2015 15:36:10 -0400] rev 24941
setup: hide octal literals inside strings so they're portable (
issue4554)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 26 Mar 2014 15:55:50 -0700] rev 24940
revset: avoid returning duplicates when returning ancestors
Before this patch, _revancestors were giving false result when a revision was
duplicated in the input. Duplicated entry are rare but may happen when using the
`%lx` notation internally.
This series has no visible impact on the performance of the function according
to benchmark.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 26 Mar 2014 16:21:30 -0700] rev 24939
revset: use an iterator instead of a dequeue in ancestors()
The dequeue was actually just used to be able to pop value one at a time.
Building the dequeue means we are reading all the input value at once at the
beginning of the evaluation. This defeat the lazyness of revset.
We replace the deque with iterator usage for the sake of simplicity and
lazyness.
This provide massive speedup to get the first result if the input set is big
max(::all())
before) wall 0.001917 comb 0.000000 user 0.000000 sys 0.000000 (best of 1115)
after) wall 0.000107 comb 0.000000 user 0.000000 sys 0.000000 (best of 22222)
Martin von Zweigbergk <martinvonz@google.com> [Wed, 06 May 2015 11:29:09 -0700] rev 24938
revset: return early when revs is empty
By introducing an early return in _revancestors() when revs is empty,
we make it so inputrev is never None, which simplifies the subsequent
code.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 26 Mar 2014 16:14:30 -0700] rev 24937
revset: rename 'revsnode' to 'inputrev' in ancestors
We usually use 'node' for variable containing 20 bytes hash. There is nothing
nodish in this variable, so we rename it to "inputrev" as it old the next entry
of the iteration.
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 04 May 2015 12:36:48 -0700] rev 24936
revset: make generatorset.__nonzero__ lazy
The 'for r in self:' call could trigger full consumption of the generator while
we only need a single value. We also fast path if a single value got already
computed. See inline comment for more details.
This provide massive speedup for lazy operation using boolean testing.
max(::tip)
e5b507efb36e) wall 0.055609 comb 0.060000 user 0.060000 sys 0.000000 (best of 100)
after change) wall 0.000109 comb 0.000000 user 0.000000 sys 0.000000 (best of 19146)
Drew Gottlieb <drgott@google.com> [Tue, 05 May 2015 15:33:01 -0700] rev 24935
tests: test that we can convert to manifestv2 with clone
This just adds a test to ensure that we can convert a manifestv1 repo to a
manifestv2 repo (for future commits only) by means of a local clone.