Mercurial > public > mercurial-scm > hg
annotate hgext/largefiles/reposetup.py @ 18726:431b246cfb12 stable
largefiles: missing largefiles should not be committed as removed
Largefiles can easily become missing - for example if it simply isn't available
or the download fail. It might even be convenient to be able to work that way
in some cases.
But commiting missing largefiles as if they had been 'hg remove'd is plain wrong.
author | Mads Kiilerich <madski@unity3d.com> |
---|---|
date | Thu, 28 Feb 2013 13:45:18 +0100 |
parents | e6db64abfa87 |
children | c2d079387b2c |
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 types | |
12 import os | |
13 | |
18152
4454607b5d25
largefiles: remove findoutgoing portability wrapper
Mads Kiilerich <madski@unity3d.com>
parents:
18149
diff
changeset
|
14 from mercurial import context, error, manifest, match as match_, util, \ |
4454607b5d25
largefiles: remove findoutgoing portability wrapper
Mads Kiilerich <madski@unity3d.com>
parents:
18149
diff
changeset
|
15 discovery |
15789
2c10ea43c801
largefiles: Fix parser warning: redefinition of unused 'node' from line 14
Levi Bard <levi@unity3d.com>
parents:
15783
diff
changeset
|
16 from mercurial import node as node_ |
15168 | 17 from mercurial.i18n import _ |
18012
848c428bb5ee
largefile: status is buggy on repoproxy, so run unfiltered
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17803
diff
changeset
|
18 from mercurial import localrepo |
15168 | 19 |
20 import lfcommands | |
21 import proto | |
22 import lfutil | |
23 | |
24 def reposetup(ui, repo): | |
25 # wire repositories should be given new wireproto functions but not the | |
26 # other largefiles modifications | |
27 if not repo.local(): | |
28 return proto.wirereposetup(ui, repo) | |
29 | |
30 for name in ('status', 'commitctx', 'commit', 'push'): | |
31 method = getattr(repo, name) | |
15255
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
32 if (isinstance(method, types.FunctionType) and |
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
33 method.func_name == 'wrap'): |
15168 | 34 ui.warn(_('largefiles: repo method %r appears to have already been' |
35 ' wrapped by another extension: ' | |
36 'largefiles may behave incorrectly\n') | |
37 % name) | |
38 | |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
39 class lfilesrepo(repo.__class__): |
15168 | 40 lfstatus = False |
41 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
|
42 return super(lfilesrepo, self).status(*args, **kwargs) |
15168 | 43 |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15250
diff
changeset
|
44 # 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
|
45 # of largefiles instead of their corresponding standins and |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15250
diff
changeset
|
46 # identifies the largefiles as always binary, regardless of |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15250
diff
changeset
|
47 # their actual contents. |
15168 | 48 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
|
49 ctx = super(lfilesrepo, self).__getitem__(changeid) |
15168 | 50 if self.lfstatus: |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
51 class lfilesmanifestdict(manifest.manifestdict): |
15168 | 52 def __contains__(self, filename): |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
53 if super(lfilesmanifestdict, |
15168 | 54 self).__contains__(filename): |
55 return True | |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
56 return super(lfilesmanifestdict, |
15628
2b40513384ca
largefiles: use lfutil functions
Martin Geisler <mg@aragost.com>
parents:
15626
diff
changeset
|
57 self).__contains__(lfutil.standin(filename)) |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
58 class lfilesctx(ctx.__class__): |
15168 | 59 def files(self): |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
60 filenames = super(lfilesctx, self).files() |
15628
2b40513384ca
largefiles: use lfutil functions
Martin Geisler <mg@aragost.com>
parents:
15626
diff
changeset
|
61 return [lfutil.splitstandin(f) or f for f in filenames] |
15168 | 62 def manifest(self): |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
63 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
|
64 man1.__class__ = lfilesmanifestdict |
15168 | 65 return man1 |
66 def filectx(self, path, fileid=None, filelog=None): | |
67 try: | |
16141
f346de4dff57
largefiles: don't break filesets
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
16110
diff
changeset
|
68 if filelog is not None: |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
69 result = super(lfilesctx, self).filectx( |
16141
f346de4dff57
largefiles: don't break filesets
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
16110
diff
changeset
|
70 path, fileid, filelog) |
f346de4dff57
largefiles: don't break filesets
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
16110
diff
changeset
|
71 else: |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
72 result = super(lfilesctx, self).filectx( |
16141
f346de4dff57
largefiles: don't break filesets
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
16110
diff
changeset
|
73 path, fileid) |
15168 | 74 except error.LookupError: |
75 # Adding a null character will cause Mercurial to | |
76 # identify this as a binary file. | |
16141
f346de4dff57
largefiles: don't break filesets
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
16110
diff
changeset
|
77 if filelog is not None: |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
78 result = super(lfilesctx, self).filectx( |
16141
f346de4dff57
largefiles: don't break filesets
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
16110
diff
changeset
|
79 lfutil.standin(path), fileid, filelog) |
f346de4dff57
largefiles: don't break filesets
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
16110
diff
changeset
|
80 else: |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
81 result = super(lfilesctx, self).filectx( |
16141
f346de4dff57
largefiles: don't break filesets
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
16110
diff
changeset
|
82 lfutil.standin(path), fileid) |
15168 | 83 olddata = result.data |
84 result.data = lambda: olddata() + '\0' | |
85 return result | |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
86 ctx.__class__ = lfilesctx |
15168 | 87 return ctx |
88 | |
89 # 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
|
90 # appropriate list in the result. Also removes standin files |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15250
diff
changeset
|
91 # from the listing. Revert to the original status if |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15250
diff
changeset
|
92 # self.lfstatus is False. |
18012
848c428bb5ee
largefile: status is buggy on repoproxy, so run unfiltered
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17803
diff
changeset
|
93 # XXX large file status is buggy when used on repo proxy. |
848c428bb5ee
largefile: status is buggy on repoproxy, so run unfiltered
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17803
diff
changeset
|
94 # XXX this needs to be investigated. |
18016
2a393df0f5cc
clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18012
diff
changeset
|
95 @localrepo.unfilteredmethod |
15168 | 96 def status(self, node1='.', node2=None, match=None, ignored=False, |
97 clean=False, unknown=False, listsubrepos=False): | |
98 listignored, listclean, listunknown = ignored, clean, unknown | |
99 if not self.lfstatus: | |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
100 return super(lfilesrepo, self).status(node1, node2, match, |
15626
931dc4af0d95
largefiles: remove pre-1.7 compatibility code
Martin Geisler <mg@aragost.com>
parents:
15617
diff
changeset
|
101 listignored, listclean, listunknown, listsubrepos) |
15168 | 102 else: |
103 # some calls in this function rely on the old version of status | |
104 self.lfstatus = False | |
105 if isinstance(node1, context.changectx): | |
106 ctx1 = node1 | |
107 else: | |
17803
1479572db256
largefile: use `self` in repo method instead of `repo`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17424
diff
changeset
|
108 ctx1 = self[node1] |
15168 | 109 if isinstance(node2, context.changectx): |
110 ctx2 = node2 | |
111 else: | |
17803
1479572db256
largefile: use `self` in repo method instead of `repo`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17424
diff
changeset
|
112 ctx2 = self[node2] |
15168 | 113 working = ctx2.rev() is None |
114 parentworking = working and ctx1 == self['.'] | |
115 | |
116 def inctx(file, ctx): | |
117 try: | |
118 if ctx.rev() is None: | |
119 return file in ctx.manifest() | |
120 ctx[file] | |
121 return True | |
15171
547da6115d1d
largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents:
15170
diff
changeset
|
122 except KeyError: |
15168 | 123 return False |
124 | |
125 if match is None: | |
126 match = match_.always(self.root, self.getcwd()) | |
127 | |
15653
93c77d5b9752
largefiles: optimize status when files are specified (issue3144)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15630
diff
changeset
|
128 # First check if there were files specified on the |
93c77d5b9752
largefiles: optimize status when files are specified (issue3144)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15630
diff
changeset
|
129 # command line. If there were, and none of them were |
93c77d5b9752
largefiles: optimize status when files are specified (issue3144)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15630
diff
changeset
|
130 # largefiles, we should just bail here and let super |
93c77d5b9752
largefiles: optimize status when files are specified (issue3144)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15630
diff
changeset
|
131 # handle it -- thus gaining a big performance boost. |
93c77d5b9752
largefiles: optimize status when files are specified (issue3144)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15630
diff
changeset
|
132 lfdirstate = lfutil.openlfdirstate(ui, self) |
93c77d5b9752
largefiles: optimize status when files are specified (issue3144)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15630
diff
changeset
|
133 if match.files() and not match.anypats(): |
16110
41417443b7d0
largefiles: check whether specified patterns are related to largefiles strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15982
diff
changeset
|
134 for f in lfdirstate: |
41417443b7d0
largefiles: check whether specified patterns are related to largefiles strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15982
diff
changeset
|
135 if match(f): |
41417443b7d0
largefiles: check whether specified patterns are related to largefiles strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15982
diff
changeset
|
136 break |
41417443b7d0
largefiles: check whether specified patterns are related to largefiles strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15982
diff
changeset
|
137 else: |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
138 return super(lfilesrepo, self).status(node1, node2, |
15653
93c77d5b9752
largefiles: optimize status when files are specified (issue3144)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15630
diff
changeset
|
139 match, listignored, listclean, |
93c77d5b9752
largefiles: optimize status when files are specified (issue3144)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15630
diff
changeset
|
140 listunknown, listsubrepos) |
93c77d5b9752
largefiles: optimize status when files are specified (issue3144)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15630
diff
changeset
|
141 |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
142 # Create a copy of match that matches standins instead |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
143 # of largefiles. |
16586
ebd2ead59f1c
largefiles: fix "hg status dir" missing regular files (issue3421)
Patrick Mezard <patrick@mezard.eu>
parents:
16571
diff
changeset
|
144 def tostandins(files): |
ebd2ead59f1c
largefiles: fix "hg status dir" missing regular files (issue3421)
Patrick Mezard <patrick@mezard.eu>
parents:
16571
diff
changeset
|
145 if not working: |
ebd2ead59f1c
largefiles: fix "hg status dir" missing regular files (issue3421)
Patrick Mezard <patrick@mezard.eu>
parents:
16571
diff
changeset
|
146 return files |
ebd2ead59f1c
largefiles: fix "hg status dir" missing regular files (issue3421)
Patrick Mezard <patrick@mezard.eu>
parents:
16571
diff
changeset
|
147 newfiles = [] |
17803
1479572db256
largefile: use `self` in repo method instead of `repo`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17424
diff
changeset
|
148 dirstate = self.dirstate |
16586
ebd2ead59f1c
largefiles: fix "hg status dir" missing regular files (issue3421)
Patrick Mezard <patrick@mezard.eu>
parents:
16571
diff
changeset
|
149 for f in files: |
ebd2ead59f1c
largefiles: fix "hg status dir" missing regular files (issue3421)
Patrick Mezard <patrick@mezard.eu>
parents:
16571
diff
changeset
|
150 sf = lfutil.standin(f) |
ebd2ead59f1c
largefiles: fix "hg status dir" missing regular files (issue3421)
Patrick Mezard <patrick@mezard.eu>
parents:
16571
diff
changeset
|
151 if sf in dirstate: |
ebd2ead59f1c
largefiles: fix "hg status dir" missing regular files (issue3421)
Patrick Mezard <patrick@mezard.eu>
parents:
16571
diff
changeset
|
152 newfiles.append(sf) |
ebd2ead59f1c
largefiles: fix "hg status dir" missing regular files (issue3421)
Patrick Mezard <patrick@mezard.eu>
parents:
16571
diff
changeset
|
153 elif sf in dirstate.dirs(): |
ebd2ead59f1c
largefiles: fix "hg status dir" missing regular files (issue3421)
Patrick Mezard <patrick@mezard.eu>
parents:
16571
diff
changeset
|
154 # Directory entries could be regular or |
ebd2ead59f1c
largefiles: fix "hg status dir" missing regular files (issue3421)
Patrick Mezard <patrick@mezard.eu>
parents:
16571
diff
changeset
|
155 # standin, check both |
ebd2ead59f1c
largefiles: fix "hg status dir" missing regular files (issue3421)
Patrick Mezard <patrick@mezard.eu>
parents:
16571
diff
changeset
|
156 newfiles.extend((f, sf)) |
ebd2ead59f1c
largefiles: fix "hg status dir" missing regular files (issue3421)
Patrick Mezard <patrick@mezard.eu>
parents:
16571
diff
changeset
|
157 else: |
ebd2ead59f1c
largefiles: fix "hg status dir" missing regular files (issue3421)
Patrick Mezard <patrick@mezard.eu>
parents:
16571
diff
changeset
|
158 newfiles.append(f) |
ebd2ead59f1c
largefiles: fix "hg status dir" missing regular files (issue3421)
Patrick Mezard <patrick@mezard.eu>
parents:
16571
diff
changeset
|
159 return newfiles |
15168 | 160 |
161 m = copy.copy(match) | |
16586
ebd2ead59f1c
largefiles: fix "hg status dir" missing regular files (issue3421)
Patrick Mezard <patrick@mezard.eu>
parents:
16571
diff
changeset
|
162 m._files = tostandins(m._files) |
15168 | 163 |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
164 result = super(lfilesrepo, self).status(node1, node2, m, |
18141
a907826c158c
largefiles: don't walk through all ignored files
Mads Kiilerich <madski@unity3d.com>
parents:
18139
diff
changeset
|
165 ignored, clean, unknown, listsubrepos) |
15168 | 166 if working: |
18149
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
167 |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
168 def sfindirstate(f): |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
169 sf = lfutil.standin(f) |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
170 dirstate = self.dirstate |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
171 return sf in dirstate or sf in dirstate.dirs() |
15617
74e691b141c4
largefiles: optimize performance of status on largefiles repos (issue3136)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15385
diff
changeset
|
172 |
18149
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
173 match._files = [f for f in match._files |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
174 if sfindirstate(f)] |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
175 # Don't waste time getting the ignored and unknown |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
176 # files from lfdirstate |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
177 s = lfdirstate.status(match, [], False, |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
178 listclean, False) |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
179 (unsure, modified, added, removed, missing, _unknown, |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
180 _ignored, clean) = s |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
181 if parentworking: |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
182 for lfile in unsure: |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
183 standin = lfutil.standin(lfile) |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
184 if standin not in ctx1: |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
185 # from second parent |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
186 modified.append(lfile) |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
187 elif ctx1[standin].data().strip() \ |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
188 != lfutil.hashfile(self.wjoin(lfile)): |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
189 modified.append(lfile) |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
190 else: |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
191 clean.append(lfile) |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
192 lfdirstate.normal(lfile) |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
193 else: |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
194 tocheck = unsure + modified + added + clean |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
195 modified, added, clean = [], [], [] |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
196 |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
197 for lfile in tocheck: |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
198 standin = lfutil.standin(lfile) |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
199 if inctx(standin, ctx1): |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
200 if ctx1[standin].data().strip() != \ |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
201 lfutil.hashfile(self.wjoin(lfile)): |
15168 | 202 modified.append(lfile) |
203 else: | |
204 clean.append(lfile) | |
18149
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
205 else: |
2dcc3653b361
largefiles: unindent code
Mads Kiilerich <madski@unity3d.com>
parents:
18148
diff
changeset
|
206 added.append(lfile) |
15168 | 207 |
18145
93206823bd61
largefiles: remove overly complex handling of ignored and unknown files
Mads Kiilerich <madski@unity3d.com>
parents:
18142
diff
changeset
|
208 # Standins no longer found in lfdirstate has been removed |
15168 | 209 for standin in ctx1.manifest(): |
210 if not lfutil.isstandin(standin): | |
211 continue | |
212 lfile = lfutil.splitstandin(standin) | |
213 if not match(lfile): | |
214 continue | |
215 if lfile not in lfdirstate: | |
216 removed.append(lfile) | |
15663
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15629
diff
changeset
|
217 |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15629
diff
changeset
|
218 # Filter result lists |
15168 | 219 result = list(result) |
15663
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15629
diff
changeset
|
220 |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15629
diff
changeset
|
221 # Largefiles are not really removed when they're |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15629
diff
changeset
|
222 # still in the normal dirstate. Likewise, normal |
18145
93206823bd61
largefiles: remove overly complex handling of ignored and unknown files
Mads Kiilerich <madski@unity3d.com>
parents:
18142
diff
changeset
|
223 # files are not really removed if they are still in |
15663
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15629
diff
changeset
|
224 # lfdirstate. This happens in merges where files |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15629
diff
changeset
|
225 # change type. |
17803
1479572db256
largefile: use `self` in repo method instead of `repo`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17424
diff
changeset
|
226 removed = [f for f in removed if f not in self.dirstate] |
15663
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15629
diff
changeset
|
227 result[2] = [f for f in result[2] if f not in lfdirstate] |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15629
diff
changeset
|
228 |
18145
93206823bd61
largefiles: remove overly complex handling of ignored and unknown files
Mads Kiilerich <madski@unity3d.com>
parents:
18142
diff
changeset
|
229 lfiles = set(lfdirstate._map) |
15168 | 230 # Unknown files |
18145
93206823bd61
largefiles: remove overly complex handling of ignored and unknown files
Mads Kiilerich <madski@unity3d.com>
parents:
18142
diff
changeset
|
231 result[4] = set(result[4]).difference(lfiles) |
93206823bd61
largefiles: remove overly complex handling of ignored and unknown files
Mads Kiilerich <madski@unity3d.com>
parents:
18142
diff
changeset
|
232 # Ignored files |
93206823bd61
largefiles: remove overly complex handling of ignored and unknown files
Mads Kiilerich <madski@unity3d.com>
parents:
18142
diff
changeset
|
233 result[5] = set(result[5]).difference(lfiles) |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
234 # combine normal files and largefiles |
15255
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
235 normals = [[fn for fn in filelist |
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
236 if not lfutil.isstandin(fn)] |
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
237 for filelist in result] |
15663
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15629
diff
changeset
|
238 lfiles = (modified, added, removed, missing, [], [], clean) |
15255
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
239 result = [sorted(list1 + list2) |
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
240 for (list1, list2) in zip(normals, lfiles)] |
15168 | 241 else: |
242 def toname(f): | |
243 if lfutil.isstandin(f): | |
244 return lfutil.splitstandin(f) | |
245 return f | |
246 result = [[toname(f) for f in items] for items in result] | |
247 | |
18139
03faf12fbee7
largefiles status: update lfdirstate with result from cleanliness check
Mads Kiilerich <madski@unity3d.com>
parents:
18064
diff
changeset
|
248 lfdirstate.write() |
03faf12fbee7
largefiles status: update lfdirstate with result from cleanliness check
Mads Kiilerich <madski@unity3d.com>
parents:
18064
diff
changeset
|
249 |
15168 | 250 if not listunknown: |
251 result[4] = [] | |
252 if not listignored: | |
253 result[5] = [] | |
254 if not listclean: | |
255 result[6] = [] | |
256 self.lfstatus = True | |
257 return result | |
258 | |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
259 # As part of committing, copy all of the largefiles into the |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
260 # cache. |
15168 | 261 def commitctx(self, *args, **kwargs): |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
262 node = super(lfilesrepo, self).commitctx(*args, **kwargs) |
15796
3e5b6045ccfc
largefiles: factor out a copyalltostore() function
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
15794
diff
changeset
|
263 lfutil.copyalltostore(self, node) |
15168 | 264 return node |
265 | |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
266 # 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
|
267 # 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
|
268 # Do that here. |
15168 | 269 def commit(self, text="", user=None, date=None, match=None, |
270 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
|
271 orig = super(lfilesrepo, self).commit |
15168 | 272 |
17803
1479572db256
largefile: use `self` in repo method instead of `repo`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17424
diff
changeset
|
273 wlock = self.wlock() |
15168 | 274 try: |
15982
bf502ccc46d7
largefiles: fix transplant for all cases (issue3192)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15796
diff
changeset
|
275 # Case 0: Rebase or Transplant |
15793
3ef07ecdb0d5
largefiles: correctly handle dirstate status when rebasing
Na'Tosha Bard <natosha@unity3d.com>
parents:
15789
diff
changeset
|
276 # We have to take the time to pull down the new largefiles now. |
15982
bf502ccc46d7
largefiles: fix transplant for all cases (issue3192)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15796
diff
changeset
|
277 # Otherwise, any largefiles that were modified in the |
bf502ccc46d7
largefiles: fix transplant for all cases (issue3192)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15796
diff
changeset
|
278 # destination changesets get overwritten, either by the rebase |
bf502ccc46d7
largefiles: fix transplant for all cases (issue3192)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15796
diff
changeset
|
279 # or in the first commit after the rebase or transplant. |
15793
3ef07ecdb0d5
largefiles: correctly handle dirstate status when rebasing
Na'Tosha Bard <natosha@unity3d.com>
parents:
15789
diff
changeset
|
280 # updatelfiles will update the dirstate to mark any pulled |
3ef07ecdb0d5
largefiles: correctly handle dirstate status when rebasing
Na'Tosha Bard <natosha@unity3d.com>
parents:
15789
diff
changeset
|
281 # largefiles as modified |
17803
1479572db256
largefile: use `self` in repo method instead of `repo`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17424
diff
changeset
|
282 if getattr(self, "_isrebasing", False) or \ |
1479572db256
largefile: use `self` in repo method instead of `repo`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17424
diff
changeset
|
283 getattr(self, "_istransplanting", False): |
1479572db256
largefile: use `self` in repo method instead of `repo`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17424
diff
changeset
|
284 lfcommands.updatelfiles(self.ui, self, filelist=None, |
15982
bf502ccc46d7
largefiles: fix transplant for all cases (issue3192)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15796
diff
changeset
|
285 printmessage=False) |
15793
3ef07ecdb0d5
largefiles: correctly handle dirstate status when rebasing
Na'Tosha Bard <natosha@unity3d.com>
parents:
15789
diff
changeset
|
286 result = orig(text=text, user=user, date=date, match=match, |
3ef07ecdb0d5
largefiles: correctly handle dirstate status when rebasing
Na'Tosha Bard <natosha@unity3d.com>
parents:
15789
diff
changeset
|
287 force=force, editor=editor, extra=extra) |
3ef07ecdb0d5
largefiles: correctly handle dirstate status when rebasing
Na'Tosha Bard <natosha@unity3d.com>
parents:
15789
diff
changeset
|
288 return result |
15168 | 289 # Case 1: user calls commit with no specific files or |
15250
f172292cd416
largefiles: speed up commit by only rewriting standins for modified largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents:
15224
diff
changeset
|
290 # include/exclude patterns: refresh and commit all files that |
f172292cd416
largefiles: speed up commit by only rewriting standins for modified largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents:
15224
diff
changeset
|
291 # are "dirty". |
15255
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
292 if ((match is None) or |
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
293 (not match.anypats() and not match.files())): |
15250
f172292cd416
largefiles: speed up commit by only rewriting standins for modified largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents:
15224
diff
changeset
|
294 # Spend a bit of time here to get a list of files we know |
f172292cd416
largefiles: speed up commit by only rewriting standins for modified largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents:
15224
diff
changeset
|
295 # are modified so we can compare only against those. |
f172292cd416
largefiles: speed up commit by only rewriting standins for modified largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents:
15224
diff
changeset
|
296 # It can cost a lot of time (several seconds) |
f172292cd416
largefiles: speed up commit by only rewriting standins for modified largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents:
15224
diff
changeset
|
297 # otherwise to update all standins if the largefiles are |
f172292cd416
largefiles: speed up commit by only rewriting standins for modified largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents:
15224
diff
changeset
|
298 # large. |
f172292cd416
largefiles: speed up commit by only rewriting standins for modified largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents:
15224
diff
changeset
|
299 lfdirstate = lfutil.openlfdirstate(ui, self) |
17803
1479572db256
largefile: use `self` in repo method instead of `repo`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17424
diff
changeset
|
300 dirtymatch = match_.always(self.root, self.getcwd()) |
15250
f172292cd416
largefiles: speed up commit by only rewriting standins for modified largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents:
15224
diff
changeset
|
301 s = lfdirstate.status(dirtymatch, [], False, False, False) |
18726
431b246cfb12
largefiles: missing largefiles should not be committed as removed
Mads Kiilerich <madski@unity3d.com>
parents:
18182
diff
changeset
|
302 (unsure, modified, added, removed, _missing, _unknown, |
431b246cfb12
largefiles: missing largefiles should not be committed as removed
Mads Kiilerich <madski@unity3d.com>
parents:
18182
diff
changeset
|
303 _ignored, _clean) = s |
431b246cfb12
largefiles: missing largefiles should not be committed as removed
Mads Kiilerich <madski@unity3d.com>
parents:
18182
diff
changeset
|
304 modifiedfiles = unsure + modified + added + removed |
15168 | 305 lfiles = lfutil.listlfiles(self) |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
306 # this only loops through largefiles that exist (not |
15168 | 307 # removed/renamed) |
308 for lfile in lfiles: | |
15250
f172292cd416
largefiles: speed up commit by only rewriting standins for modified largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents:
15224
diff
changeset
|
309 if lfile in modifiedfiles: |
16248
51e6f318bdf1
largefiles: fix check-code errors.
Na'Tosha Bard <natosha@unity3d.com>
parents:
16247
diff
changeset
|
310 if os.path.exists( |
51e6f318bdf1
largefiles: fix check-code errors.
Na'Tosha Bard <natosha@unity3d.com>
parents:
16247
diff
changeset
|
311 self.wjoin(lfutil.standin(lfile))): |
15250
f172292cd416
largefiles: speed up commit by only rewriting standins for modified largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents:
15224
diff
changeset
|
312 # this handles the case where a rebase is being |
f172292cd416
largefiles: speed up commit by only rewriting standins for modified largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents:
15224
diff
changeset
|
313 # performed and the working copy is not updated |
f172292cd416
largefiles: speed up commit by only rewriting standins for modified largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents:
15224
diff
changeset
|
314 # yet. |
f172292cd416
largefiles: speed up commit by only rewriting standins for modified largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents:
15224
diff
changeset
|
315 if os.path.exists(self.wjoin(lfile)): |
f172292cd416
largefiles: speed up commit by only rewriting standins for modified largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents:
15224
diff
changeset
|
316 lfutil.updatestandin(self, |
f172292cd416
largefiles: speed up commit by only rewriting standins for modified largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents:
15224
diff
changeset
|
317 lfutil.standin(lfile)) |
f172292cd416
largefiles: speed up commit by only rewriting standins for modified largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents:
15224
diff
changeset
|
318 lfdirstate.normal(lfile) |
15794
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15793
diff
changeset
|
319 |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15793
diff
changeset
|
320 result = orig(text=text, user=user, date=date, match=match, |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15793
diff
changeset
|
321 force=force, editor=editor, extra=extra) |
17230
fc4c155658b7
largefiles: defer lfdirstate.drop() until after commit (issue3364)
Matt Harbison <matt_harbison@yahoo.com>
parents:
16731
diff
changeset
|
322 |
fc4c155658b7
largefiles: defer lfdirstate.drop() until after commit (issue3364)
Matt Harbison <matt_harbison@yahoo.com>
parents:
16731
diff
changeset
|
323 if result is not None: |
fc4c155658b7
largefiles: defer lfdirstate.drop() until after commit (issue3364)
Matt Harbison <matt_harbison@yahoo.com>
parents:
16731
diff
changeset
|
324 for lfile in lfdirstate: |
fc4c155658b7
largefiles: defer lfdirstate.drop() until after commit (issue3364)
Matt Harbison <matt_harbison@yahoo.com>
parents:
16731
diff
changeset
|
325 if lfile in modifiedfiles: |
17803
1479572db256
largefile: use `self` in repo method instead of `repo`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17424
diff
changeset
|
326 if (not os.path.exists(self.wjoin( |
17230
fc4c155658b7
largefiles: defer lfdirstate.drop() until after commit (issue3364)
Matt Harbison <matt_harbison@yahoo.com>
parents:
16731
diff
changeset
|
327 lfutil.standin(lfile)))) or \ |
17803
1479572db256
largefile: use `self` in repo method instead of `repo`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17424
diff
changeset
|
328 (not os.path.exists(self.wjoin(lfile))): |
17230
fc4c155658b7
largefiles: defer lfdirstate.drop() until after commit (issue3364)
Matt Harbison <matt_harbison@yahoo.com>
parents:
16731
diff
changeset
|
329 lfdirstate.drop(lfile) |
fc4c155658b7
largefiles: defer lfdirstate.drop() until after commit (issue3364)
Matt Harbison <matt_harbison@yahoo.com>
parents:
16731
diff
changeset
|
330 |
15794
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15793
diff
changeset
|
331 # This needs to be after commit; otherwise precommit hooks |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15793
diff
changeset
|
332 # get the wrong status |
15168 | 333 lfdirstate.write() |
15794
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15793
diff
changeset
|
334 return result |
15168 | 335 |
18064
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
336 lfiles = lfutil.listlfiles(self) |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
337 match._files = self._subdirlfs(match.files(), lfiles) |
15168 | 338 |
339 # Case 2: user calls commit with specified patterns: refresh | |
340 # any matching big files. | |
341 smatcher = lfutil.composestandinmatcher(self, match) | |
18154
93c697d9c158
largefiles: remove trivial portability wrappers
Mads Kiilerich <madski@unity3d.com>
parents:
18152
diff
changeset
|
342 standins = self.dirstate.walk(smatcher, [], False, False) |
15168 | 343 |
344 # No matching big files: get out of the way and pass control to | |
345 # the usual commit() method. | |
346 if not standins: | |
347 return orig(text=text, user=user, date=date, match=match, | |
348 force=force, editor=editor, extra=extra) | |
349 | |
350 # Refresh all matching big files. It's possible that the | |
351 # commit will end up failing, in which case the big files will | |
352 # stay refreshed. No harm done: the user modified them and | |
353 # asked to commit them, so sooner or later we're going to | |
354 # refresh the standins. Might as well leave them refreshed. | |
355 lfdirstate = lfutil.openlfdirstate(ui, self) | |
356 for standin in standins: | |
357 lfile = lfutil.splitstandin(standin) | |
18182
e6db64abfa87
largefiles: stop using <> operator in favor of !=
Augie Fackler <raf@durin42.com>
parents:
18154
diff
changeset
|
358 if lfdirstate[lfile] != 'r': |
15168 | 359 lfutil.updatestandin(self, standin) |
360 lfdirstate.normal(lfile) | |
361 else: | |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15171
diff
changeset
|
362 lfdirstate.drop(lfile) |
15168 | 363 |
364 # Cook up a new matcher that only matches regular files or | |
365 # standins corresponding to the big files requested by the | |
366 # user. Have to modify _files to prevent commit() from | |
367 # complaining "not tracked" for big files. | |
368 match = copy.copy(match) | |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
369 origmatchfn = match.matchfn |
15168 | 370 |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
371 # Check both the list of largefiles and the list of |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
372 # standins because if a largefile was removed, it |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
373 # won't be in the list of largefiles at this point |
15168 | 374 match._files += sorted(standins) |
375 | |
376 actualfiles = [] | |
377 for f in match._files: | |
378 fstandin = lfutil.standin(f) | |
379 | |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15250
diff
changeset
|
380 # ignore known largefiles and standins |
15168 | 381 if f in lfiles or fstandin in standins: |
382 continue | |
383 | |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15250
diff
changeset
|
384 # append directory separator to avoid collisions |
15168 | 385 if not fstandin.endswith(os.sep): |
386 fstandin += os.sep | |
387 | |
388 actualfiles.append(f) | |
389 match._files = actualfiles | |
390 | |
391 def matchfn(f): | |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
392 if origmatchfn(f): |
15168 | 393 return f not in lfiles |
394 else: | |
395 return f in standins | |
396 | |
397 match.matchfn = matchfn | |
15794
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15793
diff
changeset
|
398 result = orig(text=text, user=user, date=date, match=match, |
15168 | 399 force=force, editor=editor, extra=extra) |
15794
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15793
diff
changeset
|
400 # This needs to be after commit; otherwise precommit hooks |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15793
diff
changeset
|
401 # get the wrong status |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15793
diff
changeset
|
402 lfdirstate.write() |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15793
diff
changeset
|
403 return result |
15168 | 404 finally: |
405 wlock.release() | |
406 | |
407 def push(self, remote, force=False, revs=None, newbranch=False): | |
18152
4454607b5d25
largefiles: remove findoutgoing portability wrapper
Mads Kiilerich <madski@unity3d.com>
parents:
18149
diff
changeset
|
408 outgoing = discovery.findcommonoutgoing(repo, remote.peer(), |
4454607b5d25
largefiles: remove findoutgoing portability wrapper
Mads Kiilerich <madski@unity3d.com>
parents:
18149
diff
changeset
|
409 force=force) |
4454607b5d25
largefiles: remove findoutgoing portability wrapper
Mads Kiilerich <madski@unity3d.com>
parents:
18149
diff
changeset
|
410 if outgoing.missing: |
15168 | 411 toupload = set() |
18152
4454607b5d25
largefiles: remove findoutgoing portability wrapper
Mads Kiilerich <madski@unity3d.com>
parents:
18149
diff
changeset
|
412 o = self.changelog.nodesbetween(outgoing.missing, revs)[0] |
15168 | 413 for n in o: |
17803
1479572db256
largefile: use `self` in repo method instead of `repo`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17424
diff
changeset
|
414 parents = [p for p in self.changelog.parents(n) |
15789
2c10ea43c801
largefiles: Fix parser warning: redefinition of unused 'node' from line 14
Levi Bard <levi@unity3d.com>
parents:
15783
diff
changeset
|
415 if p != node_.nullid] |
17803
1479572db256
largefile: use `self` in repo method instead of `repo`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17424
diff
changeset
|
416 ctx = self[n] |
15168 | 417 files = set(ctx.files()) |
418 if len(parents) == 2: | |
419 mc = ctx.manifest() | |
420 mp1 = ctx.parents()[0].manifest() | |
421 mp2 = ctx.parents()[1].manifest() | |
422 for f in mp1: | |
423 if f not in mc: | |
424 files.add(f) | |
425 for f in mp2: | |
426 if f not in mc: | |
427 files.add(f) | |
428 for f in mc: | |
429 if mc[f] != mp1.get(f, None) or mc[f] != mp2.get(f, | |
430 None): | |
431 files.add(f) | |
432 | |
15255
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
433 toupload = toupload.union( |
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
434 set([ctx[f].data().strip() |
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
435 for f in files |
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
436 if lfutil.isstandin(f) and f in ctx])) |
15168 | 437 lfcommands.uploadlfiles(ui, self, remote, toupload) |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
438 return super(lfilesrepo, self).push(remote, force, revs, |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15171
diff
changeset
|
439 newbranch) |
15168 | 440 |
18064
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
441 def _subdirlfs(self, files, lfiles): |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
442 ''' |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
443 Adjust matched file list |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
444 If we pass a directory to commit whose only commitable files |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
445 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
|
446 the largefiles. |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
447 So we do the following: |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
448 For directories that only have largefiles as matches, |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
449 we explicitly add the largefiles to the matchlist and remove |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
450 the directory. |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
451 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
|
452 ''' |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
453 actualfiles = [] |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
454 dirs = [] |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
455 regulars = [] |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
456 |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
457 for f in files: |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
458 if lfutil.isstandin(f + '/'): |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
459 raise util.Abort( |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
460 _('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
|
461 hint=('commit the largefile itself instead')) |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
462 # Scan directories |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
463 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
|
464 dirs.append(f) |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
465 else: |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
466 regulars.append(f) |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
467 |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
468 for f in dirs: |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
469 matcheddir = False |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
470 d = self.dirstate.normalize(f) + '/' |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
471 # Check for matched normal files |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
472 for mf in regulars: |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
473 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
|
474 actualfiles.append(f) |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
475 matcheddir = True |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
476 break |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
477 if not matcheddir: |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
478 # If no normal match, manually append |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
479 # any matching largefiles |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
480 for lf in lfiles: |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
481 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
|
482 actualfiles.append(lf) |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
483 if not matcheddir: |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
484 actualfiles.append(lfutil.standin(f)) |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
485 matcheddir = True |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
486 # Nothing in dir, so readd it |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
487 # and let commit reject it |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
488 if not matcheddir: |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
489 actualfiles.append(f) |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
490 |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
491 # Always add normal files |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
492 actualfiles += regulars |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
493 return actualfiles |
7e2b9f6a2cd0
largefiles: commit directories that only contain largefiles (issue3548)
Levi Bard <levi@unity3d.com>
parents:
17803
diff
changeset
|
494 |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16141
diff
changeset
|
495 repo.__class__ = lfilesrepo |
15168 | 496 |
497 def checkrequireslfiles(ui, repo, **kwargs): | |
15319
9da7e96cd5c2
largefiles: remove redundant any_ function
Benjamin Pollack <benjamin@bitquabit.com>
parents:
15316
diff
changeset
|
498 if 'largefiles' not in repo.requirements and util.any( |
15168 | 499 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
|
500 repo.requirements.add('largefiles') |
15168 | 501 repo._writerequirements() |
502 | |
503 ui.setconfig('hooks', 'changegroup.lfiles', checkrequireslfiles) | |
504 ui.setconfig('hooks', 'commit.lfiles', checkrequireslfiles) |