dirstate.py
227 lines
| 6.8 KiB
| text/x-python
|
PythonLexer
Matt Harbison
|
r52756 | from __future__ import annotations | ||
Augie Fackler
|
r43197 | import contextlib | ||
Matt Harbison
|
r52814 | from typing import ( | ||
Protocol, | ||||
) | ||||
Augie Fackler
|
r43346 | from . import util as interfaceutil | ||
Augie Fackler
|
r43197 | |||
Matt Harbison
|
r52814 | class idirstate(Protocol): | ||
# TODO: convert these constructor args to fields? | ||||
# def __init__( | ||||
# self, | ||||
# opener, | ||||
# ui, | ||||
# root, | ||||
# validate, | ||||
# sparsematchfn, | ||||
# nodeconstants, | ||||
# use_dirstate_v2, | ||||
# use_tracked_hint=False, | ||||
# ): | ||||
# """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. | ||||
# """ | ||||
Augie Fackler
|
r43197 | |||
Augie Fackler
|
r43199 | # TODO: all these private methods and attributes should be made | ||
# public or removed from the interface. | ||||
Gregory Szorc
|
r43278 | _ignore = interfaceutil.Attribute("""Matcher for ignored files.""") | ||
r50918 | is_changing_any = interfaceutil.Attribute( | |||
"""True if any changes in progress.""" | ||||
) | ||||
r50917 | is_changing_parents = interfaceutil.Attribute( | |||
"""True if parents changes in progress.""" | ||||
) | ||||
r50921 | is_changing_files = interfaceutil.Attribute( | |||
"""True if file tracking changes in progress.""" | ||||
) | ||||
Augie Fackler
|
r43199 | |||
Matt Harbison
|
r52815 | def _ignorefiles(self): | ||
Augie Fackler
|
r43199 | """Return a list of files containing patterns to ignore.""" | ||
Matt Harbison
|
r52815 | def _ignorefileandline(self, f): | ||
Matt Harbison
|
r44226 | """Given a file `f`, return the ignore file and line that ignores it.""" | ||
Augie Fackler
|
r43199 | |||
Gregory Szorc
|
r43278 | _checklink = interfaceutil.Attribute("""Callable for checking symlinks.""") | ||
_checkexec = interfaceutil.Attribute("""Callable for checking exec bits.""") | ||||
Augie Fackler
|
r43199 | |||
Augie Fackler
|
r43197 | @contextlib.contextmanager | ||
Matt Harbison
|
r52815 | def changing_parents(self, repo): | ||
Augie Fackler
|
r46554 | """Context manager for handling dirstate parents. | ||
Augie Fackler
|
r43197 | |||
If an exception occurs in the scope of the context manager, | ||||
the incoherent dirstate won't be written when wlock is | ||||
released. | ||||
Augie Fackler
|
r46554 | """ | ||
Augie Fackler
|
r43197 | |||
r50921 | @contextlib.contextmanager | |||
Matt Harbison
|
r52815 | def changing_files(self, repo): | ||
r50921 | """Context manager for handling dirstate files. | |||
If an exception occurs in the scope of the context manager, | ||||
the incoherent dirstate won't be written when wlock is | ||||
released. | ||||
""" | ||||
Matt Harbison
|
r52815 | def hasdir(self, d): | ||
Augie Fackler
|
r43197 | pass | ||
Matt Harbison
|
r52815 | def flagfunc(self, buildfallback): | ||
r50775 | """build a callable that returns flags associated with a filename | |||
The information is extracted from three possible layers: | ||||
1. the file system if it supports the information | ||||
2. the "fallback" information stored in the dirstate if any | ||||
3. a more expensive mechanism inferring the flags from the parents. | ||||
""" | ||||
Augie Fackler
|
r43197 | |||
Matt Harbison
|
r52815 | def getcwd(self): | ||
Augie Fackler
|
r46554 | """Return the path from which a canonical path is calculated. | ||
Augie Fackler
|
r43197 | |||
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. | ||||
Augie Fackler
|
r46554 | """ | ||
Augie Fackler
|
r43197 | |||
Matt Harbison
|
r52815 | def pathto(self, f, cwd=None): | ||
r50776 | pass | |||
Matt Harbison
|
r52815 | def get_entry(self, path): | ||
Matt Harbison
|
r49967 | """return a DirstateItem for the associated path""" | ||
Matt Harbison
|
r52815 | def __contains__(self, key): | ||
Augie Fackler
|
r43197 | """Check if bytestring `key` is known to the dirstate.""" | ||
Matt Harbison
|
r52815 | def __iter__(self): | ||
Augie Fackler
|
r43197 | """Iterate the dirstate's contained filenames as bytestrings.""" | ||
Matt Harbison
|
r52815 | def items(self): | ||
r48328 | """Iterate the dirstate's entries as (filename, DirstateItem. | |||
Augie Fackler
|
r43197 | |||
As usual, filename is a bytestring. | ||||
""" | ||||
iteritems = items | ||||
Matt Harbison
|
r52815 | def parents(self): | ||
Augie Fackler
|
r43197 | pass | ||
Matt Harbison
|
r52815 | def p1(self): | ||
Augie Fackler
|
r43197 | pass | ||
Matt Harbison
|
r52815 | def p2(self): | ||
Augie Fackler
|
r43197 | pass | ||
Matt Harbison
|
r52815 | def branch(self): | ||
Augie Fackler
|
r43197 | pass | ||
Matt Harbison
|
r52815 | def setparents(self, p1, p2=None): | ||
Augie Fackler
|
r43197 | """Set dirstate parents to p1 and p2. | ||
r50775 | When moving from two parents to one, "merged" entries a | |||
Augie Fackler
|
r43197 | adjusted to normal and previous copy records discarded and | ||
returned by the call. | ||||
See localrepo.setparents() | ||||
""" | ||||
Matt Harbison
|
r52815 | def setbranch(self, branch, transaction): | ||
Augie Fackler
|
r43197 | pass | ||
Matt Harbison
|
r52815 | def invalidate(self): | ||
Augie Fackler
|
r46554 | """Causes the next access to reread the dirstate. | ||
Augie Fackler
|
r43197 | |||
This is different from localrepo.invalidatedirstate() because it always | ||||
rereads the dirstate. Use localrepo.invalidatedirstate() if you want to | ||||
Augie Fackler
|
r46554 | check whether the dirstate has changed before rereading it.""" | ||
Augie Fackler
|
r43197 | |||
Matt Harbison
|
r52815 | def copy(self, source, dest): | ||
Augie Fackler
|
r43197 | """Mark dest as a copy of source. Unmark dest if source is None.""" | ||
Matt Harbison
|
r52815 | def copied(self, file): | ||
Augie Fackler
|
r43197 | pass | ||
Matt Harbison
|
r52815 | def copies(self): | ||
Augie Fackler
|
r43197 | pass | ||
Matt Harbison
|
r52815 | def normalize(self, path, isknown=False, ignoremissing=False): | ||
Augie Fackler
|
r46554 | """ | ||
Augie Fackler
|
r43197 | 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 | ||||
Augie Fackler
|
r46554 | """ | ||
Augie Fackler
|
r43197 | |||
Matt Harbison
|
r52815 | def clear(self): | ||
Augie Fackler
|
r43197 | pass | ||
Matt Harbison
|
r52815 | def rebuild(self, parent, allfiles, changedfiles=None): | ||
Augie Fackler
|
r43197 | pass | ||
Matt Harbison
|
r52815 | def write(self, tr): | ||
Augie Fackler
|
r43197 | pass | ||
Matt Harbison
|
r52815 | def addparentchangecallback(self, category, callback): | ||
Augie Fackler
|
r43197 | """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. | ||||
""" | ||||
Matt Harbison
|
r52815 | def walk(self, match, subrepos, unknown, ignored, full=True): | ||
Augie Fackler
|
r46554 | """ | ||
Augie Fackler
|
r43197 | 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()). | ||||
Augie Fackler
|
r46554 | """ | ||
Augie Fackler
|
r43197 | |||
Matt Harbison
|
r52815 | def status(self, match, subrepos, ignored, clean, unknown): | ||
Augie Fackler
|
r46554 | """Determine the status of the working copy relative to the | ||
Augie Fackler
|
r43197 | 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 | ||||
Augie Fackler
|
r46554 | """ | ||
Augie Fackler
|
r43197 | |||
Matt Harbison
|
r52815 | def matches(self, match): | ||
Augie Fackler
|
r46554 | """ | ||
Augie Fackler
|
r43197 | return files in the dirstate (in whatever state) filtered by match | ||
Augie Fackler
|
r46554 | """ | ||
Augie Fackler
|
r43197 | |||
Matt Harbison
|
r52815 | def verify(self, m1, m2, p1, narrow_matcher=None): | ||
r50777 | """ | |||
check the dirstate contents against the parent manifest and yield errors | ||||
""" | ||||