hg admin::chainsaw-update#

pull and update to a given revision, no matter what, (EXPERIMENTAL)#

hg admin::chainsaw-update [OPTION] --rev REV --source SOURCE --dest DEST

Aliases: admin::chainsawupdate

Context of application: some Continuous Integration (CI) systems, packaging or deployment tools.

Wanted end result: local repository at the given REPO_PATH, having the latest changes to the given revision and with a clean working directory updated at the given revision.

chainsaw-update pulls from one source, then updates the working directory to the given revision, overcoming anything that would stand in the way.

By default, it will:

  • clone if the local repo does not exist yet, removing any directory at the given path that would not be a Mercurial repository. The initial clone is full by default, so that clonebundles can be applied. Use the --initial-clone-minimal flag to avoid this.

  • break locks if needed, leading to possible corruption if there is a concurrent write access.

  • perform recovery actions if needed

  • revert any local modification.

  • purge unknown and ignored files.

  • go as far as to reclone if everything else failed (not implemented yet).

DO NOT use it for anything else than performing a series of unattended updates, with full exclusive repository access each time and without any other local work than running build scripts. In case the local repository is a share (see `hg help share`), exclusive write access to the share source is also mandatory.

It is recommended to run these commands with the HGPLAIN environment variable (see `hg scripting`).

Motivation: in Continuous Integration and Delivery systems (CI/CD), the occasional remnant or bogus lock are common sources of waste of time (both working time and calendar time). CI/CD scripts tend to grow with counter- measures, often done in urgency. Also, whilst it is neat to keep repositories from one job to the next (especially with large repositories), an exceptional recloning is better than missing a release deadline.

Options

Every command accepts the global options.

--[no-]purge-unknown

Remove unversioned files before update. Disabling this can in some cases interfere with the update.See also `hg purge`. (default: on)

--[no-]purge-ignored

Remove ignored files before update. Disable this for instance to reuse previous compiler object files. See also `hg purge`. (default: on)

--rev VALUE

revision to update to

--source VALUE

repository to clone from

--dest VALUE

repository to update to REV (possibly cloning)

--initial-clone-minimal

Pull only the prescribed revision upon initial cloning. This has the side effect of ignoring clone-bundles, which if often slower on the client side and stressful to the server than applying available clone bundles.