Mercurial > hg
view mercurial/interfaces/dirstate.py @ 43299:83bb1e89ab9b
copies: compute the exact set of revision to walk
This change make the code clearer by removing the revision queue. It comes
without very noticeable performance impact. However the simpler code will be
easier to update in later changesets.
revision: large amount; added files: large amount; rename small amount; c3b14617fbd7 9ba6ab77fd29
before: ! wall 1.430082 comb 1.430000 user 1.390000 sys 0.040000 (median of 10)
after: ! wall 1.405192 comb 1.410000 user 1.390000 sys 0.020000 (median of 10)
revision: large amount; added files: small amount; rename small amount; c3b14617fbd7 f650a9b140d2
before: ! wall 1.971366 comb 1.970000 user 1.950000 sys 0.020000 (median of 10)
after: ! wall 1.892541 comb 1.890000 user 1.870000 sys 0.020000 (median of 10)
revision: large amount; added files: large amount; rename large amount; 08ea3258278e d9fa043f30c0
before: ! wall 0.252594 comb 0.250000 user 0.240000 sys 0.010000 (median of 38)
after: ! wall 0.240075 comb 0.240000 user 0.240000 sys 0.000000 (median of 40)
revision: small amount; added files: large amount; rename large amount; df6f7a526b60 a83dc6a2d56f
before: ! wall 0.013100 comb 0.010000 user 0.010000 sys 0.000000 (median of 226)
after: ! wall 0.013247 comb 0.010000 user 0.010000 sys 0.000000 (median of 223)
revision: small amount; added files: large amount; rename small amount; 4aa4e1f8e19a 169138063d63
before: ! wall 0.001633 comb 0.000000 user 0.000000 sys 0.000000 (median of 1000)
after: ! wall 0.001670 comb 0.000000 user 0.000000 sys 0.000000 (median of 1000)
revision: small amount; added files: small amount; rename small amount; 4bc173b045a6 964879152e2e
before: ! wall 0.000078 comb 0.000000 user 0.000000 sys 0.000000 (median of 11984)
after: ! wall 0.000119 comb 0.000000 user 0.000000 sys 0.000000 (median of 7982)
revision: medium amount; added files: large amount; rename medium amount; c95f1ced15f2 2c68e87c3efe
before: ! wall 0.207093 comb 0.210000 user 0.210000 sys 0.000000 (median of 47)
after: ! wall 0.201551 comb 0.200000 user 0.200000 sys 0.000000 (median of 48)
revision: medium amount; added files: medium amount; rename small amount; d343da0c55a8 d7746d32bf9d
before: ! wall 0.038462 comb 0.040000 user 0.040000 sys 0.000000 (median of 100)
after: ! wall 0.036578 comb 0.030000 user 0.030000 sys 0.000000 (median of 100)
Differential Revision: https://phab.mercurial-scm.org/D7076
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Sat, 12 Oct 2019 18:35:14 +0200 |
parents | 687b865b95ad |
children | be8552f25cab |
line wrap: on
line source
from __future__ import absolute_import, print_function import contextlib from .. import node as nodemod from . import util as interfaceutil class idirstate(interfaceutil.Interface): def __init__(opener, ui, root, validate, sparsematchfn): '''Create a new dirstate object. opener is an open()-like callable that can be used to open the dirstate file; root is the root of the directory tracked by the dirstate. ''' # TODO: all these private methods and attributes should be made # public or removed from the interface. _ignore = interfaceutil.Attribute("""Matcher for ignored files.""") def _ignorefiles(): """Return a list of files containing patterns to ignore.""" def _ignorefileandline(f): b"Given a file `f`, return the ignore file and line that ignores it." _checklink = interfaceutil.Attribute("""Callable for checking symlinks.""") _checkexec = interfaceutil.Attribute("""Callable for checking exec bits.""") @contextlib.contextmanager def parentchange(): '''Context manager for handling dirstate parents. If an exception occurs in the scope of the context manager, the incoherent dirstate won't be written when wlock is released. ''' def pendingparentchange(): '''Returns true if the dirstate is in the middle of a set of changes that modify the dirstate parent. ''' def hasdir(d): pass def flagfunc(buildfallback): pass def getcwd(): '''Return the path from which a canonical path is calculated. This path should be used to resolve file patterns or to convert canonical paths back to file paths for display. It shouldn't be used to get real file paths. Use vfs functions instead. ''' def pathto(f, cwd=None): pass def __getitem__(key): '''Return the current state of key (a filename) in the dirstate. States are: n normal m needs merging r marked for removal a marked for addition ? not tracked ''' def __contains__(key): """Check if bytestring `key` is known to the dirstate.""" def __iter__(): """Iterate the dirstate's contained filenames as bytestrings.""" def items(): """Iterate the dirstate's entries as (filename, dirstatetuple). As usual, filename is a bytestring. """ iteritems = items def parents(): pass def p1(): pass def p2(): pass def branch(): pass def setparents(p1, p2=nodemod.nullid): """Set dirstate parents to p1 and p2. When moving from two parents to one, 'm' merged entries a adjusted to normal and previous copy records discarded and returned by the call. See localrepo.setparents() """ def setbranch(branch): pass def invalidate(): '''Causes the next access to reread the dirstate. This is different from localrepo.invalidatedirstate() because it always rereads the dirstate. Use localrepo.invalidatedirstate() if you want to check whether the dirstate has changed before rereading it.''' def copy(source, dest): """Mark dest as a copy of source. Unmark dest if source is None.""" def copied(file): pass def copies(): pass def normal(f, parentfiledata=None): '''Mark a file normal and clean. parentfiledata: (mode, size, mtime) of the clean file parentfiledata should be computed from memory (for mode, size), as or close as possible from the point where we determined the file was clean, to limit the risk of the file having been changed by an external process between the moment where the file was determined to be clean and now.''' pass def normallookup(f): '''Mark a file normal, but possibly dirty.''' def otherparent(f): '''Mark as coming from the other parent, always dirty.''' def add(f): '''Mark a file added.''' def remove(f): '''Mark a file removed.''' def merge(f): '''Mark a file merged.''' def drop(f): '''Drop a file from the dirstate''' def normalize(path, isknown=False, ignoremissing=False): ''' normalize the case of a pathname when on a casefolding filesystem isknown specifies whether the filename came from walking the disk, to avoid extra filesystem access. If ignoremissing is True, missing path are returned unchanged. Otherwise, we try harder to normalize possibly existing path components. The normalized case is determined based on the following precedence: - version of name already stored in the dirstate - version of name stored on disk - version provided via command arguments ''' def clear(): pass def rebuild(parent, allfiles, changedfiles=None): pass def identity(): '''Return identity of dirstate it to detect changing in storage If identity of previous dirstate is equal to this, writing changes based on the former dirstate out can keep consistency. ''' def write(tr): pass def addparentchangecallback(category, callback): """add a callback to be called when the wd parents are changed Callback will be called with the following arguments: dirstate, (oldp1, oldp2), (newp1, newp2) Category is a unique identifier to allow overwriting an old callback with a newer callback. """ def walk(match, subrepos, unknown, ignored, full=True): ''' Walk recursively through the directory tree, finding all files matched by match. If full is False, maybe skip some known-clean files. Return a dict mapping filename to stat-like object (either mercurial.osutil.stat instance or return value of os.stat()). ''' def status(match, subrepos, ignored, clean, unknown): '''Determine the status of the working copy relative to the dirstate and return a pair of (unsure, status), where status is of type scmutil.status and: unsure: files that might have been modified since the dirstate was written, but need to be read to be sure (size is the same but mtime differs) status.modified: files that have definitely been modified since the dirstate was written (different size or mode) status.clean: files that have definitely not been modified since the dirstate was written ''' def matches(match): ''' return files in the dirstate (in whatever state) filtered by match ''' def savebackup(tr, backupname): '''Save current dirstate into backup file''' def restorebackup(tr, backupname): '''Restore dirstate by backup file''' def clearbackup(tr, backupname): '''Clear backup file'''