Differences between revisions 238 and 351 (spanning 113 versions)
Revision 238 as of 2014-09-02 01:45:57
Size: 63867
Editor: mpm
Comment:
Revision 351 as of 2018-05-26 04:18:13
Size: 58357
Editor: MattHarbison
Comment: Add a note about lfs
Deletions are marked like this. Additions are marked like this.
Line 14: Line 14:
== Mercurial 3.1.1 (2014-09-01) == == Mercurial 4.6 (2018-05-06) ==

[[Release4.6|Full release notes]] are available. This is a regularly-scheduled quarterly feature release.

=== New Features ===

==== pullbundles ====

Pullbundles allow the server to answer client requests using pre-built bundles. This is different from the existing clonebundle feature:

 * pullbundles can be used for both the initial clone and later pull operations
 * pullbundles can be used incrementally, i.e. to cover the changes up to the start of the current month as one bundle and the remaining changes as second bundle
 * the bundle is transferred inline as part of the existing connection without a secondary server

Pullbundles are only used for clients running Mercurial 4.6 as well.

==== push ====

If 'server.streamunbundle' option is enabled, the server will directly apply the changes send by the changes. This avoids potentially large temporary files on the server side. It can also prevent concurrent pushes.

==== notify extension ====

The 'maxdiffstat' option can be used to truncate long file lists similar to 'maxdiff' for the patch part of the email.

==== hgweb ====

hgweb now shows date and user for operations that resulted in obsolete commit(s). For unstable commits, it shows the exact reason why they are considered unstable.

`Server:` header is now configurable using `web.server-header` option.

==== templates ====

A new template keyword 'reporoot' which shows the root directory of the current repository.
A new template function 'mailmap' which maps author fields based on values in a .mailmap file.

==== Other notable features ====

 * revset: parse error now shows a hint where the error occurred
 * templates: parse error now shows a hint where the error occured
 * forget: new '--dry-run' and '--interactive' flags
 * copyfile: preserve stat info (mtime, etc.) when doing copies/renames
 * bundle2 format is documented and can be found using 'hg help internals.bundle2'

=== Backwards Compatibility Changes ===

 * Support for connecting to Mercurial servers older than 0.9.1 has been removed.

 * Working-directory commands now respect "-X PATTERN" no matter if PATTERN matches explicitly-specified FILEs. For example, "hg add foo -X foo" no longer add the file "foo".

 * Support for the experimental manifestv2 format has been removed, as it was never completed and failed to meet expectations.

 * '{' in output filename passed to archive/cat/export is taken as a start of a template expression.

 * The HTTP wire protocol server no longer accepts the "cmd" argument to control which command to run via HTTP POST bodies. The "cmd" argument must be specified on the URL query string.

 * Hgweb no longer reads form data in POST requests from multipart/form-data and application/x-www-form-urlencoded requests. Arguments should be specified as URL path components or in the query string in the URL instead.

 * Query string shorts in hgweb like "?cs=@" have been removed. Use URLs of the form "/:cmd" instead.

 * The HTTP client no longer accepts text/plain and application/hg-changegroup Content-Type values as a valid Mercurial command response. These should only be encountered on pre 1.0 Mercurial servers.

=== Performance Improvements ===

 * 'hg manifest --all' is likely slower due to changing its implementation to respect storage interface boundaries. If you are impacted by this regression in a meaningful way, please make noise on the development mailing list and it can be dealt with.

 * 'hg diff' is much faster for larger repositories. 40% improvements have been reported. Other operations using diffs like hgweb also benefit.

=== Bug Fixes ===

 * grep: fixes erroneous output of grep in forward order (Bts:issue3885)
 * dirstate: drop explicit files that shouldn't match (BC) (Bts:issue4679)
 * procutil: rewrite popen() as a subprocess.Popen wrapper (Bts:issue4746) (API)
 * bookmarks: test for exchanging long bookmark names (Bts:issue5165)
 * templater: drop symbols which should be overridden by new 'ctx' (Bts:issue5612)
 * clone: updates the help text for hg clone -{r,b} (Bts:issue5654)
 * bundle: updates the help text for hg bundle (Bts:issue5744)
 * histedit: make histedit's commands accept revsets (Bts:issue5746)
 * releasenotes: replace abort with warning while parsing (Bts:issue5775)
 * context: skip path conflicts by default when clearing unknown file (Bts:issue5776)
 * templatekw: switch most of showlist template keywords to new API (Bts:issue5779)
 * rebase: do not consider extincts for divergence detection (Bts:issue5782)
 * revert: use an exact matcher in interactive diff selection (Bts:issue5789)
 * subrepo: don't attempt to share remote sources (Bts:issue5793)
 * lfs: respect narrowmatcher when testing to add 'lfs' requirement (Bts:issue5794)
 * showconfig: allow multiple section.name selectors (Bts:issue5797)
 * annotate: do not poorly split lines at CR (Bts:issue5798)
 * convert: avoid closing ui.fout in subversion code (Bts:issue5807)
 * setdiscovery: back out changeset 5cfdf6137af8 (Bts:issue5809)
 * fsmonitor: layer on another hack in bser.c for os.stat() compat (Bts:issue5811)
 * notify: access the initial revision on an unfiltered repository (Bts:issue5821)
 * rebase: fix issue 5494 also with --collapse
 * date: fixed a bug in parsing months like 'Feb 2018', 'Apr 2018'
 * diffhelper: rename module to avoid conflicts with ancient C module (Bts:issue5846)
 * infinitepush: ensure fileindex bookmarks use '/' separators (Bts:issue5840)
 * import: fix crash on --exact check of empty commit (Bts:issue5702)
 * hgweb: reuse body file object when hgwebdir calls hgweb (Bts:issue5851)
 * debugcolor: fix crash by empty styles (Bts:issue5856)
 * hgweb: discard Content-Type header for 304 responses (Bts:issue5844)
 * hgweb: allow Content-Security-Policy header on 304 responses (Bts:issue5844)
 * paper: don't register click handlers with inline javascript (Bts:issue5812)
 * httppeer: detect redirect to URL without query string (Bts:issue5860)
 * filelog: don't crash on invalid copy metadata (Bts:issue5748)


=== New experimental features ===

Each release there are lot of new features added which are hidden under the EXPERIMENTAL tag as the behavior may change in future or the feature is not complete yet. The experimental features added in this cycle are:

==== narrow extension ====

Allows to create clones which fetch history data for only a subset of files. This experimental extension is now distributed with Mercurial.

==== remotenames extension ====

Shows `remotebookmarks` and `remotebranches` in the UI. This experimental extension is now distributed with Mercurial.

==== infinitepush extension ====

Allows to store some pushes in a remote blob store on the server and to serve commits from remote blob store. The revisions are stored on disk or in everstore, the metadata are stored in sql or on disk. This experimental extension is now distributed with Mercurial.

==== fix extension ====

Allows to rewrite file content in changesets or working copy. For example, automatically applying formatting fixes to modified lines of code. This experimental extension is now distributed with Mercurial.

==== lfs extension ====

An alternative to the largefiles extension, which uses the git-lfs protocol. This experimental extension is now distributed with Mercurial.

=== API Changes ===

 * Content from mercurial.hgweb.protocol has been moved to mercurial.wireprotoserver.

 * Content from mercurial.sshserver has been moved into mercurial.wireprotoserver.

 * sshserver no longers looks for wire protocol command handlers in methods named `do_<command>`. Use `@wireproto.wireprotocommand` to declare wire protocol command handler functions.

 * Log-related utility functions has been renamed as follows:

   - cmdutil.loglimit -> logcmdutil.getlimit

   - cmdutil.diffordiffstat -> logcmdutil.diffordiffstat

   - cmdutil._changesetlabels -> logcmdutil.changesetlabels

   - cmdutil.changeset_printer -> logcmdutil.changesetprinter

   - cmdutil.jsonchangeset = logcmdutil.jsonchangeset

   - cmdutil.changeset_templater -> logcmdutil.changesettemplater

   - cmdutil.logtemplatespec -> logcmdutil.templatespec

   - cmdutil.makelogtemplater -> logcmdutil.maketemplater

   - cmdutil.show_changeset -> logcmdutil.changesetdisplayer

   - cmdutil.getlogrevs -> logcmdutil.getrevs

   - cmdutil.getloglinerangerevs -> logcmdutil.getlinerangerevs

   - cmdutil.displaygraph -> logcmdutil.displaygraph

   - cmdutil.graphlog -> logcmdutil.graphlog

   - cmdutil.checkunsupportedgraphflags -> logcmdutil.checkunsupportedgraphflags

   - cmdutil.graphrevs -> logcmdutil.graphrevs

   - cmdutil._makenofollowlogfilematcher -> logcmdutil._makenofollowfilematcher

 * The following deprecated methods have been removed from context, with replacements:

   - unstable() -> orphan()

   - bumped() -> phasedivergent()

   - divergent() -> contentdivergent()

   - troubled() -> isunstable()

   - troubles() -> instabilities()

 * The following deprecated methods have been removed from obsolete, with replacements:

   - _addprecursors() -> _addpredecessors()

   - obsstore.precursors -> obsstore.predecessors

   - allprecursors() -> obsutil.allprecursors()

   - allsuccessors() -> obsutil.allsuccessors()

   - marker() -> obsutil.marker

   - getmarkers() -> obsutil.getmarkers()

   - exclusivemarkers() -> obsutil.exclusivemarkers()

   - foreground() -> obsutil.foreground()

   - successorssets() -> obsutil.successorsset()

   - unstable() -> orphan()

   - bumped() -> phasedivergent()

   - divergent() -> contentdivergent()

 * The following deprecated methods have been removed from obsutil: `marker.precnode()` and `allprecursors()`. Use `marker.prednode()` and `allpredecessors()` instead.

 * `beginparentchange()` and `endparentchange()` have been replaced by the `parentchange` context manager.

 * The deprecated `localrepo.walk()` has been removed, and replaced by `repo[node].walk()`.

 * The following deprecated methods have been removed from bookmarks: `__setitem__()`, `__delitem__()`, `update()`, and `recordchange()`. Use `bookmarks.applychanges()` instead.

 * The `cmdutil._revertprefetch()` hook point for prefetching stored files has been replaced by the command agnostic `cmdutil._prefetchfiles()`. The new function takes a list of files, instead of a list of lists of files.

 * `sshpeer.sshpeer.__init__` now receives arguments describing an existing connection instead of creating a connection itself.

 * `sshpeer.sshpeer` renamed to `sshpeer.sshv1peer`.

 * `wireproto.pushres` and `wireproto.pusherr` now explicitly track stdio output.

 * `redirect()` and `restore()` have been removed from the wire protocol handler interface. Use `mayberedirectstdio()` instead.

 * The `_client()` method of the wire protocol handler interface has been renamed to `client()`.

 * Wire protocol command handlers now return a `wireprototypes.bytesresponse` instead of a raw bytes instance. Protocol handlers will continue handling bytes instances. However, any extensions wrapping wire protocol commands will need to handle the new type.

 * SSH protocol handler now advertises its name internally as "ssh-v1" instead of "ssh."

 * File prefetching is now handled by registering a callback with `scmutil.fileprefetchhooks`.

 * HTTP protocol handlers now advertises its internal name as "http-v1" instead of "http".

 * `context.basectx` no longer implements `__int__`. Context instances will no longer cast to ints. Consumers should call `ctx.rev()` instead.

 * `templatekw.showdict()` and `showlist()` are deprecated in favor of new `(context, mapping)` API. Switch the keyword function to new API and use `templatekw.compatdict()` and `compatlist()` instead.

 * `hgweb_mod.perms` and `wireproto.permissions` have been removed. Wire protocol commands should declare their required permissions in the `@wireprotocommand` decorator.

 * The WSGI request object no longer exposes a `form` attribute containing parsed query string data. Use the `qsparams` attribute instead.

 * `hgweb.hgweb_mod.permhooks` no longer take a `wsgirequest` instance as an argument.

 * hgweb `@webcommand` functions must use the new response object passed in via "web.res" to initiate sending of a response. The hgweb WSGI application will no longer start sending the response automatically.

 * Various helper functions in hgweb.webutil no longer accept a templater instance. Access the templater through the "web" argument instead.

 * Various functions in hgweb.webutil now take a modern request object instead of "wsgirequest".

 * `@webcommand` functions now only receive a single argument. The request and templater instances can be accessed via the "req" and "templater" attributes of the first argument. Note that the request object is different from previous Mercurial releases and consumers of the previous "req" 2nd argument will need updating to use the new API.

 * The old "wsgirequest" class for handling everything WSGI in hgweb has been replaced by separate request and response types. Various high-level functions in the hgweb WSGI applications now receive these new types as arguments instead of the old "wsgirequest" type.

 * The `render(mapping)` method of the templater has been renamed to `renderdefault(mapping)`.

 * `httppeer.httppeer.__init__` now takes additional arguments. Instances should be obtained by calling `httppeer.instance()` or `httppeer.makepeer()` instead.

 * The templater is no longer callable. Use `templater.generate(t, mapping)` instead of `templater(t, **pycompat.strkwargs(mapping))`.

 * `templatekw._showlist()` is deprecated in favor of `templateutil._showcompatlist()`, which takes `context` in place of `templ`.

 * Several generic string helper functions have been moved to utils.stringutil module.

 * The `util.Abort` alias has been removed. Use `error.Abort`.

 * `merge.update()` and `merge.applyupdates()` now return a class with named attributes instead of a tuple. Switch consumers to access elements by name instead of by offset.

 * Utility functions related to process/executable management have been moved to utils.procutil module.

 * localrepo.localrepository.featuresetupfuncs has been renamed to localrepo.featuresetupfuncs.

 * localrepo.localrepository.filterpats was renamed to localrepo.localrepository._filterpats.

 * Template filters should declare input data type and/or catch `AttributeError`, `ValueError`, `TypeError`, etc. as needed. See the doc of "registrar.templatefilters" for details.

 * "wireproto" module no longer re-exports various types used to define responses to wire protocol commands. Access these types from the "wireprototypes" module.

 * `filelog.parsemeta()` and `filelog.packmeta()` have been moved to the revlog module.

 * `procutil.popen()` no longer supports text mode I/O.

 * `hook.hook()` and `hook.runhooks()` may return a negative integer to denote that the process was killed by signal.

 * `filelog.filelog` is now a standalone class and doesn't inherit from revlog. Instead, it wraps a revlog instance at `self._revlog`. This change was made in an attempt to formalize storage APIs and prevent revlog implementation details leaking through to callers.

 * The `fp` argument is removed from `cmdutil.export()`. Use `cmdutil.exportfile()` instead.

 * `cmdutil.export()` takes a formatter as an argument.

 * `patch.extract()` is now a context manager. Callers no longer have to worry about deleting the temporary file it creates, as the file is tied to the lifetime of the context manager.

 * The wire protocol peer's `iterbatch()` for bulk executing commands has been removed. Use `peer.commandexecutor()` instead.


== Mercurial 4.5.3 (2018-04-04) ==
Line 18: Line 315:
 * changectx: ancestor should only prefer merge.preferancestor if it is a revision
 * color: pass on key error for win32 (Bts:issue4298)
 * config: exit non zero on non-existent config option (Bts:issue4247)
 * context: call normal on the right object
 * debugobsolete: catch ValueError that may be raised by obsstore.create
 * discovery: prevent crash on unknown remote heads with old repo (Bts:issue4337)
 * graft: fix collision detection with origin revisions that are missing
 * help: add pad function to template help
 * help: only call doc() when it is callable
 * hgweb: avoid config object race with hgwebdir (Bts:issue4326)
 * histedit: preserve initial author on fold (Bts:issue4296)
 * import: show warning message for merge changesets
 * incoming: don't request heads that already are common
 * largefiles: don't override matchandpats for always matchers (Bts:issue4334)
 * largefiles: drop setting lfstatus in overridelog (Bts:issue4334)
 * largefiles: in overridelog, use non-lf matcher for patch generation (Bts:issue4334)
 * log: use correct phase info for parent field (Bts:issue4347)
 * merge: show the scary multiple ancestor hint for merges only, not for updates
 * obsstore.create: add a simple safeguard against cyclic markers
 * repoview: filter tags to non-existent nodes from blockers (Bts:issue4328)
 * repoview: fix typo in repoview.changelog
 * revset: bookmark revset interprets 'literal:' prefix correctly (Bts:issue4329)
 * unbundle: don't advance bookmarks (Bts:issue4322) (BC)


== Mercurial 3.1 (2014-08-01) ==

 * backout: accept '--edit' like other commands creating new changeset
 * bash_completion: add -l|--list support for shelve
 * bookmarks: avoid deleting primary bookmarks on rebase
 * bookmarks: improve the bookmark help (Bts:issue4244)
 * branch: add debug message for branch cache write failure
 * bugzilla: stop trying to cache setup across hook invocation
 * build: initial support for in-tree autobuilding recipes
 * buildrpm: include release version in .tar.gz name
 * bundle2: add ``pushkey`` support
 * bundle2: fix bundle2 pulling all revs on empty pulls
 * commit: make commit message shown in text editor customizable by template
 * config: allow 'user' in .hgrc ui section (Bts:issue3169)
 * convert: detect removal of ".gitmodules" at git source revisions correctly
 * convert: drastically speed up git conversions
 * convert: mercurial source: convert global tags only - not local tags
 * convert: only consider shamap revisions converted if they still exists
 * convert: update the transplant, rebase and graft references in 'extra'
 * diff: add nobinary config to suppress git-style binary diffs
 * discovery: if a push would create a new head, mention the bookmark name if any
 * filemerge: add internal:tagmerge merge tool
 * filemerge: use 'basic' as the default of '[ui] mergemarkers' for safety
 * filemerge: use non-minimal conflict marker regions (BC)
 * gpg: accept '--edit' like other commands creating new changeset
 * graft: customize graft conflict markers (BC)
 * help: always show command help with -h (Bts:issue4240)
 * help: suggest keyword search when no topic is found
 * histedit: respect revsetalias entries (Bts:issue4311)
 * import: add --partial flag to create a changeset despite failed hunks
 * largefiles: avoid unnecessary creation of .hg/largefiles when opening lfdirstate
 * largefiles: include largefiles when doing log on a directory (Bts:issue4241)
 * largefiles: show also how many data entities are outgoing at "hg outgoing"
 * largefiles: use "normallookup", if "mtime" of standin is unset
 * log: allow revset for --follow to be lazily evaluated
 * log: do not use exact matcher for --patch --follow without file (Bts:issue4319)
 * log: make --patch --follow work inside a subdirectory
 * make: add a basic osx mpkg target
 * merge: add conflict marker formatter (BC)
 * merge: define conflict marker labels in filemerge()
 * mergetools.hgrc: add minimal configuration for editmerge
 * packaging: move output directory from build/ to packages/
 * pager: add attend-<command> option
 * patchbomb: includes series information in the header
 * pull: when remote supports it, pull phase data alongside changesets
 * purge: add options for deleting only files or only directories
 * push: use bundle2 to push phases when available
 * qfold: allow to specify '--message/'--logfile' and '--edit' at the same time
 * qimport: record imported revs incrementally (Bts:issue3874)
 * qrefresh: allow to specify '--message/'--logfile' and '--edit' at the same time
 * rebase: specify custom conflict marker labels for rebase (BC)
 * resolve: abort when not applicable (BC)
 * resolve: don't abort resolve -l even when no merge is in progress
 * resolve: print message when no unresolved files remain (Bts:issue4214)
 * resolve: print warning when no work performed (Bts:issue4208)
 * revset: maintain ordering when subtracting from a baseset (Bts:issue4289)
 * revset: optimize baseset.__sub__ (Bts:issue4313)
 * setup: fixed for Pythons which don't have a CFLAGS
 * setup: make Xcode 5.1 check less specific
 * shelve: accept '--edit' like other commands creating new changeset
 * strip: drop -b/--backup option (BC)
 * strip: remove bookmarks after strip succeed (Bts:issue4295)
 * templatefilter: add splitlines function
 * templatekw: add 'currentbookmark' keyword to show current bookmark easily
 * templatekw: add 'subrepos' keyword to show updated subrepositories
 * templater: introduce startswith function
 * templater: introduce word function
 * templates: escape NUL bytes in jsonescape (Bts:issue4303)
 * update: introduce --tool for controlling the merge tool
 * update: show message when a bookmark is activated by update
 * update: specify custom conflict markers for update (BC)
 * update: when deactivating a bookmark, print a message
 * version: show enabled extensions (Bts:issue4209)
 * version: don't traceback if no extensions to list (Bts:issue4312)
 * vim: use try catch in vim plugin to avoid conflicts

