##// END OF EJS Templates
bisect: avoid adding irrelevant revisions to bisect state...
bisect: avoid adding irrelevant revisions to bisect state When adding new revisions to the bisect state, it only makes sense to add information about revisions that are under consideration (i.e., those that are topologically between the known good and bad revisions). However, if the user passes in a revset (e.g., '!merge()' to exclude merge commits), hg will resolve the revset first and add all matching revisions to the bisect state (which in this case would likely be the majority of revisions in the repo). To avoid this, revisions should only be added to the bisect state if they are between the good and bad revisions (and therefore relevant to the bisection). -- Here are the results of some performance tests using the `mozilla-central` repo (since it is one of the largest freely-available hg repositories in the wild). These tests compare the performance of a locally-built `hg` before and after application of this series. Note that `--noupdate` is passed to avoid including update time (which should not vary across cases). Setup (run between each test): $ hg bisect --reset $ hg bisect --noupdate --bad 56c3ad4bde5c70714b784ccf15d099e0df0f5bde $ hg bisect --noupdate --good 57426696adaf08298af3027fa77486fee0633b13 Test using a revset that returns a very large number of revisions: $ time hg bisect --noupdate --skip '!merge()' > /dev/null Before: real 0m9.398s user 0m9.233s sys 0m0.120s After: real 0m1.513s user 0m1.425s sys 0m0.052s Test using a revset that is expensive to compute: $ time hg bisect --noupdate --skip 'desc("Bug")' > /dev/null Before: real 0m49.853s user 0m49.580s sys 0m0.243s After: real 0m4.120s user 0m4.036s sys 0m0.048s

File last commit:

