author | Yuya Nishihara <yuya@tcha.org> |
Thu, 14 Jun 2018 20:25:51 +0900 | |
changeset 38309 | 93b812d5b818 |
parent 38128 | 1cba497491be |
child 38836 | fed6fe856333 |
permissions | -rw-r--r-- |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
1 |
# narrowdirstate.py - extensions to mercurial dirstate to support narrow clones |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
2 |
# |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
3 |
# Copyright 2017 Google, Inc. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
4 |
# |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
5 |
# This software may be used and distributed according to the terms of the |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
6 |
# GNU General Public License version 2 or any later version. |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
7 |
|
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
8 |
from __future__ import absolute_import |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
9 |
|
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
10 |
from mercurial.i18n import _ |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
11 |
from mercurial import ( |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
12 |
error, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
13 |
match as matchmod, |
36160
9fd8c2a3db5a
narrowspec: move module into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36079
diff
changeset
|
14 |
narrowspec, |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
15 |
util as hgutil, |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
16 |
) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
17 |
|
38128
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
18 |
def wrapdirstate(repo, dirstate): |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
19 |
"""Add narrow spec dirstate ignore, block changes outside narrow spec.""" |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
20 |
|
38128
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
21 |
def _editfunc(fn): |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
22 |
def _wrapper(self, *args): |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
23 |
dirstate = repo.dirstate |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
24 |
narrowmatch = repo.narrowmatch() |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
25 |
for f in args: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
26 |
if f is not None and not narrowmatch(f) and f not in dirstate: |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
27 |
raise error.Abort(_("cannot track '%s' - it is outside " + |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
28 |
"the narrow clone") % f) |
38128
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
29 |
return fn(self, *args) |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
30 |
return _wrapper |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
31 |
|
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
32 |
def _narrowbackupname(backupname): |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
33 |
assert 'dirstate' in backupname |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
34 |
return backupname.replace('dirstate', narrowspec.FILENAME) |
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
35 |
|
38128
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
36 |
class narrowdirstate(dirstate.__class__): |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
37 |
def walk(self, match, subrepos, unknown, ignored, full=True, |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
38 |
narrowonly=True): |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
39 |
if narrowonly: |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
40 |
# hack to not exclude explicitly-specified paths so that they |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
41 |
# can be warned later on e.g. dirstate.add() |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
42 |
em = matchmod.exact(match._root, match._cwd, match.files()) |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
43 |
nm = matchmod.unionmatcher([repo.narrowmatch(), em]) |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
44 |
match = matchmod.intersectmatchers(match, nm) |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
45 |
return super(narrowdirstate, self).walk(match, subrepos, unknown, |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
46 |
ignored, full) |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
47 |
|
38128
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
48 |
# Prevent adding/editing/copying/deleting files that are outside the |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
49 |
# sparse checkout |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
50 |
@_editfunc |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
51 |
def normal(self, *args): |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
52 |
return super(narrowdirstate, self).normal(*args) |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
53 |
|
38128
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
54 |
@_editfunc |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
55 |
def add(self, *args): |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
56 |
return super(narrowdirstate, self).add(*args) |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
57 |
|
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
58 |
@_editfunc |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
59 |
def normallookup(self, *args): |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
60 |
return super(narrowdirstate, self).normallookup(*args) |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
61 |
|
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
62 |
@_editfunc |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
63 |
def copy(self, *args): |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
64 |
return super(narrowdirstate, self).copy(*args) |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
65 |
|
38128
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
66 |
@_editfunc |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
67 |
def remove(self, *args): |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
68 |
return super(narrowdirstate, self).remove(*args) |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
69 |
|
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
70 |
@_editfunc |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
71 |
def merge(self, *args): |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
72 |
return super(narrowdirstate, self).merge(*args) |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
73 |
|
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
74 |
def rebuild(self, parent, allfiles, changedfiles=None): |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
75 |
if changedfiles is None: |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
76 |
# Rebuilding entire dirstate, let's filter allfiles to match the |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
77 |
# narrowspec. |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
78 |
allfiles = [f for f in allfiles if repo.narrowmatch()(f)] |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
79 |
super(narrowdirstate, self).rebuild(parent, allfiles, changedfiles) |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
80 |
|
38128
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
81 |
def restorebackup(self, tr, backupname): |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
82 |
self._opener.rename(_narrowbackupname(backupname), |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
83 |
narrowspec.FILENAME, checkambig=True) |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
84 |
super(narrowdirstate, self).restorebackup(tr, backupname) |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
85 |
|
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
86 |
def savebackup(self, tr, backupname): |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
87 |
super(narrowdirstate, self).savebackup(tr, backupname) |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
88 |
|
38128
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
89 |
narrowbackupname = _narrowbackupname(backupname) |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
90 |
self._opener.tryunlink(narrowbackupname) |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
91 |
hgutil.copyfile(self._opener.join(narrowspec.FILENAME), |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
92 |
self._opener.join(narrowbackupname), hardlink=True) |
36079
a2a6e724d61a
narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
93 |
|
38128
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
94 |
def clearbackup(self, tr, backupname): |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
95 |
super(narrowdirstate, self).clearbackup(tr, backupname) |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
96 |
self._opener.unlink(_narrowbackupname(backupname)) |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
97 |
|
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
98 |
dirstate.__class__ = narrowdirstate |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
36200
diff
changeset
|
99 |
return dirstate |