== Mercurial 3.0.2 (2014-07-01) ==
=== Bug Fixes ===
 * rebase: on abort, don't strip commits that didn't need to be rebased (Bts:issue5822)
 * hgweb: garbage collect on every request
 * amend: abort if unresolved merge conflicts found (Bts:issue5805)

== Mercurial 4.5.1 / 4.5.2 (2018-03-06) ==
(4.5.2 was released immediately after 4.5.1 to fix a release oversight.)
Line 123: Line 325:
 * cmdutil: add copy-filtering support to duplicatecopies
 * hgweb: avoid initialization race (Bts:issue4280)
 * keyword: suppress keyword expansion for internal merge
 * match: make glob '**/' match the empty string
 * p4: accept changesets with no description (Bts:issue4282)
 * parsers.c: fix a couple of memory leaks
 * push: restore contents of HG_URL for hooks (Bts:issue4268)
 * rebase: fix bug that caused transitive copy records to disappear (Bts:issue4192)
 * repoview: do not crash when localtags refers to non existing revisions
 * resolve: keep wlock while resolving
 * revlog: hold a private reference to self._cache
 * revlog: make _chunkcache access atomic

== Mercurial 3.0.1 (2014-06-01) ==
=== Security Fixes ===
All versions of Mercurial prior to 4.5.2 have vulnerabilities in the HTTP server that allow permissions bypass to:

 * Perform writes on repositories that should be read-only
 * Perform reads on repositories that shouldn't allow read access

CVE-2018-1000132 has been assigned these vulnerabilities.

The nature of the vulnerabilities is:

 1. Wire protocol commands that didn't explicitly declare their permissions had no permissions checking done. The `web.{allow-pull, allow-push, deny_read, etc}` config options governing access control were never consulted when running these commands. This allowed permissions bypass for impacted commands.
 1. The `batch` wire protocol command did not list its permission requirements nor did it enforce permissions on individual sub-commands.

The implication of these vulnerabilities is that no permissions checking was performed on commands and this could lead to accessing data that `web.*` config options were supposed to prevent access to or modifying data (via wire protocol commands that can mutate data) without authorization. A Mercurial HTTP server in its default configuration is supposed to be read-only. However, a well-crafted `batch` command could invoke commands that perform writes.

The `batch` write permissions bypass has been present since Mercurial 1.9. The flaw of not checking permissions for wire protocol commands that don't declare their needed permissions has been present since Mercurial 1.0.

Assuming you are running a server without any custom commands provided by extensions, your exposure is unauthorized data access (if relying on the `web.*` config options to limit access) and unauthorized data mutation via the `batch` command.

Server operators can detect unauthorized use of the `batch` command by looking for requests to URLs of the form `repo?cmd=batch` with arguments containing `pushkey` or `unbundle`. This may produce false positives. A more comprehensive check would decode the argument string and verify that `pushkey` or `unbundle` are command names (not values). The arguments specified via `x-hgarg-<N>` request headers can span multiple headers. So advanced attackers could hide the vulnerability by splitting a `pushkey` or `unbundle` string across multiple headers. So the only reliable way to detect if this vulnerability is being exploited is to decode these headers like Mercurial does. The format for specifying arguments is documented at https://www.mercurial-scm.org/repo/hg/file/4.5/mercurial/help/internals/wireprotocol.txt#l26. Python code for decoding headers is at https://www.mercurial-scm.org/repo/hg/file/4.5/mercurial/hgweb/protocol.py#l70.

Mercurial 4.5.2 fixes these vulnerabilities by:

 * Performing permissions checking on all wire protocol commands, not just commands that list their permissions.
 * Checking permissions on sub-commands issued to the `batch` command.

Wire protocol commands not declaring wire protocol permissions will be assumed to be read-write commands and a server in its default configuration (which only allows read-only access), will refuse to execute these commands.

For package maintainers needing to backport the fixes, the relevant changesets from 4.5.2 are `2c647da851ed::2ecb0fc535b1`. These can be viewed online at e.g. https://www.mercurial-scm.org/repo/hg/rev/2ecb0fc535b1. The author of these commits has backports to 4.4 and 4.3 on a personal fork at https://hg.mozilla.org/users/gszorc_mozilla.com/hg. The backports for 4.4 are `a4843835c835::7cf827e5f8af` and for 4.3 are `db527ae12671::86f9a022ccb8`. To obtain these changesets, run e.g. `hg pull -r 7cf827e5f8af https://hg.mozilla.org/users/gszorc_mozilla.com/hg`.

=== Backwards Compatibility Changes ===
 * The "batch" wire protocol command now enforces permissions of each invoked sub-command. Wire protocol commands must define their operation type or the "batch" command will assume they can write data and will prevent their execution on HTTP servers unless the HTTP request method is POST, the server is configured to allow pushes, and the (possibly authenticated) HTTP user is authorized to perform a push.

 * Wire protocol commands not defining their operation type in "wireproto.PERMISSIONS" are now assumed to be used for "push" operations and access control to run those commands is now enforced accordingly.

=== Bug Fixes ===
 * fileset: don't abort when running copied() on a revision with a removed file
 * date: fix parsing months
 * setup: only allow Python 3 from a source checkout (Bts:issue5804)
 * annotate: do not poorly split lines at CR (Bts:issue5798)
 * subrepo: don't attempt to share remote sources (Bts:issue5793)
 * subrepo: activate clone pooling to enable sharing with remote URLs
 * changegroup: do not delta lfs revisions
 * revlog: do not use delta for lfs revisions
 * revlog: resolve lfs rawtext to vanilla rawtext before applying delta

== Mercurial 4.5 (2018-02-01) ==
=== New Features ===
==== revert --interactive ====
The revert command now accepts the flag --interactive to allow reverting only some of the changes to the specified files.

==== Accessing hidden changesets ====
Set config option 'experimental.directaccess = True' to access hidden changesets from read only commands.

==== githelp extension ====
The `githelp` extension provides the `hg githelp` command. This command attempts to convert a `git` command to its Mercurial equivalent. The extension can be useful to Git users new to Mercurial.

==== Largefiles changes ====
 * largefiles: add a 'debuglfput' command to put largefile into the store
 * largefiles: add support for 'largefiles://' url scheme
 * largefiles: allow to run 'debugupgraderepo' on repo with largefiles
 * largefiles: convert EOL of hgrc before appending to bytes IO
 * largefiles: explicitly set the source and sink types to 'hg' for lfconvert
 * largefiles: modernize how capabilities are added to the wire protocol

