Gregory Szorc <gregory.szorc@gmail.com> [Sat, 24 Jun 2017 14:52:15 -0700] rev 33048
namespaces: record and expose whether namespace is built-in
Currently, the templating layer tends to treat each namespace
as a one-off, with explicit usage of {bookmarks}, {tags}, {branch},
etc instead of using {namespaces}. It would be really useful if
we could iterate over namespaces and operate on them generically.
However, some consumers may wish to differentiate namespaces by
whether they are built-in to core Mercurial or provided by extensions.
Expected use cases include ignoring non-built-in namespaces or
emitting a generic label for non-built-in namespaces.
This commit introduces an attribute on namespace instances
that says whether the namespace is "built-in" and then exposes
this to the templating layer.
As part of this, we implement a reusable extension for defining
custom names on each changeset for testing. A second consumer
will be introduced in a subsequent commit.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 24 Jun 2017 13:39:20 -0700] rev 33047
templatekw: expose color name in {namespaces} entries
Templates make use of a "log.<namespace>" label. The <namespace> value
here differs from the actual namespace name in that the namespace
itself is plural but the label/color value is singular.
Expose the color name to the templating layer so log.* labels
can be emitted for {namespaces}.
As part of this, we refactored the logic to eliminate a gnarly
comprehension. We store color names in their own dict because the
lookup can occur in tight loops and we shouldn't have to go to
repo.names[ns] multiple times for every changeset.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 24 Jun 2017 12:47:25 -0700] rev 33046
show: construct changeset templater during dispatch
Previously, we constructed a formatter from a specific template
topic. Then from show() we reached into the internals of the
formatter to resolve a template string to be used to construct
a changeset templater.
A downside to this approach was it limited us to having the
entire template defined in a single entry in the map file. You
couldn't reference other entries in the map file and this would
lead to long templates and redundancy in the map file.
This commit teaches @showview how to instantiate a changeset
templater so we can construct a templater with full access to
the map file. To prove it works, we've split "showwork" into
components.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 24 Jun 2017 11:47:26 -0700] rev 33045
cmdutil: use named arguments for changeset_templater.__init__
This will make the API more extensible and easier to use.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 22 Jun 2017 21:45:32 -0700] rev 33044
bundle: inline applybundle1()
We have now gotten rid of all but one caller, so let's inline it
there.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 22 Jun 2017 15:00:19 -0700] rev 33043
bundle: make applybundle() delegate v1 bundles to applybundle1()
Martin von Zweigbergk <martinvonz@google.com> [Thu, 22 Jun 2017 21:27:57 -0700] rev 33042
bundle: transpose transaction scope with bundle type switch
This moves the transaction with-statements outside of the
per-bundle-version switches, so the next patch will be a little
simpler.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 22 Jun 2017 15:03:13 -0700] rev 33041
unbundle: move BundleUnknownFeatureError exception handling out
This just moves the BundleUnknownFeatureError exception handling one
level up so we collect the bundle2.applybundle{,1}() calls
together. applybundle1() will never throw the exception, so it should
have no functional consequence.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 21 Jun 2017 21:08:48 -0700] rev 33040
bundle: make applybundle1() return a bundleoperation
See previous commit for motivation. It already lets us share a little
bit more code in commands.py.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 16 Jun 2017 10:25:11 -0700] rev 33039
bundle: add a applybundle1() method
This is one step towards removing a bunch of "if isinstance(gen,
unbundle20)" by treating bundle1 and bundle2 more similarly.
The name may sounds ironic for a method in the bundle2 module, but I
didn't think it was worth it yet to create a new 'bundle' module that
depends on the 'bundle2' module. Besides, we'll inline the method
again later.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 22 Jun 2017 15:59:07 -0700] rev 33038
bundle: extract _processchangegroup() method
The new method applies the changegroup and fills in op.records,
sharing a little bit of code between the two callers. We'll add
another caller soon.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 22 Jun 2017 14:04:13 -0700] rev 33037
bundle: make combinechangegroupresults() take a bundleoperation
Both callers have a bundleoperation. Passing it in lets us share a bit
more code.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 22 Jun 2017 13:58:20 -0700] rev 33036
bundle: move combineresults() from changegroup to bundle2
The results only need to be combined if they come from a bundle2. More
importantly, we'll change its argument to a bundleoperation soon, and
then it definitely will no longer belong in changegroup.py.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 21 Jun 2017 14:42:04 -0700] rev 33035
bundle: remove 'op' argument from applybundle()
No callers pass in an operation.
Jun Wu <quark@fb.com> [Sat, 24 Jun 2017 10:31:41 -0700] rev 33034
test-rebase-conflicts: add a test case about turning obsstore on and off
Turning obsstore and allowunstable on, rebase will skip the
"can't remove original changesets with unrebased descendants" check. Then
rebase could be interrupted (merge conflict), and the user has a chance to
turn off obsstore. If rebase continues, the current code may strip
irrelevant commits (in the test case added, "C" got stripped unexpectedly).
The test case reproduces
issue5606. It will be fixed by the "multidest"
rebase refactoring being reviewed. The test case itself is relatively
separate from the rebase refactoring, therefore sent separately hoping to
reduce the number of patches of the main rebase series.
Augie Fackler <augie@google.com> [Sat, 24 Jun 2017 15:50:13 -0400] rev 33033
merge with stable
Martin von Zweigbergk <martinvonz@google.com> [Thu, 15 Jun 2017 00:15:52 -0700] rev 33032
strip: include phases in bundle (BC)
Before this patch, unbundling a stripped changeset would make it a
draft (unless the parent was secret). This meant that one would lose
phase information when stripping and unbundling secret changesets. The
same thing was true for public changesets. While stripping public
changesets is generally rare, it's done frequently by e.g. the
narrowhg extension.
We also include the phases in the temporary bundle, just in case
stripping were to fail after that point, so the user can still restore
the repo including phase information. Before this patch, the phases
were left untouched during the bundling and unbundling of the
temporary bundle. Only at the end of the transaction would
phasecache.filterunknown() be called to remove phase roots that were
no longer valid. We now need to call that also after the first
stripping, i.e. before applying the temporary bundle. Otherwise
unbundling the temporary bundle will cause a read of the phase cache
which has stripped changesets in the cache and that fails.
Like with obsmarkers, we unconditionally include the phases in the
bundle when stripping (when using bundle2, such as when generaldelta
is enabled). The reason for doing that for strip but not for bundle is
that strip bundles are not meant to be shared outside the repo, so we
don't care as much about compatibility.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 22 Jun 2017 10:10:02 -0700] rev 33031
bundle: add config option to include phases
This adds an experimental.bundle-phases config option to include phase
information in bundles. As with the recently added support for
bundling obsmarkers, the support for bundling phases is hidden behind
the config option until we decide to make a bundlespec v3 that
includes phases (and obsmarkers and ...).
We could perhaps use the listkeys format for this, but that's
considered obsolete according to Pierre-Yves. Instead, we introduce a
new "phase-heads" bundle part. The new part contains the phase heads
among the set of bundled revisions. It does not include those in
secret phase; any head in the bundle that is not mentioned in the
phase-heads part is assumed to be secret. As a special case, an empty
phase-heads part thus means that any changesets should be added in
secret phase. (If we ever add a fourth phase, we'll include secret in
the part and we'll add a version number.)
For now, phases are only included by "hg bundle", and not by
e.g. strip and rebase.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 16 Jun 2017 16:56:16 -0700] rev 33030
bundle2: record changegroup data in 'op.records' (API)
When adding support for bundling and unbundling phases, it will be
useful to have the list of added changesets. To do that, we return the
list from changegroup.apply().
Martin von Zweigbergk <martinvonz@google.com> [Thu, 22 Jun 2017 10:15:15 -0700] rev 33029
debugcommands: pass part, not read data, into _debugobsmarker()
This matches how it's done for _debugchangegroup() and how we will
soon do it for _debugphaseheads().
Martin von Zweigbergk <martinvonz@google.com> [Thu, 22 Jun 2017 10:09:58 -0700] rev 33028
debugcommands: remove unused "all" argument from _debugobsmarkers
Martin von Zweigbergk <martinvonz@google.com> [Fri, 23 Jun 2017 22:15:22 -0700] rev 33027
dagop: raise ProgrammingError if stopdepth < 0
revset.py should never send such a value.
Anton Shestakov <av6@dwimlabs.net> [Fri, 23 Jun 2017 13:33:41 +0800] rev 33026
make: add Debian 9 (Stretch) docker target
Anton Shestakov <av6@dwimlabs.net> [Fri, 23 Jun 2017 13:08:46 +0800] rev 33025
make: templatize Debian build target a la
e63dfbbdbd07
Anton Shestakov <av6@dwimlabs.net> [Fri, 23 Jun 2017 12:04:12 +0800] rev 33024
make: add Ubuntu Zesty docker targets (.deb and ppa)
Zesty Zapus was released on 2017-04-13 and will be supported until 2018-01.
Anton Shestakov <av6@dwimlabs.net> [Fri, 23 Jun 2017 10:05:01 +0800] rev 33023
docker: install less as a build-time dependency in deb-based distros
It's needed since
387a76cac28e, otherwise dpkg-checkbuilddeps errors out.
Yuya Nishihara <yuya@tcha.org> [Sat, 24 Jun 2017 13:48:04 +0900] rev 33022
py3: add utility to forward __str__() to __bytes__()
It calls unifromlocal() instead of sysstr() because __bytes__() may contain
locale-dependent values such as paths.
Yuya Nishihara <yuya@tcha.org> [Sat, 24 Jun 2017 13:20:30 +0900] rev 33021
share: use dict literal instead of dict(key=value)
check-code.py has the rule, but it isn't smart enough to catch this.
Pulkit Goyal <7895pulkit@gmail.com> [Thu, 22 Jun 2017 03:24:12 +0530] rev 33020
py3: use r'' to prevent conversion to bytes by transformer
Pulkit Goyal <7895pulkit@gmail.com> [Thu, 22 Jun 2017 03:22:30 +0530] rev 33019
py3: define __bytes__ for basefilectx class
The implementation is shamely copied from the __str__ function
Pulkit Goyal <7895pulkit@gmail.com> [Thu, 22 Jun 2017 03:20:11 +0530] rev 33018
py3: check for bytes instead of str in isinstance
Pulkit Goyal <7895pulkit@gmail.com> [Thu, 22 Jun 2017 03:16:16 +0530] rev 33017
py3: convert kwargs' keys' to str using pycompat.strkwargs()
On Python 3, we must have keys of keyword arguments as str.
Pulkit Goyal <7895pulkit@gmail.com> [Thu, 22 Jun 2017 03:10:24 +0530] rev 33016
py3: convert kwargs keys' back to bytes using pycompat.byteskwargs()
Pulkit Goyal <7895pulkit@gmail.com> [Thu, 22 Jun 2017 01:29:07 +0530] rev 33015
py3: use "%d" % val for int rather than pycompat.bytestr
Earlier I used pycompat.bytestr() to convert integers to bytes, but we can do
b"%d" % val to convert that int to bytes. b'' is already added by the
transformer.
Thanks to Yuya for suggesting this.
Adam Simpkins <simpkins@fb.com> [Fri, 23 Jun 2017 10:59:05 -0700] rev 33014
extensions: call afterloaded() with loaded=False for disabled extensions
If an extension was loaded but disabled due to a minimumhgversion check it
will be present in the _extensions map, but set to None. The rest of the
extensions code treats the extension as if it were not present in this case,
but the afterloaded() function called the callback with loaded=True.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sat, 24 Jun 2017 02:39:13 +0900] rev 33013
fetch: remove shorthand of --edit colliding against -e/-ssh in remoteopts (BC)
Before this patch, -e/--edit and -e/--ssh of fetch command collide
against each other. This causes that -e is treated as shorthand of
--edit but doesn't work as same as --edit. Therefore, -e works as
neither --edit nor --ssh, in practice.
This issue was introduced at
595a69a01129 (or 1.0), which renamed
-f/--force-editor to -e/--edit. At that point, -e was already used as
shorthand of --ssh.
After this patch, -e is treated as shorthand of --ssh.
This patch is marked as "(BC)", because -e as shorthand of --edit in
existing scripts causes failure (or unexpected result) after this
patch. This impact should be less enough, because --edit mainly
focuses on interactive use.
BTW, test-duplicateoptions.py (since
7d171c05a631 or 1.9) can't detect
this kind of issues as expected, because direct invocation of
extensions.loadall() doesn't involve registration of commands defined
in extensions (this issue is fixed in subsequent patch).
Rishabh Madan <rishabhmadan96@gmail.com> [Fri, 23 Jun 2017 17:15:53 +0200] rev 33012
releasenotes: improve parsing around bullet points
Earlier, on parsing the bullet points from existing release notes the bullet
points after the first one weren't written correctly to the notes file. This
patch makes changes to parsereleasenotesfromfile() function that introduces a new
bullet_points data structure that tracks the bullets and associated subparagraph.
It also makes necessary changes to the tests related to merging of bullets.
Sean Farley <sean@farley.io> [Tue, 20 Jun 2017 17:18:20 -0700] rev 33011
bookmarks: factor method _printer out of for loop in printbookmarks
This allows even further customization via extensions for printing
bookmarks. For example, in hg-git this would allow printing remote refs
by just modifying the 'bmarks' parameter instead of reimplementing the
old commands.bookmarks method.
Furthermore, there is another benefit: now multiple extensions can
chain their custom data to bookmark printing. Previously, an extension
could have conflicting bookmark output due to which loaded first and
overrode commands.bookmarks. Now they can all play nicely together.
Sean Farley <sean@farley.io> [Tue, 20 Jun 2017 16:36:25 -0700] rev 33010
bookmarks: factor out bookmark printing from commands
Sean Farley <sean@farley.io> [Tue, 20 Jun 2017 15:56:29 -0700] rev 33009
commands: move activebookmarklabel to bookmarks module
This is going to be used in an upcoming patch that moves more methods to
bookmarks.py.
Sean Farley <sean@farley.io> [Tue, 20 Jun 2017 15:36:43 -0700] rev 33008
commands: replace locking code with a context manager
Note that this means that we're unnecessarily creating a transaction
in the pure "--inactive" (i.e. when deactivating the current
bookmark), but that should be harmless.
Sean Farley <sean@farley.io> [Tue, 20 Jun 2017 15:18:40 -0700] rev 33007
bookmarks: factor out adding a list of bookmarks logic from commands
We keep the lock in the caller so that future devs are aware of the
locking implications.
Sean Farley <sean@farley.io> [Tue, 13 Jun 2017 11:10:22 -0700] rev 33006
bookmarks: factor out rename logic from commands
We keep the lock in the caller so that future devs are aware of the
locking implications.
Sean Farley <sean@farley.io> [Mon, 12 Jun 2017 23:02:48 -0700] rev 33005
bookmarks: factor out delete logic from commands
We keep the lock in the caller so that future devs are aware of the
locking implications.
Augie Fackler <augie@google.com> [Fri, 23 Jun 2017 15:30:27 -0400] rev 33004
merge with stable
Yuya Nishihara <yuya@tcha.org> [Sun, 18 Jun 2017 00:40:58 +0900] rev 33003
revset: add startdepth limit to ancestors() as internal option
This is necessary to implement the set{gen} (set subscript) operator. For
example, set{-n} will be translated to ancestors(set, depth=n, startdepth=n).
https://www.mercurial-scm.org/wiki/RevsetOperatorPlan#ideas_from_mpm
The UI is undecided and I doubt if the startdepth option would be actually
useful, so the option is hidden for now. 'depth' could be extended to take
min:max range, in which case, integer depth should select a single generation.
ancestors(set, depth=:y) # scan up to y-th generation
ancestors(set, depth=x:) # skip until (x-1)-th generation
ancestors(set, depth=x) # select only x-th generation
Any ideas are welcomed.
# reverse(ancestors(tip)) using hg repo
3) 0.075951
4) 0.076175
Yuya Nishihara <yuya@tcha.org> [Sun, 18 Jun 2017 00:22:41 +0900] rev 33002
revset: add depth limit to ancestors()
This is proposed by the
issue5374, and will be a building block of set{gen}
(set subscript) operator.
https://www.mercurial-scm.org/wiki/RevsetOperatorPlan#ideas_from_mpm
# reverse(ancestors(tip)) using hg repo
2) 0.075408
3) 0.075951
Yuya Nishihara <yuya@tcha.org> [Sun, 18 Jun 2017 00:11:48 +0900] rev 33001
dagop: compute depth in revancestors() generator
Surprisingly, this makes revset benchmark slightly faster. I don't know why,
but it appears that wrapping -inputrev by tuple is the key. So I decided to
just enable depth computation by default.
# reverse(ancestors(tip)) using hg repo
1) 0.081051
2) 0.075408
Yuya Nishihara <yuya@tcha.org> [Sun, 18 Jun 2017 08:59:09 +0900] rev 33000
dagop: just compare with the last value to deduplicate input of revancestors()
Since we're using a max heap, the current rev should be a duplicate only
if it equals to the previous one. We don't have to maintain the whole seen
set.
# reverse(ancestors(tip)) using hg repo
0) 0.086420
1) 0.081051
Yuya Nishihara <yuya@tcha.org> [Sun, 18 Jun 2017 17:22:57 +0900] rev 32999
dagop: bulk rename variables in revancestors() generator
- h -> pendingheap: "h" seems too short for variable of long lifetime
- current -> currev: future patches will add current "depth" variable
- parent -> prev or pctx: short lifetime, follows common naming rules
Yuya Nishihara <yuya@tcha.org> [Sun, 18 Jun 2017 17:16:02 +0900] rev 32998
dagop: comment why revancestors() doesn't heapify input revs at once
I wondered why we're doing this complicated stuff without noticing the input
revs may be iterated lazily in descending order.
c1f666e27345 showed why.
Yuya Nishihara <yuya@tcha.org> [Sat, 17 Jun 2017 22:33:23 +0900] rev 32997
dagop: unnest inner generator of revancestors()
This just moves iterate() to module-level function.
Denis Laxalde <denis.laxalde@logilab.fr> [Wed, 21 Jun 2017 17:17:17 +0200] rev 32996
hgweb: plug followlines action in annotate view
Add the followlines.js script and corresponding parameters as data attribute
on <tbody class="sourcelines"> element.
Extend CSS rules so that they also match the DOM structure of annotate view.
As previously, only address paper and gitweb styles (other styles do not have
followlines at all).
Denis Laxalde <denis.laxalde@logilab.fr> [Wed, 21 Jun 2017 17:07:51 +0200] rev 32995
hgweb: parameterize the tag name of elements holding followlines selection
While plugging followlines.js into "annotate" view, we'll need to walk a
different DOM structure from that of "filerevision" view. In particular, the
selectable source line element is a <tr> in annotate view (in contrast with a
<span> in filerevision view). So make this tag name a parameter of
followlines.js script by passing its value as a "selectabletag" data attribute
of <pre class="sourcelines"> element.
As <pre class="sourcelines"> tags are getting quite long in templates, rewrite
them on several lines.
Denis Laxalde <denis.laxalde@logilab.fr> [Wed, 21 Jun 2017 17:02:21 +0200] rev 32994
gitweb: wrap table rows of annotate view into a <tbody> element
We will use this element to hook data attribute for the followlines.js script
to be plugged in annotate view. Also this gets symmetrical with paper style
which already has a <tbody> element.
Denis Laxalde <denis@laxalde.org> [Thu, 22 Jun 2017 11:16:29 +0200] rev 32993
tests: update regex check for fetch error in test-clonebundles.t
On some systems, e.g. Docker container, the actual error may be:
error fetching bundle: [Errno 99] Cannot assign requested address
Update the regex to handle this case.
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 20 Jun 2017 20:53:29 -0700] rev 32992
hgweb: use separate CSS class for navigation links in footer
2d93d2159e30 changed the styling of the "page_nav" CSS class to use
flexbox to separate elements within the <div>. I didn't realize that
this class was used outside of the links in the header. So this
resulted in incorrectly formatting links in the footer of various
pages. Fix that by introducing a new CSS class that preserves the
old CSS behavior.
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 17 Jun 2017 13:25:42 +0200] rev 32991
configitems: register 'ui.clonebundleprefers' as example for 'configlist'
This exercise the default value handling in 'configlist'.
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 17 Jun 2017 13:17:10 +0200] rev 32990
configitems: register 'patch.fuzz' as first example for 'configint'
This exercise the default value handling in 'configint'.
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 17 Jun 2017 13:08:03 +0200] rev 32989
configitems: issue a devel warning when overriding default config
If the option is registered, there is already a default value available and
passing a new one is at best redundant. So we issue a deprecation warning in
this case.
(note: there will be case were the default value will not be as simple as what
is currently possible. We'll upgrade the configitems code to handle them in
time.)