Mercurial > hg
annotate hgext/largefiles/overrides.py @ 15983:32b9aee3602c stable
largefiles: fix revert on missing largefile (issue3217)
author | Na'Tosha Bard <natosha@unity3d.com> |
---|---|
date | Wed, 25 Jan 2012 16:52:16 +0100 |
parents | bf502ccc46d7 |
children | 67a5bc8aeb1d 3e1efb458e8b |
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 '''Overridden Mercurial commands and functions for the largefiles extension''' | |
10 | |
11 import os | |
12 import copy | |
13 | |
15305 | 14 from mercurial import hg, commands, util, cmdutil, scmutil, match as match_, \ |
15 node, archival, error, merge | |
15168 | 16 from mercurial.i18n import _ |
17 from mercurial.node import hex | |
18 from hgext import rebase | |
19 | |
20 import lfutil | |
21 import lfcommands | |
22 | |
15792
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
23 # -- Utility functions: commonly/repeatedly needed functionality --------------- |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
24 |
15168 | 25 def installnormalfilesmatchfn(manifest): |
26 '''overrides scmutil.match so that the matcher it returns will ignore all | |
27 largefiles''' | |
28 oldmatch = None # for the closure | |
15306
94527d67f3da
largefiles: fix some badly named function parameters
Greg Ward <greg@gerg.ca>
parents:
15305
diff
changeset
|
29 def override_match(ctx, pats=[], opts={}, globbed=False, |
15168 | 30 default='relpath'): |
15306
94527d67f3da
largefiles: fix some badly named function parameters
Greg Ward <greg@gerg.ca>
parents:
15305
diff
changeset
|
31 match = oldmatch(ctx, pats, opts, globbed, default) |
15168 | 32 m = copy.copy(match) |
33 notlfile = lambda f: not (lfutil.isstandin(f) or lfutil.standin(f) in | |
34 manifest) | |
35 m._files = filter(notlfile, m._files) | |
36 m._fmap = set(m._files) | |
37 orig_matchfn = m.matchfn | |
38 m.matchfn = lambda f: notlfile(f) and orig_matchfn(f) or None | |
39 return m | |
40 oldmatch = installmatchfn(override_match) | |
41 | |
42 def installmatchfn(f): | |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
43 oldmatch = scmutil.match |
15168 | 44 setattr(f, 'oldmatch', oldmatch) |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
45 scmutil.match = f |
15168 | 46 return oldmatch |
47 | |
48 def restorematchfn(): | |
49 '''restores scmutil.match to what it was before installnormalfilesmatchfn | |
50 was called. no-op if scmutil.match is its original function. | |
51 | |
52 Note that n calls to installnormalfilesmatchfn will require n calls to | |
53 restore matchfn to reverse''' | |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
54 scmutil.match = getattr(scmutil.match, 'oldmatch', scmutil.match) |
15168 | 55 |
15792
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
56 def add_largefiles(ui, repo, *pats, **opts): |
15168 | 57 large = opts.pop('large', None) |
15227
a7686abf73a6
largefiles: factor out lfutil.getminsize()
Greg Ward <greg@gerg.ca>
parents:
15224
diff
changeset
|
58 lfsize = lfutil.getminsize( |
a7686abf73a6
largefiles: factor out lfutil.getminsize()
Greg Ward <greg@gerg.ca>
parents:
15224
diff
changeset
|
59 ui, lfutil.islfilesrepo(repo), opts.pop('lfsize', None)) |
15168 | 60 |
61 lfmatcher = None | |
15739
be55285470cf
largefiles: tiny code clean up
Michal Sznajder <michalsznajder@gmail.com>
parents:
15674
diff
changeset
|
62 if lfutil.islfilesrepo(repo): |
15229
89e19ca2a90e
largefiles: use ui.configlist() to split largefiles.patterns
Greg Ward <greg@gerg.ca>
parents:
15227
diff
changeset
|
63 lfpats = ui.configlist(lfutil.longname, 'patterns', default=[]) |
15168 | 64 if lfpats: |
65 lfmatcher = match_.match(repo.root, '', list(lfpats)) | |
66 | |
67 lfnames = [] | |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
68 m = scmutil.match(repo[None], pats, opts) |
15168 | 69 m.bad = lambda x, y: None |
70 wctx = repo[None] | |
71 for f in repo.walk(m): | |
72 exact = m.exact(f) | |
73 lfile = lfutil.standin(f) in wctx | |
74 nfile = f in wctx | |
75 exists = lfile or nfile | |
76 | |
77 # Don't warn the user when they attempt to add a normal tracked file. | |
78 # The normal add code will do that for us. | |
79 if exact and exists: | |
80 if lfile: | |
81 ui.warn(_('%s already a largefile\n') % f) | |
82 continue | |
83 | |
84 if exact or not exists: | |
15255
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
85 abovemin = (lfsize and |
15369
b4ea79f88268
largefiles: bugfix for symlink handling with testcase
Eli Carter <eli.carter@tektronix.com>
parents:
15323
diff
changeset
|
86 os.lstat(repo.wjoin(f)).st_size >= lfsize * 1024 * 1024) |
15255
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
87 if large or abovemin or (lfmatcher and lfmatcher(f)): |
15168 | 88 lfnames.append(f) |
89 if ui.verbose or not exact: | |
90 ui.status(_('adding %s as a largefile\n') % m.rel(f)) | |
91 | |
92 bad = [] | |
93 standins = [] | |
94 | |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15229
diff
changeset
|
95 # Need to lock, otherwise there could be a race condition between |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15229
diff
changeset
|
96 # when standins are created and added to the repo. |
15168 | 97 wlock = repo.wlock() |
98 try: | |
99 if not opts.get('dry_run'): | |
100 lfdirstate = lfutil.openlfdirstate(ui, repo) | |
101 for f in lfnames: | |
102 standinname = lfutil.standin(f) | |
103 lfutil.writestandin(repo, standinname, hash='', | |
104 executable=lfutil.getexecutable(repo.wjoin(f))) | |
105 standins.append(standinname) | |
106 if lfdirstate[f] == 'r': | |
107 lfdirstate.normallookup(f) | |
108 else: | |
109 lfdirstate.add(f) | |
110 lfdirstate.write() | |
15255
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
111 bad += [lfutil.splitstandin(f) |
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
112 for f in lfutil.repo_add(repo, standins) |
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
113 if f in m.files()] |
15168 | 114 finally: |
115 wlock.release() | |
15792
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
116 return bad |
15168 | 117 |
15792
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
118 def remove_largefiles(ui, repo, *pats, **opts): |
15786
aca0f2b3c7e3
largefiles: fix confusion upon removal of added largefile (issue3176)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15663
diff
changeset
|
119 after = opts.get('after') |
15168 | 120 if not pats and not after: |
121 raise util.Abort(_('no files specified')) | |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
122 m = scmutil.match(repo[None], pats, opts) |
15168 | 123 try: |
124 repo.lfstatus = True | |
125 s = repo.status(match=m, clean=True) | |
126 finally: | |
127 repo.lfstatus = False | |
15792
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
128 manifest = repo[None].manifest() |
15255
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
129 modified, added, deleted, clean = [[f for f in list |
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
130 if lfutil.standin(f) in manifest] |
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
131 for list in [s[0], s[1], s[3], s[6]]] |
15168 | 132 |
133 def warn(files, reason): | |
134 for f in files: | |
15786
aca0f2b3c7e3
largefiles: fix confusion upon removal of added largefile (issue3176)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15663
diff
changeset
|
135 ui.warn(_('not removing %s: %s (use forget to undo)\n') |
15168 | 136 % (m.rel(f), reason)) |
137 | |
15786
aca0f2b3c7e3
largefiles: fix confusion upon removal of added largefile (issue3176)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15663
diff
changeset
|
138 if after: |
15168 | 139 remove, forget = deleted, [] |
15294
db7b09e689f1
largefiles: make parameter more i18n-friendly
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
15279
diff
changeset
|
140 warn(modified + added + clean, _('file still exists')) |
15168 | 141 else: |
142 remove, forget = deleted + clean, [] | |
15294
db7b09e689f1
largefiles: make parameter more i18n-friendly
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
15279
diff
changeset
|
143 warn(modified, _('file is modified')) |
db7b09e689f1
largefiles: make parameter more i18n-friendly
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
15279
diff
changeset
|
144 warn(added, _('file has been marked for add')) |
15168 | 145 |
146 for f in sorted(remove + forget): | |
147 if ui.verbose or not m.exact(f): | |
148 ui.status(_('removing %s\n') % m.rel(f)) | |
149 | |
150 # Need to lock because standin files are deleted then removed from the | |
151 # repository and we could race inbetween. | |
152 wlock = repo.wlock() | |
153 try: | |
154 lfdirstate = lfutil.openlfdirstate(ui, repo) | |
155 for f in remove: | |
156 if not after: | |
15792
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
157 # If this is being called by addremove, notify the user that we |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
158 # are removing the file. |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
159 if getattr(repo, "_isaddremove", False): |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
160 ui.status(_('removing %s\n' % f)) |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
161 if os.path.exists(repo.wjoin(f)): |
15930
2dc599583ebe
largefiles: test and simplify empty directory removal in remove
Patrick Mezard <pmezard@gmail.com>
parents:
15916
diff
changeset
|
162 util.unlinkpath(repo.wjoin(f)) |
15168 | 163 lfdirstate.remove(f) |
164 lfdirstate.write() | |
165 forget = [lfutil.standin(f) for f in forget] | |
166 remove = [lfutil.standin(f) for f in remove] | |
167 lfutil.repo_forget(repo, forget) | |
15792
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
168 # If this is being called by addremove, let the original addremove |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
169 # function handle this. |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
170 if not getattr(repo, "_isaddremove", False): |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
171 lfutil.repo_remove(repo, remove, unlink=True) |
15168 | 172 finally: |
173 wlock.release() | |
174 | |
15792
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
175 # -- Wrappers: modify existing commands -------------------------------- |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
176 |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
177 # Add works by going through the files that the user wanted to add and |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
178 # checking if they should be added as largefiles. Then it makes a new |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
179 # matcher which matches only the normal files and runs the original |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
180 # version of add. |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
181 def override_add(orig, ui, repo, *pats, **opts): |
15944
f19d5c852f9b
largefiles: add --normal option to hg add (issue3061)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15930
diff
changeset
|
182 normal = opts.pop('normal') |
f19d5c852f9b
largefiles: add --normal option to hg add (issue3061)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15930
diff
changeset
|
183 if normal: |
f19d5c852f9b
largefiles: add --normal option to hg add (issue3061)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15930
diff
changeset
|
184 if opts.get('large'): |
f19d5c852f9b
largefiles: add --normal option to hg add (issue3061)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15930
diff
changeset
|
185 raise util.Abort(_('--normal cannot be used with --large')) |
f19d5c852f9b
largefiles: add --normal option to hg add (issue3061)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15930
diff
changeset
|
186 return orig(ui, repo, *pats, **opts) |
15792
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
187 bad = add_largefiles(ui, repo, *pats, **opts) |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
188 installnormalfilesmatchfn(repo[None].manifest()) |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
189 result = orig(ui, repo, *pats, **opts) |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
190 restorematchfn() |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
191 |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
192 return (result == 1 or bad) and 1 or 0 |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
193 |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
194 def override_remove(orig, ui, repo, *pats, **opts): |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
195 installnormalfilesmatchfn(repo[None].manifest()) |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
196 orig(ui, repo, *pats, **opts) |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
197 restorematchfn() |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
198 remove_largefiles(ui, repo, *pats, **opts) |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
199 |
15168 | 200 def override_status(orig, ui, repo, *pats, **opts): |
201 try: | |
202 repo.lfstatus = True | |
203 return orig(ui, repo, *pats, **opts) | |
204 finally: | |
205 repo.lfstatus = False | |
206 | |
207 def override_log(orig, ui, repo, *pats, **opts): | |
208 try: | |
209 repo.lfstatus = True | |
210 orig(ui, repo, *pats, **opts) | |
211 finally: | |
212 repo.lfstatus = False | |
213 | |
214 def override_verify(orig, ui, repo, *pats, **opts): | |
215 large = opts.pop('large', False) | |
216 all = opts.pop('lfa', False) | |
217 contents = opts.pop('lfc', False) | |
218 | |
219 result = orig(ui, repo, *pats, **opts) | |
220 if large: | |
221 result = result or lfcommands.verifylfiles(ui, repo, all, contents) | |
222 return result | |
223 | |
224 # Override needs to refresh standins so that update's normal merge | |
225 # will go through properly. Then the other update hook (overriding repo.update) | |
226 # will get the new files. Filemerge is also overriden so that the merge | |
227 # will merge standins correctly. | |
228 def override_update(orig, ui, repo, *pats, **opts): | |
229 lfdirstate = lfutil.openlfdirstate(ui, repo) | |
230 s = lfdirstate.status(match_.always(repo.root, repo.getcwd()), [], False, | |
231 False, False) | |
232 (unsure, modified, added, removed, missing, unknown, ignored, clean) = s | |
233 | |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15229
diff
changeset
|
234 # Need to lock between the standins getting updated and their |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15229
diff
changeset
|
235 # largefiles getting updated |
15168 | 236 wlock = repo.wlock() |
237 try: | |
238 if opts['check']: | |
239 mod = len(modified) > 0 | |
240 for lfile in unsure: | |
241 standin = lfutil.standin(lfile) | |
242 if repo['.'][standin].data().strip() != \ | |
243 lfutil.hashfile(repo.wjoin(lfile)): | |
244 mod = True | |
245 else: | |
246 lfdirstate.normal(lfile) | |
247 lfdirstate.write() | |
248 if mod: | |
249 raise util.Abort(_('uncommitted local changes')) | |
250 # XXX handle removed differently | |
251 if not opts['clean']: | |
252 for lfile in unsure + modified + added: | |
253 lfutil.updatestandin(repo, lfutil.standin(lfile)) | |
254 finally: | |
255 wlock.release() | |
256 return orig(ui, repo, *pats, **opts) | |
257 | |
15663
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
258 # Before starting the manifest merge, merge.updates will call |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
259 # _checkunknown to check if there are any files in the merged-in |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
260 # changeset that collide with unknown files in the working copy. |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
261 # |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
262 # The largefiles are seen as unknown, so this prevents us from merging |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
263 # in a file 'foo' if we already have a largefile with the same name. |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
264 # |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
265 # The overridden function filters the unknown files by removing any |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
266 # largefiles. This makes the merge proceed and we can then handle this |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
267 # case further in the overridden manifestmerge function below. |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
268 def override_checkunknown(origfn, wctx, mctx, folding): |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
269 origunknown = wctx.unknown() |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
270 wctx._unknown = filter(lambda f: lfutil.standin(f) not in wctx, origunknown) |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
271 try: |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
272 return origfn(wctx, mctx, folding) |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
273 finally: |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
274 wctx._unknown = origunknown |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
275 |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
276 # The manifest merge handles conflicts on the manifest level. We want |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
277 # to handle changes in largefile-ness of files at this level too. |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
278 # |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
279 # The strategy is to run the original manifestmerge and then process |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
280 # the action list it outputs. There are two cases we need to deal with: |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
281 # |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
282 # 1. Normal file in p1, largefile in p2. Here the largefile is |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
283 # detected via its standin file, which will enter the working copy |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
284 # with a "get" action. It is not "merge" since the standin is all |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
285 # Mercurial is concerned with at this level -- the link to the |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
286 # existing normal file is not relevant here. |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
287 # |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
288 # 2. Largefile in p1, normal file in p2. Here we get a "merge" action |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
289 # since the largefile will be present in the working copy and |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
290 # different from the normal file in p2. Mercurial therefore |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
291 # triggers a merge action. |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
292 # |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
293 # In both cases, we prompt the user and emit new actions to either |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
294 # remove the standin (if the normal file was kept) or to remove the |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
295 # normal file and get the standin (if the largefile was kept). The |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
296 # default prompt answer is to use the largefile version since it was |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
297 # presumably changed on purpose. |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
298 # |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
299 # Finally, the merge.applyupdates function will then take care of |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
300 # writing the files into the working copy and lfcommands.updatelfiles |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
301 # will update the largefiles. |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
302 def override_manifestmerge(origfn, repo, p1, p2, pa, overwrite, partial): |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
303 actions = origfn(repo, p1, p2, pa, overwrite, partial) |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
304 processed = [] |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
305 |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
306 for action in actions: |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
307 if overwrite: |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
308 processed.append(action) |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
309 continue |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
310 f, m = action[:2] |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
311 |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
312 choices = (_('&Largefile'), _('&Normal file')) |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
313 if m == "g" and lfutil.splitstandin(f) in p1 and f in p2: |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
314 # Case 1: normal file in the working copy, largefile in |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
315 # the second parent |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
316 lfile = lfutil.splitstandin(f) |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
317 standin = f |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
318 msg = _('%s has been turned into a largefile\n' |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
319 'use (l)argefile or keep as (n)ormal file?') % lfile |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
320 if repo.ui.promptchoice(msg, choices, 0) == 0: |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
321 processed.append((lfile, "r")) |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
322 processed.append((standin, "g", p2.flags(standin))) |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
323 else: |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
324 processed.append((standin, "r")) |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
325 elif m == "m" and lfutil.standin(f) in p1 and f in p2: |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
326 # Case 2: largefile in the working copy, normal file in |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
327 # the second parent |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
328 standin = lfutil.standin(f) |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
329 lfile = f |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
330 msg = _('%s has been turned into a normal file\n' |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
331 'keep as (l)argefile or use (n)ormal file?') % lfile |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
332 if repo.ui.promptchoice(msg, choices, 0) == 0: |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
333 processed.append((lfile, "r")) |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
334 else: |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
335 processed.append((standin, "r")) |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
336 processed.append((lfile, "g", p2.flags(lfile))) |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
337 else: |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
338 processed.append(action) |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
339 |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
340 return processed |
9036c7d106bf
largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
341 |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15229
diff
changeset
|
342 # Override filemerge to prompt the user about how they wish to merge |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15229
diff
changeset
|
343 # largefiles. This will handle identical edits, and copy/rename + |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15229
diff
changeset
|
344 # edit without prompting the user. |
15168 | 345 def override_filemerge(origfn, repo, mynode, orig, fcd, fco, fca): |
346 # Use better variable names here. Because this is a wrapper we cannot | |
347 # change the variable names in the function declaration. | |
348 fcdest, fcother, fcancestor = fcd, fco, fca | |
349 if not lfutil.isstandin(orig): | |
350 return origfn(repo, mynode, orig, fcdest, fcother, fcancestor) | |
351 else: | |
352 if not fcother.cmp(fcdest): # files identical? | |
353 return None | |
354 | |
355 # backwards, use working dir parent as ancestor | |
356 if fcancestor == fcother: | |
357 fcancestor = fcdest.parents()[0] | |
358 | |
359 if orig != fcother.path(): | |
360 repo.ui.status(_('merging %s and %s to %s\n') | |
361 % (lfutil.splitstandin(orig), | |
362 lfutil.splitstandin(fcother.path()), | |
363 lfutil.splitstandin(fcdest.path()))) | |
364 else: | |
365 repo.ui.status(_('merging %s\n') | |
366 % lfutil.splitstandin(fcdest.path())) | |
367 | |
368 if fcancestor.path() != fcother.path() and fcother.data() == \ | |
369 fcancestor.data(): | |
370 return 0 | |
371 if fcancestor.path() != fcdest.path() and fcdest.data() == \ | |
372 fcancestor.data(): | |
373 repo.wwrite(fcdest.path(), fcother.data(), fcother.flags()) | |
374 return 0 | |
375 | |
376 if repo.ui.promptchoice(_('largefile %s has a merge conflict\n' | |
377 'keep (l)ocal or take (o)ther?') % | |
378 lfutil.splitstandin(orig), | |
379 (_('&Local'), _('&Other')), 0) == 0: | |
380 return 0 | |
381 else: | |
382 repo.wwrite(fcdest.path(), fcother.data(), fcother.flags()) | |
383 return 0 | |
384 | |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15229
diff
changeset
|
385 # Copy first changes the matchers to match standins instead of |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15229
diff
changeset
|
386 # largefiles. Then it overrides util.copyfile in that function it |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15229
diff
changeset
|
387 # checks if the destination largefile already exists. It also keeps a |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15229
diff
changeset
|
388 # list of copied files so that the largefiles can be copied and the |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15229
diff
changeset
|
389 # dirstate updated. |
15168 | 390 def override_copy(orig, ui, repo, pats, opts, rename=False): |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15229
diff
changeset
|
391 # doesn't remove largefile on rename |
15168 | 392 if len(pats) < 2: |
393 # this isn't legal, let the original function deal with it | |
394 return orig(ui, repo, pats, opts, rename) | |
395 | |
396 def makestandin(relpath): | |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
397 path = scmutil.canonpath(repo.root, repo.getcwd(), relpath) |
15323
19368c54a774
largefiles: remove all uses of os.path.relpath for 2.4 compatibility
Benjamin Pollack <benjamin@bitquabit.com>
parents:
15306
diff
changeset
|
398 return os.path.join(repo.wjoin(lfutil.standin(path))) |
15168 | 399 |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
400 fullpats = scmutil.expandpats(pats) |
15168 | 401 dest = fullpats[-1] |
402 | |
403 if os.path.isdir(dest): | |
404 if not os.path.isdir(makestandin(dest)): | |
405 os.makedirs(makestandin(dest)) | |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
406 # This could copy both lfiles and normal files in one command, |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
407 # but we don't want to do that. First replace their matcher to |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
408 # only match normal files and run it, then replace it to just |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
409 # match largefiles and run it again. |
15168 | 410 nonormalfiles = False |
411 nolfiles = False | |
412 try: | |
15279
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
413 try: |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
414 installnormalfilesmatchfn(repo[None].manifest()) |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
415 result = orig(ui, repo, pats, opts, rename) |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
416 except util.Abort, e: |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
417 if str(e) != 'no files to copy': |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
418 raise e |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
419 else: |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
420 nonormalfiles = True |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
421 result = 0 |
15168 | 422 finally: |
423 restorematchfn() | |
424 | |
425 # The first rename can cause our current working directory to be removed. | |
426 # In that case there is nothing left to copy/rename so just quit. | |
427 try: | |
428 repo.getcwd() | |
429 except OSError: | |
430 return result | |
431 | |
432 try: | |
15279
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
433 try: |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
434 # When we call orig below it creates the standins but we don't add them |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
435 # to the dir state until later so lock during that time. |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
436 wlock = repo.wlock() |
15168 | 437 |
15279
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
438 manifest = repo[None].manifest() |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
439 oldmatch = None # for the closure |
15306
94527d67f3da
largefiles: fix some badly named function parameters
Greg Ward <greg@gerg.ca>
parents:
15305
diff
changeset
|
440 def override_match(ctx, pats=[], opts={}, globbed=False, |
15279
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
441 default='relpath'): |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
442 newpats = [] |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
443 # The patterns were previously mangled to add the standin |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
444 # directory; we need to remove that now |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
445 for pat in pats: |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
446 if match_.patkind(pat) is None and lfutil.shortname in pat: |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
447 newpats.append(pat.replace(lfutil.shortname, '')) |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
448 else: |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
449 newpats.append(pat) |
15306
94527d67f3da
largefiles: fix some badly named function parameters
Greg Ward <greg@gerg.ca>
parents:
15305
diff
changeset
|
450 match = oldmatch(ctx, newpats, opts, globbed, default) |
15279
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
451 m = copy.copy(match) |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
452 lfile = lambda f: lfutil.standin(f) in manifest |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
453 m._files = [lfutil.standin(f) for f in m._files if lfile(f)] |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
454 m._fmap = set(m._files) |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
455 orig_matchfn = m.matchfn |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
456 m.matchfn = lambda f: (lfutil.isstandin(f) and |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
457 lfile(lfutil.splitstandin(f)) and |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
458 orig_matchfn(lfutil.splitstandin(f)) or |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
459 None) |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
460 return m |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
461 oldmatch = installmatchfn(override_match) |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
462 listpats = [] |
15168 | 463 for pat in pats: |
15279
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
464 if match_.patkind(pat) is not None: |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
465 listpats.append(pat) |
15168 | 466 else: |
15279
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
467 listpats.append(makestandin(pat)) |
15168 | 468 |
15279
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
469 try: |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
470 origcopyfile = util.copyfile |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
471 copiedfiles = [] |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
472 def override_copyfile(src, dest): |
15598
a77ce45584ef
largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15576
diff
changeset
|
473 if (lfutil.shortname in src and |
a77ce45584ef
largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15576
diff
changeset
|
474 dest.startswith(repo.wjoin(lfutil.shortname))): |
15279
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
475 destlfile = dest.replace(lfutil.shortname, '') |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
476 if not opts['force'] and os.path.exists(destlfile): |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
477 raise IOError('', |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
478 _('destination largefile already exists')) |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
479 copiedfiles.append((src, dest)) |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
480 origcopyfile(src, dest) |
15168 | 481 |
15279
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
482 util.copyfile = override_copyfile |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
483 result += orig(ui, repo, listpats, opts, rename) |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
484 finally: |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
485 util.copyfile = origcopyfile |
15168 | 486 |
15279
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
487 lfdirstate = lfutil.openlfdirstate(ui, repo) |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
488 for (src, dest) in copiedfiles: |
15598
a77ce45584ef
largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15576
diff
changeset
|
489 if (lfutil.shortname in src and |
a77ce45584ef
largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15576
diff
changeset
|
490 dest.startswith(repo.wjoin(lfutil.shortname))): |
a77ce45584ef
largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15576
diff
changeset
|
491 srclfile = src.replace(repo.wjoin(lfutil.standin('')), '') |
a77ce45584ef
largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15576
diff
changeset
|
492 destlfile = dest.replace(repo.wjoin(lfutil.standin('')), '') |
15279
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
493 destlfiledir = os.path.dirname(destlfile) or '.' |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
494 if not os.path.isdir(destlfiledir): |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
495 os.makedirs(destlfiledir) |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
496 if rename: |
15598
a77ce45584ef
largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15576
diff
changeset
|
497 os.rename(repo.wjoin(srclfile), repo.wjoin(destlfile)) |
a77ce45584ef
largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15576
diff
changeset
|
498 lfdirstate.remove(srclfile) |
15279
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
499 else: |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
500 util.copyfile(srclfile, destlfile) |
15598
a77ce45584ef
largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15576
diff
changeset
|
501 lfdirstate.add(destlfile) |
15279
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
502 lfdirstate.write() |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
503 except util.Abort, e: |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
504 if str(e) != 'no files to copy': |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
505 raise e |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
506 else: |
018608160299
largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents:
15255
diff
changeset
|
507 nolfiles = True |
15168 | 508 finally: |
509 restorematchfn() | |
510 wlock.release() | |
511 | |
512 if nolfiles and nonormalfiles: | |
513 raise util.Abort(_('no files to copy')) | |
514 | |
515 return result | |
516 | |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
517 # When the user calls revert, we have to be careful to not revert any |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
518 # changes to other largefiles accidentally. This means we have to keep |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
519 # track of the largefiles that are being reverted so we only pull down |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
520 # the necessary largefiles. |
15168 | 521 # |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
522 # Standins are only updated (to match the hash of largefiles) before |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
523 # commits. Update the standins then run the original revert, changing |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
524 # the matcher to hit standins instead of largefiles. Based on the |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
525 # resulting standins update the largefiles. Then return the standins |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
526 # to their proper state |
15168 | 527 def override_revert(orig, ui, repo, *pats, **opts): |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
528 # Because we put the standins in a bad state (by updating them) |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
529 # and then return them to a correct state we need to lock to |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
530 # prevent others from changing them in their incorrect state. |
15168 | 531 wlock = repo.wlock() |
532 try: | |
533 lfdirstate = lfutil.openlfdirstate(ui, repo) | |
534 (modified, added, removed, missing, unknown, ignored, clean) = \ | |
535 lfutil.lfdirstate_status(lfdirstate, repo, repo['.'].rev()) | |
536 for lfile in modified: | |
537 lfutil.updatestandin(repo, lfutil.standin(lfile)) | |
15983
32b9aee3602c
largefiles: fix revert on missing largefile (issue3217)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15982
diff
changeset
|
538 for lfile in missing: |
32b9aee3602c
largefiles: fix revert on missing largefile (issue3217)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15982
diff
changeset
|
539 os.unlink(repo.wjoin(lfutil.standin(lfile))) |
15168 | 540 |
541 try: | |
542 ctx = repo[opts.get('rev')] | |
543 oldmatch = None # for the closure | |
15306
94527d67f3da
largefiles: fix some badly named function parameters
Greg Ward <greg@gerg.ca>
parents:
15305
diff
changeset
|
544 def override_match(ctx, pats=[], opts={}, globbed=False, |
15168 | 545 default='relpath'): |
15306
94527d67f3da
largefiles: fix some badly named function parameters
Greg Ward <greg@gerg.ca>
parents:
15305
diff
changeset
|
546 match = oldmatch(ctx, pats, opts, globbed, default) |
15168 | 547 m = copy.copy(match) |
548 def tostandin(f): | |
15306
94527d67f3da
largefiles: fix some badly named function parameters
Greg Ward <greg@gerg.ca>
parents:
15305
diff
changeset
|
549 if lfutil.standin(f) in ctx or lfutil.standin(f) in ctx: |
15168 | 550 return lfutil.standin(f) |
551 elif lfutil.standin(f) in repo[None]: | |
552 return None | |
553 return f | |
554 m._files = [tostandin(f) for f in m._files] | |
555 m._files = [f for f in m._files if f is not None] | |
556 m._fmap = set(m._files) | |
557 orig_matchfn = m.matchfn | |
558 def matchfn(f): | |
559 if lfutil.isstandin(f): | |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
560 # We need to keep track of what largefiles are being |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
561 # matched so we know which ones to update later -- |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
562 # otherwise we accidentally revert changes to other |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
563 # largefiles. This is repo-specific, so duckpunch the |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
564 # repo object to keep the list of largefiles for us |
15168 | 565 # later. |
566 if orig_matchfn(lfutil.splitstandin(f)) and \ | |
567 (f in repo[None] or f in ctx): | |
568 lfileslist = getattr(repo, '_lfilestoupdate', []) | |
569 lfileslist.append(lfutil.splitstandin(f)) | |
570 repo._lfilestoupdate = lfileslist | |
571 return True | |
572 else: | |
573 return False | |
574 return orig_matchfn(f) | |
575 m.matchfn = matchfn | |
576 return m | |
577 oldmatch = installmatchfn(override_match) | |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
578 scmutil.match |
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
579 matches = override_match(repo[None], pats, opts) |
15168 | 580 orig(ui, repo, *pats, **opts) |
581 finally: | |
582 restorematchfn() | |
583 lfileslist = getattr(repo, '_lfilestoupdate', []) | |
15170
c1a4a3220711
largefiles: fix over-long lines
Matt Mackall <mpm@selenic.com>
parents:
15169
diff
changeset
|
584 lfcommands.updatelfiles(ui, repo, filelist=lfileslist, |
c1a4a3220711
largefiles: fix over-long lines
Matt Mackall <mpm@selenic.com>
parents:
15169
diff
changeset
|
585 printmessage=False) |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
586 |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
587 # empty out the largefiles list so we start fresh next time |
15168 | 588 repo._lfilestoupdate = [] |
589 for lfile in modified: | |
590 if lfile in lfileslist: | |
591 if os.path.exists(repo.wjoin(lfutil.standin(lfile))) and lfile\ | |
592 in repo['.']: | |
593 lfutil.writestandin(repo, lfutil.standin(lfile), | |
594 repo['.'][lfile].data().strip(), | |
595 'x' in repo['.'][lfile].flags()) | |
596 lfdirstate = lfutil.openlfdirstate(ui, repo) | |
597 for lfile in added: | |
598 standin = lfutil.standin(lfile) | |
599 if standin not in ctx and (standin in matches or opts.get('all')): | |
600 if lfile in lfdirstate: | |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
601 lfdirstate.drop(lfile) |
15168 | 602 util.unlinkpath(repo.wjoin(standin)) |
603 lfdirstate.write() | |
604 finally: | |
605 wlock.release() | |
606 | |
607 def hg_update(orig, repo, node): | |
608 result = orig(repo, node) | |
609 lfcommands.updatelfiles(repo.ui, repo) | |
610 return result | |
611 | |
612 def hg_clean(orig, repo, node, show_stats=True): | |
613 result = orig(repo, node, show_stats) | |
614 lfcommands.updatelfiles(repo.ui, repo) | |
615 return result | |
616 | |
617 def hg_merge(orig, repo, node, force=None, remind=True): | |
15860
3ecce805ac13
largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents:
15794
diff
changeset
|
618 # Mark the repo as being in the middle of a merge, so that |
3ecce805ac13
largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents:
15794
diff
changeset
|
619 # updatelfiles() will know that it needs to trust the standins in |
3ecce805ac13
largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents:
15794
diff
changeset
|
620 # the working copy, not in the standins in the current node |
3ecce805ac13
largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents:
15794
diff
changeset
|
621 repo._ismerging = True |
3ecce805ac13
largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents:
15794
diff
changeset
|
622 try: |
3ecce805ac13
largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents:
15794
diff
changeset
|
623 result = orig(repo, node, force, remind) |
3ecce805ac13
largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents:
15794
diff
changeset
|
624 lfcommands.updatelfiles(repo.ui, repo) |
3ecce805ac13
largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents:
15794
diff
changeset
|
625 finally: |
3ecce805ac13
largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents:
15794
diff
changeset
|
626 repo._ismerging = False |
15168 | 627 return result |
628 | |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
629 # When we rebase a repository with remotely changed largefiles, we need to |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
630 # take some extra care so that the largefiles are correctly updated in the |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
631 # working copy |
15168 | 632 def override_pull(orig, ui, repo, source=None, **opts): |
633 if opts.get('rebase', False): | |
634 repo._isrebasing = True | |
635 try: | |
636 if opts.get('update'): | |
637 del opts['update'] | |
638 ui.debug('--update and --rebase are not compatible, ignoring ' | |
639 'the update flag\n') | |
640 del opts['rebase'] | |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
641 cmdutil.bailifchanged(repo) |
15168 | 642 revsprepull = len(repo) |
643 origpostincoming = commands.postincoming | |
644 def _dummy(*args, **kwargs): | |
645 pass | |
646 commands.postincoming = _dummy | |
647 repo.lfpullsource = source | |
648 if not source: | |
649 source = 'default' | |
650 try: | |
651 result = commands.pull(ui, repo, source, **opts) | |
652 finally: | |
653 commands.postincoming = origpostincoming | |
654 revspostpull = len(repo) | |
655 if revspostpull > revsprepull: | |
656 result = result or rebase.rebase(ui, repo) | |
657 finally: | |
658 repo._isrebasing = False | |
659 else: | |
660 repo.lfpullsource = source | |
661 if not source: | |
662 source = 'default' | |
663 result = orig(ui, repo, source, **opts) | |
15916
c96148346af8
largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents:
15914
diff
changeset
|
664 # If we do not have the new largefiles for any new heads we pulled, we |
c96148346af8
largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents:
15914
diff
changeset
|
665 # will run into a problem later if we try to merge or rebase with one of |
c96148346af8
largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents:
15914
diff
changeset
|
666 # these heads, so cache the largefiles now direclty into the system |
c96148346af8
largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents:
15914
diff
changeset
|
667 # cache. |
c96148346af8
largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents:
15914
diff
changeset
|
668 ui.status(_("caching new largefiles\n")) |
c96148346af8
largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents:
15914
diff
changeset
|
669 numcached = 0 |
c96148346af8
largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents:
15914
diff
changeset
|
670 branches = repo.branchmap() |
c96148346af8
largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents:
15914
diff
changeset
|
671 for branch in branches: |
c96148346af8
largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents:
15914
diff
changeset
|
672 heads = repo.branchheads(branch) |
c96148346af8
largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents:
15914
diff
changeset
|
673 for head in heads: |
c96148346af8
largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents:
15914
diff
changeset
|
674 (cached, missing) = lfcommands.cachelfiles(ui, repo, head) |
c96148346af8
largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents:
15914
diff
changeset
|
675 numcached += len(cached) |
c96148346af8
largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents:
15914
diff
changeset
|
676 ui.status(_("%d largefiles cached\n" % numcached)) |
15168 | 677 return result |
678 | |
679 def override_rebase(orig, ui, repo, **opts): | |
680 repo._isrebasing = True | |
681 try: | |
682 orig(ui, repo, **opts) | |
683 finally: | |
684 repo._isrebasing = False | |
685 | |
686 def override_archive(orig, repo, dest, node, kind, decode=True, matchfn=None, | |
687 prefix=None, mtime=None, subrepos=None): | |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
688 # No need to lock because we are only reading history and |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
689 # largefile caches, neither of which are modified. |
15168 | 690 lfcommands.cachelfiles(repo.ui, repo, node) |
691 | |
692 if kind not in archival.archivers: | |
693 raise util.Abort(_("unknown archive type '%s'") % kind) | |
694 | |
695 ctx = repo[node] | |
696 | |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
697 if kind == 'files': |
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
698 if prefix: |
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
699 raise util.Abort( |
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
700 _('cannot give prefix when archiving to files')) |
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
701 else: |
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
702 prefix = archival.tidyprefix(dest, kind, prefix) |
15168 | 703 |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
704 def write(name, mode, islink, getdata): |
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
705 if matchfn and not matchfn(name): |
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
706 return |
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
707 data = getdata() |
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
708 if decode: |
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
709 data = repo.wwritedata(name, data) |
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
710 archiver.addfile(prefix + name, mode, islink, data) |
15168 | 711 |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
712 archiver = archival.archivers[kind](dest, mtime or ctx.date()[0]) |
15168 | 713 |
714 if repo.ui.configbool("ui", "archivemeta", True): | |
715 def metadata(): | |
716 base = 'repo: %s\nnode: %s\nbranch: %s\n' % ( | |
717 hex(repo.changelog.node(0)), hex(node), ctx.branch()) | |
718 | |
719 tags = ''.join('tag: %s\n' % t for t in ctx.tags() | |
720 if repo.tagtype(t) == 'global') | |
721 if not tags: | |
722 repo.ui.pushbuffer() | |
723 opts = {'template': '{latesttag}\n{latesttagdistance}', | |
724 'style': '', 'patch': None, 'git': None} | |
725 cmdutil.show_changeset(repo.ui, repo, opts).show(ctx) | |
726 ltags, dist = repo.ui.popbuffer().split('\n') | |
727 tags = ''.join('latesttag: %s\n' % t for t in ltags.split(':')) | |
728 tags += 'latesttagdistance: %s\n' % dist | |
729 | |
730 return base + tags | |
731 | |
732 write('.hg_archival.txt', 0644, False, metadata) | |
733 | |
734 for f in ctx: | |
735 ff = ctx.flags(f) | |
736 getdata = ctx[f].data | |
737 if lfutil.isstandin(f): | |
738 path = lfutil.findfile(repo, getdata().strip()) | |
15914
264087940d5b
largefiles: check if largefile could be found when archiving (issue3193)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15860
diff
changeset
|
739 if path is None: |
264087940d5b
largefiles: check if largefile could be found when archiving (issue3193)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15860
diff
changeset
|
740 raise util.Abort( |
264087940d5b
largefiles: check if largefile could be found when archiving (issue3193)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15860
diff
changeset
|
741 _('largefile %s not found in repo store or system cache') |
264087940d5b
largefiles: check if largefile could be found when archiving (issue3193)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15860
diff
changeset
|
742 % lfutil.splitstandin(f)) |
15168 | 743 f = lfutil.splitstandin(f) |
744 | |
745 def getdatafn(): | |
15576
e387e760b207
largefiles: avoid use of uinitialized variable in case of errors
Mads Kiilerich <mads@kiilerich.com>
parents:
15383
diff
changeset
|
746 fd = None |
15168 | 747 try: |
748 fd = open(path, 'rb') | |
749 return fd.read() | |
750 finally: | |
15576
e387e760b207
largefiles: avoid use of uinitialized variable in case of errors
Mads Kiilerich <mads@kiilerich.com>
parents:
15383
diff
changeset
|
751 if fd: |
e387e760b207
largefiles: avoid use of uinitialized variable in case of errors
Mads Kiilerich <mads@kiilerich.com>
parents:
15383
diff
changeset
|
752 fd.close() |
15168 | 753 |
754 getdata = getdatafn | |
755 write(f, 'x' in ff and 0755 or 0644, 'l' in ff, getdata) | |
756 | |
757 if subrepos: | |
758 for subpath in ctx.substate: | |
759 sub = ctx.sub(subpath) | |
15626
931dc4af0d95
largefiles: remove pre-1.7 compatibility code
Martin Geisler <mg@aragost.com>
parents:
15598
diff
changeset
|
760 sub.archive(repo.ui, archiver, prefix) |
15168 | 761 |
762 archiver.done() | |
763 | |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
764 # If a largefile is modified, the change is not reflected in its |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
765 # standin until a commit. cmdutil.bailifchanged() raises an exception |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
766 # if the repo has uncommitted changes. Wrap it to also check if |
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
767 # largefiles were changed. This is used by bisect and backout. |
15168 | 768 def override_bailifchanged(orig, repo): |
769 orig(repo) | |
770 repo.lfstatus = True | |
771 modified, added, removed, deleted = repo.status()[:4] | |
772 repo.lfstatus = False | |
773 if modified or added or removed or deleted: | |
774 raise util.Abort(_('outstanding uncommitted changes')) | |
775 | |
776 # Fetch doesn't use cmdutil.bail_if_changed so override it to add the check | |
777 def override_fetch(orig, ui, repo, *pats, **opts): | |
778 repo.lfstatus = True | |
779 modified, added, removed, deleted = repo.status()[:4] | |
780 repo.lfstatus = False | |
781 if modified or added or removed or deleted: | |
782 raise util.Abort(_('outstanding uncommitted changes')) | |
783 return orig(ui, repo, *pats, **opts) | |
784 | |
785 def override_forget(orig, ui, repo, *pats, **opts): | |
786 installnormalfilesmatchfn(repo[None].manifest()) | |
787 orig(ui, repo, *pats, **opts) | |
788 restorematchfn() | |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
789 m = scmutil.match(repo[None], pats, opts) |
15168 | 790 |
791 try: | |
792 repo.lfstatus = True | |
793 s = repo.status(match=m, clean=True) | |
794 finally: | |
795 repo.lfstatus = False | |
796 forget = sorted(s[0] + s[1] + s[3] + s[6]) | |
797 forget = [f for f in forget if lfutil.standin(f) in repo[None].manifest()] | |
798 | |
799 for f in forget: | |
800 if lfutil.standin(f) not in repo.dirstate and not \ | |
801 os.path.isdir(m.rel(lfutil.standin(f))): | |
802 ui.warn(_('not removing %s: file is already untracked\n') | |
803 % m.rel(f)) | |
804 | |
805 for f in forget: | |
806 if ui.verbose or not m.exact(f): | |
807 ui.status(_('removing %s\n') % m.rel(f)) | |
808 | |
809 # Need to lock because standin files are deleted then removed from the | |
810 # repository and we could race inbetween. | |
811 wlock = repo.wlock() | |
812 try: | |
813 lfdirstate = lfutil.openlfdirstate(ui, repo) | |
814 for f in forget: | |
815 if lfdirstate[f] == 'a': | |
816 lfdirstate.drop(f) | |
817 else: | |
818 lfdirstate.remove(f) | |
819 lfdirstate.write() | |
820 lfutil.repo_remove(repo, [lfutil.standin(f) for f in forget], | |
821 unlink=True) | |
822 finally: | |
823 wlock.release() | |
824 | |
825 def getoutgoinglfiles(ui, repo, dest=None, **opts): | |
826 dest = ui.expandpath(dest or 'default-push', dest or 'default') | |
827 dest, branches = hg.parseurl(dest, opts.get('branch')) | |
828 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev')) | |
829 if revs: | |
830 revs = [repo.lookup(rev) for rev in revs] | |
831 | |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
832 remoteui = hg.remoteui |
15168 | 833 |
834 try: | |
835 remote = hg.repository(remoteui(repo, opts), dest) | |
836 except error.RepoError: | |
837 return None | |
838 o = lfutil.findoutgoing(repo, remote, False) | |
839 if not o: | |
840 return None | |
841 o = repo.changelog.nodesbetween(o, revs)[0] | |
842 if opts.get('newest_first'): | |
843 o.reverse() | |
844 | |
845 toupload = set() | |
846 for n in o: | |
847 parents = [p for p in repo.changelog.parents(n) if p != node.nullid] | |
848 ctx = repo[n] | |
849 files = set(ctx.files()) | |
850 if len(parents) == 2: | |
851 mc = ctx.manifest() | |
852 mp1 = ctx.parents()[0].manifest() | |
853 mp2 = ctx.parents()[1].manifest() | |
854 for f in mp1: | |
855 if f not in mc: | |
856 files.add(f) | |
857 for f in mp2: | |
858 if f not in mc: | |
859 files.add(f) | |
860 for f in mc: | |
861 if mc[f] != mp1.get(f, None) or mc[f] != mp2.get(f, None): | |
862 files.add(f) | |
15255
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
863 toupload = toupload.union( |
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15254
diff
changeset
|
864 set([f for f in files if lfutil.isstandin(f) and f in ctx])) |
15168 | 865 return toupload |
866 | |
867 def override_outgoing(orig, ui, repo, dest=None, **opts): | |
868 orig(ui, repo, dest, **opts) | |
869 | |
870 if opts.pop('large', None): | |
871 toupload = getoutgoinglfiles(ui, repo, dest, **opts) | |
872 if toupload is None: | |
873 ui.status(_('largefiles: No remote repo\n')) | |
874 else: | |
875 ui.status(_('largefiles to upload:\n')) | |
876 for file in toupload: | |
877 ui.status(lfutil.splitstandin(file) + '\n') | |
878 ui.status('\n') | |
879 | |
880 def override_summary(orig, ui, repo, *pats, **opts): | |
15787
0c7b83a057aa
largefiles: fix output of hg summary (issue3060)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15786
diff
changeset
|
881 try: |
0c7b83a057aa
largefiles: fix output of hg summary (issue3060)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15786
diff
changeset
|
882 repo.lfstatus = True |
0c7b83a057aa
largefiles: fix output of hg summary (issue3060)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15786
diff
changeset
|
883 orig(ui, repo, *pats, **opts) |
0c7b83a057aa
largefiles: fix output of hg summary (issue3060)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15786
diff
changeset
|
884 finally: |
0c7b83a057aa
largefiles: fix output of hg summary (issue3060)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15786
diff
changeset
|
885 repo.lfstatus = False |
15168 | 886 |
887 if opts.pop('large', None): | |
888 toupload = getoutgoinglfiles(ui, repo, None, **opts) | |
889 if toupload is None: | |
890 ui.status(_('largefiles: No remote repo\n')) | |
891 else: | |
892 ui.status(_('largefiles: %d to upload\n') % len(toupload)) | |
893 | |
894 def override_addremove(orig, ui, repo, *pats, **opts): | |
15792
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
895 # Get the list of missing largefiles so we can remove them |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
896 lfdirstate = lfutil.openlfdirstate(ui, repo) |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
897 s = lfdirstate.status(match_.always(repo.root, repo.getcwd()), [], False, |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
898 False, False) |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
899 (unsure, modified, added, removed, missing, unknown, ignored, clean) = s |
15168 | 900 |
15792
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
901 # Call into the normal remove code, but the removing of the standin, we want |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
902 # to have handled by original addremove. Monkey patching here makes sure |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
903 # we don't remove the standin in the largefiles code, preventing a very |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
904 # confused state later. |
15967
295f8aeab363
largefiles: fix addremove when no largefiles are specified
Na'Tosha Bard <natosha@unity3d.com>
parents:
15944
diff
changeset
|
905 if missing: |
295f8aeab363
largefiles: fix addremove when no largefiles are specified
Na'Tosha Bard <natosha@unity3d.com>
parents:
15944
diff
changeset
|
906 repo._isaddremove = True |
295f8aeab363
largefiles: fix addremove when no largefiles are specified
Na'Tosha Bard <natosha@unity3d.com>
parents:
15944
diff
changeset
|
907 remove_largefiles(ui, repo, *missing, **opts) |
295f8aeab363
largefiles: fix addremove when no largefiles are specified
Na'Tosha Bard <natosha@unity3d.com>
parents:
15944
diff
changeset
|
908 repo._isaddremove = False |
15792
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
909 # Call into the normal add code, and any files that *should* be added as |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
910 # largefiles will be |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
911 add_largefiles(ui, repo, *pats, **opts) |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
912 # Now that we've handled largefiles, hand off to the original addremove |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
913 # function to take care of the rest. Make sure it doesn't do anything with |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
914 # largefiles by installing a matcher that will ignore them. |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
915 installnormalfilesmatchfn(repo[None].manifest()) |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
916 result = orig(ui, repo, *pats, **opts) |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
917 restorematchfn() |
7cbba3adabc7
largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15788
diff
changeset
|
918 return result |
15168 | 919 |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
920 # Calling purge with --all will cause the largefiles to be deleted. |
15168 | 921 # Override repo.status to prevent this from happening. |
922 def override_purge(orig, ui, repo, *dirs, **opts): | |
923 oldstatus = repo.status | |
924 def override_status(node1='.', node2=None, match=None, ignored=False, | |
925 clean=False, unknown=False, listsubrepos=False): | |
926 r = oldstatus(node1, node2, match, ignored, clean, unknown, | |
927 listsubrepos) | |
928 lfdirstate = lfutil.openlfdirstate(ui, repo) | |
929 modified, added, removed, deleted, unknown, ignored, clean = r | |
930 unknown = [f for f in unknown if lfdirstate[f] == '?'] | |
931 ignored = [f for f in ignored if lfdirstate[f] == '?'] | |
932 return modified, added, removed, deleted, unknown, ignored, clean | |
933 repo.status = override_status | |
934 orig(ui, repo, *dirs, **opts) | |
935 repo.status = oldstatus | |
936 | |
937 def override_rollback(orig, ui, repo, **opts): | |
938 result = orig(ui, repo, **opts) | |
939 merge.update(repo, node=None, branchmerge=False, force=True, | |
940 partial=lfutil.isstandin) | |
15794
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15792
diff
changeset
|
941 wlock = repo.wlock() |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15792
diff
changeset
|
942 try: |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15792
diff
changeset
|
943 lfdirstate = lfutil.openlfdirstate(ui, repo) |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15792
diff
changeset
|
944 lfiles = lfutil.listlfiles(repo) |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15792
diff
changeset
|
945 oldlfiles = lfutil.listlfiles(repo, repo[None].parents()[0].rev()) |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15792
diff
changeset
|
946 for file in lfiles: |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15792
diff
changeset
|
947 if file in oldlfiles: |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15792
diff
changeset
|
948 lfdirstate.normallookup(file) |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15792
diff
changeset
|
949 else: |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15792
diff
changeset
|
950 lfdirstate.add(file) |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15792
diff
changeset
|
951 lfdirstate.write() |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15792
diff
changeset
|
952 finally: |
0d91211dd12f
largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents:
15792
diff
changeset
|
953 wlock.release() |
15168 | 954 return result |
15383
155d0f8fb7e5
largefiles: fix bad bug where transplanting a changeset with a largefile will result in an old largefile being comitted later on
Na'Tosha Bard <natosha@unity3d.com>
parents:
15369
diff
changeset
|
955 |
155d0f8fb7e5
largefiles: fix bad bug where transplanting a changeset with a largefile will result in an old largefile being comitted later on
Na'Tosha Bard <natosha@unity3d.com>
parents:
15369
diff
changeset
|
956 def override_transplant(orig, ui, repo, *revs, **opts): |
15982
bf502ccc46d7
largefiles: fix transplant for all cases (issue3192)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15967
diff
changeset
|
957 try: |
bf502ccc46d7
largefiles: fix transplant for all cases (issue3192)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15967
diff
changeset
|
958 repo._istransplanting = True |
bf502ccc46d7
largefiles: fix transplant for all cases (issue3192)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15967
diff
changeset
|
959 result = orig(ui, repo, *revs, **opts) |
bf502ccc46d7
largefiles: fix transplant for all cases (issue3192)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15967
diff
changeset
|
960 lfcommands.updatelfiles(ui, repo, filelist=None, |
bf502ccc46d7
largefiles: fix transplant for all cases (issue3192)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15967
diff
changeset
|
961 printmessage=False) |
bf502ccc46d7
largefiles: fix transplant for all cases (issue3192)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15967
diff
changeset
|
962 finally: |
bf502ccc46d7
largefiles: fix transplant for all cases (issue3192)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15967
diff
changeset
|
963 repo._istransplanting = False |
15383
155d0f8fb7e5
largefiles: fix bad bug where transplanting a changeset with a largefile will result in an old largefile being comitted later on
Na'Tosha Bard <natosha@unity3d.com>
parents:
15369
diff
changeset
|
964 return result |