=== hgweb changes ===
hgweb now shows more information about commits: phase (if it's not public), obsolescence status (with a short explanation and links to the successors) and instabilities (e.g. orphan, phase-divergent or content-divergent).

Client-side graph code has been simplified by delegating more work to the backend, so /graph page is now more in sync with /log page, visually and feature-wise. Unfortunately, this code change means that 3rd-party themes for 4.5+ are required to have `graphentry.tmpl` template available (copy it from the base theme if you don't use `%include` and then reference it in map file) and render entries in `graph.tmpl` -- look at one of the core themes to see what it needs to look like. JS functions that create graph vertices and edges are now available in `Graph.prototype`, making it possible to call the original functions from custom theme-specific functions if needed.

Graph now shows different symbols for normal, branch-closing, obsolete and unstable commits, and marks currently checked out commit with a circle around its graph node.

There's also now `json-graph` API endpoint that can be used for rendering commit graph in 3rd-party applications.

==== Other Changes ====
 * When interactive revert is run against a revision other than the working directory parent, the diff shown is the diff to <em>apply</em> to the working directory, rather than the diff to <em>discard</em> from the working copy. This is in line with related user experiences with 'git' and appears to be less confusing with 'ui.interface=curses'.
 * Let 'hg rebase' avoid content-divergence by skipping obsolete changesets (and their descendants) when they are present in the rebase set along with one of their successors but none of their successors is in destination.
 * A new experimental config flag, 'rebase.experimental.inmemory', makes rebase perform an in-memory merge instead of doing it on-disk in the working copy.
 * The `HGPLAINEXCEPT` environment variable can now include `color` to allow automatic output colorization in otherwise automated environments.
 * A new unamend command in uncommit extension which undoes the effect of the amend command by creating a new changeset which was there before amend and moving the changes that were amended to the working directory.
 * A '--abort' flag to merge command to abort the ongoing merge.
 * An experimental flag '--rev' to 'hg branch' which can be used to change branch of changesets.
 * bundle2 read I/O significantly improved
 * bundle2 memory use significantly reduced during read
 * clonebundle: it is now possible to serve the clonebundle using a git-lfs compatible server.
 * templatefilters: add slashpath() to convert path separator to slash (Bts:issue5572)
 * A new experimental config flag, 'inline-color-diff', adds within-line color diff capacity
 * histedit: add support to output nodechanges using formatter to help with editor integrations

=== Backwards Compatibility Changes ===
 * `log --follow-first -rREV`, which is deprecated, now follows the first parent of merge revisions from the specified `REV` just like `log --follow -rREV`.
 * `log --follow -rREV FILE..` now follows file history across copies and renames.
 * transaction: register summary callbacks only at start of transaction
 * hgweb's graph view no longer supports browsers that lack <canvas> support
 * hgweb: only include graph-related data in jsdata variable on /graph pages
 * graphlog: add another graph node type, unstable, using character `*`
 * remove: print message for each file in verbose mode only while using '-A'

=== Bug Fixes ===
 * Bookmark, whose name is longer than 255, can again be exchanged again between 4.4+ client and servers (Bts:issue5165)
 * The convert extension works with bzr < 2.6.0 again (Bts:issue5733)
 * Mercurial will now attempt to use hardlinks on NTFS on Windows (Bts:issue4580)
 * The revset `x^::` is now correctly parsed as `(x^)::` instead of being an error (Bts:issue5764)
 * Setting the diff.noprefix configuration option no longer breaks the `--stat` flag on `hg diff` (Bts:issue5759)
 * `hg outgoing` now honors `:pushurl` paths from hgrc (Bts:issue5365)
 * log: translate column labels at once (Bts:issue5750)
 * patch: improve heuristics to not take the word `diff` as header (Bts:issue1879)
 * templater: look up symbols/resources as if they were separated (Bts:issue5699)
 * http and ssh: support for emitting extra debug logs about requests as they happen

=== API Changes ===
 * `bundlerepo.bundlerepository.bundle` and `bundlerepo.bundlerepository.bundlefile` are now prefixed with an underscore.
 * Rename bundlerepo.bundlerepository.bundlefilespos to _cgfilespos.
 * dirstate no longer provides a 'dirs()' method. To test for the existence of a directory in the dirstate, use 'dirstate.hasdir(dirname)'.
 * mapping does not contain all template resources. use context.resource() in template functions.
 * `text=False|True` option is dropped from the vfs interface because of Python 3 compatibility issue. Use `util.tonativeeol/fromnativeeol()` to convert EOL manually.
 * `wireproto.streamres.__init__` no longer accepts a `reader` argument. Use the `gen` argument instead.
 * exchange.getbundlechunks() now returns a 2-tuple instead of just an iterator.
 * bundle2 parts are no longer seekable by default
 * memfilectx: the changectx argument is now mandatory in constructor

== Mercurial 4.4.2 (2017-12-01) ==
Line 140: Line 449:
 * alias: change return code of bad definition to 255
 * alias: fix loss of non-zero return code in command aliases
 * alias: handle shlex error in command aliases
 * bookmarks: properly align multi-byte characters
 * bugzilla: support Bugzilla 4.4.3+ API login token authentication (Bts:issue4257)
 * bundle2: fix bundle2 pulling all revs on empty pulls
 * bundle2: fix configuration name mismatch
 * changelog: ensure changelog._delaybuf is initialized
 * color: don't fail on error messages when no curses (Bts:issue4237)
 * exchange: propagate arguments to the _getbundleextrapart function
 * localrepo: prevent leak of transaction object (Bts:issue4258)
 * proxy: remove unneeded _set_hostport for compatibility with Python 2.7.7rc1
 * setup.py, make: avoid problems with outdated, existing {{{hgext/__index__.py*}}}
 * subrepo: avoid sanitizing ".hg/hgrc" in meta data area for non-hg subrepos
 * subrepo: invoke "_sanitize()" also after "git merge --ff"
 * subrepo: make "_sanitize()" take absolute path to the root of subrepo
 * subrepo: make "_sanitize()" work
 * subrepo: normalize path in the specific way for problematic encodings
 * templates: fix ifcontains against sets with length > 1 (Bts:issue4259)
 * win32: backout 1a9ebc83a74c


== Mercurial 3.0 (2014-05-01) ==

This is a regularly-scheduled quarterly feature release. Unlike other 3.0 software releases, this is simply 2.9 + .1, so it should be the usual pain-free upgrade.

=== Core features ===

 * cat: support explicit paths in subrepos
 * cmdserver: allow starting server without repository
 * clone: abort if default destination has no meaningful name (BC)
 * clone: put streaming clones in a transaction
 * color: add debugcolor command (Bts:issue4094)
 * color: allow color keywords to be used directly in template
 * commands: add -T as alternative to --template
 * commands: hg debuginstall checks missing templates (Bts:issue4151)
 * commit: --edit/-e allows editing commit message supplied through other means
 * config: add initial implementation of --edit (with --global and --local flags)
 * debuginstall: add Python information to debuginstall output (Bts:issue4128)
 * demandimport: support HGDEMANDIMPORT=disable to disable demandimport
 * hgweb: add metadata to atom and rss feed entries
 * http: reuse authentication info after the first failed request (Bts:issue3567)
 * log: change implementation to use graphlog code
 * push: provide a hint when no paths are configured (Bts:issue3692)
 * require: provide a link to a wiki page as well as suggesting upgrade
 * revset: new implementation with incremental evaluation
 * revset: try to handle hyphenated symbols if lookup callback is available
 * revset: add 'only()' revset
 * sshpeer: only print out 'running ssh' messages in debug mode (BC)
 * template: add ifcontains template function
 * template: add pad function for padding output
 * template: add revset() template function
 * template: add shortest(node) template function
 * template: add flexible -T option
 * win32: improve the performance of win32.unlink() over CIFS

=== Extension features ===

 * blackbox: log events related to branch cache
 * convert: avoid updating tags when there is nothing new
 * convert: compare tags from all heads instead of just one
 * convert: replace old sha1s in the description
 * extensions: mark win32text deprecated
 * extensions: remove interhg
 * extensions: remove the inotify extension (BC)
 * histedit: select the lowest rev when looking for a root in a revset (BC)
 * journal: report parsing errors on recover/rollback (Bts:issue4172)
 * qimport: allow importing URLs

=== Fixes ===

 * backout: don't limit ancestry check to a single ancestor
 * backout: improve confusing 'cannot backout change on a different branch' abort
 * caches: invalidate store caches when lock is taken
 * cmdserver: forcibly use L channel to read password input (Bts:issue3161)
 * cmdserver: reload mq on each runcommand request to avoid corruption
 * diff: use second filename for --stat reporting on git patches (Bts:issue4221)
 * dirstate: report bad subdirectories as match.bad, not just a warning (BC)
 * extensions: use normpath to allow trailing '\' on Windows (Bts:issue4187)
 * fncache: clean up fncache during strips
 * largefiles: changed overridelog to work with graphlog
 * largefiles: don't prompt when one side of merge was changed but didn't change
 * largefiles: remove directories emptied after their files are moved (Bts:issue3515)
 * parsers: fail fast if Python has wrong minor version (Bts:issue4110)
 * phases: apply publishing enforcement for "serve" source
 * revlog: deal with chunk ranges over 2G on Windows (Bts:issue4215)
 * setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
 * subrepo: check return code for git push (Bts:issue4223)

=== Experimental features ===

 * bundle2: experimental support for bundle2
 * merge: experimental implementation of bid merge
 * merge: tell when .ancestor picks one of multiple common ancestors heads

== Mercurial 2.9.2 (2014-04-01) ==
=== Notable changes ===
==== Stricter command option parsing ====
Mercurial can now optionally parse "early" options (`-R/--repository`, `--cwd`, `--config`, `--debugger`, and `--profile`) more strictly, for more secure integration with tools that invoke 'hg' commands. Setting `HGPLAIN=+strictflags` will parse these options more strictly, which prevents them from being injected as arguments to other flags.

=== Bug fixes ===
 * 'hg amend' now correctly handles deleted and removed files, as well as subrepos. (Bts:issue5732, Bts:issue5677)
 * largefiles now correctly handles dropped standin files when updating largefiles.
 * Fixed an issue with deleting symlinks to directories when ui.origbackuppath is set. (Bts:issue5731)

=== Performance improvements ===
 * Improved performance in path conflict checking introduced in Mercurial 4.4. (Bts:issue5716)

== Mercurial 4.4.1 (2017-11-07) ==
=== Notable changes ===
 * Git and Subversion subrepos have been disabled by default to mitigate a potential security risk if files overlapping with a subrepo managed to be committed to a repository.
 * Subrepos are now more paranoid about symlink traversal.
 * The share extension handles drive letters on Windows better.

It is possible that a specially malformed repository can cause Git subrepositories to run arbitrary code in the form of a .git/hooks/post-update script checked in to the repository in Mercurial 4.4 and earlier. Typical use of Mercurial prevents construction of such repositories, but they can be created programmatically.

== Mercurial 4.4 (2017-11-01) ==
=== Notable changes ===
==== Control whitespace settings for annotation on hgweb ====
/annotate URLs on hgweb now accept query string arguments to influence how whitespace changes impact results.

The arguments "ignorews," "ignorewsamount," "ignorewseol," and "ignoreblanklines" now have the same meaning as their [annotate] config section counterparts. Any provided setting overrides the server default.

HTML checkboxes have been added to the paper and gitweb themes to expose current whitespace settings and to easily modify the current view.

==== Fast, heuristic copy-tracing ====
A new fast heuristic algorithm for copytracing which assumes that the files moves are either:

 1. renames in the same directory
 1. moves in other directories with same names

You can use this algorithm by setting 'experimental.copytrace=heuristics'. This setting performs full copytracing if both source and destination branches contains non-public changesets only.

==== Other changes ====
 * Estimated time is more accurate with non-linear progress

 * "hg status -v" can now show unfinished state. For example, when in an unfinished rebase state, "hg status -v" might show:
 {{{
 # The repository is in an unfinished *rebase* state.
 # No unresolved merge conflicts.
 # To continue: hg rebase --continue
 # To abort: hg rebase --abort
}}}

 * Added '--ignore-space-at-eol' diff option to ignore whitespace differences at line endings.

 * show: use consistent node length in views

 * show: decrease minimum displayed hash length from 5 to 4

 * A new uncommit extension which provides 'hg uncommit' using which one can uncommit part or all of the changeset. This command undoes the effect of a local commit, returning the affected files to their uncommitted state.

 * 'hg clone --uncompressed' uses clone bundles when possible

 * 'hg annotate --skip' now prints a '*' on lines with skipped revisions

 * New 'commands.update.check' feature to adjust constraints on when 'hg update' will allow updates with a dirty working copy.

 * Add an experimental -L/--line-range FILE,FROMLINE:TOLINE option to 'hg log' command to follow the history of files by line range. In combination with -p/--patch option, only diff hunks within specified line range will be displayed. Feedback, especially on UX aspects, is welcome.

 * Print warning when fsmonitor isn't being used on a large repository

=== Backwards Compatibility Changes ===
 * The config option for copytrace 'experimental.disablecopytrace' is now replaced with 'experimental.copytrace' which defaults to 'on'. If you need to turn off copytracing, add '[experimental] copytrace = off' to your config.

 * 'hg clone --stream' should now be used instead of --uncompressed. --uncompressed is marked as deprecated and is an alias for --stream. There is no schedule for elimination of --uncompressed.

 * The 'experimental.updatecheck' name for the new 'commands.update.check' feature is now deprecated, and will be removed after this release.

 * Mercurial subrepositories are now shared instead of cloned when the parent repository is shared. This prevents dangling subrepository references in the share source. Previously shared repositories with cloned subrepositories will continue to function unchanged.

 * Push no longer triggers a pushkey hook when updating phases. Use the new 'txnclose-phase' and 'txnclose-phase' hooks instead. (Applies when both server and client use version 4.4 or above).

=== Bug Fixes ===
 * Core rebase algorithm has been rewritten to be more robust (Bts:issue5578, Bts:issue5630)

 * Creating a share of a repository with a Mercurial subrepository will now share the subrepository (Bts:issue5675)

=== Performance Improvements ===
 * improved performance when many aliases are defined

=== API Changes ===
==== remove peer.batch() ====
Replace with peer.iterbatch().

==== Other Changes ====
 * @peer.batchable can no longer emit local values

 * @peer.batchable functions must now yield exactly 2 values

 * Rename attributes on sshpeer to reflect peer API

 * peer.peerrepository has been removed. Use repository.peer abstract base class to represent a peer repository.

 * revset.stringset() now takes 'order' as the last argument.

== Mercurial 4.3.3 (2017-10-01) ==
 * Prevent crashes when clearing progress bar. (Bts:issue5684)
 * rebase: move bookmarks with --keep (Bts:issue5682)

== Mercurial 4.3.2 (2017-09-18) ==
 * restore compatibility with older versions of Python 2.7 by not using a bytearray with struct.unpack_from()
 * restore mingw compatibility for setup.py
 * hgwebdir: read 'web.template' untrusted (plugs potential security issue)
 * repair: preserve phase when not using generaldelta (Bts:issue5678)
 * ssh: fix flakey ssh errors on BSD systems
 * restore error handling behavior around certain I/O errors; the regressed behavior could result in transactions not being properly rolled back if stdio handles encountered errors (Bts:issue5658)
 * templatekw: choose {latesttag} by len(changes), not date (Bts:issue5659)
 * record: fix revert -i for lines without newline (Bts:issue5651)
 * mq: create non-lossy patches, also with custom global diff configuration

== Mercurial 4.3 / 4.3.1 (2017-08-10) ==
(4.3.1 was released immediately after 4.3 to fix a release oversight.)

An [[Release4.3|overview of new features]] available. This is a regularly-scheduled quarterly feature release.

=== Notable changes ===
 * experimental amend extension providing the amend command
 * experimental sparse extension
 * Support for Python 2.6 has been dropped.
 * Bundles created by the strip extension now store phase information. It will be restored when unbundling.
 * The strip extension now removes relevant obsmarkers. If a backup requested (the default), the obsmarkers are stored in the backup bundle and will be restored when unbundling.
 * `hg show work` (from the experimental `show` extension) now displays more info
 * `hg show stack` is a new view for the current, in-progress changeset and others around it
 * Mitigation for two security vulnerabilities

=== CVE-2017-1000115 ===
Mercurial's symlink auditing was incomplete prior to 4.3, and could be abused to write to files outside the repository.

=== CVE-2017-1000116 ===
Mercurial was not sanitizing hostnames passed to ssh, allowing shell injection attacks on clients by specifying a hostname starting with -oProxyCommand. This is also present in Git (CVE-2017-1000117) and Subversion (CVE-2017-9800), so please patch those tools as well if you have them installed.

== Mercurial 4.2.3 (2017-08-10) ==
This was an out-of-cycle backport of security fixes from 4.3 for users stuck on Python 2.6.

== Mercurial 4.2.2 (2017-07-05) ==
Line 239: Line 591:
 * amend: save commit message into ".hg/last-message.txt"
 * backout: correct commit status of no changes made (BC) (Bts:issue4190)
 * backout: document return code of merge conflict
 * commit: create new amend changeset as secret correctly for "--secret" option
 * commit: propagate --secret option to subrepos (Bts:issue4182)
 * convert: more clear documentation of the 'include' default of a 'include .'
 * dispatch: only do __import__(debugger) when a debugger is requested
 * log: solves bug regarding hg log -r 0:null (Bts:issue4039)
 * hg: introduce "wirepeersetupfuncs" to setup wire peer by extensions (Bts:issue4109)
 * hg: use "os.path.join()" to join path components which may be empty (Bts:issue4203)
 * histedit: save manually edited commit message into ".hg/last-message.txt"
 * localrepo: save manually edited commit message as soon as possible
 * merge: fix lack of "%s" in format string causing !TypeError at runtime
 * paper: overlapping of section title on help pages (Bts:issue4051)
 * phase: say "Returns 0" instead of "Return 0" like other command help
 * qfold: save manually edited commit message into ".hg/last-message.txt"
 * qnew: save manually edited commit message into ".hg/last-message.txt"
 * rebase: use "commitforceeditor" instead of "ui.edit()" for "--collapse"
 * revset: document the regular expression support for tag(name)
 * subrepo: add trailing newlines to warnings
 * subrepo: convert matched string to integer before comparing Git version
 * subrepo: only retrieve the first two components of the Git version
 * tag: save manually edited commit message into ".hg/last-message.txt"
 * templater: apply "stringify()" on sub expression to get string correctly
 * templater: avoid recursive evaluation of string literals completely
 * templater: make strings in template expressions be "string-escape"-ed correctly
 * templater: raise error for unknown function

== Mercurial 2.9.1 (2014-03-01) ==
 * largefiles: avoid a crash when archiving a subrepo with largefiles disabled
 * rebase: also test abort from pretxnclose error
 * rebase: backed out changes 2519994d25ca and cf8ad0e6c0e4 (Bts:issue5610)
 * rebase: reinforce testing around precommit hook interrupting a rebase

== Mercurial 4.2.1 (2017-6-4) ==
Line 271: Line 599:
 * coal: hgweb style adds extra blank line in file view (Bts:issue4136)
 * hg.openpath: use url.islocal to tell if the path is local (Bts:issue3624)
 * hgweb: hack around mimetypes encoding thinko (Bts:issue4160)
 * hooks: only disable/re-enable demandimport when it's already enabled
 * merge: add "other" file node in the merge state file
 * merge: audit the right destination file when merging with dir rename
 * merge: don't overwrite file untracked after remove, abort with 'untracked files'
 * merge: record the "other" node in merge state
 * pathencode: eliminate signed integer warnings
 * pull: close peer repo on completion (Bts:issue2491) (Bts:issue2797)
 * purge: avoid duplicate output for --print (Bts:issue4092)
 * rebase: do not try to reactivate deleted divergent bookmark
 * resolve: use "other" changeset from merge state (Bts:issue4163)
 * verify: do not prevent verify repository containing hidden changesets



== Mercurial 2.9 (2014-02-01) ==

This is a regularly-scheduled feature release.

=== Core features ===

 * backout: add a message after backout that need manual commit
 * bash_completion: add global support for -B|--bookmark
 * bash_completion: add global support for -b|--branch
 * bookmarks: allow push -B to create a new remote head (Bts:issue2372)
 * date: allow %z in format (Bts:issue4040)
 * hgweb: infinite scroll support for coal, gitweb, and monoblue styles
 * patch: add support for git delta hunks
 * url: added authuri when login information is requested (Bts:issue3209)

=== Performance improvement ===

 * backout: avoid update on simple case
 * branchmap: cache open/closed branch head information
 * cat: increase perf when catting single files
 * changectx: increase perf of walk function
 * strip: add faster revlog strip computation

=== Extension features ===

 * bash_completion: add completion for deleting a shelve
 * convert: use branchmap to change default branch in destination (Bts:issue3469)
 * record: --user/-u now works with record when ui.username not set (Bts:issue3857)
 * subrepo: check phase of state in each subrepositories before committing

=== Fixes ===

 * aliases: make "_checkshellalias()" invoke "findcmd()" with "strict=True"
 * bisect: --command without --noupdate should flag the parent rev it tested
 * clone: do not turn hidden changeset public on publishing clone (Bts:issue3935)
 * diff: search beyond ancestor when detecting renames
 * push: properly move phase boundary when no changeset are exchanged (Bts:issue3786)
 * rebase: abort cleanly when we encounter a damaged rebasestate (Bts:issue4155)
 * rebase: do not crash in panic when cwd disapear in the process (Bts:issue4121)
 * record: re-enable whitespace-ignoring options
 * relink: abort earlier when on different devices (Bts:issue3916)
 * subrepo: make it possible to update to hidden subrepo revisions
 * templater: selecting a style with no templates does not crash (Bts:issue4140)
 * update: consider successor changesets for a bare update
 * update: consider successor changesets when moving active bookmark


== Mercurial 2.8.2 (2014-01-01) ==
 * `hg graft` now works when grafting across merges that were problematic before ([[https://www.mercurial-scm.org/repo/hg-stable/rev/b4e1e30528c7|b4e1e30528c7]]).
 * A race condition in `hg status` was partially fixed (Bts:issue5584).
 * The message about deprecated SHA-1 hashes in the [hostfingerprints] config section now references the correct syntax for replacing them with SHA-256 hashes (Bts:issue5559).

== Mercurial 4.2 (2017-5-2) ==
An [[Release4.2|overview of new features]] available. This is a regularly-scheduled quarterly feature release.

=== Notable changes ===
 * Pager support has been moved into core and is now enabled by default. This is now controlled with the ui.paginate setting.
  * Note that in 4.2-rc, the ui.paginate option was named pager.enable. The old name has been dropped in the final release. If you had turned pagination off using pager.enable=False, please update your config.
 * Color support has also been moved into core and is now enabled by default (the ui.color setting now defaults to 'auto').
 * The new experimental 'show' extension provides a way to view various information about your repository in an ergonomic way. It is deliberately designed for human consumption and not for scripting, so it doesn't carry the same [[CompatibilityRules|backward compatibility guarantees]] as other commands. See 'hg help -e show' for more information.
 * Mercurial now requires `setuptools` on Windows.

=== commands ===
 * Pager support has been added to the 'log', 'diff', 'branches', 'files', 'status', 'summary', and 'tags' commands, as well as the '--patch', '--list', and '--stat' options of hg shelve.
 * bisect: set a blockedtag when running the check command
 * bookmarks: check HG_PENDING strictly
 * branches: populate all template keywords in formatter
 * commandserver: handle backlog before exiting
 * commandserver: prevent unlinking socket twice
 * commit: optionally strip quotes from commit template (BC)
 * diff: add --binary option for git mode diffs
 * help: add pointer how to narrow list of resolved/unresolved files (Bts:issue5469)
 * pager: advertise the config option in the default hgrc
 * pager: avoid shell=True on subprocess.Popen for better errors (Bts:issue5491)
 * pager: don't terminate with extreme prejudice on SIGPIPE (BC)
 * pager: exit cleanly on SIGPIPE (BC)
 * pager: improve support for various flavors of 'more' on Windows
 * pager: use less as a fallback on Unix
 * pull: abort pull --update if config requires destination (Bts:issue5528)
 * serve: add support for Mercurial subrepositories
 * status: handle more node indicators in buildstatus
 * status: support commands.status.relative config
 * update: accept --merge to allow merging across topo branches (Bts:issue5125)
 * verify: fix length check

=== core ===
 * bundle2: ignore errors seeking a bundle after an exception (Bts:issue4784)
 * checkheads: upgrade the obsolescence postprocessing logic (Bts:issue4354)
 * color: insert color code after every "\e[0m" (Bts:issue5413)
 * color: sync text attributes and buffered text output on Windows (Bts:issue5508)
 * config: use "churn" as an example extension
 * config: drop pager from the recommended extension
 * context: optimize linkrev adjustment in blockancestors() (Bts:issue5538)
 * crecord: avoid setting non-existing SIGTSTP signal on windows (Bts:issue5512)
 * debian: configure editor and pager to sensible-editor and sensible-pager by default
 * dispatch: ignore further SIGPIPE while handling KeyboardInterrupt
 * dispatch: protect against malicious 'hg serve --stdio' invocations (SEC)
 * dispatch: start profiling earlier
 * filemerge: optionally strip quotes from merge marker template (BC)
 * formatter: add support for changeset templating
 * formatter: support json formatting of long type
 * graphlog: draw multiple edges towards null node (Bts:issue5440)
 * graphlog: optionally strip quotes from graphnode template (BC)
 * localrepo: deprecate 'repo.join' in favor of 'repo.vfs.join'
 * localrepo: deprecate 'repo.opener' (API)
 * localrepo: deprecate 'wfile'
 * localrepo: deprecated 'repo.wopener' (API)
 * match: adding support for matching files inside a directory
 * packaging: add make target for linux wheels
 * patch: make diff in git mode respect --text option (Bts:issue5510)
 * plain: ignore [commands] config
 * profiling: add statprof support for Chrome trace viewer rendering
 * progress: retry ferr.flush() and .write() on EINTR (Bts:issue5532)
 * py3: stop exporting urlparse from pycompat and util (API)
 * rcutil: let environ override system configs (BC)
 * rcutil: let rccomponents return different types of configs (API)
 * rcutil: move scmutil.*rcpath to rcutil (API)
 * rcutil: rename rcpath to rccomponents (API)
 * rcutil: split osrcpath to return default.d paths (API)
 * record: update help message to use operation instead of "record" (Bts:issue5432)
 * revlog: avoid applying delta chain on cache hit
 * revset: split language services to revsetlang module (API)
 * revset: stop supporting plain list as input set (API)
 * revset: stop supporting predicate that returns plain list (API)
 * setup: use setuptools on Windows (Bts:issue5400)
 * smartset: move set classes and related functions from revset module (API)
 * sshpeer: try harder to snag stderr when stdout closes unexpectedly
 * templatefilter: add support for 'long' to json()
 * templatekw: have showlist() take mapping dict with no **kwargs expansion (API)
 * templatekw: make join() escape values of extras (BC) (Bts:issue5504)
 * templater: make pad() strip color codes before computing width (Bts:issue5416)
 * test-profile: allow negative time in JSON output (issue5542)
 * track-tags: write all tag changes to a file
 * util: always force line buffered stdout when stdout is a tty (BC)
 * vfs: extract 'vfs' class and related code to a new 'vfs' module (API)

=== extensions ===
 * histedit: log the time taken to read in the commands list
 * histedit: make check for unresolved conflicts explicit (Bts:issue5545)
 * histedit: modify rollup to discard date from the rollup commit (Bts:issue4820)
 * histedit: use safecleanupnode in _aborthistedit (Bts:issue5500)
 * largefiles: add copytostore() fstandin argument to replace readstandin() (API)
 * largefiles: add lfile argument to updatestandin() for efficiency (API)
 * largefiles: make copytostore() accept only changectx as the 2nd argument (API)
 * largefiles: omit updating newly added standin at linear merging
 * largefiles: remove unused keyword argument of copytostore() (API)
 * largefiles: replace hashrepofile by hashfile (API)
 * largefiles: set the extension as enabled locally after a share requiring it
 * patchbomb: add config knob to generate flags by template (Bts:issue5354)
 * patchbomb: drop internal option for pbranch extension (API)
 * patchbomb: use modern pager to display -n/--test result (BC)
 * rebase: abort hg pull --rebase if rebase.requiredest is set (Bts:issue5514)
 * rebase: abort if *any* commit in rebase set is public
 * rebase: add flag to require destination
 * rebase: allow aborting if last-message.txt is missing
 * rebase: allow destination-free continue and abort (Bts:issue5513)
 * rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
 * rebase: unhide original working directory node as well (Bts:issue5219)
 * shelve: add -n/--name option to unshelve (Bts:issue5475)
 * shelve: add logic to preserve active bookmarks
 * show: new extension for displaying various repository data

=== hgweb ===
 * hgweb: add a "patch" query parameter to filelog command
 * hgweb: do not show "descending" link in followlines UI for filelog heads
 * hgweb: handle a "descend" query parameter in filelog command
 * hgweb: handle a "linerange" request parameter in filelog command
 * hgwebdir: add support for explicit index files

=== Behavior changes ===
 * commit: optionally strip quotes from commit template (BC)
 * filemerge: optionally strip quotes from merge marker template (BC)
 * graphlog: optionally strip quotes from graphnode template (BC)
 * pager: don't terminate with extreme prejudice on SIGPIPE (BC)
 * pager: exit cleanly on SIGPIPE (BC)
 * patchbomb: use modern pager to display -n/--test result (BC)
 * rcutil: let environ override system configs (BC)
 * rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
 * templatekw: make join() escape values of extras (BC) (Bts:issue5504)
 * util: always force line buffered stdout when stdout is a tty (BC)

=== Internal API changes ===
 * largefiles: add copytostore() fstandin argument to replace readstandin() (API)
 * largefiles: add lfile argument to updatestandin() for efficiency (API)
 * largefiles: make copytostore() accept only changectx as the 2nd argument (API)
 * largefiles: remove unused keyword argument of copytostore() (API)
 * largefiles: replace hashrepofile by hashfile (API)
 * localrepo: deprecate 'repo.opener' (API)
 * localrepo: deprecated 'repo.wopener' (API)
 * patchbomb: drop internal option for pbranch extension (API)
 * py3: stop exporting urlparse from pycompat and util (API)
 * rcutil: let rccomponents return different types of configs (API)
 * rcutil: move scmutil.*rcpath to rcutil (API)
 * rcutil: rename rcpath to rccomponents (API)
 * rcutil: split osrcpath to return default.d paths (API)
 * revset: split language services to revsetlang module (API)
 * revset: stop supporting plain list as input set (API)
 * revset: stop supporting predicate that returns plain list (API)
 * smartset: move set classes and related functions from revset module (API)
 * templatekw: have showlist() take mapping dict with no **kwargs expansion (API)
 * vfs: extract 'vfs' class and related code to a new 'vfs' module (API)

== Mercurial 4.1.3 (2017-4-18) ==
This is an out of cycle release to address a security issue:

 * `hg serve --stdio` could be tricked into granting authorized users access to the Python debugger. Thanks to Jonathan Claudius of Mozilla for reporting this issue. This issue is only a security issue for repositories served using --stdio, which includes ssh but *not* http. This is CVE-2017-9462.

== Mercurial 4.1.2 (2017-4-3) ==
Line 339: Line 761:
 * fileset, revset: do not use global parser object for thread safety
 * hgweb: avoid initialization race (Bts:issue3953)
 * mpatch: rewrite pointer overflow checks

== Mercurial 2.8.1 (2013-12-01) ==
 * Mercurial should work inside IIS on Windows again. (Bts:issue5493)
 * zstd support now refuses to work on old bundle formats. (Bts:issue5506)
 * Merges involving subrepositories no longer crash in some cases. (Bts:issue5505)
 * Checking for new heads during push is [[https://www.mercurial-scm.org/repo/hg/rev/ed5b25874d998ababb181a939dd37a16ea644435|no longer]] accidentally quadratic

== Mercurial 4.1.1 (2017-3-2) ==
Line 347: Line 769:
 * bookmarks: consider successor changesets when moving bookmark (Bts:issue4015)
 * contrib: don't mention obsolete graphlog extension in mercurial.ini
 * contrib: promote strip extension over MQ in sample.hgrc
 * contrib: stop mentioning obsolete graphlog extension in sample.hgrc
 * convert: fix svn crash when svn.ra.get_log calls back with orig_paths=None
 * help: fix backwards bisect help example
 * help: use progress instead of mq as in 'hg help config' example
 * hgk: fix tag list parser (Bts:issue4101)
 * hgweb: ignore non numeric "revcount" parameter values (Bts:issue4091)
 * histedit: hold wlock and lock while in progress
 * largefiles: cache largefiles for update, also without printmessage
 * largefiles: don't crash on 'local renamed directory' actions
 * merge: move forgets to the beginning of the action list
 * minirst: do not interpret a directive as a literal block
 * minirst: find admonitions before pruning comments and adding margins
 * obsolete: stop doing membership test on list
 * parse_index2: fix crash on bad argument type (Bts:issue4110)
 * phase: better error message when --force is needed
 * rebase: fix rebase aborts when 'tip-1' is public (Bts:issue4082)
 * rebase: fix working copy location after a --collapse (Bts:issue4080)
 * share: fix unshare calling wrong repo.__init__() method
 * shelve: fix bad argument interaction with largefiles (Bts:issue4111)
 * shelve: unshelve using an unfiltered repository
 * strip: fix last unprotected mq reference (Bts:issue4097)
 * strip: hold wlock for entire duration
 * subrepo: sanitize non-hg subrepos
 * templater: fix escaping in nested string literals (Bts:issue4102)
 * templater: makes branches work correctly with stringify (Bts:issue4108)
 * templater: only recursively evaluate string literals as templates (Bts:issue4103)
 * unshelve: add tests for unknown files
 * unshelve: don't commit unknown files during unshelve (Bts:issue4113)
 * util: url keeps backslash in paths
 * util: warn when adding paths ending with \

== Mercurial 2.8 (2013-11-01) ==

This is a regularly scheduled feature release.

=== Core features ===

 * hgweb: add revset syntax support to search
 * hgweb: always run search when a query is entered (BC)
 * hgweb (paper theme): add infinite scrolling to graph
 * hgweb: show full date in rfc822 format in tooltips at shortlog page
 * proxy: allow wildcards in the no proxy list (Bts:issue1821)
 * pull: for pull --update with failed update, print hint if any
 * rebase: preserve working directory parent (BC)
 * sslutil: add a config knob to support TLS (default) or SSLv23 (BC) (Bts:issue4038)
 * templatefilters: add short format for age formatting
 * templater: support using templates with non-standard names from map file
 * update: add error message for dirty non-linear update with no rev
 * addremove: don't do full walks
 * log: make file log slow path usable on huge repos
 * subrepo: let the user choose to merge, keep local or keep remote subrepo revisions

=== Extension features ===

 * convert-internals: introduce hg.revs to replace hg.startrev and --rev with a revset
 * convert-internals: update source shamap when using filemap, just as when not using filemap
 * factotum: clean up keychain for multiple hg repository authentication
 * histedit: abort if there are multiple roots in "--outgoing" revisions
 * mq: extract strip function as its standalone extension (Bts:issue3824)
 * mq: look for modified subrepos when checking for local changes
 * rebase: remove bailifchanged check from pullrebase (BC)
 * shelve: add a shelve extension to save/restore working changes

=== Fixes ===

 * pager: honour internal aliases
 * patch: ensure valid git diffs if source/destination file is missing (Bts:issue4046)
 * patch: Fix nullid for binary git diffs (Bts:issue4054)
 * progress: stop getting stuck in a nested topic during a long inner step
 * rebase: handle bookmarks matching revset function names (Bts:issue3950)
 * rebase: preserve active bookmark when not at head (Bts:issue3813)
 * rebase: preserve metadata from grafts of changes (Bts:issue4001)
 * rebase: fix selection of base used when rebasing merge (Bts:issue4041)
 * ui: send password prompts to stderr again (Bts:issue4056)

== Mercurial 2.7.2 (2013-10-01) ==

Regularly scheduled bugfix release. This fixes significant regressions from 2.7 in push/pull performance and SSL negotiation.

 * bundle: fix performance regression when bundling file changes (Bts:issue4031)
 * generaldelta: initialize basecache properly
 * help: use full name of extensions to look up them for keyword search
 * histedit: abort if there are multiple roots in "--outgoing" revisions
 * histedit: add more detailed help about "--outgoing"
 * histedit: suggest "histedit --abort" for inconsistent histedit state
 * httpclient: apply upstream revision da7579b034a4 to fix SSL problems (Bts:issue4038)
 * rebase: catch RepoLookupError at restoring rebase state for abort/continue
 * rebase: catch RepoLookupError at restoring rebase state for summary
 * repoview: have unfilteredpropertycache using the underlying cache
 * repoview: make propertycache.setcache compatible with repoview
 * revset: fix wrong keyword() behaviour for strings with spaces
 * sslutil: backed out changeset 074bd02352c0 (Bts:issue4038)
 * strip: set current bookmark to None if stripped


== Mercurial 2.7.1 (2013-09-03) ==

Regularly scheduled bugfix release.

 * rebase: handle bookmarks matching revset function names (Bts:issue3950)
 * tags: write tag overwriting history also into tag cache file (Bts:issue3911)


== Mercurial 2.7 (2013-08-01) ==

Regularly scheduled feature release. This release contains an important fix for a merge ancestor calculation regression in the 2.6 series.

=== Core features ===

 * bookmarks: allow bookmark command to take multiple arguments
 * commands: add checks for unfinished operations (Bts:issue3955)
 * commit: enable --secret option
 * hgweb: run search instead of showing wrong error for ambigious identifier
 * import: cut commit messages at --- unconditionally (Bts:issue2148)
 * log: add a log style that is default+phase (Bts:issue3436)
 * paper: add line wrapping switch to file source view
 * paper: code selection without line numbers in file source view
 * paper: highlight line which is linked to in source view
 * revert: make backup when unforgetting a file (Bts:issue3423)
 * rollback: mark as deprecated
 * sslutil: force SSLv3 on Python 2.6 and later (Bts:issue3905)
 * summary: augment output with info from extensions
 * templater: add strip function with chars as an extra argument
 * log: show style list when unknown style specified
 * tip: deprecate the tip command
 * update: add tracking of interrupted updates (Bts:issue3113)

=== Extension features ===

 * churn: split email aliases from the right
 * histedit: refuse to edit history that contains merges (Bts:issue3962)
 * convert: improve error handling when parsing splicemap (Bts:issue2084)
 * convert: support paths with spaces in splicemap (Bts:issue3844)

=== Fixes ===

 * ancestor: Fix a reference counting bug in the C version (Bts:issue3984)
 * bookmarks: update only proper bookmarks on push -r/-B (issue 3973)
 * bookmarks: pull --update updates to active bookmark if it moved (Bts:issue4007)
 * changegroup: fix fastpath during commit
 * checklink: work around sshfs brain-damage (Bts:issue3636)
 * convert: catch empty origpaths in svn gettags (Bts:issue3941)
 * convert: fix bad conversion of copies when hg.startrev is specified
 * convert: handle changeset sorting errors without traceback (Bts:issue3961)
 * hgweb: fix incorrect way to count revisions in log (Bts:issue3977)
 * histedit: don't clobber working copy on --abort if not on histedit cset
 * largefiles: overridematch() should replace the file path instead of extending (Bts:issue3934)
 * progress: respect HGPLAIN
 * rebase: allow aborting when descendants detected
 * rebase: continue abort without strip for immutable csets (Bts:issue3997)
 * rebase: don't clobber wd on --abort when we've updated away (Bts:issue4009)
 * revlog: handle hidden revs in _partialmatch (Bts:issue3979)

== Mercurial 2.6.3 (2013-07-01) ==
 * Several incorrect mailing list addresses have been corrected.
 * Various error cases have been corrected during push and pull.
 * Minor issues that happened when Mercurial spawned worker processes have been fixed.

== Mercurial 4.1 (2017-2-1) ==
An [[Release4.1|overview of new features]] available. This is a regularly-scheduled quarterly feature release.

=== commands ===
 * commands: config option to control bundle compression level
 * crecord: add an experimental option for space key to move cursor down
 * crecord: rewrite status line text (BC)
 * diff: add experimental support for more git-diff extended diff features
 * graft: support grafting changes to new file in renamed directory (Bts:issue5436)
 * help: show help for disabled extensions (Bts:issue5228)
 * help: update help for 'hg update' which was misleading (Bts:issue5427)
 * merge: fix crash on criss cross merge with dir move and delete (Bts:issue5020)
 * summary: add evolution "troubles" information to summary output
 * summary: use the same labels as log command in "parent: " line
 * templates: display evolution "troubles" in command line style

=== core ===
 * changelog: keep track of file end in appender (Bts:issue5444)
 * dispatch: stop supporting non-use of @command (API)
 * hook: do not redirect stdout/err/in to ui while running in-process hooks (BC)
 * httppeer: advertise and support application/mercurial-0.2
 * localrepo: experimental support for non-zlib revlog compression
 * manifest: add bundlemanifestlog support
 * manifest: add unionmanifestlog support
 * manifest: make revlog verification optional
 * patch: add experimental config knob for displaying the index header
 * patch: add similarity config knob in experimental section
 * patch: add label for coloring the index extended header
 * patch: add label for coloring the similarity extended header
 * profiling: make statprof the default profiler (BC)
 * profiling: use vendored statprof and upstream enhancements (BC)
 * revlog: REVIDX_EXTSTORED flag
 * revlog: add clone method
 * revlog: ensure that flags do not overflow 2 bytes
 * revlog: flag processor
 * revlog: inline start() and end() for perf reasons
 * revlog: make compressed size comparisons consistent
 * revlog: merge hash checking subfunctions
 * revlog: move decompress() from module to revlog class (API)
 * revlog: optimize _chunkraw when startrev==endrev
 * revlog: pass revlog flags to addrevision
 * revlog: reorder index accessors to match data structure order
 * revlog: use compression engine API for compression
 * revlog: use compression engine APIs for decompression
 * revset: add regular expression support to 'desc'
 * revset: make children() not look at p2 if null (Bts:issue5439)
 * run-tests: forward Python USER_BASE from site (Bts:issue5425)
 * server: move cmdutil.service() to new module (API)
 * templatekw: force noprefix=False to insure diffstat consistency (Bts:issue4755)
 * ui: check EOF of getpass() response read from command-server channel
 * ui: do not translate empty configsource() to 'none' (API)
 * ui: factor out ui.load() to create a ui without loading configs (API)
 * util: compression APIs to support revlog compression and decompression
 * util: declare wire protocol support of compression engines
 * wireproto: advertise supported media types and compression formats
 * wireproto: only advertise HTTP-specific capabilities to HTTP peers (BC)
 * wireproto: perform chunking and compression at protocol layer (API)

=== extensions ===
 * convert: add config option to control storing original revision
 * convert: add config option to copy extra keys from Git commits
 * convert: config option for git rename limit
 * convert: config option to control Git committer actions
 * rebase: calculate ancestors for --base separately (Bts:issue5420)
 * rebase: check for conflicts before continuing
 * rebase: fail-fast the pull if working dir is not clean (BC)
 * shelve: allow multiple shelves with --patch and --stat
 * shelve: choose a legal shelve name when no name is passed (Bts:issue5112)
 * shelve: make --keep option survive user intervention (Bts:issue5431)
 * shelve: make unshelve not crash when there are missing files (Bts:issue4176)

=== hgweb ===
 * hgweb: link to raw-file on annotation page (BC)
 * hgweb: make log streams compatible with command server
 * hgweb: restore ascending iteration on revs in filelog web command
 * hgweb: support Content Security Policy

=== chg ===
 * chg: send type information via S channel (BC)
 * chg: support long socket path
 * chgserver: make S channel support pager request
 * chgserver: override runcommand

=== Behavior Changes ===
 * chg: send type information via S channel (BC)
 * crecord: rewrite status line text (BC)
 * hgweb: link to raw-file on annotation page (BC)
 * hook: do not redirect stdout/err/in to ui while running in-process hooks (BC)
 * profiling: make statprof the default profiler (BC)
 * profiling: use vendored statprof and upstream enhancements (BC)
 * rebase: fail-fast the pull if working dir is not clean (BC)
 * wireproto: only advertise HTTP-specific capabilities to HTTP peers (BC)

=== Internal API Changes ===
 * bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
 * bookmarks: rename 'compare()' to 'comparebookmarks()' (API)
 * revlog: move decompress() from module to revlog class (API)
 * server: move cmdutil.service() to new module (API)
 * ui: do not translate empty configsource() to 'none' (API)
 * ui: factor out ui.load() to create a ui without loading configs (API)
 * util: remove compressors dict (API)
 * util: remove decompressors dict (API)
 * wireproto: perform chunking and compression at protocol layer (API)
 * dispatch: stop supporting non-use of @command (API)

== Mercurial 4.0.2 (2017-01-04) ==
Line 507: Line 881:
 * commit: amending with --close-branch (Bts:issue3445)
 * doc: make it easier to read how to enable extensions
 * doc: reword "config file" to "configuration file"
 * docs: change description to synopsis in hgrc.5
 * histedit: raise ImportError when demandloading is enabled
 * pathencode: fix hashmangle short dir limit (Bts:issue3958)
 * update: remove .hg/graftstate on clean (Bts:issue3970)

== Mercurial 2.6.2 (2013-06-01) ==
 * demandimport: do not raise ImportError for unknown item in fromlist
 * posix: make poll() restart on interruption by signal (Bts:issue5452)
 * hgweb: add missing slash to file log url in rss style

== Mercurial 4.0.1 (2016-12-1) ==
Line 519: Line 888:
 * amend: complain more comprehensibly about subrepos
 * blackbox: fix blackbox causing exceptions in tests
 * blackbox: fix recording exit codes (Bts:issue3938)
 * dirstate: don't overnormalize for ui.slash
 * graft: refuse to commit an interrupted graft (Bts:issue3667)
 * help: fix role/option confusion in RST
 * help: stop documentation markup appearing in generated help

== Mercurial 2.6.1 (2013-05-14) ==

This is an unscheduled bugfix release to address some minor regressions in the 2.6 release.

 * convert: fix bug of wrong CVS path parsing without port number (Bts:issue3678)
 * help/config: note 64-bit Windows registry key used with 32-bit Python
 * hfs+: rewrite percent-escaper (Bts:issue3918)
 * hgignore: fix regression with hgignore directory matches (Bts:issue3921)
 * highlight: fix page layout with empty first and last lines
 * largefiles: check existence of the file with case awareness of the filesystem
 * largefiles: check unknown files with case awareness of the filesystem
 * pathencode: grow buffers to increase safety margin
 * revert: ensure that copies and renames are honored (Bts:issue3920)
 * subrepo: open files in 'rb' mode to read exact data in (Bts:issue3926)
 * windows: check target type before actual unlinking to follow POSIX semantics

== Mercurial 2.6 (2013-05-01) ==


/!\ This release has known issues with some ignore rules (Bts:issue3921) and subrepos on Windows (Bts:issue3926)

This is a regularly scheduled feature release.

=== Core features ===

 * amend: support amending merge changesets (Bts:issue3778)
 * archive: raise error.Abort if the file pattern matches no files
 * bash_completion: allow remove to complete normal files
 * bookmarks: allow (re-)activating a bookmark on the current changeset
 * bookmarks: don't allow integers as bookmark/branch/tag names
 * bookmarks: moving the active bookmark deactivates it
 * bookmarks: resolve divergent bookmarks when moving active bookmark forward
 * bookmarks: resolve divergent bookmark when moving across a branch
 * commit: show active bookmark in commit editor helper text
 * config: discard "%unset" values defined in the other files read in previously
 * dates: support 'today' and 'yesterday' in parsedate (Bts:issue3764)
 * date: understand "now" as a shortcut for the current time
 * dispatch: print 'abort:' when a pre-command hook fails (BC)
 * dispatch: return status is 1 and a nice error message is printed when a user intervention is required (BC)
 * export: clobber files with -o (BC) (Bts:issue3652)
 * export: export working directory parent by default
 * export: show 'Date' header in a format that also is readable for humans
 * filesets: add eol predicate
 * hgweb: generate documentation as HTML (previously as text)
 * hgweb: teach archive how to download a specific directory or file
 * merge: apply non-interactive working dir updates in parallel
 * mergetools: avoid losing the merged version with meld
 * mergetools: vimdiff issues a warning explaining how to abort
 * sslutil: abort if peer certificate is not verified for secure use
 * summary: make "incoming" information sensitive to branch in URL (Bts:issue3830)
 * summary: make "outgoing" information sensitive to branch in URL (Bts:issue3829)
 * summary: show active bookmark even if not at current changeset
 * templatekw: add default styles for hybrid types (Bts:issue3887)
 * templater: add get() function to access dict element (e.g. extra)

 * addremove: improve performance
 * ancestor: a new algorithm that is faster for nodes near tip
 * dirstate: performance improvements
 * grep: use re2 if possible
 * parsers: a C implementation of the new ancestors algorithm
 * scmutil: rewrite dirs in C, use if available
 * tags: update tag type only if tag node is updated (Bts:issue3911)

=== Extension features ===

 * blackbox: new extension
 * hgk: add support for phases
 * hgk: don't use fixed format for dates
 * hgk: update backgroud colour when Ttk is available
 * histedit: allow "-" as a command file
 * histedit: handle multiple spaces between action and hash (Bts:issue3893)
 * histedit: make "hg histedit" sensitive to branch in URL
 * histedit: properly handle --continue on empty fold
 * histedit: support editing of the first commit (Bts:issue3767)
 * interhg: feature integrated in core. Extension removed.
 * largefiles: don't cache largefiles for pulled heads by default
 * largefiles: improve reuse of HTTP connections
 * largefiles: introduce lfpull command for pulling missing largefiles
 * largefiles: introduce pulled() revset expression for use in --lfrev
 * largefiles: introduce pull --lfrev option
 * largefiles: quiet (and document) undefined name errors (Bts:issue3886)
 * largefiles: stat all largefiles in one batch before downloading
 * largefiles: use repo.wwrite for writing standins (Bts:issue3909)
 * mq: comply with filtering when injecting fake tags (Bts:issue3812)
 * mq: do not inherit settings form base repo in mqrepo (Fixes Bts:issue2358)
 * rebase: check no-op before checking phase (Bts:issue3891)
 * rebase: fix --collapse when a file was added then removed
 * smtp: use 465 as default port for SMTPS
 * smtp: verify the certificate of the SMTP server for STARTTLS/SMTPS
 * subrepo: clone of git sub-repository creates incorrect git branch (Bts:issue3870)
 * subrepo: do not push mercurial subrepos whose store is clean
 * subrepo: fix exception on revert when "all" option is omitted

=== Fixes ===

 * annotate: increase refcount of each revision correctly (Bts:issue3841)
 * applyupdates: assign variable before we try to use it (Bts:issue3855)
 * bookmarks: allow moving a bookmark forward to a descendant
 * bookmarks: fix bug that activated a bookmark even with -r passed
 * case collision: Avoid unexpectd case folding issue during merge that should succeed (Bts: issue3452)
 * commit: allow closing "non-head" changesets
 * convert/git: catch errors from modern git-ls-remote (Bts:issue3428)
 * destroyed: invalidate phraserevs cache in all case (Bts:issue3858)
 * diff: fix binary file removals in git mode
 * http: avoid large text dumps when remote url is not a repo
 * import: don't rollback and unrelated transaction on failed import --exact (Bts:issue3616)
 * log: fix behavior with empty repositories (Bts:issue3497)
 * outgoing: fix possible filtering crash in outgoing (Bts:issue3814)
 * pager: catch ctrl-c on exit (Bts:issue3834)
 * record: abort on malformed patches instead of crashing
 * revset: change ancestor to accept 0 or more arguments (Bts:issue3750)
 * revset: don't abort when regex to tag() matches nothing (Bts:issue3850)
 * scheme: don't crash on invalid URLs
 * setup: make error message for missing Python headers more helpful
 * sshpeer: store subprocess so it cleans up correctly
 * win32: use explicit path to "python.exe" only if it exists


== Mercurial 2.5.4 (2013-04-04) ==

This fixes an urgent regression in merging with subrepos introduced in 2.5.

 * applyupdates: assign variable before we try to use it (Bts:issue3855)
 * setup.py: properly discard trust warning

== Mercurial 2.5.3 (2013-04-01) ==

 * hgweb: show correct error message for i18n environment
 * localrepo: always write the filtered phasecache when nodes are destroyed (Bts:issue3827)
 * rebase: restore active bookmark after rebase --continue
 * setup.py: add metadata to register package to PyPI
 * setup.py: ignore warnings from obsolete
 * zsh_completion: fix trailing carriage return spoiling tag completion

== Mercurial 2.5.2 (2013-03-01) ==

 * bundle: treat branches created newly on the local correctly (Bts:issue3828)
 * largefiles: avoid rechecking hashes when avoidable
 * largefiles: don't let update leave wrong largefiles in wd if fetch fails
 * largefiles: fix off-by-one error on pull --all-largefiles
 * largefiles: fix download of largefiles from an empty list of changesets
 * largefiles: missing largefiles should not be committed as removed
 * mergetools: vimdiff issue a warning explaining how to abort
 * outgoing: fix possible filtering crash in outgoing (Bts:issue3814)
 * rebase: fix potential infinite loop in complex rename situation (Bts:issue3843)

== Mercurial 2.5.1 (2013-02-08) ==

This is a non-scheduled bugfix release.

 * hgk: support the old way of getting the current Ttk theme (Bts:issue3808)
 * hgweb.cgi: fix internal WSGI emulation (Bts:issue3804)
 * hgweb: make 'summary' work with hidden changesets (Bts:issue3810)
 * incoming: fix incoming when a local head is remotely filtered (Bts:issue3805)
 * largefiles: don't crash when trying to find default dest for url without path
 * rebase: derive node from target rev (Bts:issue3802)

== Mercurial 2.5 (2013-02-01) ==

This is a regularly-scheduled feature release.

=== Core features ===

 * branchmap: improved performances
 * bundle: add revset expression to show bundle contents (Bts:issue3487)
 * dirstate: implement unix statfiles in C
 * hgweb: add (Atom) subscribe links to the repository index
 * hgweb: add "URL breadcrumbs"
 * hgweb: add branches RSS and Atom feeds
 * hgweb: secret changeset are excluded from html view (Bts:3614 )
 * serve: use chunked encoding in hgweb responses
 * pathencode: implement both basic and hashed encoding in C
 * subrepo: append subrepo path to subrepo error messages
 * validate: check for spurious incoming filelog entries
 * hgweb: allow hgweb's archive to recurse into subrepos

=== Changeset Evolution ===

Major progress toward ChangesetEvolution were done.

 * hidden changesets are now properly ignored by all commands
 * a global --hidden flag is added to give access to hidden changesets
 * rewriting a changeset but not its descendants is now allowed; this leaves unstable changeset behind
 * we now detect *divergent* changesets. The third and last kind of obsolescence related troubles. `divergent()` revset is added
 * a `troubled()` revset have been added
 * branchmap for of *visible* and *served* changeset are now cached on disk. This is a major performance improvements
 * performance improvements of most evolution related algorithm

=== Extension features ===
 * color: add template label function
 * convert: add config option to use the local time zone
 * convert: add support for converting git submodule (Bts:issue3528)
 * hgk: use Ttk instead of plain Tk
 * inotify: don't fall over just because of a dangling symlink
 * largefiles: fix revert removing a largefile from a merge
 * largefiles: fix update from a merge with removed files
 * largefiles: make log match largefiles in the non-standin location too
 * largefiles: make update with backup files in .hglf slightly less broken
 * largefiles: rename 'admin' to more descriptive 'lfstoredir
 * rebase: performance improvements
 * rebase: rebase set with multiple roots are now handled by the --rev option
 * record: use patch.diffopts to account for user diffopts
 * share: always set default path to work with subrepos (Bts:issue3518)
 * zsh_completion: add completion of branch names

=== Fixes ===
 * commands: 'hg bookmark NAME' should work even with ui.strict=True
 * copies: do not track backward copies, only renames (Bts:issue3739)
 * destroyed: keep the filecache in sync with `__dict__` (Bts:issue3335, Bts:issue3693, Bts:issue3743)
 * grep: don't search past the end of the searched string
 * hgweb: properly returns 404 for unknown revision (instead of 500)
 * histedit: proper phase conservation (Bts:issue3724)
 * histedit: prevents obsolescence cycle (Bts:issue3681)
 * hook: disable demandimport before importing hooks
 * mq: don't fail when removing a patch without patch file from series file
 * mq: fix qpop of working directory parent patch when not at qtip
 * zeroconf: use port from server instead of picking port from config (Bts:issue3746)
 * update: update to current bookmark if it moved out from under us (issue3682)
 * bookmarks: show active bookmark even if not at working dir
 * largefiles: let wirestore._stat return stats as expected by remotestore verify
 * largefiles: adapt verify to batched remote statlfile (issue3780)
 * largefiles: don't allow corruption to propagate after detection
 * largefiles: don't verify largefile hashes on servers when processing statlfile
 * largefiles: allow use of urls with #revision
 * largefiles: fix commit when using relative paths from subdirectory
 * largefiles: fix cat when using relative paths from subdirectory
 * histedit: prevent parent guessed via --outgoing from being a revset (issue3770)
 * rebase: delete divergent bookmarks on destination (issue3685)
 * hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)
 * subrepo: allow skipping courtesy phase sync (issue3781)
 * merge: .hgsubstate is special as merge destination, not as merge source
 * merge: improved handling of symlinks

== Mercurial 2.4.2 (2013-01-01) ==

This is a regularly-scheduled bugfix release.

 * amend: invalidate dirstate in case of failure (Bts:issue3670)
 * amend: prevent loss of bookmark on failed amend
 * bookmarks: fix head selection for merge with two bookmarked heads
 * bundlerepo: don't return the peer without bundlerepo from getremotechanges
 * dirstate: don't rename branch file if writing it failed
 * dirstate: remove obsolete comment from setbranch
 * hgweb: avoid generator exhaustion with branches
 * hgweb: fix iterator reuse in atom feed generation
 * hgwebdir: honor web.templates and web.static for static files (Bts:issue3734)
 * largefiles revert: update lfdirstate with result from first cleanliness check
 * largefiles status: update lfdirstate with result from cleanliness check
 * largefiles: commit directories that only contain largefiles (Bts:issue3548)
 * largefiles: don't walk through all ignored files
 * paper: sanity-check page feed links
 * scmutil: don't try to match modes on filesystems without modes (Bts:issue3740)
 * zeroconf: use port from server instead of picking port from config (Bts:issue3746)

== Mercurial 2.4.1 (2012-12-03) ==

This is a regularly-schedule bugfix release.

 * amend: force editor only if old message is reused (Bts:issue3698)
 * grep: don't search past the end of the searched string
 * hooks: be even more forgiven of non-fd descriptors (Bts:issue3711)
 * hooks: delay I/O redirection until we actually run a hook (Bts:issue3711)
 * phases: fix missing "error" module import (Bts:issue3707)
 * rebase: fix pull --rev options clashing with --rebase (Bts:issue3619)
 * subrepo: add argument to "diff()" to pass "ui" of caller side (Bts:issue3712) (API)
 * update: allow update to existing branches with invalid names (Bts:issue3710)
 * util: make chunkbuffer non-quadratic on Windows


== Mercurial 2.4 (2012-11-01) ==

This is a regularly-scheduled feature release.

=== Core features ===

 * amend: support for ChangesetEvolution if enabled
 * bookmarks: deactivate current bookmark if no name is given
 * bookmarks: teach the -r option to use revsets
 * bookmarks: disallow bookmarks named 'tip', '.', or 'null'
 * clone: substantial speedup to clone on repo with a lots of heads (Bts:issue3378)
 * clone: activate bookmark specified with --updaterev
 * clone: update to @ bookmark if it exists
 * log: substantial speedup for untracked files (Bts:issue1340)
 * revsets: add branchpoint() function
 * resolve: commit the changes after each item resolve (Bts:issue3638)
 * subrepo, hghave: use "svn --version --quiet" to determine version number
 * subrepo: setting LC_MESSAGES only works if LC_ALL is empty or unset
 * templatefilters: add parameterized date method
 * templatefilters: add parameterized fill function
 * templatefilters: avoid traceback caused by bogus date input (Bts:issue3344)
 * templatekw: add p1rev, p1node, p2rev, p2node keywords
 * templatekw: add parent1, parent1node, parent2, parent2node keywords
 * templater: abort when a template filter raises an exception (Bts:issue2987)
 * templater: add if/ifeq conditionals
 * templater: add sub() function
 * templating: make new-style templating features work with command line lists
 * bookmarks: take ChangesetEvolution into account when updating (Bts:issue3561)
 * speedup various operation related to ChangesetEvolution
 * add detection of changeset ''bumped'' by ChangesetEvolution

=== Extension features ===

 * color: add additional changeset.phase label to log.changeset and log.parent
 * color: enabled color support for export command (Bts:issue1507)
 * color: support for all grep fields
 * contrib: add a commit synthesizer for reproducing scaling problems
 * histedit: refuse to edit public changeset
 * histedit: replaces patching logic by merges
 * histedit: support for ChangesetEvolution if enabled
 * largefiles: always create the cache and standin directories when cloning
 * largefiles: distinguish "no remote repo" from "no files to upload" (Bts:issue3651)
 * largefiles: fix a traceback in lfconvert if a largefile is missing (Bts:issue3519)
 * mq: improve qqueue message with patches applied (Bts:issue3036)
 * mq: update bookmarks during qrefresh
 * notify: support revset selection for subscriptions
 * rebase: support for ChangesetEvolution if enabled
 * record: checks for valid username before starting recording process (Bts:issue3456)
 * record: fix display of non-ASCII names in chunk selection

=== Fixes ===

 * amend: fix incompatibity between logfile and message option (Bts:issue3675)
 * amend: wrap all commit operations in a single transaction
 * bookmarks: abort when incompatible options are used (Bts:issue3663)
 * bookmarks: avoid redundant creation/assignment of "validdests" in "validdest()"
 * bookmarks: check bookmark format during rename (Bts:issue3662)
 * bookmarks: when @ bookmark diverges, don't double the @ sign (BC)
 * bookmark: prevent crashing when a successor is unknown locally (Bts:issue3680)
 * clone: activate @ bookmark if updating to it
 * clone: don't %-escape the default destination (Bts:issue3145)
 * clone: make sure to use "@" as bookmark and "default" as branch (Bts:issue3677) (BC)
 * clone: print bookmark name when clone activates a bookmark
 * commands: don't infer repo for commands like update (Bts:issue2748)
 * convert: normalize paths in filemaps (Bts:issue3612)
 * dirstate: handle large dates and times with masking (Bts:issue2608)
 * dirstate: handle dangling junctions on windows (Bts:issue2579)
 * filemerge: use util.shellquote when calling merge (Bts:issue3581)
 * hgweb: make the escape filter remove null characters (Bts:issue2567)
 * http2: make it possible to connect w/o ssl on port 443
 * icasefs: make case-folding collision detection as deletion aware (Bts:issue3648)
 * largefiles: don't copy largefiles from working dir to the store while converting
 * largefiles: respect the rev when reading standins in copytostore() (Bts:issue3630)
 * largefiles: use 'default' instead of 'default-push' when pulling (Bts:issue3584)
 * mq: fix qrefresh case sensitivity (Bts:issue3271)
 * patchbomb: respect --in-reply-to for all mails if no intro message is sent
 * remove: don't return error on directories with tracked files
 * revset: accept @ in unquoted symbols (Bts:issue3686)
 * scmutil: add mustaudit delegation to filtervfs (Bts:issue3673)
 * subrepo: only do clean update when overwrite is set (Bts:issue3276)
 * subrepo: subrepo isolation, pass baseui when cloning a new subrepo (Bts:issue2904)
 * update: check for missing files with --check (Bts:issue3595) (BC)
 * url: use open and not url.open for local files (Bts:issue3624)
 * verify: fix all doubled-slash sites (Bts:issue3665)
 * wireproto: fix pushkey hook failure and output on remote http repo

== Mercurial 2.3.2 (2012-10-01) ==
 * amend: preserve phase of amended revision (Bts:issue3602)
 * archival: add "extended-timestamp" extra block for zip archives (Bts:issue3600)
 * hgweb: avoid bad $$ processing in graph (Bts:issue3601)
 * hgweb: fix incorrect graph padding calculation (Bts:issue3626)
 * largefiles: fix return codes for multiple commands
 * largefiles: don't convert dest=None to dest=hg.defaultdest() in clone command
 * largefiles: download missing subrepo revs when archiving
 * largefiles: enable islfilesrepo() prior to a commit (Bts:issue3541)
 * largefiles: handle commit -A properly, after a --large commit (Bts:issue3542)
 * largefiles: preserve exit code from outgoing command (Bts:issue3611)
 * largefiles: restore caching of largefiles with 'clone -U --all-largefiles'
 * largefiles: restore normal 'clone -u' and 'clone -U' functionality
 * lock: fixed race condition in trylock/testlock (Bts:issue3506)
 * mergetools.hgrc: set vimdiff to check=changed
 * strip: fix revset usage (Bts:issue3604)
 * subrepo: encode unicode path names (Bts:issue3610)

== Mercurial 2.3.1 (2012-09-01) ==

 * clone: don't fail with --update for non-local clones (Bts:issue3578)
 * commit: normalize filenames when checking explicit files (Bts:issue3576)
 * fileset: actually implement 'minusset'
 * fileset: do not traceback on invalid grep pattern
 * fileset: exclude deleted files from matchctx.existing()
 * fileset: fix generator vs list bug in fast path
 * fileset: matchctx.existing() must consider ignored files
 * fileset: matchctx.existing() must consider unknown files
 * largefiles: adjust localstore to handle batch statlfile requests (Bts:issue3583)
 * merge: handle case when heads are all bookmarks
 * obsolete: import modules within mercurial/ without "from mercurial"
 * revlog: don't try to partialmatch strings with length > 40
 * rollback: write dirstate branch with correct encoding
 * store: only one kind of OSError means "nonexistent entry"
 * store: sort the results of fncachestore.datafiles()
 * strip: fix revset usage (Bts:issue3604)
 * templater: handle a missing value correctly
 * verify: do not choke on valid changelog without manifest
 * wix: bump MSI based installers to use Python 2.7


== Mercurial 2.3 (2012-08-01) ==

This is a regularly-scheduled feature release with numerous improvements and
bugfixes.

=== Core features ===

 * help: add --keyword (-k) for searching help
 * hgweb: side-by-side comparison functionality
 * log: support --graph without graphlog extension
 * push: accept revset argument for --rev
 * merge: bookmarks will no longer automatically merge with unnamed heads or other bookmarks. Instead it picks heads with diverging bookmarks.
 * introduce ChangesetsObsolescence concept ''(experimental)''

 * bookmarks: allow existing remote bookmarks to become heads when pushing
 * bookmarks: pull new bookmarks from remote by default '''(backward incompatible change)'''
 * bookmarks: delete divergent bookmarks on merge
 * bisect: set HG_NODE when runing a command
 * graft: allow -r to specify revisions
 * graft: implement --log (Bts:issue3438)
 * graft: remark on empty graft
 * hooks: print out more information when loading a python hook fails
 * identity: show trailing '+' for dirty subrepos (Bts:issue2839)
 * incoming/outgoing: handle --graph in core
 * merge: warn about file deleted in one branch and renamed in other (Bts:issue3074)
 * Mercurial can now identify third-party extensions as sources of tracebacks
 * outgoing: accept revset argument for --rev
 * performance improvement on branchy repo: incrementaly update branchcache
 * performance improvement on huge file tree: add a C function to pack the dirstate
 * performance improvement for huge .hgignore: process regex with re2 bindings if available
 * revset: add "diff" field to "matching" predicate
 * revset: add "converted" predicate to find converted changesets
 * revset: add "origin" and "destination" predicates, to get graft, transplant or rebase origins or destinations.
 * revset: add "extra" predicate to match changesets extra fields (Bts:issue2767)
 * revset: add pattern matching to "bookmarks/branch/extra/tag/user" predicated

=== Extension features ===

 * acl: use of "!" prefix in user or group names
 * children: mark extension as deprecated
 * convert/svn: handle non-local svn destination paths (Bts:issue3142)
 * convert: accept Subversion 'file:///c%3A/svnrepo' syntax on Windows
 * fetch: mark extension as deprecated
 * graphlog: feature is now into core
 * histedit: new extension for interactive history editing
 * hg-ssh: add read-only flag
 * largefiles: add --all-largefiles flag to pull and clone (Bts:issue3188)
 * largefiles: improve performance by batching statlfile requests when pushing a largefiles repo (Bts:issue3386)
 * largefiles: no longer attempt to clone all largefiles to non-local destinations
 * largefiles: optimize performance when updating (Bts:issue3440)
 * largefiles: support revsets for cat, outgoing --large and revert
 * mq: introduce qpush/qpop/qgoto --keep-changes
 * strip: introduce -B option to remove a bookmark
 * rebase: allow collapsing branches in place (Bts:issue3111)
 * rebase: make --dest understand revsets
 * rebase: drop the infamous --detach option: rebase now behave with --source and --rev as expectable. It may no longer add second parent to rebased changeset '''(backward incompatible change)'''
 * transplant: handle non-empty patches doing nothing (Bts:issue2806)
 * transplant: manually transplant pullable changesets with --log

=== Fixes ===

 * bisect: fix O(n**2) behaviour (Bts:issue3382)
 * bookmarks: fix push of moved bookmark when creating new branch heads
 * case insensitive file system can no longer be confused by `-R` on (Bts:issue2167)
 * copies: one fix related to directory rename detection (Bts:issue3511)
 * convert: check for failed svn import in debugsvnlog and abort cleanly
 * convert: ignore svn:executable for subversion targets without exec bit support
 * convert: keep branch switching merges with ancestors (Bts:issue3340)
 * convert: make filemap renames consistently override revision renames
 * debugrevlog: fix a bug with empty repository (Bts:issue3537)
 * graphlog: don't truncate template value at last \n
 * httprepo: ensure Content-Type header exists when pushing data
 * largefiles: fix a traceback when addremove follows a remove (Bts:issue3507)
 * largefiles: fix a traceback when archiving a subrepo in a subrepo
 * largefiles: fix addremove when largefile is missing (Bts:issue3227)
 * largefiles: fix addremove with -R option
 * largefiles: fix exception hack for i18n (Bts:issue3197)
 * largefiles: fix path handling for cp/mv (Bts:issue3516)
 * largefiles: archive -S now store largefiles instead of standins
 * largefiles: fix hg addremove when already removed largefile exists (Bts:issue3364)
 * merge: do not warn about copy and rename in the same transaction (Bts:issue2113)
 * mq: add ".hgsubstate" to patch target list only if it is not listed up yet
 * mq: create patch file after commit to import diff of ".hgsubstate" at qrefresh
 * pager: work around bug in python 2.4's subprocess module (Bts:issue3533):
 * revlog: zlib.error are no longer sent to the user (Bts:issue3424)
 * tag: don't allow tagging the null revision (Bts:issue1915)


== Mercurial 2.2.3 (2012-07-01) ==

This is a regularly-scheduled bugfix release.

 * amend: disable hooks when creating intermediate commit (Bts:issue3501)
 * archive: make progress only show files that are actually archived
 * bookmarks: correctly update current bookmarks on rebase (Bts:issue2277)
 * bugzilla: stop bugs always being marked as fixed in xmlrpc (Bts:issue3484)
 * graft: don't drop the second parent on unsuccessful merge (Bts:issue3498)
 * hgweb: fixes linebreak location in gitweb filediff.tmpl view
 * rebase: improve error message on improper phases
 * record: fix display of non-ASCII names
 * statichttprepo: don't send Range header when requesting entire file
 * strip: update help to state that you can strip public changeset
 * subrepo/svn: make rev number retrieval compatible with svn 1.5 (Bts:issue2968)
 * subrepo: support Git being named "git.cmd" on Windows (Bts:issue3173)
 * subrepo: warn user if Git is not version 1.6.0 or higher
 * update: fix help regarding update to ancestor

== Mercurial 2.2.2 (2012-06-01) ==

This is a regularly-scheduled bugfix release.

 * addremove: document default similarity behavior (Bts:issue3429)
 * alias: inherit command optionalrepo flag (Bts:issue3298)
 * amend: preserve extra dict (Bts:issue3430)
 * bisect: save current state before running a command
 * bugzilla: fix transport initialization on python 2.4
 * build: fix hgrc manpage building with docutils 0.9
 * bundle: make bundles more portable (Bts:issue3441)
 * changelog: ensure that nodecache is valid (Bts:issue3428)
 * hg-ssh: exit with 255 instead of -1 on error
 * hgweb: fix filediff base calculation
 * largefiles: fix "hg status dir" missing regular files (Bts:issue3421)
 * largefiles: fix deletion of multiple missing largefiles (Bts:issue3329)
 * largefiles: follow normal codepath for addremove if non-largefiles repo (Bts:issue3249)
 * largefiles: in putlfile, ensure tempfile's directory exists prior to creation
 * largefiles: use wlock for lfconvert (Bts:issue3444)
 * localrepo: clear _filecache earlier to really force reloading (Bts:issue3462)
 * match: make 'match.files()' return list object always
 * mq: add --no-backup for qpush/qpop/qgoto
 * mq: backup local changes in qpop --force (Bts:issue3433)
 * mq: backup local changes in qpush --force
 * mq: qimport need wlock for --push - do that after releasing lock
 * osutil: handle deletion race with readdir/stat (Bts:issue3463)
 * pager: check if signal.SIGPIPE exists
 * pager: preserve Hg's exit code (and fix Windows support) (Bts:issue3225)
 * pager: remove quiet flag
 * paper, monoblue: link correctly to lines in annotate view
 * parsers: fix refcount bug on corrupt index
 * patch: fix segfault against unified diffs which start line is zero
 * patch: keep patching after missing copy source (Bts:issue3480)
 * posix: workaround lack of TIOCGWINSZ on Irix (Bts:issue3449)
 * revpair: handle odd ranges (Bts:issue3474)
 * revset: explicitely tag alias arguments for expansion
 * revset: fix infinite alias expansion detection
 * revset: fix traceback for bogus revisions in id(rev)
 * revset: make matching() preserve input revision order
 * scmutil: seen.union should be seen.update (Bts:issue3476)
 * subrepo: do not traceback on .hgsubstate parsing errors
 * subrepo: ignore blank lines in .hgsubstate (Bts:issue3424)
 * tag: run commit hook when lock is released (Bts:issue3344)
 * templater: handle !SyntaxError when parsing ui.logtemplate
 * util: fix bad variable use in bytecount introduced by f0f7f3fab315
 * win32: fix encoding handling for registry strings (Bts:issue3467)

== Mercurial 2.2.1 (2012-05-03) ==

This is an unscheduled bugfix release to fix a signficant memory leak in hgweb.

 * bookmarks: catch the proper exception for missing revisions
 * help: add reference to template help (Bts:issue3413)
 * help: added description for the web.collapse setting
 * largefiles: fix commit of both largefiles and non-largefiles (Bts:issue3354)
 * parsers: fix refcount leak, simplify init of index (Bts:issue3417)

== Mercurial 2.2 (2012-05-01) ==

This is a regularly-scheduled feature release. The most notable feature is a new safe '--amend' option for commit using our new [[Phases|phases]] infrastructure. There are also a number of signficant performance improvements for large repositories and improvements for case-folding filesystems. See UpgradeNotes for minor compatibility notes.

=== Core features ===
 * commit: add --amend option
 * fileset: add "subrepo" fileset symbol
 * graft: add --dry-run support (Bts:issue3362)
 * hgweb: add support for branch width and color settings
 * hgweb: add block numbers to diff regions and related links
 * hgweb: support multi-level repository indexes by enabling descend and collapse
 * merge: improve performance with lots of unknown files
 * parsers: incrementally parse the revlog index in C
 * plan9: add support for [[https://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs|plan9]]
 * push/pull: improve performance for partial transfers
 * push: decompress in larger chunks for better performance on the server
 * clone: add server config option to prefer uncompressed clone
 * revert: add support for reverting subrepos
 * revset: add "matching" keyword
 * store: speed up read and write of large fncache files
 * ui: optionally quiesce ssl verification warnings on python 2.5

=== Extension features ===

 * bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
 * bugzilla: allow change comment to mark bugs fixed
 * bugzilla: extract optional hours from commit message and update bug time
 * bugzilla: modify access interface to include new bug states
 * graphlog: add all log options to glog command
 * patchbomb: add --body flag to send patches as inline message body text
 * record: allow splitting of hunks by manually editing patches
 * transplant: permit merge changesets via --parent

=== Fixes ===
 * alias: fix shell alias documentation (Bts:issue3374)
 * archive: make it work with svn subrepos (Bts:issue3308)
 * branchmap: server should not advertise secret changeset in branchmap (Bts:issue3303)
 * clone: always close source repository (Bts:issue2491)
 * commit: abort on merge with missing files (BC)
 * config: discard UTF-8 BOM if found
 * convert/bzr: convert all branches (Bts:issue3229) (BC)
 * convert/bzr: expect unicode metadata, encode in UTF-8 (Bts:issue3232)
 * convert/bzr: handle empty bzr repositories (Bts:issue3233)
 * convert/bzr: ignore nested repos when listing branches (Bts:issue3254)
 * convert/svn: do not try converting empty head revisions (Bts:issue3347)
 * convert/svn: make svn sink work with svn 1.7
 * convert: support non-annotated tags in git backend
 * dirstate: preserve path components case on renames (Bts:issue3402)
 * export: catch exporting empty revsets (Bts:issue3353)
 * icasefs: make case-folding collision detection rename aware (Bts:issue3370)
 * inotify: catch !SignalInterrupt during shutdown (Bts:issue3351)
 * journal: use tryread helper to backup files (Bts:issue3375)
 * largefiles: fix cat for largefiles (Bts:issue3352)
 * largefiles: fix status -S reporting of subrepos (Bts:issue3231)
 * largefiles: hide .hglf/ prefix for largefiles in hgweb
 * largefiles: notice dirty large files in a subrepo
 * largefiles: only update changed largefiles when transplanting
 * largefiles: optimize update speed by only updating changed largefiles
 * localrepo: add setparents() to adjust dirstate copies (Bts:issue3407)
 * mdiff: fix diff header generation for files with spaces (Bts:issue3357)
 * merge: check for untracked files more precisely (Bts:issue3400)
 * merge: fix unknown file merge detection for case-folding systems
 * patch: be more tolerant with "Parent" header (Bts:issue3356)
 * patch: be more tolerant with EOLs in binary diffs (Bts:issue2870)
 * patch: fix patch hunk/metdata synchronization (Bts:issue3384)
 * phase: when phase cannot be reduced, hint at --force and return 1 (BC)
 * posix: disable cygwin's symlink emulation (BC)
 * posix: ignore execution bit in cygwin (Bts:issue3301)
 * pure/osutil: use Python's msvcrt module (Bts:issue3380)
 * rebase: preserve mq series order, guarded patches (Bts:issue2849)
 * rebase: skip resolved but emptied revisions
 * revset: fix O(n**2) behaviour of bisect() (Bts:issue3381)
 * revset: fix adds/modifies/removes and patterns (Bts:issue3403)
 * revset: fix alias substitution recursion (Bts:issue3240)
 * subrepo/svn: abort on commit with missing file (Bts:issue3029)
 * subrepo/svn: fix checked out rev number retrieval (Bts:issue2968)
 * subrepo: fix default implementation of forget() (Bts:issue3404)
 * subrepo: rewrite handling of subrepo state at commit (Bts:issue2403)
 * templates/filters: extracting the user portion of an email address (BC)
 * transplant: do not rollback on patching error (Bts:issue3379)
 * update: fix case-collision with a clean wd and no --clean
 * update: make --check abort with dirty subrepos
 * update: use normal update path with --check (Bts:issue2450)
 * wireprotocol: use visibleheads as reference while unbundling (Bts:issue 3303)
 * hgweb: cache fctx.parents() in annotate command (Bts:issue5414)
 * vfs, scmutil: ignore EPERM at os.utime, which avoids ambiguity (Bts:issue5418)

== Mercurial 4.0 (2016-11-1) ==
An [[Release4.0|overview of new features]] available. This is a regularly-scheduled quarterly feature release. Unlike other 4.0 software releases, this is simply 3.9 + .1, so it should be the usual pain-free upgrade.

=== commands ===
 * annotate: calculate line count correctly
 * branchmap: acquires lock before writting the rev branch cache
 * clone: set default path correctly when doing a clone+share (Bts:issue5378)
 * copy: distinguish "file exists" cases and add a hint (BC)
 * commit: return 1 for interactive commit with no changes (Bts:issue5397)
 * config: add template support
 * debugobsolete: add formatter support (Bts:issue5134)
 * files: change documentation to match its behaviour (Bts:issue5276)
 * grep: add formatter support
 * help: show content for explicitly disabled extension (Bts:issue5228)
 * import: abort instead of crashing when copy source does not exist (Bts:issue5375)
 * import: report directory-relative paths in error messages (Bts:issue5224)
 * log: copy the way of ancestor traversal to --follow matcher (Bts:issue5376)
 * log: preserve topo sort in graph even if additional filter options specified
 * merge: add conflict labels to merge command
 * merge: avoid superfluous filemerges when grafting through renames (Bts:issue5407)
 * strip: report both bundle files in case of exception (Bts:issue5368)
 * tag: clarify warning about making a tag on a branch head
 * version: add formatter support
 * flags: allow specifying --no-boolean-flag on the command line (BC)

=== core ===
 * changelog: disable delta chains
 * copies: make _checkcopies handle copy sequences spanning the TCA (Bts:issue4028)
 * formatter: add function to convert list to appropriate format (Bts:issue5217)
 * lock: show more detail for new-style locks in lock waiting message (Bts:issue4752)
 * revset: do not rewrite ':y' to '0:y' (Bts:issue5385)
 * revset: fix order of nested '_(|int|hex)list' expression (BC)
 * revset: fix order of nested 'or' expression (BC)
 * revset: fix order of nested 'range' expression (BC)
 * revset: make reverse() and sort() no-ops when ordering requirement allows (BC)
 * revset: support "follow(renamed.py, e22f4f3f06c3)" (Bts:issue5334)
 * templater: provide a termwidth keyword (Bts:issue5395)
 * templater: add inheritance support to style maps
 * templater: add relpath() to convert repo path to relative path (Bts:issue5394)
 * templater: make pad() evaluate boolean argument (BC)
 * wireproto: unescape argument names in batch command (BC)

=== extensions ===
 * journal: properly check for held lock (Bts:issue5349)
 * journal: use fm.formatdate() to pass date tuple in appropriate type (BC)
 * journal: use fm.formatlist() to pass hashes in appropriate type (BC)
 * journal: use fm.hexfunc() to get full hash in JSON/template output (BC)
 * largefiles: fix 'deleted' files sometimes persistently appearing with R status
 * largefiles: handle that a found standin file doesn't exist when removing it
 * largefiles: more safe handling of interruptions while updating modifications
 * largefiles: when setting/clearing x bit on largefiles, don't change other bits
 * mq: release lock after transaction in qrefresh
 * mq: take wlock when 'qqueue' is doing write operations
 * rebase: properly calculate total commits to rebase (Bts:issue5347)
 * rebase: rebase changesets in topo order (Bts:issue5370) (BC)

=== hgweb ===
 * hgweb: avoid line wrap between revision and annotate-info (Bts:issue5398)
 * hgweb: config option to control zlib compression level

Release Notes

Features and bugfixes in our latest releases. Please see the Download page for links to source and binaries.

Note that Mercurial follows a time-based release plan with major releases every three months and minor (bugfix) releases on the first of every month (see TimeBasedReleasePlan).

{i} Be sure to read the upgrade notes when upgrading.

(See the archive for older versions)

1. Mercurial 4.6 (2018-05-06)

Full release notes are available. This is a regularly-scheduled quarterly feature release.

1.1. New Features

1.1.1. pullbundles

Pullbundles allow the server to answer client requests using pre-built bundles. This is different from the existing clonebundle feature:

  • pullbundles can be used for both the initial clone and later pull operations
  • pullbundles can be used incrementally, i.e. to cover the changes up to the start of the current month as one bundle and the remaining changes as second bundle
  • the bundle is transferred inline as part of the existing connection without a secondary server

Pullbundles are only used for clients running Mercurial 4.6 as well.

1.1.2. push

If 'server.streamunbundle' option is enabled, the server will directly apply the changes send by the changes. This avoids potentially large temporary files on the server side. It can also prevent concurrent pushes.

1.1.3. notify extension

The 'maxdiffstat' option can be used to truncate long file lists similar to 'maxdiff' for the patch part of the email.

1.1.4. hgweb

hgweb now shows date and user for operations that resulted in obsolete commit(s). For unstable commits, it shows the exact reason why they are considered unstable.

Server: header is now configurable using web.server-header option.

1.1.5. templates

A new template keyword 'reporoot' which shows the root directory of the current repository. A new template function 'mailmap' which maps author fields based on values in a .mailmap file.

1.1.6. Other notable features

  • revset: parse error now shows a hint where the error occurred
  • templates: parse error now shows a hint where the error occured
  • forget: new '--dry-run' and '--interactive' flags
  • copyfile: preserve stat info (mtime, etc.) when doing copies/renames
  • bundle2 format is documented and can be found using 'hg help internals.bundle2'

1.2. Backwards Compatibility Changes

  • Support for connecting to Mercurial servers older than 0.9.1 has been removed.
  • Working-directory commands now respect "-X PATTERN" no matter if PATTERN matches explicitly-specified FILEs. For example, "hg add foo -X foo" no longer add the file "foo".
  • Support for the experimental manifestv2 format has been removed, as it was never completed and failed to meet expectations.
  • '{' in output filename passed to archive/cat/export is taken as a start of a template expression.
  • The HTTP wire protocol server no longer accepts the "cmd" argument to control which command to run via HTTP POST bodies. The "cmd" argument must be specified on the URL query string.
  • Hgweb no longer reads form data in POST requests from multipart/form-data and application/x-www-form-urlencoded requests. Arguments should be specified as URL path components or in the query string in the URL instead.
  • Query string shorts in hgweb like "?cs=@" have been removed. Use URLs of the form "/:cmd" instead.
  • The HTTP client no longer accepts text/plain and application/hg-changegroup Content-Type values as a valid Mercurial command response. These should only be encountered on pre 1.0 Mercurial servers.

1.3. Performance Improvements

  • 'hg manifest --all' is likely slower due to changing its implementation to respect storage interface boundaries. If you are impacted by this regression in a meaningful way, please make noise on the development mailing list and it can be dealt with.
  • 'hg diff' is much faster for larger repositories. 40% improvements have been reported. Other operations using diffs like hgweb also benefit.

1.4. Bug Fixes

  • grep: fixes erroneous output of grep in forward order (issue3885)

  • dirstate: drop explicit files that shouldn't match (BC) (issue4679)

  • procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)

  • bookmarks: test for exchanging long bookmark names (issue5165)

  • templater: drop symbols which should be overridden by new 'ctx' (issue5612)

  • clone: updates the help text for hg clone -{r,b} (issue5654)

  • bundle: updates the help text for hg bundle (issue5744)

  • histedit: make histedit's commands accept revsets (issue5746)

  • releasenotes: replace abort with warning while parsing (issue5775)

  • context: skip path conflicts by default when clearing unknown file (issue5776)

  • templatekw: switch most of showlist template keywords to new API (issue5779)

  • rebase: do not consider extincts for divergence detection (issue5782)

  • revert: use an exact matcher in interactive diff selection (issue5789)

  • subrepo: don't attempt to share remote sources (issue5793)

  • lfs: respect narrowmatcher when testing to add 'lfs' requirement (issue5794)

  • showconfig: allow multiple section.name selectors (issue5797)

  • annotate: do not poorly split lines at CR (issue5798)

  • convert: avoid closing ui.fout in subversion code (issue5807)

  • setdiscovery: back out changeset 5cfdf6137af8 (issue5809)

  • fsmonitor: layer on another hack in bser.c for os.stat() compat (issue5811)

  • notify: access the initial revision on an unfiltered repository (issue5821)

  • rebase: fix issue 5494 also with --collapse
  • date: fixed a bug in parsing months like 'Feb 2018', 'Apr 2018'
  • diffhelper: rename module to avoid conflicts with ancient C module (issue5846)

  • infinitepush: ensure fileindex bookmarks use '/' separators (issue5840)

  • import: fix crash on --exact check of empty commit (issue5702)

  • hgweb: reuse body file object when hgwebdir calls hgweb (issue5851)

  • debugcolor: fix crash by empty styles (issue5856)

  • hgweb: discard Content-Type header for 304 responses (issue5844)

  • hgweb: allow Content-Security-Policy header on 304 responses (issue5844)

  • paper: don't register click handlers with inline javascript (issue5812)

  • httppeer: detect redirect to URL without query string (issue5860)

  • filelog: don't crash on invalid copy metadata (issue5748)

1.5. New experimental features

Each release there are lot of new features added which are hidden under the EXPERIMENTAL tag as the behavior may change in future or the feature is not complete yet. The experimental features added in this cycle are:

1.5.1. narrow extension

Allows to create clones which fetch history data for only a subset of files. This experimental extension is now distributed with Mercurial.

1.5.2. remotenames extension

Shows remotebookmarks and remotebranches in the UI. This experimental extension is now distributed with Mercurial.

1.5.3. infinitepush extension

Allows to store some pushes in a remote blob store on the server and to serve commits from remote blob store. The revisions are stored on disk or in everstore, the metadata are stored in sql or on disk. This experimental extension is now distributed with Mercurial.

1.5.4. fix extension

Allows to rewrite file content in changesets or working copy. For example, automatically applying formatting fixes to modified lines of code. This experimental extension is now distributed with Mercurial.

1.5.5. lfs extension

An alternative to the largefiles extension, which uses the git-lfs protocol. This experimental extension is now distributed with Mercurial.

1.6. API Changes

  • Content from mercurial.hgweb.protocol has been moved to mercurial.wireprotoserver.
  • Content from mercurial.sshserver has been moved into mercurial.wireprotoserver.
  • sshserver no longers looks for wire protocol command handlers in methods named do_<command>. Use @wireproto.wireprotocommand to declare wire protocol command handler functions.

  • Log-related utility functions has been renamed as follows:
    • - cmdutil.loglimit -> logcmdutil.getlimit

      - cmdutil.diffordiffstat -> logcmdutil.diffordiffstat

      - cmdutil._changesetlabels -> logcmdutil.changesetlabels

      - cmdutil.changeset_printer -> logcmdutil.changesetprinter - cmdutil.jsonchangeset = logcmdutil.jsonchangeset

      - cmdutil.changeset_templater -> logcmdutil.changesettemplater

      - cmdutil.logtemplatespec -> logcmdutil.templatespec

      - cmdutil.makelogtemplater -> logcmdutil.maketemplater

      - cmdutil.show_changeset -> logcmdutil.changesetdisplayer

      - cmdutil.getlogrevs -> logcmdutil.getrevs

      - cmdutil.getloglinerangerevs -> logcmdutil.getlinerangerevs

      - cmdutil.displaygraph -> logcmdutil.displaygraph

      - cmdutil.graphlog -> logcmdutil.graphlog

      - cmdutil.checkunsupportedgraphflags -> logcmdutil.checkunsupportedgraphflags

      - cmdutil.graphrevs -> logcmdutil.graphrevs

      - cmdutil._makenofollowlogfilematcher -> logcmdutil._makenofollowfilematcher

  • The following deprecated methods have been removed from context, with replacements:
    • - unstable() -> orphan()

      - bumped() -> phasedivergent()

      - divergent() -> contentdivergent()

      - troubled() -> isunstable()

      - troubles() -> instabilities()

  • The following deprecated methods have been removed from obsolete, with replacements:
    • - _addprecursors() -> _addpredecessors()

      - obsstore.precursors -> obsstore.predecessors

      - allprecursors() -> obsutil.allprecursors()

      - allsuccessors() -> obsutil.allsuccessors()

      - marker() -> obsutil.marker

      - getmarkers() -> obsutil.getmarkers()

      - exclusivemarkers() -> obsutil.exclusivemarkers()

      - foreground() -> obsutil.foreground()

      - successorssets() -> obsutil.successorsset()

      - unstable() -> orphan()

      - bumped() -> phasedivergent()

      - divergent() -> contentdivergent()

  • The following deprecated methods have been removed from obsutil: marker.precnode() and allprecursors(). Use marker.prednode() and allpredecessors() instead.

  • beginparentchange() and endparentchange() have been replaced by the parentchange context manager.

  • The deprecated localrepo.walk() has been removed, and replaced by repo[node].walk().

  • The following deprecated methods have been removed from bookmarks: __setitem__(), __delitem__(), update(), and recordchange(). Use bookmarks.applychanges() instead.

  • The cmdutil._revertprefetch() hook point for prefetching stored files has been replaced by the command agnostic cmdutil._prefetchfiles(). The new function takes a list of files, instead of a list of lists of files.

  • sshpeer.sshpeer.__init__ now receives arguments describing an existing connection instead of creating a connection itself.

  • sshpeer.sshpeer renamed to sshpeer.sshv1peer.

  • wireproto.pushres and wireproto.pusherr now explicitly track stdio output.

  • redirect() and restore() have been removed from the wire protocol handler interface. Use mayberedirectstdio() instead.

  • The _client() method of the wire protocol handler interface has been renamed to client().

  • Wire protocol command handlers now return a wireprototypes.bytesresponse instead of a raw bytes instance. Protocol handlers will continue handling bytes instances. However, any extensions wrapping wire protocol commands will need to handle the new type.

  • SSH protocol handler now advertises its name internally as "ssh-v1" instead of "ssh."
  • File prefetching is now handled by registering a callback with scmutil.fileprefetchhooks.

  • HTTP protocol handlers now advertises its internal name as "http-v1" instead of "http".
  • context.basectx no longer implements __int__. Context instances will no longer cast to ints. Consumers should call ctx.rev() instead.

  • templatekw.showdict() and showlist() are deprecated in favor of new (context, mapping) API. Switch the keyword function to new API and use templatekw.compatdict() and compatlist() instead.

  • hgweb_mod.perms and wireproto.permissions have been removed. Wire protocol commands should declare their required permissions in the @wireprotocommand decorator.

  • The WSGI request object no longer exposes a form attribute containing parsed query string data. Use the qsparams attribute instead.

  • hgweb.hgweb_mod.permhooks no longer take a wsgirequest instance as an argument.

  • hgweb @webcommand functions must use the new response object passed in via "web.res" to initiate sending of a response. The hgweb WSGI application will no longer start sending the response automatically.

  • Various helper functions in hgweb.webutil no longer accept a templater instance. Access the templater through the "web" argument instead.
  • Various functions in hgweb.webutil now take a modern request object instead of "wsgirequest".
  • @webcommand functions now only receive a single argument. The request and templater instances can be accessed via the "req" and "templater" attributes of the first argument. Note that the request object is different from previous Mercurial releases and consumers of the previous "req" 2nd argument will need updating to use the new API.

  • The old "wsgirequest" class for handling everything WSGI in hgweb has been replaced by separate request and response types. Various high-level functions in the hgweb WSGI applications now receive these new types as arguments instead of the old "wsgirequest" type.
  • The render(mapping) method of the templater has been renamed to renderdefault(mapping).

  • httppeer.httppeer.__init__ now takes additional arguments. Instances should be obtained by calling httppeer.instance() or httppeer.makepeer() instead.

  • The templater is no longer callable. Use templater.generate(t, mapping) instead of templater(t, **pycompat.strkwargs(mapping)).

  • templatekw._showlist() is deprecated in favor of templateutil._showcompatlist(), which takes context in place of templ.

  • Several generic string helper functions have been moved to utils.stringutil module.
  • The util.Abort alias has been removed. Use error.Abort.

  • merge.update() and merge.applyupdates() now return a class with named attributes instead of a tuple. Switch consumers to access elements by name instead of by offset.

  • Utility functions related to process/executable management have been moved to utils.procutil module.
  • localrepo.localrepository.featuresetupfuncs has been renamed to localrepo.featuresetupfuncs.
  • localrepo.localrepository.filterpats was renamed to localrepo.localrepository._filterpats.
  • Template filters should declare input data type and/or catch AttributeError, ValueError, TypeError, etc. as needed. See the doc of "registrar.templatefilters" for details.

  • "wireproto" module no longer re-exports various types used to define responses to wire protocol commands. Access these types from the "wireprototypes" module.
  • filelog.parsemeta() and filelog.packmeta() have been moved to the revlog module.

  • procutil.popen() no longer supports text mode I/O.

  • hook.hook() and hook.runhooks() may return a negative integer to denote that the process was killed by signal.

  • filelog.filelog is now a standalone class and doesn't inherit from revlog. Instead, it wraps a revlog instance at self._revlog. This change was made in an attempt to formalize storage APIs and prevent revlog implementation details leaking through to callers.

  • The fp argument is removed from cmdutil.export(). Use cmdutil.exportfile() instead.

  • cmdutil.export() takes a formatter as an argument.

  • patch.extract() is now a context manager. Callers no longer have to worry about deleting the temporary file it creates, as the file is tied to the lifetime of the context manager.

  • The wire protocol peer's iterbatch() for bulk executing commands has been removed. Use peer.commandexecutor() instead.

2. Mercurial 4.5.3 (2018-04-04)

This is a regularly-scheduled bugfix release.

2.1. Bug Fixes

  • rebase: on abort, don't strip commits that didn't need to be rebased (issue5822)

  • hgweb: garbage collect on every request
  • amend: abort if unresolved merge conflicts found (issue5805)

3. Mercurial 4.5.1 / 4.5.2 (2018-03-06)

(4.5.2 was released immediately after 4.5.1 to fix a release oversight.)

This is a regularly-scheduled bugfix release.

3.1. Security Fixes

All versions of Mercurial prior to 4.5.2 have vulnerabilities in the HTTP server that allow permissions bypass to:

  • Perform writes on repositories that should be read-only
  • Perform reads on repositories that shouldn't allow read access

CVE-2018-1000132 has been assigned these vulnerabilities.

The nature of the vulnerabilities is:

  1. Wire protocol commands that didn't explicitly declare their permissions had no permissions checking done. The web.{allow-pull, allow-push, deny_read, etc} config options governing access control were never consulted when running these commands. This allowed permissions bypass for impacted commands.

  2. The batch wire protocol command did not list its permission requirements nor did it enforce permissions on individual sub-commands.

The implication of these vulnerabilities is that no permissions checking was performed on commands and this could lead to accessing data that web.* config options were supposed to prevent access to or modifying data (via wire protocol commands that can mutate data) without authorization. A Mercurial HTTP server in its default configuration is supposed to be read-only. However, a well-crafted batch command could invoke commands that perform writes.

The batch write permissions bypass has been present since Mercurial 1.9. The flaw of not checking permissions for wire protocol commands that don't declare their needed permissions has been present since Mercurial 1.0.

Assuming you are running a server without any custom commands provided by extensions, your exposure is unauthorized data access (if relying on the web.* config options to limit access) and unauthorized data mutation via the batch command.

Server operators can detect unauthorized use of the batch command by looking for requests to URLs of the form repo?cmd=batch with arguments containing pushkey or unbundle. This may produce false positives. A more comprehensive check would decode the argument string and verify that pushkey or unbundle are command names (not values). The arguments specified via x-hgarg-<N> request headers can span multiple headers. So advanced attackers could hide the vulnerability by splitting a pushkey or unbundle string across multiple headers. So the only reliable way to detect if this vulnerability is being exploited is to decode these headers like Mercurial does. The format for specifying arguments is documented at https://www.mercurial-scm.org/repo/hg/file/4.5/mercurial/help/internals/wireprotocol.txt#l26. Python code for decoding headers is at https://www.mercurial-scm.org/repo/hg/file/4.5/mercurial/hgweb/protocol.py#l70.

Mercurial 4.5.2 fixes these vulnerabilities by:

  • Performing permissions checking on all wire protocol commands, not just commands that list their permissions.
  • Checking permissions on sub-commands issued to the batch command.

Wire protocol commands not declaring wire protocol permissions will be assumed to be read-write commands and a server in its default configuration (which only allows read-only access), will refuse to execute these commands.

For package maintainers needing to backport the fixes, the relevant changesets from 4.5.2 are 2c647da851ed::2ecb0fc535b1. These can be viewed online at e.g. https://www.mercurial-scm.org/repo/hg/rev/2ecb0fc535b1. The author of these commits has backports to 4.4 and 4.3 on a personal fork at https://hg.mozilla.org/users/gszorc_mozilla.com/hg. The backports for 4.4 are a4843835c835::7cf827e5f8af and for 4.3 are db527ae12671::86f9a022ccb8. To obtain these changesets, run e.g. hg pull -r 7cf827e5f8af https://hg.mozilla.org/users/gszorc_mozilla.com/hg.

3.2. Backwards Compatibility Changes

  • The "batch" wire protocol command now enforces permissions of each invoked sub-command. Wire protocol commands must define their operation type or the "batch" command will assume they can write data and will prevent their execution on HTTP servers unless the HTTP request method is POST, the server is configured to allow pushes, and the (possibly authenticated) HTTP user is authorized to perform a push.
  • Wire protocol commands not defining their operation type in "wireproto.PERMISSIONS" are now assumed to be used for "push" operations and access control to run those commands is now enforced accordingly.

3.3. Bug Fixes

  • fileset: don't abort when running copied() on a revision with a removed file
  • date: fix parsing months
  • setup: only allow Python 3 from a source checkout (issue5804)

  • annotate: do not poorly split lines at CR (issue5798)

  • subrepo: don't attempt to share remote sources (issue5793)

  • subrepo: activate clone pooling to enable sharing with remote URLs
  • changegroup: do not delta lfs revisions
  • revlog: do not use delta for lfs revisions
  • revlog: resolve lfs rawtext to vanilla rawtext before applying delta

4. Mercurial 4.5 (2018-02-01)

4.1. New Features

4.1.1. revert --interactive

The revert command now accepts the flag --interactive to allow reverting only some of the changes to the specified files.

4.1.2. Accessing hidden changesets

Set config option 'experimental.directaccess = True' to access hidden changesets from read only commands.

4.1.3. githelp extension

The githelp extension provides the hg githelp command. This command attempts to convert a git command to its Mercurial equivalent. The extension can be useful to Git users new to Mercurial.

4.1.4. Largefiles changes

  • largefiles: add a 'debuglfput' command to put largefile into the store
  • largefiles: add support for 'largefiles://' url scheme
  • largefiles: allow to run 'debugupgraderepo' on repo with largefiles
  • largefiles: convert EOL of hgrc before appending to bytes IO
  • largefiles: explicitly set the source and sink types to 'hg' for lfconvert
  • largefiles: modernize how capabilities are added to the wire protocol

4.2. hgweb changes

hgweb now shows more information about commits: phase (if it's not public), obsolescence status (with a short explanation and links to the successors) and instabilities (e.g. orphan, phase-divergent or content-divergent).

Client-side graph code has been simplified by delegating more work to the backend, so /graph page is now more in sync with /log page, visually and feature-wise. Unfortunately, this code change means that 3rd-party themes for 4.5+ are required to have graphentry.tmpl template available (copy it from the base theme if you don't use %include and then reference it in map file) and render entries in graph.tmpl -- look at one of the core themes to see what it needs to look like. JS functions that create graph vertices and edges are now available in Graph.prototype, making it possible to call the original functions from custom theme-specific functions if needed.

Graph now shows different symbols for normal, branch-closing, obsolete and unstable commits, and marks currently checked out commit with a circle around its graph node.

There's also now json-graph API endpoint that can be used for rendering commit graph in 3rd-party applications.

4.2.1. Other Changes

  • When interactive revert is run against a revision other than the working directory parent, the diff shown is the diff to <em>apply</em> to the working directory, rather than the diff to <em>discard</em> from the working copy. This is in line with related user experiences with 'git' and appears to be less confusing with 'ui.interface=curses'.

  • Let 'hg rebase' avoid content-divergence by skipping obsolete changesets (and their descendants) when they are present in the rebase set along with one of their successors but none of their successors is in destination.
  • A new experimental config flag, 'rebase.experimental.inmemory', makes rebase perform an in-memory merge instead of doing it on-disk in the working copy.
  • The HGPLAINEXCEPT environment variable can now include color to allow automatic output colorization in otherwise automated environments.

  • A new unamend command in uncommit extension which undoes the effect of the amend command by creating a new changeset which was there before amend and moving the changes that were amended to the working directory.
  • A '--abort' flag to merge command to abort the ongoing merge.
  • An experimental flag '--rev' to 'hg branch' which can be used to change branch of changesets.
  • bundle2 read I/O significantly improved
  • bundle2 memory use significantly reduced during read
  • clonebundle: it is now possible to serve the clonebundle using a git-lfs compatible server.
  • templatefilters: add slashpath() to convert path separator to slash (issue5572)

  • A new experimental config flag, 'inline-color-diff', adds within-line color diff capacity
  • histedit: add support to output nodechanges using formatter to help with editor integrations

4.3. Backwards Compatibility Changes

  • log --follow-first -rREV, which is deprecated, now follows the first parent of merge revisions from the specified REV just like log --follow -rREV.

  • log --follow -rREV FILE.. now follows file history across copies and renames.

  • transaction: register summary callbacks only at start of transaction
  • hgweb's graph view no longer supports browsers that lack <canvas> support

  • hgweb: only include graph-related data in jsdata variable on /graph pages
  • graphlog: add another graph node type, unstable, using character *

  • remove: print message for each file in verbose mode only while using '-A'

4.4. Bug Fixes

  • Bookmark, whose name is longer than 255, can again be exchanged again between 4.4+ client and servers (issue5165)

  • The convert extension works with bzr < 2.6.0 again (issue5733)

  • Mercurial will now attempt to use hardlinks on NTFS on Windows (issue4580)

  • The revset x^:: is now correctly parsed as (x^):: instead of being an error (issue5764)

  • Setting the diff.noprefix configuration option no longer breaks the --stat flag on hg diff (issue5759)

  • hg outgoing now honors :pushurl paths from hgrc (issue5365)

  • log: translate column labels at once (issue5750)

  • patch: improve heuristics to not take the word diff as header (issue1879)

  • templater: look up symbols/resources as if they were separated (issue5699)

  • http and ssh: support for emitting extra debug logs about requests as they happen

4.5. API Changes

  • bundlerepo.bundlerepository.bundle and bundlerepo.bundlerepository.bundlefile are now prefixed with an underscore.

  • Rename bundlerepo.bundlerepository.bundlefilespos to _cgfilespos.
  • dirstate no longer provides a 'dirs()' method. To test for the existence of a directory in the dirstate, use 'dirstate.hasdir(dirname)'.
  • mapping does not contain all template resources. use context.resource() in template functions.
  • text=False|True option is dropped from the vfs interface because of Python 3 compatibility issue. Use util.tonativeeol/fromnativeeol() to convert EOL manually.

  • wireproto.streamres.__init__ no longer accepts a reader argument. Use the gen argument instead.

  • exchange.getbundlechunks() now returns a 2-tuple instead of just an iterator.
  • bundle2 parts are no longer seekable by default
  • memfilectx: the changectx argument is now mandatory in constructor

5. Mercurial 4.4.2 (2017-12-01)

This is a regularly-scheduled bugfix release.

5.1. Notable changes

5.1.1. Stricter command option parsing

Mercurial can now optionally parse "early" options (-R/--repository, --cwd, --config, --debugger, and --profile) more strictly, for more secure integration with tools that invoke 'hg' commands. Setting HGPLAIN=+strictflags will parse these options more strictly, which prevents them from being injected as arguments to other flags.

5.2. Bug fixes

  • 'hg amend' now correctly handles deleted and removed files, as well as subrepos. (issue5732, issue5677)

  • largefiles now correctly handles dropped standin files when updating largefiles.
  • Fixed an issue with deleting symlinks to directories when ui.origbackuppath is set. (issue5731)

5.3. Performance improvements

  • Improved performance in path conflict checking introduced in Mercurial 4.4. (issue5716)

6. Mercurial 4.4.1 (2017-11-07)

6.1. Notable changes

  • Git and Subversion subrepos have been disabled by default to mitigate a potential security risk if files overlapping with a subrepo managed to be committed to a repository.
  • Subrepos are now more paranoid about symlink traversal.
  • The share extension handles drive letters on Windows better.

It is possible that a specially malformed repository can cause Git subrepositories to run arbitrary code in the form of a .git/hooks/post-update script checked in to the repository in Mercurial 4.4 and earlier. Typical use of Mercurial prevents construction of such repositories, but they can be created programmatically.

7. Mercurial 4.4 (2017-11-01)

7.1. Notable changes

7.1.1. Control whitespace settings for annotation on hgweb

/annotate URLs on hgweb now accept query string arguments to influence how whitespace changes impact results.

The arguments "ignorews," "ignorewsamount," "ignorewseol," and "ignoreblanklines" now have the same meaning as their [annotate] config section counterparts. Any provided setting overrides the server default.

HTML checkboxes have been added to the paper and gitweb themes to expose current whitespace settings and to easily modify the current view.

7.1.2. Fast, heuristic copy-tracing

A new fast heuristic algorithm for copytracing which assumes that the files moves are either:

  1. renames in the same directory
  2. moves in other directories with same names

You can use this algorithm by setting 'experimental.copytrace=heuristics'. This setting performs full copytracing if both source and destination branches contains non-public changesets only.

7.1.3. Other changes

  • Estimated time is more accurate with non-linear progress
  • "hg status -v" can now show unfinished state. For example, when in an unfinished rebase state, "hg status -v" might show:
     # The repository is in an unfinished *rebase* state.
     # No unresolved merge conflicts.
     # To continue:                hg rebase --continue
     # To abort:                   hg rebase --abort
  • Added '--ignore-space-at-eol' diff option to ignore whitespace differences at line endings.
  • show: use consistent node length in views
  • show: decrease minimum displayed hash length from 5 to 4
  • A new uncommit extension which provides 'hg uncommit' using which one can uncommit part or all of the changeset. This command undoes the effect of a local commit, returning the affected files to their uncommitted state.
  • 'hg clone --uncompressed' uses clone bundles when possible
  • 'hg annotate --skip' now prints a '*' on lines with skipped revisions
  • New 'commands.update.check' feature to adjust constraints on when 'hg update' will allow updates with a dirty working copy.
  • Add an experimental -L/--line-range FILE,FROMLINE:TOLINE option to 'hg log' command to follow the history of files by line range. In combination with -p/--patch option, only diff hunks within specified line range will be displayed. Feedback, especially on UX aspects, is welcome.

  • Print warning when fsmonitor isn't being used on a large repository

7.2. Backwards Compatibility Changes

  • The config option for copytrace 'experimental.disablecopytrace' is now replaced with 'experimental.copytrace' which defaults to 'on'. If you need to turn off copytracing, add '[experimental] copytrace = off' to your config.
  • 'hg clone --stream' should now be used instead of --uncompressed. --uncompressed is marked as deprecated and is an alias for --stream. There is no schedule for elimination of --uncompressed.
  • The 'experimental.updatecheck' name for the new 'commands.update.check' feature is now deprecated, and will be removed after this release.
  • Mercurial subrepositories are now shared instead of cloned when the parent repository is shared. This prevents dangling subrepository references in the share source. Previously shared repositories with cloned subrepositories will continue to function unchanged.
  • Push no longer triggers a pushkey hook when updating phases. Use the new 'txnclose-phase' and 'txnclose-phase' hooks instead. (Applies when both server and client use version 4.4 or above).

7.3. Bug Fixes

  • Core rebase algorithm has been rewritten to be more robust (issue5578, issue5630)

  • Creating a share of a repository with a Mercurial subrepository will now share the subrepository (issue5675)

7.4. Performance Improvements

  • improved performance when many aliases are defined

7.5. API Changes

7.5.1. remove peer.batch()

Replace with peer.iterbatch().

7.5.2. Other Changes

  • @peer.batchable can no longer emit local values
  • @peer.batchable functions must now yield exactly 2 values
  • Rename attributes on sshpeer to reflect peer API
  • peer.peerrepository has been removed. Use repository.peer abstract base class to represent a peer repository.
  • revset.stringset() now takes 'order' as the last argument.

8. Mercurial 4.3.3 (2017-10-01)

  • Prevent crashes when clearing progress bar. (issue5684)

  • rebase: move bookmarks with --keep (issue5682)

9. Mercurial 4.3.2 (2017-09-18)

  • restore compatibility with older versions of Python 2.7 by not using a bytearray with struct.unpack_from()
  • restore mingw compatibility for setup.py
  • hgwebdir: read 'web.template' untrusted (plugs potential security issue)
  • repair: preserve phase when not using generaldelta (issue5678)

  • ssh: fix flakey ssh errors on BSD systems
  • restore error handling behavior around certain I/O errors; the regressed behavior could result in transactions not being properly rolled back if stdio handles encountered errors (issue5658)

  • templatekw: choose {latesttag} by len(changes), not date (issue5659)

  • record: fix revert -i for lines without newline (issue5651)

  • mq: create non-lossy patches, also with custom global diff configuration

10. Mercurial 4.3 / 4.3.1 (2017-08-10)

(4.3.1 was released immediately after 4.3 to fix a release oversight.)

An overview of new features available. This is a regularly-scheduled quarterly feature release.

10.1. Notable changes

  • experimental amend extension providing the amend command
  • experimental sparse extension
  • Support for Python 2.6 has been dropped.
  • Bundles created by the strip extension now store phase information. It will be restored when unbundling.
  • The strip extension now removes relevant obsmarkers. If a backup requested (the default), the obsmarkers are stored in the backup bundle and will be restored when unbundling.
  • hg show work (from the experimental show extension) now displays more info

  • hg show stack is a new view for the current, in-progress changeset and others around it

  • Mitigation for two security vulnerabilities

10.2. CVE-2017-1000115

Mercurial's symlink auditing was incomplete prior to 4.3, and could be abused to write to files outside the repository.

10.3. CVE-2017-1000116

Mercurial was not sanitizing hostnames passed to ssh, allowing shell injection attacks on clients by specifying a hostname starting with -oProxyCommand. This is also present in Git (CVE-2017-1000117) and Subversion (CVE-2017-9800), so please patch those tools as well if you have them installed.

11. Mercurial 4.2.3 (2017-08-10)

This was an out-of-cycle backport of security fixes from 4.3 for users stuck on Python 2.6.

12. Mercurial 4.2.2 (2017-07-05)

This is a regularly-scheduled bugfix release.

  • largefiles: avoid a crash when archiving a subrepo with largefiles disabled
  • rebase: also test abort from pretxnclose error
  • rebase: backed out changes 2519994d25ca and cf8ad0e6c0e4 (issue5610)

  • rebase: reinforce testing around precommit hook interrupting a rebase

13. Mercurial 4.2.1 (2017-6-4)

This is a regularly-scheduled bugfix release.

  • hg graft now works when grafting across merges that were problematic before (b4e1e30528c7).

  • A race condition in hg status was partially fixed (issue5584).

  • The message about deprecated SHA-1 hashes in the [hostfingerprints] config section now references the correct syntax for replacing them with SHA-256 hashes (issue5559).

14. Mercurial 4.2 (2017-5-2)

An overview of new features available. This is a regularly-scheduled quarterly feature release.

14.1. Notable changes

  • Pager support has been moved into core and is now enabled by default. This is now controlled with the ui.paginate setting.
    • Note that in 4.2-rc, the ui.paginate option was named pager.enable. The old name has been dropped in the final release. If you had turned pagination off using pager.enable=False, please update your config.
  • Color support has also been moved into core and is now enabled by default (the ui.color setting now defaults to 'auto').
  • The new experimental 'show' extension provides a way to view various information about your repository in an ergonomic way. It is deliberately designed for human consumption and not for scripting, so it doesn't carry the same backward compatibility guarantees as other commands. See 'hg help -e show' for more information.

  • Mercurial now requires setuptools on Windows.

14.2. commands

  • Pager support has been added to the 'log', 'diff', 'branches', 'files', 'status', 'summary', and 'tags' commands, as well as the '--patch', '--list', and '--stat' options of hg shelve.
  • bisect: set a blockedtag when running the check command
  • bookmarks: check HG_PENDING strictly
  • branches: populate all template keywords in formatter
  • commandserver: handle backlog before exiting
  • commandserver: prevent unlinking socket twice
  • commit: optionally strip quotes from commit template (BC)
  • diff: add --binary option for git mode diffs
  • help: add pointer how to narrow list of resolved/unresolved files (issue5469)

  • pager: advertise the config option in the default hgrc
  • pager: avoid shell=True on subprocess.Popen for better errors (issue5491)

  • pager: don't terminate with extreme prejudice on SIGPIPE (BC)
  • pager: exit cleanly on SIGPIPE (BC)
  • pager: improve support for various flavors of 'more' on Windows
  • pager: use less as a fallback on Unix
  • pull: abort pull --update if config requires destination (issue5528)

  • serve: add support for Mercurial subrepositories
  • status: handle more node indicators in buildstatus
  • status: support commands.status.relative config
  • update: accept --merge to allow merging across topo branches (issue5125)

  • verify: fix length check

14.3. core

  • bundle2: ignore errors seeking a bundle after an exception (issue4784)

  • checkheads: upgrade the obsolescence postprocessing logic (issue4354)

  • color: insert color code after every "\e[0m" (issue5413)

  • color: sync text attributes and buffered text output on Windows (issue5508)

  • config: use "churn" as an example extension
  • config: drop pager from the recommended extension
  • context: optimize linkrev adjustment in blockancestors() (issue5538)

  • crecord: avoid setting non-existing SIGTSTP signal on windows (issue5512)

  • debian: configure editor and pager to sensible-editor and sensible-pager by default
  • dispatch: ignore further SIGPIPE while handling KeyboardInterrupt

  • dispatch: protect against malicious 'hg serve --stdio' invocations (SEC)
  • dispatch: start profiling earlier
  • filemerge: optionally strip quotes from merge marker template (BC)
  • formatter: add support for changeset templating
  • formatter: support json formatting of long type
  • graphlog: draw multiple edges towards null node (issue5440)

  • graphlog: optionally strip quotes from graphnode template (BC)
  • localrepo: deprecate 'repo.join' in favor of 'repo.vfs.join'
  • localrepo: deprecate 'repo.opener' (API)
  • localrepo: deprecate 'wfile'
  • localrepo: deprecated 'repo.wopener' (API)
  • match: adding support for matching files inside a directory
  • packaging: add make target for linux wheels
  • patch: make diff in git mode respect --text option (issue5510)

  • plain: ignore [commands] config
  • profiling: add statprof support for Chrome trace viewer rendering
  • progress: retry ferr.flush() and .write() on EINTR (issue5532)

  • py3: stop exporting urlparse from pycompat and util (API)
  • rcutil: let environ override system configs (BC)
  • rcutil: let rccomponents return different types of configs (API)
  • rcutil: move scmutil.*rcpath to rcutil (API)
  • rcutil: rename rcpath to rccomponents (API)
  • rcutil: split osrcpath to return default.d paths (API)
  • record: update help message to use operation instead of "record" (issue5432)

  • revlog: avoid applying delta chain on cache hit
  • revset: split language services to revsetlang module (API)
  • revset: stop supporting plain list as input set (API)
  • revset: stop supporting predicate that returns plain list (API)
  • setup: use setuptools on Windows (issue5400)

  • smartset: move set classes and related functions from revset module (API)
  • sshpeer: try harder to snag stderr when stdout closes unexpectedly
  • templatefilter: add support for 'long' to json()
  • templatekw: have showlist() take mapping dict with no **kwargs expansion (API)
  • templatekw: make join() escape values of extras (BC) (issue5504)

  • templater: make pad() strip color codes before computing width (issue5416)

  • test-profile: allow negative time in JSON output (issue5542)
  • track-tags: write all tag changes to a file
  • util: always force line buffered stdout when stdout is a tty (BC)
  • vfs: extract 'vfs' class and related code to a new 'vfs' module (API)

14.4. extensions

  • histedit: log the time taken to read in the commands list
  • histedit: make check for unresolved conflicts explicit (issue5545)

  • histedit: modify rollup to discard date from the rollup commit (issue4820)

  • histedit: use safecleanupnode in _aborthistedit (issue5500)

  • largefiles: add copytostore() fstandin argument to replace readstandin() (API)
  • largefiles: add lfile argument to updatestandin() for efficiency (API)
  • largefiles: make copytostore() accept only changectx as the 2nd argument (API)
  • largefiles: omit updating newly added standin at linear merging
  • largefiles: remove unused keyword argument of copytostore() (API)
  • largefiles: replace hashrepofile by hashfile (API)
  • largefiles: set the extension as enabled locally after a share requiring it
  • patchbomb: add config knob to generate flags by template (issue5354)

  • patchbomb: drop internal option for pbranch extension (API)
  • patchbomb: use modern pager to display -n/--test result (BC)
  • rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)

  • rebase: abort if *any* commit in rebase set is public
  • rebase: add flag to require destination
  • rebase: allow aborting if last-message.txt is missing
  • rebase: allow destination-free continue and abort (issue5513)

  • rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
  • rebase: unhide original working directory node as well (issue5219)

  • shelve: add -n/--name option to unshelve (issue5475)

  • shelve: add logic to preserve active bookmarks
  • show: new extension for displaying various repository data

14.5. hgweb

  • hgweb: add a "patch" query parameter to filelog command
  • hgweb: do not show "descending" link in followlines UI for filelog heads
  • hgweb: handle a "descend" query parameter in filelog command
  • hgweb: handle a "linerange" request parameter in filelog command
  • hgwebdir: add support for explicit index files

14.6. Behavior changes

  • commit: optionally strip quotes from commit template (BC)
  • filemerge: optionally strip quotes from merge marker template (BC)
  • graphlog: optionally strip quotes from graphnode template (BC)
  • pager: don't terminate with extreme prejudice on SIGPIPE (BC)
  • pager: exit cleanly on SIGPIPE (BC)
  • patchbomb: use modern pager to display -n/--test result (BC)
  • rcutil: let environ override system configs (BC)
  • rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
  • templatekw: make join() escape values of extras (BC) (issue5504)

  • util: always force line buffered stdout when stdout is a tty (BC)

14.7. Internal API changes

  • largefiles: add copytostore() fstandin argument to replace readstandin() (API)
  • largefiles: add lfile argument to updatestandin() for efficiency (API)
  • largefiles: make copytostore() accept only changectx as the 2nd argument (API)
  • largefiles: remove unused keyword argument of copytostore() (API)
  • largefiles: replace hashrepofile by hashfile (API)
  • localrepo: deprecate 'repo.opener' (API)
  • localrepo: deprecated 'repo.wopener' (API)
  • patchbomb: drop internal option for pbranch extension (API)
  • py3: stop exporting urlparse from pycompat and util (API)
  • rcutil: let rccomponents return different types of configs (API)
  • rcutil: move scmutil.*rcpath to rcutil (API)
  • rcutil: rename rcpath to rccomponents (API)
  • rcutil: split osrcpath to return default.d paths (API)
  • revset: split language services to revsetlang module (API)
  • revset: stop supporting plain list as input set (API)
  • revset: stop supporting predicate that returns plain list (API)
  • smartset: move set classes and related functions from revset module (API)
  • templatekw: have showlist() take mapping dict with no **kwargs expansion (API)
  • vfs: extract 'vfs' class and related code to a new 'vfs' module (API)

15. Mercurial 4.1.3 (2017-4-18)

This is an out of cycle release to address a security issue:

  • hg serve --stdio could be tricked into granting authorized users access to the Python debugger. Thanks to Jonathan Claudius of Mozilla for reporting this issue. This issue is only a security issue for repositories served using --stdio, which includes ssh but *not* http. This is CVE-2017-9462.

16. Mercurial 4.1.2 (2017-4-3)

This is a regularly-scheduled bugfix release.

  • Mercurial should work inside IIS on Windows again. (issue5493)

  • zstd support now refuses to work on old bundle formats. (issue5506)

  • Merges involving subrepositories no longer crash in some cases. (issue5505)

  • Checking for new heads during push is no longer accidentally quadratic

17. Mercurial 4.1.1 (2017-3-2)

This is a regularly-scheduled bugfix release.

  • Several incorrect mailing list addresses have been corrected.
  • Various error cases have been corrected during push and pull.
  • Minor issues that happened when Mercurial spawned worker processes have been fixed.

18. Mercurial 4.1 (2017-2-1)

An overview of new features available. This is a regularly-scheduled quarterly feature release.

18.1. commands

  • commands: config option to control bundle compression level
  • crecord: add an experimental option for space key to move cursor down
  • crecord: rewrite status line text (BC)
  • diff: add experimental support for more git-diff extended diff features
  • graft: support grafting changes to new file in renamed directory (issue5436)

  • help: show help for disabled extensions (issue5228)

  • help: update help for 'hg update' which was misleading (issue5427)

  • merge: fix crash on criss cross merge with dir move and delete (issue5020)

  • summary: add evolution "troubles" information to summary output
  • summary: use the same labels as log command in "parent: " line
  • templates: display evolution "troubles" in command line style

18.2. core

  • changelog: keep track of file end in appender (issue5444)

  • dispatch: stop supporting non-use of @command (API)
  • hook: do not redirect stdout/err/in to ui while running in-process hooks (BC)
  • httppeer: advertise and support application/mercurial-0.2
  • localrepo: experimental support for non-zlib revlog compression
  • manifest: add bundlemanifestlog support
  • manifest: add unionmanifestlog support
  • manifest: make revlog verification optional
  • patch: add experimental config knob for displaying the index header
  • patch: add similarity config knob in experimental section
  • patch: add label for coloring the index extended header
  • patch: add label for coloring the similarity extended header
  • profiling: make statprof the default profiler (BC)
  • profiling: use vendored statprof and upstream enhancements (BC)
  • revlog: REVIDX_EXTSTORED flag
  • revlog: add clone method
  • revlog: ensure that flags do not overflow 2 bytes
  • revlog: flag processor
  • revlog: inline start() and end() for perf reasons
  • revlog: make compressed size comparisons consistent
  • revlog: merge hash checking subfunctions
  • revlog: move decompress() from module to revlog class (API)
  • revlog: optimize _chunkraw when startrev==endrev
  • revlog: pass revlog flags to addrevision
  • revlog: reorder index accessors to match data structure order
  • revlog: use compression engine API for compression
  • revlog: use compression engine APIs for decompression
  • revset: add regular expression support to 'desc'
  • revset: make children() not look at p2 if null (issue5439)

  • run-tests: forward Python USER_BASE from site (issue5425)

  • server: move cmdutil.service() to new module (API)
  • templatekw: force noprefix=False to insure diffstat consistency (issue4755)

  • ui: check EOF of getpass() response read from command-server channel
  • ui: do not translate empty configsource() to 'none' (API)
  • ui: factor out ui.load() to create a ui without loading configs (API)
  • util: compression APIs to support revlog compression and decompression
  • util: declare wire protocol support of compression engines
  • wireproto: advertise supported media types and compression formats
  • wireproto: only advertise HTTP-specific capabilities to HTTP peers (BC)
  • wireproto: perform chunking and compression at protocol layer (API)

18.3. extensions

  • convert: add config option to control storing original revision
  • convert: add config option to copy extra keys from Git commits
  • convert: config option for git rename limit
  • convert: config option to control Git committer actions
  • rebase: calculate ancestors for --base separately (issue5420)

  • rebase: check for conflicts before continuing
  • rebase: fail-fast the pull if working dir is not clean (BC)
  • shelve: allow multiple shelves with --patch and --stat
  • shelve: choose a legal shelve name when no name is passed (issue5112)

  • shelve: make --keep option survive user intervention (issue5431)

  • shelve: make unshelve not crash when there are missing files (issue4176)

18.4. hgweb

  • hgweb: link to raw-file on annotation page (BC)
  • hgweb: make log streams compatible with command server
  • hgweb: restore ascending iteration on revs in filelog web command
  • hgweb: support Content Security Policy

18.5. chg

  • chg: send type information via S channel (BC)
  • chg: support long socket path
  • chgserver: make S channel support pager request
  • chgserver: override runcommand

18.6. Behavior Changes

  • chg: send type information via S channel (BC)
  • crecord: rewrite status line text (BC)
  • hgweb: link to raw-file on annotation page (BC)
  • hook: do not redirect stdout/err/in to ui while running in-process hooks (BC)
  • profiling: make statprof the default profiler (BC)
  • profiling: use vendored statprof and upstream enhancements (BC)
  • rebase: fail-fast the pull if working dir is not clean (BC)
  • wireproto: only advertise HTTP-specific capabilities to HTTP peers (BC)

18.7. Internal API Changes

  • bookmarks: make bookmarks.comparebookmarks accept binary nodes (API)
  • bookmarks: rename 'compare()' to 'comparebookmarks()' (API)
  • revlog: move decompress() from module to revlog class (API)
  • server: move cmdutil.service() to new module (API)
  • ui: do not translate empty configsource() to 'none' (API)
  • ui: factor out ui.load() to create a ui without loading configs (API)
  • util: remove compressors dict (API)
  • util: remove decompressors dict (API)
  • wireproto: perform chunking and compression at protocol layer (API)
  • dispatch: stop supporting non-use of @command (API)

19. Mercurial 4.0.2 (2017-01-04)

This is a regularly-scheduled bugfix release.

  • demandimport: do not raise ImportError for unknown item in fromlist

  • posix: make poll() restart on interruption by signal (issue5452)

  • hgweb: add missing slash to file log url in rss style

20. Mercurial 4.0.1 (2016-12-1)

This is a regularly-scheduled bugfix release.

  • hgweb: cache fctx.parents() in annotate command (issue5414)

  • vfs, scmutil: ignore EPERM at os.utime, which avoids ambiguity (issue5418)

21. Mercurial 4.0 (2016-11-1)

An overview of new features available. This is a regularly-scheduled quarterly feature release. Unlike other 4.0 software releases, this is simply 3.9 + .1, so it should be the usual pain-free upgrade.

21.1. commands

  • annotate: calculate line count correctly
  • branchmap: acquires lock before writting the rev branch cache
  • clone: set default path correctly when doing a clone+share (issue5378)

  • copy: distinguish "file exists" cases and add a hint (BC)
  • commit: return 1 for interactive commit with no changes (issue5397)

  • config: add template support
  • debugobsolete: add formatter support (issue5134)

  • files: change documentation to match its behaviour (issue5276)

  • grep: add formatter support
  • help: show content for explicitly disabled extension (issue5228)

  • import: abort instead of crashing when copy source does not exist (issue5375)

  • import: report directory-relative paths in error messages (issue5224)

  • log: copy the way of ancestor traversal to --follow matcher (issue5376)

  • log: preserve topo sort in graph even if additional filter options specified
  • merge: add conflict labels to merge command
  • merge: avoid superfluous filemerges when grafting through renames (issue5407)

  • strip: report both bundle files in case of exception (issue5368)

  • tag: clarify warning about making a tag on a branch head
  • version: add formatter support
  • flags: allow specifying --no-boolean-flag on the command line (BC)

21.2. core

  • changelog: disable delta chains
  • copies: make _checkcopies handle copy sequences spanning the TCA (issue4028)

  • formatter: add function to convert list to appropriate format (issue5217)

  • lock: show more detail for new-style locks in lock waiting message (issue4752)

  • revset: do not rewrite ':y' to '0:y' (issue5385)

  • revset: fix order of nested '_(|int|hex)list' expression (BC)
  • revset: fix order of nested 'or' expression (BC)
  • revset: fix order of nested 'range' expression (BC)
  • revset: make reverse() and sort() no-ops when ordering requirement allows (BC)
  • revset: support "follow(renamed.py, e22f4f3f06c3)" (issue5334)

  • templater: provide a termwidth keyword (issue5395)

  • templater: add inheritance support to style maps
  • templater: add relpath() to convert repo path to relative path (issue5394)

  • templater: make pad() evaluate boolean argument (BC)
  • wireproto: unescape argument names in batch command (BC)

21.3. extensions

  • journal: properly check for held lock (issue5349)

  • journal: use fm.formatdate() to pass date tuple in appropriate type (BC)
  • journal: use fm.formatlist() to pass hashes in appropriate type (BC)
  • journal: use fm.hexfunc() to get full hash in JSON/template output (BC)
  • largefiles: fix 'deleted' files sometimes persistently appearing with R status
  • largefiles: handle that a found standin file doesn't exist when removing it
  • largefiles: more safe handling of interruptions while updating modifications
  • largefiles: when setting/clearing x bit on largefiles, don't change other bits
  • mq: release lock after transaction in qrefresh
  • mq: take wlock when 'qqueue' is doing write operations
  • rebase: properly calculate total commits to rebase (issue5347)

  • rebase: rebase changesets in topo order (issue5370) (BC)

21.4. hgweb

  • hgweb: avoid line wrap between revision and annotate-info (issue5398)

  • hgweb: config option to control zlib compression level

WhatsNew (last edited 2024-03-21 11:28:40 by RaphaelGomes)