r49730:6000f5b2 default
r50337:81623652 default
Show More
requirements.py
120 lines | 4.6 KiB | text/x-python | PythonLexer
Pulkit Goyal
requirements: introduce new requirements related module...
r45932 # requirements.py - objects and functions related to repository requirements
#
Raphaël Gomès
contributor: change mentions of mpm to olivia...
r47575 # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com>
Pulkit Goyal
requirements: introduce new requirements related module...
r45932 #
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
requirements: move the comment about manifestv2 in the module...
r49448 # obsolete experimental requirements:
# - manifestv2: An experimental new manifest format that allowed
# for stem compression of long paths. Experiment ended up not
# being successful (repository sizes went up due to worse delta
# chains), and the code was deleted in 4.6.
Raphaël Gomès
requirements: also add a generaldelta constant...
r47372 GENERALDELTA_REQUIREMENT = b'generaldelta'
Raphaël Gomès
requirements: also add a dotencode constant...
r47381 DOTENCODE_REQUIREMENT = b'dotencode'
Raphaël Gomès
requirements: also add a store constant...
r47382 STORE_REQUIREMENT = b'store'
Raphaël Gomès
requirements: also add a fncache constant...
r47383 FNCACHE_REQUIREMENT = b'fncache'
Raphaël Gomès
requirements: also add a generaldelta constant...
r47372
tracked-key: remove the dual write and rename to tracked-hint...
r49644 DIRSTATE_TRACKED_HINT_V1 = b'dirstate-tracked-key-v1'
dirstate-v2: freeze the on-disk format...
r49116 DIRSTATE_V2_REQUIREMENT = b'dirstate-v2'
Simon Sapin
dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement...
r48052
Pulkit Goyal
requirements: introduce new requirements related module...
r45932 # When narrowing is finalized and no longer subject to format changes,
# we should move this to just "narrow" or similar.
NARROW_REQUIREMENT = b'narrowhg-experimental'
# Enables sparse working directory usage
SPARSE_REQUIREMENT = b'exp-sparse'
# Enables the internal phase which is used to hide changesets instead
# of stripping them
INTERNAL_PHASE_REQUIREMENT = b'internal-phase'
# Stores manifest in Tree structure
TREEMANIFEST_REQUIREMENT = b'treemanifest'
Pulkit Goyal
localrepo: move requirements constant to requirements module...
r45933
Raphaël Gomès
requirements: add constant for revlog v1 requirement...
r47371 REVLOGV1_REQUIREMENT = b'revlogv1'
requirements: add an official `REVLOG_COMPRESSION_ZSTD` const...
r49498 # allow using ZSTD as compression engine for revlog content
REVLOG_COMPRESSION_ZSTD = b'revlog-compression-zstd'
Pulkit Goyal
localrepo: move requirements constant to requirements module...
r45933 # Increment the sub-version when the revlog v2 format changes to lock out old
# clients.
changelogv2: introduce a "changelogv2" feature...
r48037 CHANGELOGV2_REQUIREMENT = b'exp-changelog-v2'
# Increment the sub-version when the revlog v2 format changes to lock out old
# clients.
Raphaël Gomès
revlog: introduce v2 format...
r47438 REVLOGV2_REQUIREMENT = b'exp-revlogv2.2'
Pulkit Goyal
localrepo: move requirements constant to requirements module...
r45933
# A repository with the sparserevlog feature will have delta chains that
# can spread over a larger span. Sparse reading cuts these large spans into
# pieces, so that each piece isn't too big.
# Without the sparserevlog capability, reading from the repository could use
# huge amounts of memory, because the whole span would be read at once,
# including all the intermediate revisions that aren't pertinent for the chain.
# This is why once a repository has enabled sparse-read, it becomes required.
SPARSEREVLOG_REQUIREMENT = b'sparserevlog'
# A repository with the the copies-sidedata-changeset requirement will store
# copies related information in changeset's sidedata.
COPIESSDC_REQUIREMENT = b'exp-copies-sidedata-changeset'
# The repository use persistent nodemap for the changelog and the manifest.
NODEMAP_REQUIREMENT = b'persistent-nodemap'
Pulkit Goyal
requirements: introduce a set of working directory specific requirements...
r45934
Pulkit Goyal
requirements: introduce constants for `shared` and `relshared` requirements...
r45946 # Denotes that the current repository is a share
SHARED_REQUIREMENT = b'shared'
# Denotes that current repository is a share and the shared source path is
# relative to the current repository root path
RELATIVE_SHARED_REQUIREMENT = b'relshared'
Pulkit Goyal
share: introduce config option to store requires in .hg/store...
r46055 # A repository with share implemented safely. The repository has different
# store and working copy requirements i.e. both `.hg/requires` and
# `.hg/store/requires` are present.
Pulkit Goyal
share: move share safe functionality out of experimental...
r47052 SHARESAFE_REQUIREMENT = b'share-safe'
Pulkit Goyal
share: introduce config option to store requires in .hg/store...
r46055
requirements: move "bookmark in store" requirements in the right module...
r49445 # Bookmarks must be stored in the `store` part of the repository and will be
# share accross shares
BOOKMARKS_IN_STORE_REQUIREMENT = b'bookmarksinstore'
Pulkit Goyal
requirements: introduce a set of working directory specific requirements...
r45934 # List of requirements which are working directory specific
# These requirements cannot be shared between repositories if they
# share the same store
Pulkit Goyal
requirements: introduce constants for `shared` and `relshared` requirements...
r45946 # * sparse is a working directory specific functionality and hence working
# directory specific requirement
# * SHARED_REQUIREMENT and RELATIVE_SHARED_REQUIREMENT are requirements which
# represents that the current working copy/repository shares store of another
# repo. Hence both of them should be stored in working copy
Pulkit Goyal
share: introduce config option to store requires in .hg/store...
r46055 # * SHARESAFE_REQUIREMENT needs to be stored in working dir to mark that rest of
# the requirements are stored in store's requires
Simon Sapin
dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement...
r48052 # * DIRSTATE_V2_REQUIREMENT affects .hg/dirstate, of which there is one per
# working directory.
Pulkit Goyal
requirements: introduce constants for `shared` and `relshared` requirements...
r45946 WORKING_DIR_REQUIREMENTS = {
SPARSE_REQUIREMENT,
SHARED_REQUIREMENT,
RELATIVE_SHARED_REQUIREMENT,
Pulkit Goyal
share: introduce config option to store requires in .hg/store...
r46055 SHARESAFE_REQUIREMENT,
tracked-key: remove the dual write and rename to tracked-hint...
r49644 DIRSTATE_TRACKED_HINT_V1,
Simon Sapin
dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement...
r48052 DIRSTATE_V2_REQUIREMENT,
Pulkit Goyal
requirements: introduce constants for `shared` and `relshared` requirements...
r45946 }
stream-clone: add a explicit set list requirements relevant to stream clone...
r49447
# List of requirement that impact "stream-clone" (and hardlink clone) and
# cannot be changed in such cases.
#
# requirements not in this list are safe to be altered during stream-clone.
#
# note: the list is currently inherited from previous code and miss some relevant requirement while containing some irrelevant ones.
STREAM_FIXED_REQUIREMENTS = {
BOOKMARKS_IN_STORE_REQUIREMENT,
CHANGELOGV2_REQUIREMENT,
COPIESSDC_REQUIREMENT,
GENERALDELTA_REQUIREMENT,
stream-clone: stop considering working copy only requirements...
r49500 INTERNAL_PHASE_REQUIREMENT,
requirements: add an official `REVLOG_COMPRESSION_ZSTD` const...
r49498 REVLOG_COMPRESSION_ZSTD,
stream-clone: add a explicit set list requirements relevant to stream clone...
r49447 REVLOGV1_REQUIREMENT,
REVLOGV2_REQUIREMENT,
SPARSEREVLOG_REQUIREMENT,
TREEMANIFEST_REQUIREMENT,
}