Mercurial > hg
annotate hgext/largefiles/reposetup.py @ 23958:df463ca0adef stable
largefiles: revert to lfilesrepo.status() being an unfiltered method
This effectively reverts 67d63ec85eb7, which caused some normal file copies to
not be displayed as copies. Other normal file copies could be displayed- the
exact reason isn't clear. This also adds two tests that were failing prior to
this backout, so that this can be sorted out next cycle.
The difference between copy cases that worked and those that didn't seemed to be
in copies.pathcopies(). When largefiles isn't enabled for the changed test, or
lfstatus is not set in the commands.status() override, 'y.ancestor(x) == x'.
That wasn't true otherwise, which fell through to the _chain() method. In this
case, the copy is removed in the criss cross loop.
'y.ancestor(x)' returns a context.changectx type, while 'x' is a lfilesctx type
in the failing case. I tried adding the ancestor method to the lfilesctx class
to change the type of the ancestor context, however the context when printed as
a string then gains a '+'. This points to it being a context.committablectx,
which clearly isn't correct for an ancestor. Possibly the problem is the
lfilesctx needs to subclass context.committablectx in some cases, but
context.changectx in others, within the same invocation? I'm not sure how to
pull that off, and backing out this change is safer during the freeze.
As to the status changing when a path is specified, I haven't looked into it
yet.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Sun, 25 Jan 2015 22:55:10 -0500 |
parents | ab6fd3205dad |
children | 240343e13c4d d414c28db84d |
rev | line source |
---|---|
15168 | 1 # Copyright 2009-2010 Gregory P. Ward |
2 # Copyright 2009-2010 Intelerad Medical Systems Incorporated | |
3 # Copyright 2010-2011 Fog Creek Software | |
4 # Copyright 2010-2011 Unity Technologies | |
5 # | |
6 # This software may be used and distributed according to the terms of the | |
7 # GNU General Public License version 2 or any later version. | |
8 | |
9 '''setup for largefiles repositories: reposetup''' | |
10 import copy | |
11 import os | |
12 | |
21044
52a5eabf1f2f
largefiles: reuse "findcommonoutgoing()" result at "hg push"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21042
diff
changeset
|
13 from mercurial import error, manifest, match as match_, util |
15168 | 14 from mercurial.i18n import _ |
23958
df463ca0adef
largefiles: revert to lfilesrepo.status() being an unfiltered method
Matt Harbison <matt_harbison@yahoo.com>
parents:
23923
diff
changeset
|
15 from mercurial import scmutil, localrepo |
15168 | 16 |
17 import lfcommands | |
18 import lfutil | |
19 | |
20 def reposetup(ui, repo): | |
20858
bc56ec9e64df
hg: introduce "wirepeersetupfuncs" to setup wire peer by extensions (issue4109)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20177
diff
changeset
|
21 # wire repositories should be given new wireproto functions |
bc56ec9e64df
hg: introduce "wirepeersetupfuncs" to setup wire peer by extensions (issue4109)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20177
diff
changeset
|
22 # by "proto.wirereposetup()" via "hg.wirepeersetupfuncs" |
15168 | 23 if not repo.local(): |
20858
bc56ec9e64df
hg: introduce "wirepeersetupfuncs" to setup wire peer by extensions (issue4109)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20177
diff
changeset
|
24 return |
15168 | 25 |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
26 class lfilesrepo(repo.__class__): |
15168 | 27 lfstatus = False |
28 def status_nolfiles(self, *args, **kwargs): | |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
29 return super(lfilesrepo, self).status(*args, **kwargs) |
15168 | 30 |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15250
diff
changeset
|
31 # When lfstatus is set, return a context that gives the names |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15250
diff
changeset
|
32 # of largefiles instead of their corresponding standins and |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15250
diff
changeset
|
33 # identifies the largefiles as always binary, regardless of |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15250
diff
changeset
|
34 # their actual contents. |
15168 | 35 def __getitem__(self, changeid): |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
36 ctx = super(lfilesrepo, self).__getitem__(changeid) |
23958
df463ca0adef
largefiles: revert to lfilesrepo.status() being an unfiltered method
Matt Harbison <matt_harbison@yahoo.com>
parents:
23923
diff
changeset
|
37 if self.lfstatus: |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
38 class lfilesmanifestdict(manifest.manifestdict): |
15168 | 39 def __contains__(self, filename): |
22516
5e27eccbc0a4
largefiles: extract 'orig' method in lfilesmanifestdict.__contains__
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22515
diff
changeset
|
40 orig = super(lfilesmanifestdict, self).__contains__ |
5e27eccbc0a4
largefiles: extract 'orig' method in lfilesmanifestdict.__contains__
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22515
diff
changeset
|
41 return orig(filename) or orig(lfutil.standin(filename)) |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
42 class lfilesctx(ctx.__class__): |
15168 | 43 def files(self): |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
44 filenames = super(lfilesctx, self).files() |
15628
2b40513384ca
largefiles: use lfutil functions
Martin Geisler <mg@aragost.com>
parents:
15626
diff
changeset
|
45 return [lfutil.splitstandin(f) or f for f in filenames] |
15168 | 46 def manifest(self): |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
47 man1 = super(lfilesctx, self).manifest() |
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
48 man1.__class__ = lfilesmanifestdict |
15168 | 49 return man1 |
50 def filectx(self, path, fileid=None, filelog=None): | |
22517
e54a001ace06
largefiles: extract 'orig' method in lfilesctx.filectx
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22516
diff
changeset
|
51 orig = super(lfilesctx, self).filectx |
15168 | 52 try: |
16141
f346de4dff57
largefiles: don't break filesets
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
16110
diff
changeset
|
53 if filelog is not None: |
22517
e54a001ace06
largefiles: extract 'orig' method in lfilesctx.filectx
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22516
diff
changeset
|
54 result = orig(path, fileid, filelog) |
16141
f346de4dff57
largefiles: don't break filesets
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
16110
diff
changeset
|
55 else: |
22517
e54a001ace06
largefiles: extract 'orig' method in lfilesctx.filectx
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22516
diff
changeset
|
56 result = orig(path, fileid) |
15168 | 57 except error.LookupError: |
58 # Adding a null character will cause Mercurial to | |
59 # identify this as a binary file. | |
16141
f346de4dff57
largefiles: don't break filesets
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
16110
diff
changeset
|
60 if filelog is not None: |
22517
e54a001ace06
largefiles: extract 'orig' method in lfilesctx.filectx
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22516
diff
changeset
|
61 result = orig(lfutil.standin(path), fileid, |
e54a001ace06
largefiles: extract 'orig' method in lfilesctx.filectx
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22516
diff
changeset
|
62 filelog) |
16141
f346de4dff57
largefiles: don't break filesets
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
16110
diff
changeset
|
63 else: |
22517
e54a001ace06
largefiles: extract 'orig' method in lfilesctx.filectx
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22516
diff
changeset
|
64 result = orig(lfutil.standin(path), fileid) |
15168 | 65 olddata = result.data |
66 result.data = lambda: olddata() + '\0' | |
67 return result | |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
68 ctx.__class__ = lfilesctx |
15168 | 69 return ctx |
70 | |
71 # Figure out the status of big files and insert them into the | |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15250
diff
changeset
|
72 # appropriate list in the result. Also removes standin files |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15250
diff
changeset
|
73 # from the listing. Revert to the original status if |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15250
diff
changeset
|
74 # self.lfstatus is False. |
23958
df463ca0adef
largefiles: revert to lfilesrepo.status() being an unfiltered method
Matt Harbison <matt_harbison@yahoo.com>
parents:
23923
diff
changeset
|
75 # XXX large file status is buggy when used on repo proxy. |
df463ca0adef
largefiles: revert to lfilesrepo.status() being an unfiltered method
Matt Harbison <matt_harbison@yahoo.com>
parents:
23923
diff
changeset
|
76 # XXX this needs to be investigated. |
df463ca0adef
largefiles: revert to lfilesrepo.status() being an unfiltered method
Matt Harbison <matt_harbison@yahoo.com>
parents:
23923
diff
changeset
|
77 @localrepo.unfilteredmethod |
15168 | 78 def status(self, node1='.', node2=None, match=None, ignored=False, |
79 clean=False, unknown=False, listsubrepos=False): | |
80 listignored, listclean, listunknown = ignored, clean, unknown | |
22518
52dd6e25121f
largefiles: extract 'orig' method in reposetup.status
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22517
diff
changeset
|
81 orig = super(lfilesrepo, self).status |
23958
df463ca0adef
largefiles: revert to lfilesrepo.status() being an unfiltered method
Matt Harbison <matt_harbison@yahoo.com>
parents:
23923
diff
changeset
|
82 if not self.lfstatus: |
22518
52dd6e25121f
largefiles: extract 'orig' method in reposetup.status
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22517
diff
changeset
|
83 return orig(node1, node2, match, listignored, listclean, |
52dd6e25121f
largefiles: extract 'orig' method in reposetup.status
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22517
diff
changeset
|
84 listunknown, listsubrepos) |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
85 |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
86 # some calls in this function rely on the old version of status |
23958
df463ca0adef
largefiles: revert to lfilesrepo.status() being an unfiltered method
Matt Harbison <matt_harbison@yahoo.com>
parents:
23923
diff
changeset
|
87 self.lfstatus = False |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
88 ctx1 = self[node1] |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
89 ctx2 = self[node2] |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
90 working = ctx2.rev() is None |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
91 parentworking = working and ctx1 == self['.'] |
15168 | 92 |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
93 if match is None: |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
94 match = match_.always(self.root, self.getcwd()) |
15168 | 95 |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
96 wlock = None |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
97 try: |
19056
ac41bb76c737
largefiles: wlock in status before lfdirstate.write()
Mads Kiilerich <madski@unity3d.com>
parents:
18969
diff
changeset
|
98 try: |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
99 # updating the dirstate is optional |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
100 # so we don't wait on the lock |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
101 wlock = self.wlock(False) |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
102 except error.LockError: |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
103 pass |
15653
93c77d5b9752
largefiles: optimize status when files are specified (issue3144)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15630
diff
changeset
|
104 |
23146
5311de37b86f
largefiles: shortcircuit status code also for non-matching patterns
Martin von Zweigbergk <martinvonz@google.com>
parents:
23139
diff
changeset
|
105 # First check if paths or patterns were specified on the |
5311de37b86f
largefiles: shortcircuit status code also for non-matching patterns
Martin von Zweigbergk <martinvonz@google.com>
parents:
23139
diff
changeset
|
106 # command line. If there were, and they don't match any |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
107 # largefiles, we should just bail here and let super |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
108 # handle it -- thus gaining a big performance boost. |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
109 lfdirstate = lfutil.openlfdirstate(ui, self) |
23146
5311de37b86f
largefiles: shortcircuit status code also for non-matching patterns
Martin von Zweigbergk <martinvonz@google.com>
parents:
23139
diff
changeset
|
110 if not match.always(): |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
111 for f in lfdirstate: |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
112 if match(f): |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
113 break |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
114 else: |
22518
52dd6e25121f
largefiles: extract 'orig' method in reposetup.status
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22517
diff
changeset
|
115 return orig(node1, node2, match, listignored, listclean, |
52dd6e25121f
largefiles: extract 'orig' method in reposetup.status
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22517
diff
changeset
|
116 listunknown, listsubrepos) |
15168 | 117 |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
118 # Create a copy of match that matches standins instead |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
119 # of largefiles. |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
120 def tostandins(files): |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
121 if not working: |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
122 return files |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
123 newfiles = [] |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
124 dirstate = self.dirstate |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
125 for f in files: |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
126 sf = lfutil.standin(f) |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
127 if sf in dirstate: |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
128 newfiles.append(sf) |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
129 elif sf in dirstate.dirs(): |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
130 # Directory entries could be regular or |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
131 # standin, check both |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
132 newfiles.extend((f, sf)) |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
133 else: |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
134 newfiles.append(f) |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
135 return newfiles |
18149
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
136 |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
137 m = copy.copy(match) |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
138 m._files = tostandins(m._files) |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
139 |
22518
52dd6e25121f
largefiles: extract 'orig' method in reposetup.status
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22517
diff
changeset
|
140 result = orig(node1, node2, m, ignored, clean, unknown, |
52dd6e25121f
largefiles: extract 'orig' method in reposetup.status
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22517
diff
changeset
|
141 listsubrepos) |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
142 if working: |
15617
74e691b141c4
largefiles: optimize performance of status on largefiles repos (issue3136)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15385
diff
changeset
|
143 |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
144 def sfindirstate(f): |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
145 sf = lfutil.standin(f) |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
146 dirstate = self.dirstate |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
147 return sf in dirstate or sf in dirstate.dirs() |
18149
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
148 |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
149 match._files = [f for f in match._files |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
150 if sfindirstate(f)] |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
151 # Don't waste time getting the ignored and unknown |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
152 # files from lfdirstate |
22911
509e2cbee679
dirstate: separate 'lookup' status field from others
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22525
diff
changeset
|
153 unsure, s = lfdirstate.status(match, [], False, listclean, |
509e2cbee679
dirstate: separate 'lookup' status field from others
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22525
diff
changeset
|
154 False) |
22919
1982bdb7e2cc
largefiles: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22914
diff
changeset
|
155 (modified, added, removed, clean) = (s.modified, s.added, |
1982bdb7e2cc
largefiles: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22914
diff
changeset
|
156 s.removed, s.clean) |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
157 if parentworking: |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
158 for lfile in unsure: |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
159 standin = lfutil.standin(lfile) |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
160 if standin not in ctx1: |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
161 # from second parent |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
162 modified.append(lfile) |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
163 elif ctx1[standin].data().strip() \ |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
164 != lfutil.hashfile(self.wjoin(lfile)): |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
165 modified.append(lfile) |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
166 else: |
22523
8cd91f481ffd
largefiles: remove unnecessary clearing of status fields
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22518
diff
changeset
|
167 if listclean: |
8cd91f481ffd
largefiles: remove unnecessary clearing of status fields
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22518
diff
changeset
|
168 clean.append(lfile) |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
169 lfdirstate.normal(lfile) |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
170 else: |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
171 tocheck = unsure + modified + added + clean |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
172 modified, added, clean = [], [], [] |
23383
7f8d27e1f862
largefiles: avoid exec-bit examination on the platform being unaware of it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23090
diff
changeset
|
173 checkexec = self.dirstate._checkexec |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
174 |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
175 for lfile in tocheck: |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
176 standin = lfutil.standin(lfile) |
23043
244dbb646ab7
largefiles: inline redundant inctx function in status
Mads Kiilerich <madski@unity3d.com>
parents:
22919
diff
changeset
|
177 if standin in ctx1: |
23090
24600c9d7f4e
largefiles: add examination of exec bit in "hg status --rev REV" case
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23089
diff
changeset
|
178 abslfile = self.wjoin(lfile) |
24600c9d7f4e
largefiles: add examination of exec bit in "hg status --rev REV" case
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23089
diff
changeset
|
179 if ((ctx1[standin].data().strip() != |
24600c9d7f4e
largefiles: add examination of exec bit in "hg status --rev REV" case
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23089
diff
changeset
|
180 lfutil.hashfile(abslfile)) or |
23383
7f8d27e1f862
largefiles: avoid exec-bit examination on the platform being unaware of it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23090
diff
changeset
|
181 (checkexec and |
7f8d27e1f862
largefiles: avoid exec-bit examination on the platform being unaware of it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23090
diff
changeset
|
182 ('x' in ctx1.flags(standin)) != |
23090
24600c9d7f4e
largefiles: add examination of exec bit in "hg status --rev REV" case
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23089
diff
changeset
|
183 bool(lfutil.getexecutable(abslfile)))): |
15168 | 184 modified.append(lfile) |
22523
8cd91f481ffd
largefiles: remove unnecessary clearing of status fields
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22518
diff
changeset
|
185 elif listclean: |
15168 | 186 clean.append(lfile) |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
187 else: |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
188 added.append(lfile) |
15168 | 189 |
23089
197dc4580da2
largefiles: ignore removal status of files not managed in the target context
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23044
diff
changeset
|
190 # at this point, 'removed' contains largefiles |
197dc4580da2
largefiles: ignore removal status of files not managed in the target context
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23044
diff
changeset
|
191 # marked as 'R' in the working context. |
197dc4580da2
largefiles: ignore removal status of files not managed in the target context
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23044
diff
changeset
|
192 # then, largefiles not managed also in the target |
197dc4580da2
largefiles: ignore removal status of files not managed in the target context
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23044
diff
changeset
|
193 # context should be excluded from 'removed'. |
197dc4580da2
largefiles: ignore removal status of files not managed in the target context
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23044
diff
changeset
|
194 removed = [lfile for lfile in removed |
197dc4580da2
largefiles: ignore removal status of files not managed in the target context
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23044
diff
changeset
|
195 if lfutil.standin(lfile) in ctx1] |
197dc4580da2
largefiles: ignore removal status of files not managed in the target context
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23044
diff
changeset
|
196 |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
197 # Standins no longer found in lfdirstate has been |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
198 # removed |
22525
764127f58903
largefiles: simplify iteration over standins
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22524
diff
changeset
|
199 for standin in ctx1.walk(lfutil.getstandinmatcher(self)): |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
200 lfile = lfutil.splitstandin(standin) |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
201 if not match(lfile): |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
202 continue |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
203 if lfile not in lfdirstate: |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
204 removed.append(lfile) |
15663
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15629
diff
changeset
|
205 |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
206 # Filter result lists |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
207 result = list(result) |
19056
ac41bb76c737
largefiles: wlock in status before lfdirstate.write()
Mads Kiilerich <madski@unity3d.com>
parents:
18969
diff
changeset
|
208 |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
209 # Largefiles are not really removed when they're |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
210 # still in the normal dirstate. Likewise, normal |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
211 # files are not really removed if they are still in |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
212 # lfdirstate. This happens in merges where files |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
213 # change type. |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
214 removed = [f for f in removed |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
215 if f not in self.dirstate] |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
216 result[2] = [f for f in result[2] |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
217 if f not in lfdirstate] |
15663
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15629
diff
changeset
|
218 |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
219 lfiles = set(lfdirstate._map) |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
220 # Unknown files |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
221 result[4] = set(result[4]).difference(lfiles) |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
222 # Ignored files |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
223 result[5] = set(result[5]).difference(lfiles) |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
224 # combine normal files and largefiles |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
225 normals = [[fn for fn in filelist |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
226 if not lfutil.isstandin(fn)] |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
227 for filelist in result] |
22919
1982bdb7e2cc
largefiles: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22914
diff
changeset
|
228 lfstatus = (modified, added, removed, s.deleted, [], [], |
22524
8c8fe120670f
largefiles: avoid using 'lfiles' variable for two purposes
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22523
diff
changeset
|
229 clean) |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
230 result = [sorted(list1 + list2) |
22524
8c8fe120670f
largefiles: avoid using 'lfiles' variable for two purposes
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22523
diff
changeset
|
231 for (list1, list2) in zip(normals, lfstatus)] |
23044
075f55a9c488
largefiles: inline redundant toname function in status
Mads Kiilerich <madski@unity3d.com>
parents:
23043
diff
changeset
|
232 else: # not against working directory |
075f55a9c488
largefiles: inline redundant toname function in status
Mads Kiilerich <madski@unity3d.com>
parents:
23043
diff
changeset
|
233 result = [[lfutil.splitstandin(f) or f for f in items] |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
234 for items in result] |
15663
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15629
diff
changeset
|
235 |
22515
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
236 if wlock: |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
237 lfdirstate.write() |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
238 |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
239 finally: |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
240 if wlock: |
b4e251b7e9a8
largefiles: reduce indentation by dropping 'else' block after 'return'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22514
diff
changeset
|
241 wlock.release() |
15168 | 242 |
23958
df463ca0adef
largefiles: revert to lfilesrepo.status() being an unfiltered method
Matt Harbison <matt_harbison@yahoo.com>
parents:
23923
diff
changeset
|
243 self.lfstatus = True |
22914
c95db3208a33
status: update various other methods to return new class
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22911
diff
changeset
|
244 return scmutil.status(*result) |
15168 | 245 |
23184
3100d1cbce32
largefiles: factor out procedures to update lfdirstate for post-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23147
diff
changeset
|
246 def commitctx(self, ctx, *args, **kwargs): |
3100d1cbce32
largefiles: factor out procedures to update lfdirstate for post-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23147
diff
changeset
|
247 node = super(lfilesrepo, self).commitctx(ctx, *args, **kwargs) |
3100d1cbce32
largefiles: factor out procedures to update lfdirstate for post-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23147
diff
changeset
|
248 class lfilesctx(ctx.__class__): |
3100d1cbce32
largefiles: factor out procedures to update lfdirstate for post-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23147
diff
changeset
|
249 def markcommitted(self, node): |
3100d1cbce32
largefiles: factor out procedures to update lfdirstate for post-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23147
diff
changeset
|
250 orig = super(lfilesctx, self).markcommitted |
3100d1cbce32
largefiles: factor out procedures to update lfdirstate for post-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23147
diff
changeset
|
251 return lfutil.markcommitted(orig, self, node) |
3100d1cbce32
largefiles: factor out procedures to update lfdirstate for post-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23147
diff
changeset
|
252 ctx.__class__ = lfilesctx |
15168 | 253 return node |
254 | |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
255 # Before commit, largefile standins have not had their |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
256 # contents updated to reflect the hash of their largefile. |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
257 # Do that here. |
15168 | 258 def commit(self, text="", user=None, date=None, match=None, |
259 force=False, editor=False, extra={}): | |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
260 orig = super(lfilesrepo, self).commit |
15168 | 261 |
17803
1479572db256
largefile: use `self` in repo method instead of `repo`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17424
diff
changeset
|
262 wlock = self.wlock() |
15168 | 263 try: |
23186
6de61d0b773f
largefiles: introduce "_lfcommithooks" to abstract pre-committing procedures
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23185
diff
changeset
|
264 lfcommithook = self._lfcommithooks[-1] |
6de61d0b773f
largefiles: introduce "_lfcommithooks" to abstract pre-committing procedures
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23185
diff
changeset
|
265 match = lfcommithook(self, match) |
15794
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15793
diff
changeset
|
266 result = orig(text=text, user=user, date=date, match=match, |
15168 | 267 force=force, editor=editor, extra=extra) |
15794
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15793
diff
changeset
|
268 return result |
15168 | 269 finally: |
270 wlock.release() | |
271 | |
272 def push(self, remote, force=False, revs=None, newbranch=False): | |
19779
fb6e87d93948
largefiles: setup "largefiles" feature in each repositories individually
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19570
diff
changeset
|
273 if remote.local(): |
fb6e87d93948
largefiles: setup "largefiles" feature in each repositories individually
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19570
diff
changeset
|
274 missing = set(self.requirements) - remote.local().supported |
fb6e87d93948
largefiles: setup "largefiles" feature in each repositories individually
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19570
diff
changeset
|
275 if missing: |
fb6e87d93948
largefiles: setup "largefiles" feature in each repositories individually
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19570
diff
changeset
|
276 msg = _("required features are not" |
fb6e87d93948
largefiles: setup "largefiles" feature in each repositories individually
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19570
diff
changeset
|
277 " supported in the destination:" |
fb6e87d93948
largefiles: setup "largefiles" feature in each repositories individually
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19570
diff
changeset
|
278 " %s") % (', '.join(sorted(missing))) |
fb6e87d93948
largefiles: setup "largefiles" feature in each repositories individually
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19570
diff
changeset
|
279 raise util.Abort(msg) |
20177
c5f0574034ef
largefiles: call super class method with proper kwargs to respect API
Long Vu <long@tlvu.ca>
parents:
19779
diff
changeset
|
280 return super(lfilesrepo, self).push(remote, force=force, revs=revs, |
c5f0574034ef
largefiles: call super class method with proper kwargs to respect API
Long Vu <long@tlvu.ca>
parents:
19779
diff
changeset
|
281 newbranch=newbranch) |
15168 | 282 |
23185
9870173e0b48
largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23184
diff
changeset
|
283 # TODO: _subdirlfs should be moved into "lfutil.py", because |
9870173e0b48
largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23184
diff
changeset
|
284 # it is referred only from "lfutil.updatestandinsbymatch" |
18064
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
285 def _subdirlfs(self, files, lfiles): |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
286 ''' |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
287 Adjust matched file list |
23543
4dd8a6a1240d
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
23394
diff
changeset
|
288 If we pass a directory to commit whose only committable files |
18064
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
289 are largefiles, the core commit code aborts before finding |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
290 the largefiles. |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
291 So we do the following: |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
292 For directories that only have largefiles as matches, |
18644
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18182
diff
changeset
|
293 we explicitly add the largefiles to the match list and remove |
18064
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
294 the directory. |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
295 In other cases, we leave the match list unmodified. |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
296 ''' |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
297 actualfiles = [] |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
298 dirs = [] |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
299 regulars = [] |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
300 |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
301 for f in files: |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
302 if lfutil.isstandin(f + '/'): |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
303 raise util.Abort( |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
304 _('file "%s" is a largefile standin') % f, |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
305 hint=('commit the largefile itself instead')) |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
306 # Scan directories |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
307 if os.path.isdir(self.wjoin(f)): |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
308 dirs.append(f) |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
309 else: |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
310 regulars.append(f) |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
311 |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
312 for f in dirs: |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
313 matcheddir = False |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
314 d = self.dirstate.normalize(f) + '/' |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
315 # Check for matched normal files |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
316 for mf in regulars: |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
317 if self.dirstate.normalize(mf).startswith(d): |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
318 actualfiles.append(f) |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
319 matcheddir = True |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
320 break |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
321 if not matcheddir: |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
322 # If no normal match, manually append |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
323 # any matching largefiles |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
324 for lf in lfiles: |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
325 if self.dirstate.normalize(lf).startswith(d): |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
326 actualfiles.append(lf) |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
327 if not matcheddir: |
23923
ab6fd3205dad
largefiles: fix commit of a directory with no largefile changes (issue4330)
Matt Harbison <matt_harbison@yahoo.com>
parents:
23660
diff
changeset
|
328 # There may still be normal files in the dir, so |
ab6fd3205dad
largefiles: fix commit of a directory with no largefile changes (issue4330)
Matt Harbison <matt_harbison@yahoo.com>
parents:
23660
diff
changeset
|
329 # make sure a directory is in the list, which |
ab6fd3205dad
largefiles: fix commit of a directory with no largefile changes (issue4330)
Matt Harbison <matt_harbison@yahoo.com>
parents:
23660
diff
changeset
|
330 # forces status to walk and call the match |
ab6fd3205dad
largefiles: fix commit of a directory with no largefile changes (issue4330)
Matt Harbison <matt_harbison@yahoo.com>
parents:
23660
diff
changeset
|
331 # function on the matcher. Windows does NOT |
ab6fd3205dad
largefiles: fix commit of a directory with no largefile changes (issue4330)
Matt Harbison <matt_harbison@yahoo.com>
parents:
23660
diff
changeset
|
332 # require this. |
ab6fd3205dad
largefiles: fix commit of a directory with no largefile changes (issue4330)
Matt Harbison <matt_harbison@yahoo.com>
parents:
23660
diff
changeset
|
333 actualfiles.append('.') |
18064
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
334 matcheddir = True |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
335 # Nothing in dir, so readd it |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
336 # and let commit reject it |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
337 if not matcheddir: |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
338 actualfiles.append(f) |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
339 |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
340 # Always add normal files |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
341 actualfiles += regulars |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
342 return actualfiles |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
343 |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
344 repo.__class__ = lfilesrepo |
15168 | 345 |
23186
6de61d0b773f
largefiles: introduce "_lfcommithooks" to abstract pre-committing procedures
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23185
diff
changeset
|
346 # stack of hooks being executed before committing. |
6de61d0b773f
largefiles: introduce "_lfcommithooks" to abstract pre-committing procedures
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23185
diff
changeset
|
347 # only last element ("_lfcommithooks[-1]") is used for each committing. |
6de61d0b773f
largefiles: introduce "_lfcommithooks" to abstract pre-committing procedures
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23185
diff
changeset
|
348 repo._lfcommithooks = [lfutil.updatestandinsbymatch] |
6de61d0b773f
largefiles: introduce "_lfcommithooks" to abstract pre-committing procedures
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23185
diff
changeset
|
349 |
23188
94ac64bcf6fe
largefiles: introduce "_lfstatuswriters" to customize status reporting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23186
diff
changeset
|
350 # Stack of status writer functions taking "*msg, **opts" arguments |
23543
4dd8a6a1240d
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
23394
diff
changeset
|
351 # like "ui.status()". Only last element ("_lfstatuswriters[-1]") |
23188
94ac64bcf6fe
largefiles: introduce "_lfstatuswriters" to customize status reporting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23186
diff
changeset
|
352 # is used to write status out. |
94ac64bcf6fe
largefiles: introduce "_lfstatuswriters" to customize status reporting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23186
diff
changeset
|
353 repo._lfstatuswriters = [ui.status] |
94ac64bcf6fe
largefiles: introduce "_lfstatuswriters" to customize status reporting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23186
diff
changeset
|
354 |
21044
52a5eabf1f2f
largefiles: reuse "findcommonoutgoing()" result at "hg push"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21042
diff
changeset
|
355 def prepushoutgoinghook(local, remote, outgoing): |
52a5eabf1f2f
largefiles: reuse "findcommonoutgoing()" result at "hg push"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21042
diff
changeset
|
356 if outgoing.missing: |
52a5eabf1f2f
largefiles: reuse "findcommonoutgoing()" result at "hg push"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21042
diff
changeset
|
357 toupload = set() |
52a5eabf1f2f
largefiles: reuse "findcommonoutgoing()" result at "hg push"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21042
diff
changeset
|
358 addfunc = lambda fn, lfhash: toupload.add(lfhash) |
52a5eabf1f2f
largefiles: reuse "findcommonoutgoing()" result at "hg push"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21042
diff
changeset
|
359 lfutil.getlfilestoupload(local, outgoing.missing, addfunc) |
52a5eabf1f2f
largefiles: reuse "findcommonoutgoing()" result at "hg push"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21042
diff
changeset
|
360 lfcommands.uploadlfiles(ui, local, remote, toupload) |
52a5eabf1f2f
largefiles: reuse "findcommonoutgoing()" result at "hg push"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21042
diff
changeset
|
361 repo.prepushoutgoinghooks.add("largefiles", prepushoutgoinghook) |
52a5eabf1f2f
largefiles: reuse "findcommonoutgoing()" result at "hg push"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21042
diff
changeset
|
362 |
15168 | 363 def checkrequireslfiles(ui, repo, **kwargs): |
15319
9da7e96cd5c2
largefiles: remove redundant any_ function
Benjamin Pollack <benjamin@bitquabit.com>
parents:
15316
diff
changeset
|
364 if 'largefiles' not in repo.requirements and util.any( |
15168 | 365 lfutil.shortname+'/' in f[0] for f in repo.store.datafiles()): |
15312
8d862e7b96d4
largefiles: remove 1.9 compat code
Eli Carter <eli.carter@tektronix.com>
parents:
15305
diff
changeset
|
366 repo.requirements.add('largefiles') |
15168 | 367 repo._writerequirements() |
368 | |
20790
49f2d5644f04
config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents:
20177
diff
changeset
|
369 ui.setconfig('hooks', 'changegroup.lfiles', checkrequireslfiles, |
49f2d5644f04
config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents:
20177
diff
changeset
|
370 'largefiles') |
49f2d5644f04
config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents:
20177
diff
changeset
|
371 ui.setconfig('hooks', 'commit.lfiles', checkrequireslfiles, 'largefiles') |