##// END OF EJS Templates
largefiles: make caching largefiles message more explicit...
Na'Tosha Bard -
r18600:8ba52000 default
parent child Browse files
Show More
@@ -1,1178 +1,1179 b''
1 # Copyright 2009-2010 Gregory P. Ward
1 # Copyright 2009-2010 Gregory P. Ward
2 # Copyright 2009-2010 Intelerad Medical Systems Incorporated
2 # Copyright 2009-2010 Intelerad Medical Systems Incorporated
3 # Copyright 2010-2011 Fog Creek Software
3 # Copyright 2010-2011 Fog Creek Software
4 # Copyright 2010-2011 Unity Technologies
4 # Copyright 2010-2011 Unity Technologies
5 #
5 #
6 # This software may be used and distributed according to the terms of the
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.
7 # GNU General Public License version 2 or any later version.
8
8
9 '''Overridden Mercurial commands and functions for the largefiles extension'''
9 '''Overridden Mercurial commands and functions for the largefiles extension'''
10
10
11 import os
11 import os
12 import copy
12 import copy
13
13
14 from mercurial import hg, commands, util, cmdutil, scmutil, match as match_, \
14 from mercurial import hg, commands, util, cmdutil, scmutil, match as match_, \
15 node, archival, error, merge, discovery
15 node, archival, error, merge, discovery
16 from mercurial.i18n import _
16 from mercurial.i18n import _
17 from mercurial.node import hex
17 from mercurial.node import hex
18 from hgext import rebase
18 from hgext import rebase
19
19
20 import lfutil
20 import lfutil
21 import lfcommands
21 import lfcommands
22
22
23 # -- Utility functions: commonly/repeatedly needed functionality ---------------
23 # -- Utility functions: commonly/repeatedly needed functionality ---------------
24
24
25 def installnormalfilesmatchfn(manifest):
25 def installnormalfilesmatchfn(manifest):
26 '''overrides scmutil.match so that the matcher it returns will ignore all
26 '''overrides scmutil.match so that the matcher it returns will ignore all
27 largefiles'''
27 largefiles'''
28 oldmatch = None # for the closure
28 oldmatch = None # for the closure
29 def overridematch(ctx, pats=[], opts={}, globbed=False,
29 def overridematch(ctx, pats=[], opts={}, globbed=False,
30 default='relpath'):
30 default='relpath'):
31 match = oldmatch(ctx, pats, opts, globbed, default)
31 match = oldmatch(ctx, pats, opts, globbed, default)
32 m = copy.copy(match)
32 m = copy.copy(match)
33 notlfile = lambda f: not (lfutil.isstandin(f) or lfutil.standin(f) in
33 notlfile = lambda f: not (lfutil.isstandin(f) or lfutil.standin(f) in
34 manifest)
34 manifest)
35 m._files = filter(notlfile, m._files)
35 m._files = filter(notlfile, m._files)
36 m._fmap = set(m._files)
36 m._fmap = set(m._files)
37 origmatchfn = m.matchfn
37 origmatchfn = m.matchfn
38 m.matchfn = lambda f: notlfile(f) and origmatchfn(f) or None
38 m.matchfn = lambda f: notlfile(f) and origmatchfn(f) or None
39 return m
39 return m
40 oldmatch = installmatchfn(overridematch)
40 oldmatch = installmatchfn(overridematch)
41
41
42 def installmatchfn(f):
42 def installmatchfn(f):
43 oldmatch = scmutil.match
43 oldmatch = scmutil.match
44 setattr(f, 'oldmatch', oldmatch)
44 setattr(f, 'oldmatch', oldmatch)
45 scmutil.match = f
45 scmutil.match = f
46 return oldmatch
46 return oldmatch
47
47
48 def restorematchfn():
48 def restorematchfn():
49 '''restores scmutil.match to what it was before installnormalfilesmatchfn
49 '''restores scmutil.match to what it was before installnormalfilesmatchfn
50 was called. no-op if scmutil.match is its original function.
50 was called. no-op if scmutil.match is its original function.
51
51
52 Note that n calls to installnormalfilesmatchfn will require n calls to
52 Note that n calls to installnormalfilesmatchfn will require n calls to
53 restore matchfn to reverse'''
53 restore matchfn to reverse'''
54 scmutil.match = getattr(scmutil.match, 'oldmatch', scmutil.match)
54 scmutil.match = getattr(scmutil.match, 'oldmatch', scmutil.match)
55
55
56 def addlargefiles(ui, repo, *pats, **opts):
56 def addlargefiles(ui, repo, *pats, **opts):
57 large = opts.pop('large', None)
57 large = opts.pop('large', None)
58 lfsize = lfutil.getminsize(
58 lfsize = lfutil.getminsize(
59 ui, lfutil.islfilesrepo(repo), opts.pop('lfsize', None))
59 ui, lfutil.islfilesrepo(repo), opts.pop('lfsize', None))
60
60
61 lfmatcher = None
61 lfmatcher = None
62 if lfutil.islfilesrepo(repo):
62 if lfutil.islfilesrepo(repo):
63 lfpats = ui.configlist(lfutil.longname, 'patterns', default=[])
63 lfpats = ui.configlist(lfutil.longname, 'patterns', default=[])
64 if lfpats:
64 if lfpats:
65 lfmatcher = match_.match(repo.root, '', list(lfpats))
65 lfmatcher = match_.match(repo.root, '', list(lfpats))
66
66
67 lfnames = []
67 lfnames = []
68 m = scmutil.match(repo[None], pats, opts)
68 m = scmutil.match(repo[None], pats, opts)
69 m.bad = lambda x, y: None
69 m.bad = lambda x, y: None
70 wctx = repo[None]
70 wctx = repo[None]
71 for f in repo.walk(m):
71 for f in repo.walk(m):
72 exact = m.exact(f)
72 exact = m.exact(f)
73 lfile = lfutil.standin(f) in wctx
73 lfile = lfutil.standin(f) in wctx
74 nfile = f in wctx
74 nfile = f in wctx
75 exists = lfile or nfile
75 exists = lfile or nfile
76
76
77 # Don't warn the user when they attempt to add a normal tracked file.
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.
78 # The normal add code will do that for us.
79 if exact and exists:
79 if exact and exists:
80 if lfile:
80 if lfile:
81 ui.warn(_('%s already a largefile\n') % f)
81 ui.warn(_('%s already a largefile\n') % f)
82 continue
82 continue
83
83
84 if (exact or not exists) and not lfutil.isstandin(f):
84 if (exact or not exists) and not lfutil.isstandin(f):
85 wfile = repo.wjoin(f)
85 wfile = repo.wjoin(f)
86
86
87 # In case the file was removed previously, but not committed
87 # In case the file was removed previously, but not committed
88 # (issue3507)
88 # (issue3507)
89 if not os.path.exists(wfile):
89 if not os.path.exists(wfile):
90 continue
90 continue
91
91
92 abovemin = (lfsize and
92 abovemin = (lfsize and
93 os.lstat(wfile).st_size >= lfsize * 1024 * 1024)
93 os.lstat(wfile).st_size >= lfsize * 1024 * 1024)
94 if large or abovemin or (lfmatcher and lfmatcher(f)):
94 if large or abovemin or (lfmatcher and lfmatcher(f)):
95 lfnames.append(f)
95 lfnames.append(f)
96 if ui.verbose or not exact:
96 if ui.verbose or not exact:
97 ui.status(_('adding %s as a largefile\n') % m.rel(f))
97 ui.status(_('adding %s as a largefile\n') % m.rel(f))
98
98
99 bad = []
99 bad = []
100 standins = []
100 standins = []
101
101
102 # Need to lock, otherwise there could be a race condition between
102 # Need to lock, otherwise there could be a race condition between
103 # when standins are created and added to the repo.
103 # when standins are created and added to the repo.
104 wlock = repo.wlock()
104 wlock = repo.wlock()
105 try:
105 try:
106 if not opts.get('dry_run'):
106 if not opts.get('dry_run'):
107 lfdirstate = lfutil.openlfdirstate(ui, repo)
107 lfdirstate = lfutil.openlfdirstate(ui, repo)
108 for f in lfnames:
108 for f in lfnames:
109 standinname = lfutil.standin(f)
109 standinname = lfutil.standin(f)
110 lfutil.writestandin(repo, standinname, hash='',
110 lfutil.writestandin(repo, standinname, hash='',
111 executable=lfutil.getexecutable(repo.wjoin(f)))
111 executable=lfutil.getexecutable(repo.wjoin(f)))
112 standins.append(standinname)
112 standins.append(standinname)
113 if lfdirstate[f] == 'r':
113 if lfdirstate[f] == 'r':
114 lfdirstate.normallookup(f)
114 lfdirstate.normallookup(f)
115 else:
115 else:
116 lfdirstate.add(f)
116 lfdirstate.add(f)
117 lfdirstate.write()
117 lfdirstate.write()
118 bad += [lfutil.splitstandin(f)
118 bad += [lfutil.splitstandin(f)
119 for f in repo[None].add(standins)
119 for f in repo[None].add(standins)
120 if f in m.files()]
120 if f in m.files()]
121 finally:
121 finally:
122 wlock.release()
122 wlock.release()
123 return bad
123 return bad
124
124
125 def removelargefiles(ui, repo, *pats, **opts):
125 def removelargefiles(ui, repo, *pats, **opts):
126 after = opts.get('after')
126 after = opts.get('after')
127 if not pats and not after:
127 if not pats and not after:
128 raise util.Abort(_('no files specified'))
128 raise util.Abort(_('no files specified'))
129 m = scmutil.match(repo[None], pats, opts)
129 m = scmutil.match(repo[None], pats, opts)
130 try:
130 try:
131 repo.lfstatus = True
131 repo.lfstatus = True
132 s = repo.status(match=m, clean=True)
132 s = repo.status(match=m, clean=True)
133 finally:
133 finally:
134 repo.lfstatus = False
134 repo.lfstatus = False
135 manifest = repo[None].manifest()
135 manifest = repo[None].manifest()
136 modified, added, deleted, clean = [[f for f in list
136 modified, added, deleted, clean = [[f for f in list
137 if lfutil.standin(f) in manifest]
137 if lfutil.standin(f) in manifest]
138 for list in [s[0], s[1], s[3], s[6]]]
138 for list in [s[0], s[1], s[3], s[6]]]
139
139
140 def warn(files, msg):
140 def warn(files, msg):
141 for f in files:
141 for f in files:
142 ui.warn(msg % m.rel(f))
142 ui.warn(msg % m.rel(f))
143 return int(len(files) > 0)
143 return int(len(files) > 0)
144
144
145 result = 0
145 result = 0
146
146
147 if after:
147 if after:
148 remove, forget = deleted, []
148 remove, forget = deleted, []
149 result = warn(modified + added + clean,
149 result = warn(modified + added + clean,
150 _('not removing %s: file still exists\n'))
150 _('not removing %s: file still exists\n'))
151 else:
151 else:
152 remove, forget = deleted + clean, []
152 remove, forget = deleted + clean, []
153 result = warn(modified, _('not removing %s: file is modified (use -f'
153 result = warn(modified, _('not removing %s: file is modified (use -f'
154 ' to force removal)\n'))
154 ' to force removal)\n'))
155 result = warn(added, _('not removing %s: file has been marked for add'
155 result = warn(added, _('not removing %s: file has been marked for add'
156 ' (use forget to undo)\n')) or result
156 ' (use forget to undo)\n')) or result
157
157
158 for f in sorted(remove + forget):
158 for f in sorted(remove + forget):
159 if ui.verbose or not m.exact(f):
159 if ui.verbose or not m.exact(f):
160 ui.status(_('removing %s\n') % m.rel(f))
160 ui.status(_('removing %s\n') % m.rel(f))
161
161
162 # Need to lock because standin files are deleted then removed from the
162 # Need to lock because standin files are deleted then removed from the
163 # repository and we could race in-between.
163 # repository and we could race in-between.
164 wlock = repo.wlock()
164 wlock = repo.wlock()
165 try:
165 try:
166 lfdirstate = lfutil.openlfdirstate(ui, repo)
166 lfdirstate = lfutil.openlfdirstate(ui, repo)
167 for f in remove:
167 for f in remove:
168 if not after:
168 if not after:
169 # If this is being called by addremove, notify the user that we
169 # If this is being called by addremove, notify the user that we
170 # are removing the file.
170 # are removing the file.
171 if getattr(repo, "_isaddremove", False):
171 if getattr(repo, "_isaddremove", False):
172 ui.status(_('removing %s\n') % f)
172 ui.status(_('removing %s\n') % f)
173 util.unlinkpath(repo.wjoin(f), ignoremissing=True)
173 util.unlinkpath(repo.wjoin(f), ignoremissing=True)
174 lfdirstate.remove(f)
174 lfdirstate.remove(f)
175 lfdirstate.write()
175 lfdirstate.write()
176 forget = [lfutil.standin(f) for f in forget]
176 forget = [lfutil.standin(f) for f in forget]
177 remove = [lfutil.standin(f) for f in remove]
177 remove = [lfutil.standin(f) for f in remove]
178 repo[None].forget(forget)
178 repo[None].forget(forget)
179 # If this is being called by addremove, let the original addremove
179 # If this is being called by addremove, let the original addremove
180 # function handle this.
180 # function handle this.
181 if not getattr(repo, "_isaddremove", False):
181 if not getattr(repo, "_isaddremove", False):
182 for f in remove:
182 for f in remove:
183 util.unlinkpath(repo.wjoin(f), ignoremissing=True)
183 util.unlinkpath(repo.wjoin(f), ignoremissing=True)
184 repo[None].forget(remove)
184 repo[None].forget(remove)
185 finally:
185 finally:
186 wlock.release()
186 wlock.release()
187
187
188 return result
188 return result
189
189
190 # For overriding mercurial.hgweb.webcommands so that largefiles will
190 # For overriding mercurial.hgweb.webcommands so that largefiles will
191 # appear at their right place in the manifests.
191 # appear at their right place in the manifests.
192 def decodepath(orig, path):
192 def decodepath(orig, path):
193 return lfutil.splitstandin(path) or path
193 return lfutil.splitstandin(path) or path
194
194
195 # -- Wrappers: modify existing commands --------------------------------
195 # -- Wrappers: modify existing commands --------------------------------
196
196
197 # Add works by going through the files that the user wanted to add and
197 # Add works by going through the files that the user wanted to add and
198 # checking if they should be added as largefiles. Then it makes a new
198 # checking if they should be added as largefiles. Then it makes a new
199 # matcher which matches only the normal files and runs the original
199 # matcher which matches only the normal files and runs the original
200 # version of add.
200 # version of add.
201 def overrideadd(orig, ui, repo, *pats, **opts):
201 def overrideadd(orig, ui, repo, *pats, **opts):
202 normal = opts.pop('normal')
202 normal = opts.pop('normal')
203 if normal:
203 if normal:
204 if opts.get('large'):
204 if opts.get('large'):
205 raise util.Abort(_('--normal cannot be used with --large'))
205 raise util.Abort(_('--normal cannot be used with --large'))
206 return orig(ui, repo, *pats, **opts)
206 return orig(ui, repo, *pats, **opts)
207 bad = addlargefiles(ui, repo, *pats, **opts)
207 bad = addlargefiles(ui, repo, *pats, **opts)
208 installnormalfilesmatchfn(repo[None].manifest())
208 installnormalfilesmatchfn(repo[None].manifest())
209 result = orig(ui, repo, *pats, **opts)
209 result = orig(ui, repo, *pats, **opts)
210 restorematchfn()
210 restorematchfn()
211
211
212 return (result == 1 or bad) and 1 or 0
212 return (result == 1 or bad) and 1 or 0
213
213
214 def overrideremove(orig, ui, repo, *pats, **opts):
214 def overrideremove(orig, ui, repo, *pats, **opts):
215 installnormalfilesmatchfn(repo[None].manifest())
215 installnormalfilesmatchfn(repo[None].manifest())
216 result = orig(ui, repo, *pats, **opts)
216 result = orig(ui, repo, *pats, **opts)
217 restorematchfn()
217 restorematchfn()
218 return removelargefiles(ui, repo, *pats, **opts) or result
218 return removelargefiles(ui, repo, *pats, **opts) or result
219
219
220 def overridestatusfn(orig, repo, rev2, **opts):
220 def overridestatusfn(orig, repo, rev2, **opts):
221 try:
221 try:
222 repo._repo.lfstatus = True
222 repo._repo.lfstatus = True
223 return orig(repo, rev2, **opts)
223 return orig(repo, rev2, **opts)
224 finally:
224 finally:
225 repo._repo.lfstatus = False
225 repo._repo.lfstatus = False
226
226
227 def overridestatus(orig, ui, repo, *pats, **opts):
227 def overridestatus(orig, ui, repo, *pats, **opts):
228 try:
228 try:
229 repo.lfstatus = True
229 repo.lfstatus = True
230 return orig(ui, repo, *pats, **opts)
230 return orig(ui, repo, *pats, **opts)
231 finally:
231 finally:
232 repo.lfstatus = False
232 repo.lfstatus = False
233
233
234 def overridedirty(orig, repo, ignoreupdate=False):
234 def overridedirty(orig, repo, ignoreupdate=False):
235 try:
235 try:
236 repo._repo.lfstatus = True
236 repo._repo.lfstatus = True
237 return orig(repo, ignoreupdate)
237 return orig(repo, ignoreupdate)
238 finally:
238 finally:
239 repo._repo.lfstatus = False
239 repo._repo.lfstatus = False
240
240
241 def overridelog(orig, ui, repo, *pats, **opts):
241 def overridelog(orig, ui, repo, *pats, **opts):
242 def overridematch(ctx, pats=[], opts={}, globbed=False,
242 def overridematch(ctx, pats=[], opts={}, globbed=False,
243 default='relpath'):
243 default='relpath'):
244 """Matcher that merges root directory with .hglf, suitable for log.
244 """Matcher that merges root directory with .hglf, suitable for log.
245 It is still possible to match .hglf directly.
245 It is still possible to match .hglf directly.
246 For any listed files run log on the standin too.
246 For any listed files run log on the standin too.
247 matchfn tries both the given filename and with .hglf stripped.
247 matchfn tries both the given filename and with .hglf stripped.
248 """
248 """
249 match = oldmatch(ctx, pats, opts, globbed, default)
249 match = oldmatch(ctx, pats, opts, globbed, default)
250 m = copy.copy(match)
250 m = copy.copy(match)
251 standins = [lfutil.standin(f) for f in m._files]
251 standins = [lfutil.standin(f) for f in m._files]
252 m._files.extend(standins)
252 m._files.extend(standins)
253 m._fmap = set(m._files)
253 m._fmap = set(m._files)
254 origmatchfn = m.matchfn
254 origmatchfn = m.matchfn
255 def lfmatchfn(f):
255 def lfmatchfn(f):
256 lf = lfutil.splitstandin(f)
256 lf = lfutil.splitstandin(f)
257 if lf is not None and origmatchfn(lf):
257 if lf is not None and origmatchfn(lf):
258 return True
258 return True
259 r = origmatchfn(f)
259 r = origmatchfn(f)
260 return r
260 return r
261 m.matchfn = lfmatchfn
261 m.matchfn = lfmatchfn
262 return m
262 return m
263 oldmatch = installmatchfn(overridematch)
263 oldmatch = installmatchfn(overridematch)
264 try:
264 try:
265 repo.lfstatus = True
265 repo.lfstatus = True
266 return orig(ui, repo, *pats, **opts)
266 return orig(ui, repo, *pats, **opts)
267 finally:
267 finally:
268 repo.lfstatus = False
268 repo.lfstatus = False
269 restorematchfn()
269 restorematchfn()
270
270
271 def overrideverify(orig, ui, repo, *pats, **opts):
271 def overrideverify(orig, ui, repo, *pats, **opts):
272 large = opts.pop('large', False)
272 large = opts.pop('large', False)
273 all = opts.pop('lfa', False)
273 all = opts.pop('lfa', False)
274 contents = opts.pop('lfc', False)
274 contents = opts.pop('lfc', False)
275
275
276 result = orig(ui, repo, *pats, **opts)
276 result = orig(ui, repo, *pats, **opts)
277 if large or all or contents:
277 if large or all or contents:
278 result = result or lfcommands.verifylfiles(ui, repo, all, contents)
278 result = result or lfcommands.verifylfiles(ui, repo, all, contents)
279 return result
279 return result
280
280
281 def overridedebugstate(orig, ui, repo, *pats, **opts):
281 def overridedebugstate(orig, ui, repo, *pats, **opts):
282 large = opts.pop('large', False)
282 large = opts.pop('large', False)
283 if large:
283 if large:
284 lfcommands.debugdirstate(ui, repo)
284 lfcommands.debugdirstate(ui, repo)
285 else:
285 else:
286 orig(ui, repo, *pats, **opts)
286 orig(ui, repo, *pats, **opts)
287
287
288 # Override needs to refresh standins so that update's normal merge
288 # Override needs to refresh standins so that update's normal merge
289 # will go through properly. Then the other update hook (overriding repo.update)
289 # will go through properly. Then the other update hook (overriding repo.update)
290 # will get the new files. Filemerge is also overridden so that the merge
290 # will get the new files. Filemerge is also overridden so that the merge
291 # will merge standins correctly.
291 # will merge standins correctly.
292 def overrideupdate(orig, ui, repo, *pats, **opts):
292 def overrideupdate(orig, ui, repo, *pats, **opts):
293 lfdirstate = lfutil.openlfdirstate(ui, repo)
293 lfdirstate = lfutil.openlfdirstate(ui, repo)
294 s = lfdirstate.status(match_.always(repo.root, repo.getcwd()), [], False,
294 s = lfdirstate.status(match_.always(repo.root, repo.getcwd()), [], False,
295 False, False)
295 False, False)
296 (unsure, modified, added, removed, missing, unknown, ignored, clean) = s
296 (unsure, modified, added, removed, missing, unknown, ignored, clean) = s
297
297
298 # Need to lock between the standins getting updated and their
298 # Need to lock between the standins getting updated and their
299 # largefiles getting updated
299 # largefiles getting updated
300 wlock = repo.wlock()
300 wlock = repo.wlock()
301 try:
301 try:
302 if opts['check']:
302 if opts['check']:
303 mod = len(modified) > 0
303 mod = len(modified) > 0
304 for lfile in unsure:
304 for lfile in unsure:
305 standin = lfutil.standin(lfile)
305 standin = lfutil.standin(lfile)
306 if repo['.'][standin].data().strip() != \
306 if repo['.'][standin].data().strip() != \
307 lfutil.hashfile(repo.wjoin(lfile)):
307 lfutil.hashfile(repo.wjoin(lfile)):
308 mod = True
308 mod = True
309 else:
309 else:
310 lfdirstate.normal(lfile)
310 lfdirstate.normal(lfile)
311 lfdirstate.write()
311 lfdirstate.write()
312 if mod:
312 if mod:
313 raise util.Abort(_('uncommitted local changes'))
313 raise util.Abort(_('uncommitted local changes'))
314 # XXX handle removed differently
314 # XXX handle removed differently
315 if not opts['clean']:
315 if not opts['clean']:
316 for lfile in unsure + modified + added:
316 for lfile in unsure + modified + added:
317 lfutil.updatestandin(repo, lfutil.standin(lfile))
317 lfutil.updatestandin(repo, lfutil.standin(lfile))
318 finally:
318 finally:
319 wlock.release()
319 wlock.release()
320 return orig(ui, repo, *pats, **opts)
320 return orig(ui, repo, *pats, **opts)
321
321
322 # Before starting the manifest merge, merge.updates will call
322 # Before starting the manifest merge, merge.updates will call
323 # _checkunknown to check if there are any files in the merged-in
323 # _checkunknown to check if there are any files in the merged-in
324 # changeset that collide with unknown files in the working copy.
324 # changeset that collide with unknown files in the working copy.
325 #
325 #
326 # The largefiles are seen as unknown, so this prevents us from merging
326 # The largefiles are seen as unknown, so this prevents us from merging
327 # in a file 'foo' if we already have a largefile with the same name.
327 # in a file 'foo' if we already have a largefile with the same name.
328 #
328 #
329 # The overridden function filters the unknown files by removing any
329 # The overridden function filters the unknown files by removing any
330 # largefiles. This makes the merge proceed and we can then handle this
330 # largefiles. This makes the merge proceed and we can then handle this
331 # case further in the overridden manifestmerge function below.
331 # case further in the overridden manifestmerge function below.
332 def overridecheckunknownfile(origfn, repo, wctx, mctx, f):
332 def overridecheckunknownfile(origfn, repo, wctx, mctx, f):
333 if lfutil.standin(f) in wctx:
333 if lfutil.standin(f) in wctx:
334 return False
334 return False
335 return origfn(repo, wctx, mctx, f)
335 return origfn(repo, wctx, mctx, f)
336
336
337 # The manifest merge handles conflicts on the manifest level. We want
337 # The manifest merge handles conflicts on the manifest level. We want
338 # to handle changes in largefile-ness of files at this level too.
338 # to handle changes in largefile-ness of files at this level too.
339 #
339 #
340 # The strategy is to run the original manifestmerge and then process
340 # The strategy is to run the original manifestmerge and then process
341 # the action list it outputs. There are two cases we need to deal with:
341 # the action list it outputs. There are two cases we need to deal with:
342 #
342 #
343 # 1. Normal file in p1, largefile in p2. Here the largefile is
343 # 1. Normal file in p1, largefile in p2. Here the largefile is
344 # detected via its standin file, which will enter the working copy
344 # detected via its standin file, which will enter the working copy
345 # with a "get" action. It is not "merge" since the standin is all
345 # with a "get" action. It is not "merge" since the standin is all
346 # Mercurial is concerned with at this level -- the link to the
346 # Mercurial is concerned with at this level -- the link to the
347 # existing normal file is not relevant here.
347 # existing normal file is not relevant here.
348 #
348 #
349 # 2. Largefile in p1, normal file in p2. Here we get a "merge" action
349 # 2. Largefile in p1, normal file in p2. Here we get a "merge" action
350 # since the largefile will be present in the working copy and
350 # since the largefile will be present in the working copy and
351 # different from the normal file in p2. Mercurial therefore
351 # different from the normal file in p2. Mercurial therefore
352 # triggers a merge action.
352 # triggers a merge action.
353 #
353 #
354 # In both cases, we prompt the user and emit new actions to either
354 # In both cases, we prompt the user and emit new actions to either
355 # remove the standin (if the normal file was kept) or to remove the
355 # remove the standin (if the normal file was kept) or to remove the
356 # normal file and get the standin (if the largefile was kept). The
356 # normal file and get the standin (if the largefile was kept). The
357 # default prompt answer is to use the largefile version since it was
357 # default prompt answer is to use the largefile version since it was
358 # presumably changed on purpose.
358 # presumably changed on purpose.
359 #
359 #
360 # Finally, the merge.applyupdates function will then take care of
360 # Finally, the merge.applyupdates function will then take care of
361 # writing the files into the working copy and lfcommands.updatelfiles
361 # writing the files into the working copy and lfcommands.updatelfiles
362 # will update the largefiles.
362 # will update the largefiles.
363 def overridemanifestmerge(origfn, repo, p1, p2, pa, overwrite, partial):
363 def overridemanifestmerge(origfn, repo, p1, p2, pa, overwrite, partial):
364 actions = origfn(repo, p1, p2, pa, overwrite, partial)
364 actions = origfn(repo, p1, p2, pa, overwrite, partial)
365 processed = []
365 processed = []
366
366
367 for action in actions:
367 for action in actions:
368 if overwrite:
368 if overwrite:
369 processed.append(action)
369 processed.append(action)
370 continue
370 continue
371 f, m, args, msg = action
371 f, m, args, msg = action
372
372
373 choices = (_('&Largefile'), _('&Normal file'))
373 choices = (_('&Largefile'), _('&Normal file'))
374 if m == "g" and lfutil.splitstandin(f) in p1 and f in p2:
374 if m == "g" and lfutil.splitstandin(f) in p1 and f in p2:
375 # Case 1: normal file in the working copy, largefile in
375 # Case 1: normal file in the working copy, largefile in
376 # the second parent
376 # the second parent
377 lfile = lfutil.splitstandin(f)
377 lfile = lfutil.splitstandin(f)
378 standin = f
378 standin = f
379 msg = _('%s has been turned into a largefile\n'
379 msg = _('%s has been turned into a largefile\n'
380 'use (l)argefile or keep as (n)ormal file?') % lfile
380 'use (l)argefile or keep as (n)ormal file?') % lfile
381 if repo.ui.promptchoice(msg, choices, 0) == 0:
381 if repo.ui.promptchoice(msg, choices, 0) == 0:
382 processed.append((lfile, "r", None, msg))
382 processed.append((lfile, "r", None, msg))
383 processed.append((standin, "g", (p2.flags(standin),), msg))
383 processed.append((standin, "g", (p2.flags(standin),), msg))
384 else:
384 else:
385 processed.append((standin, "r", None, msg))
385 processed.append((standin, "r", None, msg))
386 elif m == "g" and lfutil.standin(f) in p1 and f in p2:
386 elif m == "g" and lfutil.standin(f) in p1 and f in p2:
387 # Case 2: largefile in the working copy, normal file in
387 # Case 2: largefile in the working copy, normal file in
388 # the second parent
388 # the second parent
389 standin = lfutil.standin(f)
389 standin = lfutil.standin(f)
390 lfile = f
390 lfile = f
391 msg = _('%s has been turned into a normal file\n'
391 msg = _('%s has been turned into a normal file\n'
392 'keep as (l)argefile or use (n)ormal file?') % lfile
392 'keep as (l)argefile or use (n)ormal file?') % lfile
393 if repo.ui.promptchoice(msg, choices, 0) == 0:
393 if repo.ui.promptchoice(msg, choices, 0) == 0:
394 processed.append((lfile, "r", None, msg))
394 processed.append((lfile, "r", None, msg))
395 else:
395 else:
396 processed.append((standin, "r", None, msg))
396 processed.append((standin, "r", None, msg))
397 processed.append((lfile, "g", (p2.flags(lfile),), msg))
397 processed.append((lfile, "g", (p2.flags(lfile),), msg))
398 else:
398 else:
399 processed.append(action)
399 processed.append(action)
400
400
401 return processed
401 return processed
402
402
403 # Override filemerge to prompt the user about how they wish to merge
403 # Override filemerge to prompt the user about how they wish to merge
404 # largefiles. This will handle identical edits, and copy/rename +
404 # largefiles. This will handle identical edits, and copy/rename +
405 # edit without prompting the user.
405 # edit without prompting the user.
406 def overridefilemerge(origfn, repo, mynode, orig, fcd, fco, fca):
406 def overridefilemerge(origfn, repo, mynode, orig, fcd, fco, fca):
407 # Use better variable names here. Because this is a wrapper we cannot
407 # Use better variable names here. Because this is a wrapper we cannot
408 # change the variable names in the function declaration.
408 # change the variable names in the function declaration.
409 fcdest, fcother, fcancestor = fcd, fco, fca
409 fcdest, fcother, fcancestor = fcd, fco, fca
410 if not lfutil.isstandin(orig):
410 if not lfutil.isstandin(orig):
411 return origfn(repo, mynode, orig, fcdest, fcother, fcancestor)
411 return origfn(repo, mynode, orig, fcdest, fcother, fcancestor)
412 else:
412 else:
413 if not fcother.cmp(fcdest): # files identical?
413 if not fcother.cmp(fcdest): # files identical?
414 return None
414 return None
415
415
416 # backwards, use working dir parent as ancestor
416 # backwards, use working dir parent as ancestor
417 if fcancestor == fcother:
417 if fcancestor == fcother:
418 fcancestor = fcdest.parents()[0]
418 fcancestor = fcdest.parents()[0]
419
419
420 if orig != fcother.path():
420 if orig != fcother.path():
421 repo.ui.status(_('merging %s and %s to %s\n')
421 repo.ui.status(_('merging %s and %s to %s\n')
422 % (lfutil.splitstandin(orig),
422 % (lfutil.splitstandin(orig),
423 lfutil.splitstandin(fcother.path()),
423 lfutil.splitstandin(fcother.path()),
424 lfutil.splitstandin(fcdest.path())))
424 lfutil.splitstandin(fcdest.path())))
425 else:
425 else:
426 repo.ui.status(_('merging %s\n')
426 repo.ui.status(_('merging %s\n')
427 % lfutil.splitstandin(fcdest.path()))
427 % lfutil.splitstandin(fcdest.path()))
428
428
429 if fcancestor.path() != fcother.path() and fcother.data() == \
429 if fcancestor.path() != fcother.path() and fcother.data() == \
430 fcancestor.data():
430 fcancestor.data():
431 return 0
431 return 0
432 if fcancestor.path() != fcdest.path() and fcdest.data() == \
432 if fcancestor.path() != fcdest.path() and fcdest.data() == \
433 fcancestor.data():
433 fcancestor.data():
434 repo.wwrite(fcdest.path(), fcother.data(), fcother.flags())
434 repo.wwrite(fcdest.path(), fcother.data(), fcother.flags())
435 return 0
435 return 0
436
436
437 if repo.ui.promptchoice(_('largefile %s has a merge conflict\n'
437 if repo.ui.promptchoice(_('largefile %s has a merge conflict\n'
438 'keep (l)ocal or take (o)ther?') %
438 'keep (l)ocal or take (o)ther?') %
439 lfutil.splitstandin(orig),
439 lfutil.splitstandin(orig),
440 (_('&Local'), _('&Other')), 0) == 0:
440 (_('&Local'), _('&Other')), 0) == 0:
441 return 0
441 return 0
442 else:
442 else:
443 repo.wwrite(fcdest.path(), fcother.data(), fcother.flags())
443 repo.wwrite(fcdest.path(), fcother.data(), fcother.flags())
444 return 0
444 return 0
445
445
446 # Copy first changes the matchers to match standins instead of
446 # Copy first changes the matchers to match standins instead of
447 # largefiles. Then it overrides util.copyfile in that function it
447 # largefiles. Then it overrides util.copyfile in that function it
448 # checks if the destination largefile already exists. It also keeps a
448 # checks if the destination largefile already exists. It also keeps a
449 # list of copied files so that the largefiles can be copied and the
449 # list of copied files so that the largefiles can be copied and the
450 # dirstate updated.
450 # dirstate updated.
451 def overridecopy(orig, ui, repo, pats, opts, rename=False):
451 def overridecopy(orig, ui, repo, pats, opts, rename=False):
452 # doesn't remove largefile on rename
452 # doesn't remove largefile on rename
453 if len(pats) < 2:
453 if len(pats) < 2:
454 # this isn't legal, let the original function deal with it
454 # this isn't legal, let the original function deal with it
455 return orig(ui, repo, pats, opts, rename)
455 return orig(ui, repo, pats, opts, rename)
456
456
457 def makestandin(relpath):
457 def makestandin(relpath):
458 path = scmutil.canonpath(repo.root, repo.getcwd(), relpath)
458 path = scmutil.canonpath(repo.root, repo.getcwd(), relpath)
459 return os.path.join(repo.wjoin(lfutil.standin(path)))
459 return os.path.join(repo.wjoin(lfutil.standin(path)))
460
460
461 fullpats = scmutil.expandpats(pats)
461 fullpats = scmutil.expandpats(pats)
462 dest = fullpats[-1]
462 dest = fullpats[-1]
463
463
464 if os.path.isdir(dest):
464 if os.path.isdir(dest):
465 if not os.path.isdir(makestandin(dest)):
465 if not os.path.isdir(makestandin(dest)):
466 os.makedirs(makestandin(dest))
466 os.makedirs(makestandin(dest))
467 # This could copy both lfiles and normal files in one command,
467 # This could copy both lfiles and normal files in one command,
468 # but we don't want to do that. First replace their matcher to
468 # but we don't want to do that. First replace their matcher to
469 # only match normal files and run it, then replace it to just
469 # only match normal files and run it, then replace it to just
470 # match largefiles and run it again.
470 # match largefiles and run it again.
471 nonormalfiles = False
471 nonormalfiles = False
472 nolfiles = False
472 nolfiles = False
473 try:
473 try:
474 try:
474 try:
475 installnormalfilesmatchfn(repo[None].manifest())
475 installnormalfilesmatchfn(repo[None].manifest())
476 result = orig(ui, repo, pats, opts, rename)
476 result = orig(ui, repo, pats, opts, rename)
477 except util.Abort, e:
477 except util.Abort, e:
478 if str(e) != _('no files to copy'):
478 if str(e) != _('no files to copy'):
479 raise e
479 raise e
480 else:
480 else:
481 nonormalfiles = True
481 nonormalfiles = True
482 result = 0
482 result = 0
483 finally:
483 finally:
484 restorematchfn()
484 restorematchfn()
485
485
486 # The first rename can cause our current working directory to be removed.
486 # The first rename can cause our current working directory to be removed.
487 # In that case there is nothing left to copy/rename so just quit.
487 # In that case there is nothing left to copy/rename so just quit.
488 try:
488 try:
489 repo.getcwd()
489 repo.getcwd()
490 except OSError:
490 except OSError:
491 return result
491 return result
492
492
493 try:
493 try:
494 try:
494 try:
495 # When we call orig below it creates the standins but we don't add
495 # When we call orig below it creates the standins but we don't add
496 # them to the dir state until later so lock during that time.
496 # them to the dir state until later so lock during that time.
497 wlock = repo.wlock()
497 wlock = repo.wlock()
498
498
499 manifest = repo[None].manifest()
499 manifest = repo[None].manifest()
500 oldmatch = None # for the closure
500 oldmatch = None # for the closure
501 def overridematch(ctx, pats=[], opts={}, globbed=False,
501 def overridematch(ctx, pats=[], opts={}, globbed=False,
502 default='relpath'):
502 default='relpath'):
503 newpats = []
503 newpats = []
504 # The patterns were previously mangled to add the standin
504 # The patterns were previously mangled to add the standin
505 # directory; we need to remove that now
505 # directory; we need to remove that now
506 for pat in pats:
506 for pat in pats:
507 if match_.patkind(pat) is None and lfutil.shortname in pat:
507 if match_.patkind(pat) is None and lfutil.shortname in pat:
508 newpats.append(pat.replace(lfutil.shortname, ''))
508 newpats.append(pat.replace(lfutil.shortname, ''))
509 else:
509 else:
510 newpats.append(pat)
510 newpats.append(pat)
511 match = oldmatch(ctx, newpats, opts, globbed, default)
511 match = oldmatch(ctx, newpats, opts, globbed, default)
512 m = copy.copy(match)
512 m = copy.copy(match)
513 lfile = lambda f: lfutil.standin(f) in manifest
513 lfile = lambda f: lfutil.standin(f) in manifest
514 m._files = [lfutil.standin(f) for f in m._files if lfile(f)]
514 m._files = [lfutil.standin(f) for f in m._files if lfile(f)]
515 m._fmap = set(m._files)
515 m._fmap = set(m._files)
516 origmatchfn = m.matchfn
516 origmatchfn = m.matchfn
517 m.matchfn = lambda f: (lfutil.isstandin(f) and
517 m.matchfn = lambda f: (lfutil.isstandin(f) and
518 (f in manifest) and
518 (f in manifest) and
519 origmatchfn(lfutil.splitstandin(f)) or
519 origmatchfn(lfutil.splitstandin(f)) or
520 None)
520 None)
521 return m
521 return m
522 oldmatch = installmatchfn(overridematch)
522 oldmatch = installmatchfn(overridematch)
523 listpats = []
523 listpats = []
524 for pat in pats:
524 for pat in pats:
525 if match_.patkind(pat) is not None:
525 if match_.patkind(pat) is not None:
526 listpats.append(pat)
526 listpats.append(pat)
527 else:
527 else:
528 listpats.append(makestandin(pat))
528 listpats.append(makestandin(pat))
529
529
530 try:
530 try:
531 origcopyfile = util.copyfile
531 origcopyfile = util.copyfile
532 copiedfiles = []
532 copiedfiles = []
533 def overridecopyfile(src, dest):
533 def overridecopyfile(src, dest):
534 if (lfutil.shortname in src and
534 if (lfutil.shortname in src and
535 dest.startswith(repo.wjoin(lfutil.shortname))):
535 dest.startswith(repo.wjoin(lfutil.shortname))):
536 destlfile = dest.replace(lfutil.shortname, '')
536 destlfile = dest.replace(lfutil.shortname, '')
537 if not opts['force'] and os.path.exists(destlfile):
537 if not opts['force'] and os.path.exists(destlfile):
538 raise IOError('',
538 raise IOError('',
539 _('destination largefile already exists'))
539 _('destination largefile already exists'))
540 copiedfiles.append((src, dest))
540 copiedfiles.append((src, dest))
541 origcopyfile(src, dest)
541 origcopyfile(src, dest)
542
542
543 util.copyfile = overridecopyfile
543 util.copyfile = overridecopyfile
544 result += orig(ui, repo, listpats, opts, rename)
544 result += orig(ui, repo, listpats, opts, rename)
545 finally:
545 finally:
546 util.copyfile = origcopyfile
546 util.copyfile = origcopyfile
547
547
548 lfdirstate = lfutil.openlfdirstate(ui, repo)
548 lfdirstate = lfutil.openlfdirstate(ui, repo)
549 for (src, dest) in copiedfiles:
549 for (src, dest) in copiedfiles:
550 if (lfutil.shortname in src and
550 if (lfutil.shortname in src and
551 dest.startswith(repo.wjoin(lfutil.shortname))):
551 dest.startswith(repo.wjoin(lfutil.shortname))):
552 srclfile = src.replace(repo.wjoin(lfutil.standin('')), '')
552 srclfile = src.replace(repo.wjoin(lfutil.standin('')), '')
553 destlfile = dest.replace(repo.wjoin(lfutil.standin('')), '')
553 destlfile = dest.replace(repo.wjoin(lfutil.standin('')), '')
554 destlfiledir = os.path.dirname(repo.wjoin(destlfile)) or '.'
554 destlfiledir = os.path.dirname(repo.wjoin(destlfile)) or '.'
555 if not os.path.isdir(destlfiledir):
555 if not os.path.isdir(destlfiledir):
556 os.makedirs(destlfiledir)
556 os.makedirs(destlfiledir)
557 if rename:
557 if rename:
558 os.rename(repo.wjoin(srclfile), repo.wjoin(destlfile))
558 os.rename(repo.wjoin(srclfile), repo.wjoin(destlfile))
559 lfdirstate.remove(srclfile)
559 lfdirstate.remove(srclfile)
560 else:
560 else:
561 util.copyfile(repo.wjoin(srclfile),
561 util.copyfile(repo.wjoin(srclfile),
562 repo.wjoin(destlfile))
562 repo.wjoin(destlfile))
563
563
564 lfdirstate.add(destlfile)
564 lfdirstate.add(destlfile)
565 lfdirstate.write()
565 lfdirstate.write()
566 except util.Abort, e:
566 except util.Abort, e:
567 if str(e) != _('no files to copy'):
567 if str(e) != _('no files to copy'):
568 raise e
568 raise e
569 else:
569 else:
570 nolfiles = True
570 nolfiles = True
571 finally:
571 finally:
572 restorematchfn()
572 restorematchfn()
573 wlock.release()
573 wlock.release()
574
574
575 if nolfiles and nonormalfiles:
575 if nolfiles and nonormalfiles:
576 raise util.Abort(_('no files to copy'))
576 raise util.Abort(_('no files to copy'))
577
577
578 return result
578 return result
579
579
580 # When the user calls revert, we have to be careful to not revert any
580 # When the user calls revert, we have to be careful to not revert any
581 # changes to other largefiles accidentally. This means we have to keep
581 # changes to other largefiles accidentally. This means we have to keep
582 # track of the largefiles that are being reverted so we only pull down
582 # track of the largefiles that are being reverted so we only pull down
583 # the necessary largefiles.
583 # the necessary largefiles.
584 #
584 #
585 # Standins are only updated (to match the hash of largefiles) before
585 # Standins are only updated (to match the hash of largefiles) before
586 # commits. Update the standins then run the original revert, changing
586 # commits. Update the standins then run the original revert, changing
587 # the matcher to hit standins instead of largefiles. Based on the
587 # the matcher to hit standins instead of largefiles. Based on the
588 # resulting standins update the largefiles. Then return the standins
588 # resulting standins update the largefiles. Then return the standins
589 # to their proper state
589 # to their proper state
590 def overriderevert(orig, ui, repo, *pats, **opts):
590 def overriderevert(orig, ui, repo, *pats, **opts):
591 # Because we put the standins in a bad state (by updating them)
591 # Because we put the standins in a bad state (by updating them)
592 # and then return them to a correct state we need to lock to
592 # and then return them to a correct state we need to lock to
593 # prevent others from changing them in their incorrect state.
593 # prevent others from changing them in their incorrect state.
594 wlock = repo.wlock()
594 wlock = repo.wlock()
595 try:
595 try:
596 lfdirstate = lfutil.openlfdirstate(ui, repo)
596 lfdirstate = lfutil.openlfdirstate(ui, repo)
597 (modified, added, removed, missing, unknown, ignored, clean) = \
597 (modified, added, removed, missing, unknown, ignored, clean) = \
598 lfutil.lfdirstatestatus(lfdirstate, repo, repo['.'].rev())
598 lfutil.lfdirstatestatus(lfdirstate, repo, repo['.'].rev())
599 lfdirstate.write()
599 lfdirstate.write()
600 for lfile in modified:
600 for lfile in modified:
601 lfutil.updatestandin(repo, lfutil.standin(lfile))
601 lfutil.updatestandin(repo, lfutil.standin(lfile))
602 for lfile in missing:
602 for lfile in missing:
603 if (os.path.exists(repo.wjoin(lfutil.standin(lfile)))):
603 if (os.path.exists(repo.wjoin(lfutil.standin(lfile)))):
604 os.unlink(repo.wjoin(lfutil.standin(lfile)))
604 os.unlink(repo.wjoin(lfutil.standin(lfile)))
605
605
606 try:
606 try:
607 ctx = scmutil.revsingle(repo, opts.get('rev'))
607 ctx = scmutil.revsingle(repo, opts.get('rev'))
608 oldmatch = None # for the closure
608 oldmatch = None # for the closure
609 def overridematch(ctx, pats=[], opts={}, globbed=False,
609 def overridematch(ctx, pats=[], opts={}, globbed=False,
610 default='relpath'):
610 default='relpath'):
611 match = oldmatch(ctx, pats, opts, globbed, default)
611 match = oldmatch(ctx, pats, opts, globbed, default)
612 m = copy.copy(match)
612 m = copy.copy(match)
613 def tostandin(f):
613 def tostandin(f):
614 if lfutil.standin(f) in ctx:
614 if lfutil.standin(f) in ctx:
615 return lfutil.standin(f)
615 return lfutil.standin(f)
616 elif lfutil.standin(f) in repo[None]:
616 elif lfutil.standin(f) in repo[None]:
617 return None
617 return None
618 return f
618 return f
619 m._files = [tostandin(f) for f in m._files]
619 m._files = [tostandin(f) for f in m._files]
620 m._files = [f for f in m._files if f is not None]
620 m._files = [f for f in m._files if f is not None]
621 m._fmap = set(m._files)
621 m._fmap = set(m._files)
622 origmatchfn = m.matchfn
622 origmatchfn = m.matchfn
623 def matchfn(f):
623 def matchfn(f):
624 if lfutil.isstandin(f):
624 if lfutil.isstandin(f):
625 # We need to keep track of what largefiles are being
625 # We need to keep track of what largefiles are being
626 # matched so we know which ones to update later --
626 # matched so we know which ones to update later --
627 # otherwise we accidentally revert changes to other
627 # otherwise we accidentally revert changes to other
628 # largefiles. This is repo-specific, so duckpunch the
628 # largefiles. This is repo-specific, so duckpunch the
629 # repo object to keep the list of largefiles for us
629 # repo object to keep the list of largefiles for us
630 # later.
630 # later.
631 if origmatchfn(lfutil.splitstandin(f)) and \
631 if origmatchfn(lfutil.splitstandin(f)) and \
632 (f in repo[None] or f in ctx):
632 (f in repo[None] or f in ctx):
633 lfileslist = getattr(repo, '_lfilestoupdate', [])
633 lfileslist = getattr(repo, '_lfilestoupdate', [])
634 lfileslist.append(lfutil.splitstandin(f))
634 lfileslist.append(lfutil.splitstandin(f))
635 repo._lfilestoupdate = lfileslist
635 repo._lfilestoupdate = lfileslist
636 return True
636 return True
637 else:
637 else:
638 return False
638 return False
639 return origmatchfn(f)
639 return origmatchfn(f)
640 m.matchfn = matchfn
640 m.matchfn = matchfn
641 return m
641 return m
642 oldmatch = installmatchfn(overridematch)
642 oldmatch = installmatchfn(overridematch)
643 scmutil.match
643 scmutil.match
644 matches = overridematch(repo[None], pats, opts)
644 matches = overridematch(repo[None], pats, opts)
645 orig(ui, repo, *pats, **opts)
645 orig(ui, repo, *pats, **opts)
646 finally:
646 finally:
647 restorematchfn()
647 restorematchfn()
648 lfileslist = getattr(repo, '_lfilestoupdate', [])
648 lfileslist = getattr(repo, '_lfilestoupdate', [])
649 lfcommands.updatelfiles(ui, repo, filelist=lfileslist,
649 lfcommands.updatelfiles(ui, repo, filelist=lfileslist,
650 printmessage=False)
650 printmessage=False)
651
651
652 # empty out the largefiles list so we start fresh next time
652 # empty out the largefiles list so we start fresh next time
653 repo._lfilestoupdate = []
653 repo._lfilestoupdate = []
654 for lfile in modified:
654 for lfile in modified:
655 if lfile in lfileslist:
655 if lfile in lfileslist:
656 if os.path.exists(repo.wjoin(lfutil.standin(lfile))) and lfile\
656 if os.path.exists(repo.wjoin(lfutil.standin(lfile))) and lfile\
657 in repo['.']:
657 in repo['.']:
658 lfutil.writestandin(repo, lfutil.standin(lfile),
658 lfutil.writestandin(repo, lfutil.standin(lfile),
659 repo['.'][lfile].data().strip(),
659 repo['.'][lfile].data().strip(),
660 'x' in repo['.'][lfile].flags())
660 'x' in repo['.'][lfile].flags())
661 lfdirstate = lfutil.openlfdirstate(ui, repo)
661 lfdirstate = lfutil.openlfdirstate(ui, repo)
662 for lfile in added:
662 for lfile in added:
663 standin = lfutil.standin(lfile)
663 standin = lfutil.standin(lfile)
664 if standin not in ctx and (standin in matches or opts.get('all')):
664 if standin not in ctx and (standin in matches or opts.get('all')):
665 if lfile in lfdirstate:
665 if lfile in lfdirstate:
666 lfdirstate.drop(lfile)
666 lfdirstate.drop(lfile)
667 util.unlinkpath(repo.wjoin(standin))
667 util.unlinkpath(repo.wjoin(standin))
668 lfdirstate.write()
668 lfdirstate.write()
669 finally:
669 finally:
670 wlock.release()
670 wlock.release()
671
671
672 def hgupdaterepo(orig, repo, node, overwrite):
672 def hgupdaterepo(orig, repo, node, overwrite):
673 if not overwrite:
673 if not overwrite:
674 # Only call updatelfiles on the standins that have changed to save time
674 # Only call updatelfiles on the standins that have changed to save time
675 oldstandins = lfutil.getstandinsstate(repo)
675 oldstandins = lfutil.getstandinsstate(repo)
676
676
677 result = orig(repo, node, overwrite)
677 result = orig(repo, node, overwrite)
678
678
679 filelist = None
679 filelist = None
680 if not overwrite:
680 if not overwrite:
681 newstandins = lfutil.getstandinsstate(repo)
681 newstandins = lfutil.getstandinsstate(repo)
682 filelist = lfutil.getlfilestoupdate(oldstandins, newstandins)
682 filelist = lfutil.getlfilestoupdate(oldstandins, newstandins)
683 lfcommands.updatelfiles(repo.ui, repo, filelist=filelist)
683 lfcommands.updatelfiles(repo.ui, repo, filelist=filelist)
684 return result
684 return result
685
685
686 def hgmerge(orig, repo, node, force=None, remind=True):
686 def hgmerge(orig, repo, node, force=None, remind=True):
687 # Mark the repo as being in the middle of a merge, so that
687 # Mark the repo as being in the middle of a merge, so that
688 # updatelfiles() will know that it needs to trust the standins in
688 # updatelfiles() will know that it needs to trust the standins in
689 # the working copy, not in the standins in the current node
689 # the working copy, not in the standins in the current node
690 repo._ismerging = True
690 repo._ismerging = True
691 try:
691 try:
692 result = orig(repo, node, force, remind)
692 result = orig(repo, node, force, remind)
693 lfcommands.updatelfiles(repo.ui, repo)
693 lfcommands.updatelfiles(repo.ui, repo)
694 finally:
694 finally:
695 repo._ismerging = False
695 repo._ismerging = False
696 return result
696 return result
697
697
698 # When we rebase a repository with remotely changed largefiles, we need to
698 # When we rebase a repository with remotely changed largefiles, we need to
699 # take some extra care so that the largefiles are correctly updated in the
699 # take some extra care so that the largefiles are correctly updated in the
700 # working copy
700 # working copy
701 def overridepull(orig, ui, repo, source=None, **opts):
701 def overridepull(orig, ui, repo, source=None, **opts):
702 revsprepull = len(repo)
702 revsprepull = len(repo)
703 if opts.get('rebase', False):
703 if opts.get('rebase', False):
704 repo._isrebasing = True
704 repo._isrebasing = True
705 try:
705 try:
706 if opts.get('update'):
706 if opts.get('update'):
707 del opts['update']
707 del opts['update']
708 ui.debug('--update and --rebase are not compatible, ignoring '
708 ui.debug('--update and --rebase are not compatible, ignoring '
709 'the update flag\n')
709 'the update flag\n')
710 del opts['rebase']
710 del opts['rebase']
711 cmdutil.bailifchanged(repo)
711 cmdutil.bailifchanged(repo)
712 origpostincoming = commands.postincoming
712 origpostincoming = commands.postincoming
713 def _dummy(*args, **kwargs):
713 def _dummy(*args, **kwargs):
714 pass
714 pass
715 commands.postincoming = _dummy
715 commands.postincoming = _dummy
716 if not source:
716 if not source:
717 source = 'default'
717 source = 'default'
718 repo.lfpullsource = source
718 repo.lfpullsource = source
719 try:
719 try:
720 result = commands.pull(ui, repo, source, **opts)
720 result = commands.pull(ui, repo, source, **opts)
721 finally:
721 finally:
722 commands.postincoming = origpostincoming
722 commands.postincoming = origpostincoming
723 revspostpull = len(repo)
723 revspostpull = len(repo)
724 if revspostpull > revsprepull:
724 if revspostpull > revsprepull:
725 result = result or rebase.rebase(ui, repo)
725 result = result or rebase.rebase(ui, repo)
726 finally:
726 finally:
727 repo._isrebasing = False
727 repo._isrebasing = False
728 else:
728 else:
729 if not source:
729 if not source:
730 source = 'default'
730 source = 'default'
731 repo.lfpullsource = source
731 repo.lfpullsource = source
732 oldheads = lfutil.getcurrentheads(repo)
732 oldheads = lfutil.getcurrentheads(repo)
733 result = orig(ui, repo, source, **opts)
733 result = orig(ui, repo, source, **opts)
734 # If we do not have the new largefiles for any new heads we pulled, we
734 # If we do not have the new largefiles for any new heads we pulled, we
735 # will run into a problem later if we try to merge or rebase with one of
735 # will run into a problem later if we try to merge or rebase with one of
736 # these heads, so cache the largefiles now directly into the system
736 # these heads, so cache the largefiles now directly into the system
737 # cache.
737 # cache.
738 ui.status(_("caching new largefiles\n"))
739 numcached = 0
738 numcached = 0
740 heads = lfutil.getcurrentheads(repo)
739 heads = lfutil.getcurrentheads(repo)
741 newheads = set(heads).difference(set(oldheads))
740 newheads = set(heads).difference(set(oldheads))
741 if len(newheads) > 0:
742 ui.status(_("caching largefiles for %s heads\n" % len(newheads)))
742 for head in newheads:
743 for head in newheads:
743 (cached, missing) = lfcommands.cachelfiles(ui, repo, head)
744 (cached, missing) = lfcommands.cachelfiles(ui, repo, head)
744 numcached += len(cached)
745 numcached += len(cached)
745 ui.status(_("%d largefiles cached\n") % numcached)
746 ui.status(_("%d largefiles cached\n") % numcached)
746 if opts.get('all_largefiles'):
747 if opts.get('all_largefiles'):
747 revspostpull = len(repo)
748 revspostpull = len(repo)
748 revs = []
749 revs = []
749 for rev in xrange(revsprepull + 1, revspostpull):
750 for rev in xrange(revsprepull + 1, revspostpull):
750 revs.append(repo[rev].rev())
751 revs.append(repo[rev].rev())
751 lfcommands.downloadlfiles(ui, repo, revs)
752 lfcommands.downloadlfiles(ui, repo, revs)
752 return result
753 return result
753
754
754 def overrideclone(orig, ui, source, dest=None, **opts):
755 def overrideclone(orig, ui, source, dest=None, **opts):
755 d = dest
756 d = dest
756 if d is None:
757 if d is None:
757 d = hg.defaultdest(source)
758 d = hg.defaultdest(source)
758 if opts.get('all_largefiles') and not hg.islocal(d):
759 if opts.get('all_largefiles') and not hg.islocal(d):
759 raise util.Abort(_(
760 raise util.Abort(_(
760 '--all-largefiles is incompatible with non-local destination %s' %
761 '--all-largefiles is incompatible with non-local destination %s' %
761 d))
762 d))
762
763
763 return orig(ui, source, dest, **opts)
764 return orig(ui, source, dest, **opts)
764
765
765 def hgclone(orig, ui, opts, *args, **kwargs):
766 def hgclone(orig, ui, opts, *args, **kwargs):
766 result = orig(ui, opts, *args, **kwargs)
767 result = orig(ui, opts, *args, **kwargs)
767
768
768 if result is not None:
769 if result is not None:
769 sourcerepo, destrepo = result
770 sourcerepo, destrepo = result
770 repo = destrepo.local()
771 repo = destrepo.local()
771
772
772 # The .hglf directory must exist for the standin matcher to match
773 # The .hglf directory must exist for the standin matcher to match
773 # anything (which listlfiles uses for each rev), and .hg/largefiles is
774 # anything (which listlfiles uses for each rev), and .hg/largefiles is
774 # assumed to exist by the code that caches the downloaded file. These
775 # assumed to exist by the code that caches the downloaded file. These
775 # directories exist if clone updated to any rev. (If the repo does not
776 # directories exist if clone updated to any rev. (If the repo does not
776 # have largefiles, download never gets to the point of needing
777 # have largefiles, download never gets to the point of needing
777 # .hg/largefiles, and the standin matcher won't match anything anyway.)
778 # .hg/largefiles, and the standin matcher won't match anything anyway.)
778 if 'largefiles' in repo.requirements:
779 if 'largefiles' in repo.requirements:
779 if opts.get('noupdate'):
780 if opts.get('noupdate'):
780 util.makedirs(repo.wjoin(lfutil.shortname))
781 util.makedirs(repo.wjoin(lfutil.shortname))
781 util.makedirs(repo.join(lfutil.longname))
782 util.makedirs(repo.join(lfutil.longname))
782
783
783 # Caching is implicitly limited to 'rev' option, since the dest repo was
784 # Caching is implicitly limited to 'rev' option, since the dest repo was
784 # truncated at that point. The user may expect a download count with
785 # truncated at that point. The user may expect a download count with
785 # this option, so attempt whether or not this is a largefile repo.
786 # this option, so attempt whether or not this is a largefile repo.
786 if opts.get('all_largefiles'):
787 if opts.get('all_largefiles'):
787 success, missing = lfcommands.downloadlfiles(ui, repo, None)
788 success, missing = lfcommands.downloadlfiles(ui, repo, None)
788
789
789 if missing != 0:
790 if missing != 0:
790 return None
791 return None
791
792
792 return result
793 return result
793
794
794 def overriderebase(orig, ui, repo, **opts):
795 def overriderebase(orig, ui, repo, **opts):
795 repo._isrebasing = True
796 repo._isrebasing = True
796 try:
797 try:
797 return orig(ui, repo, **opts)
798 return orig(ui, repo, **opts)
798 finally:
799 finally:
799 repo._isrebasing = False
800 repo._isrebasing = False
800
801
801 def overridearchive(orig, repo, dest, node, kind, decode=True, matchfn=None,
802 def overridearchive(orig, repo, dest, node, kind, decode=True, matchfn=None,
802 prefix=None, mtime=None, subrepos=None):
803 prefix=None, mtime=None, subrepos=None):
803 # No need to lock because we are only reading history and
804 # No need to lock because we are only reading history and
804 # largefile caches, neither of which are modified.
805 # largefile caches, neither of which are modified.
805 lfcommands.cachelfiles(repo.ui, repo, node)
806 lfcommands.cachelfiles(repo.ui, repo, node)
806
807
807 if kind not in archival.archivers:
808 if kind not in archival.archivers:
808 raise util.Abort(_("unknown archive type '%s'") % kind)
809 raise util.Abort(_("unknown archive type '%s'") % kind)
809
810
810 ctx = repo[node]
811 ctx = repo[node]
811
812
812 if kind == 'files':
813 if kind == 'files':
813 if prefix:
814 if prefix:
814 raise util.Abort(
815 raise util.Abort(
815 _('cannot give prefix when archiving to files'))
816 _('cannot give prefix when archiving to files'))
816 else:
817 else:
817 prefix = archival.tidyprefix(dest, kind, prefix)
818 prefix = archival.tidyprefix(dest, kind, prefix)
818
819
819 def write(name, mode, islink, getdata):
820 def write(name, mode, islink, getdata):
820 if matchfn and not matchfn(name):
821 if matchfn and not matchfn(name):
821 return
822 return
822 data = getdata()
823 data = getdata()
823 if decode:
824 if decode:
824 data = repo.wwritedata(name, data)
825 data = repo.wwritedata(name, data)
825 archiver.addfile(prefix + name, mode, islink, data)
826 archiver.addfile(prefix + name, mode, islink, data)
826
827
827 archiver = archival.archivers[kind](dest, mtime or ctx.date()[0])
828 archiver = archival.archivers[kind](dest, mtime or ctx.date()[0])
828
829
829 if repo.ui.configbool("ui", "archivemeta", True):
830 if repo.ui.configbool("ui", "archivemeta", True):
830 def metadata():
831 def metadata():
831 base = 'repo: %s\nnode: %s\nbranch: %s\n' % (
832 base = 'repo: %s\nnode: %s\nbranch: %s\n' % (
832 hex(repo.changelog.node(0)), hex(node), ctx.branch())
833 hex(repo.changelog.node(0)), hex(node), ctx.branch())
833
834
834 tags = ''.join('tag: %s\n' % t for t in ctx.tags()
835 tags = ''.join('tag: %s\n' % t for t in ctx.tags()
835 if repo.tagtype(t) == 'global')
836 if repo.tagtype(t) == 'global')
836 if not tags:
837 if not tags:
837 repo.ui.pushbuffer()
838 repo.ui.pushbuffer()
838 opts = {'template': '{latesttag}\n{latesttagdistance}',
839 opts = {'template': '{latesttag}\n{latesttagdistance}',
839 'style': '', 'patch': None, 'git': None}
840 'style': '', 'patch': None, 'git': None}
840 cmdutil.show_changeset(repo.ui, repo, opts).show(ctx)
841 cmdutil.show_changeset(repo.ui, repo, opts).show(ctx)
841 ltags, dist = repo.ui.popbuffer().split('\n')
842 ltags, dist = repo.ui.popbuffer().split('\n')
842 tags = ''.join('latesttag: %s\n' % t for t in ltags.split(':'))
843 tags = ''.join('latesttag: %s\n' % t for t in ltags.split(':'))
843 tags += 'latesttagdistance: %s\n' % dist
844 tags += 'latesttagdistance: %s\n' % dist
844
845
845 return base + tags
846 return base + tags
846
847
847 write('.hg_archival.txt', 0644, False, metadata)
848 write('.hg_archival.txt', 0644, False, metadata)
848
849
849 for f in ctx:
850 for f in ctx:
850 ff = ctx.flags(f)
851 ff = ctx.flags(f)
851 getdata = ctx[f].data
852 getdata = ctx[f].data
852 if lfutil.isstandin(f):
853 if lfutil.isstandin(f):
853 path = lfutil.findfile(repo, getdata().strip())
854 path = lfutil.findfile(repo, getdata().strip())
854 if path is None:
855 if path is None:
855 raise util.Abort(
856 raise util.Abort(
856 _('largefile %s not found in repo store or system cache')
857 _('largefile %s not found in repo store or system cache')
857 % lfutil.splitstandin(f))
858 % lfutil.splitstandin(f))
858 f = lfutil.splitstandin(f)
859 f = lfutil.splitstandin(f)
859
860
860 def getdatafn():
861 def getdatafn():
861 fd = None
862 fd = None
862 try:
863 try:
863 fd = open(path, 'rb')
864 fd = open(path, 'rb')
864 return fd.read()
865 return fd.read()
865 finally:
866 finally:
866 if fd:
867 if fd:
867 fd.close()
868 fd.close()
868
869
869 getdata = getdatafn
870 getdata = getdatafn
870 write(f, 'x' in ff and 0755 or 0644, 'l' in ff, getdata)
871 write(f, 'x' in ff and 0755 or 0644, 'l' in ff, getdata)
871
872
872 if subrepos:
873 if subrepos:
873 for subpath in sorted(ctx.substate):
874 for subpath in sorted(ctx.substate):
874 sub = ctx.sub(subpath)
875 sub = ctx.sub(subpath)
875 submatch = match_.narrowmatcher(subpath, matchfn)
876 submatch = match_.narrowmatcher(subpath, matchfn)
876 sub.archive(repo.ui, archiver, prefix, submatch)
877 sub.archive(repo.ui, archiver, prefix, submatch)
877
878
878 archiver.done()
879 archiver.done()
879
880
880 def hgsubrepoarchive(orig, repo, ui, archiver, prefix, match=None):
881 def hgsubrepoarchive(orig, repo, ui, archiver, prefix, match=None):
881 repo._get(repo._state + ('hg',))
882 repo._get(repo._state + ('hg',))
882 rev = repo._state[1]
883 rev = repo._state[1]
883 ctx = repo._repo[rev]
884 ctx = repo._repo[rev]
884
885
885 lfcommands.cachelfiles(ui, repo._repo, ctx.node())
886 lfcommands.cachelfiles(ui, repo._repo, ctx.node())
886
887
887 def write(name, mode, islink, getdata):
888 def write(name, mode, islink, getdata):
888 # At this point, the standin has been replaced with the largefile name,
889 # At this point, the standin has been replaced with the largefile name,
889 # so the normal matcher works here without the lfutil variants.
890 # so the normal matcher works here without the lfutil variants.
890 if match and not match(f):
891 if match and not match(f):
891 return
892 return
892 data = getdata()
893 data = getdata()
893
894
894 archiver.addfile(prefix + repo._path + '/' + name, mode, islink, data)
895 archiver.addfile(prefix + repo._path + '/' + name, mode, islink, data)
895
896
896 for f in ctx:
897 for f in ctx:
897 ff = ctx.flags(f)
898 ff = ctx.flags(f)
898 getdata = ctx[f].data
899 getdata = ctx[f].data
899 if lfutil.isstandin(f):
900 if lfutil.isstandin(f):
900 path = lfutil.findfile(repo._repo, getdata().strip())
901 path = lfutil.findfile(repo._repo, getdata().strip())
901 if path is None:
902 if path is None:
902 raise util.Abort(
903 raise util.Abort(
903 _('largefile %s not found in repo store or system cache')
904 _('largefile %s not found in repo store or system cache')
904 % lfutil.splitstandin(f))
905 % lfutil.splitstandin(f))
905 f = lfutil.splitstandin(f)
906 f = lfutil.splitstandin(f)
906
907
907 def getdatafn():
908 def getdatafn():
908 fd = None
909 fd = None
909 try:
910 try:
910 fd = open(os.path.join(prefix, path), 'rb')
911 fd = open(os.path.join(prefix, path), 'rb')
911 return fd.read()
912 return fd.read()
912 finally:
913 finally:
913 if fd:
914 if fd:
914 fd.close()
915 fd.close()
915
916
916 getdata = getdatafn
917 getdata = getdatafn
917
918
918 write(f, 'x' in ff and 0755 or 0644, 'l' in ff, getdata)
919 write(f, 'x' in ff and 0755 or 0644, 'l' in ff, getdata)
919
920
920 for subpath in sorted(ctx.substate):
921 for subpath in sorted(ctx.substate):
921 sub = ctx.sub(subpath)
922 sub = ctx.sub(subpath)
922 submatch = match_.narrowmatcher(subpath, match)
923 submatch = match_.narrowmatcher(subpath, match)
923 sub.archive(ui, archiver, os.path.join(prefix, repo._path) + '/',
924 sub.archive(ui, archiver, os.path.join(prefix, repo._path) + '/',
924 submatch)
925 submatch)
925
926
926 # If a largefile is modified, the change is not reflected in its
927 # If a largefile is modified, the change is not reflected in its
927 # standin until a commit. cmdutil.bailifchanged() raises an exception
928 # standin until a commit. cmdutil.bailifchanged() raises an exception
928 # if the repo has uncommitted changes. Wrap it to also check if
929 # if the repo has uncommitted changes. Wrap it to also check if
929 # largefiles were changed. This is used by bisect and backout.
930 # largefiles were changed. This is used by bisect and backout.
930 def overridebailifchanged(orig, repo):
931 def overridebailifchanged(orig, repo):
931 orig(repo)
932 orig(repo)
932 repo.lfstatus = True
933 repo.lfstatus = True
933 modified, added, removed, deleted = repo.status()[:4]
934 modified, added, removed, deleted = repo.status()[:4]
934 repo.lfstatus = False
935 repo.lfstatus = False
935 if modified or added or removed or deleted:
936 if modified or added or removed or deleted:
936 raise util.Abort(_('outstanding uncommitted changes'))
937 raise util.Abort(_('outstanding uncommitted changes'))
937
938
938 # Fetch doesn't use cmdutil.bailifchanged so override it to add the check
939 # Fetch doesn't use cmdutil.bailifchanged so override it to add the check
939 def overridefetch(orig, ui, repo, *pats, **opts):
940 def overridefetch(orig, ui, repo, *pats, **opts):
940 repo.lfstatus = True
941 repo.lfstatus = True
941 modified, added, removed, deleted = repo.status()[:4]
942 modified, added, removed, deleted = repo.status()[:4]
942 repo.lfstatus = False
943 repo.lfstatus = False
943 if modified or added or removed or deleted:
944 if modified or added or removed or deleted:
944 raise util.Abort(_('outstanding uncommitted changes'))
945 raise util.Abort(_('outstanding uncommitted changes'))
945 return orig(ui, repo, *pats, **opts)
946 return orig(ui, repo, *pats, **opts)
946
947
947 def overrideforget(orig, ui, repo, *pats, **opts):
948 def overrideforget(orig, ui, repo, *pats, **opts):
948 installnormalfilesmatchfn(repo[None].manifest())
949 installnormalfilesmatchfn(repo[None].manifest())
949 result = orig(ui, repo, *pats, **opts)
950 result = orig(ui, repo, *pats, **opts)
950 restorematchfn()
951 restorematchfn()
951 m = scmutil.match(repo[None], pats, opts)
952 m = scmutil.match(repo[None], pats, opts)
952
953
953 try:
954 try:
954 repo.lfstatus = True
955 repo.lfstatus = True
955 s = repo.status(match=m, clean=True)
956 s = repo.status(match=m, clean=True)
956 finally:
957 finally:
957 repo.lfstatus = False
958 repo.lfstatus = False
958 forget = sorted(s[0] + s[1] + s[3] + s[6])
959 forget = sorted(s[0] + s[1] + s[3] + s[6])
959 forget = [f for f in forget if lfutil.standin(f) in repo[None].manifest()]
960 forget = [f for f in forget if lfutil.standin(f) in repo[None].manifest()]
960
961
961 for f in forget:
962 for f in forget:
962 if lfutil.standin(f) not in repo.dirstate and not \
963 if lfutil.standin(f) not in repo.dirstate and not \
963 os.path.isdir(m.rel(lfutil.standin(f))):
964 os.path.isdir(m.rel(lfutil.standin(f))):
964 ui.warn(_('not removing %s: file is already untracked\n')
965 ui.warn(_('not removing %s: file is already untracked\n')
965 % m.rel(f))
966 % m.rel(f))
966 result = 1
967 result = 1
967
968
968 for f in forget:
969 for f in forget:
969 if ui.verbose or not m.exact(f):
970 if ui.verbose or not m.exact(f):
970 ui.status(_('removing %s\n') % m.rel(f))
971 ui.status(_('removing %s\n') % m.rel(f))
971
972
972 # Need to lock because standin files are deleted then removed from the
973 # Need to lock because standin files are deleted then removed from the
973 # repository and we could race in-between.
974 # repository and we could race in-between.
974 wlock = repo.wlock()
975 wlock = repo.wlock()
975 try:
976 try:
976 lfdirstate = lfutil.openlfdirstate(ui, repo)
977 lfdirstate = lfutil.openlfdirstate(ui, repo)
977 for f in forget:
978 for f in forget:
978 if lfdirstate[f] == 'a':
979 if lfdirstate[f] == 'a':
979 lfdirstate.drop(f)
980 lfdirstate.drop(f)
980 else:
981 else:
981 lfdirstate.remove(f)
982 lfdirstate.remove(f)
982 lfdirstate.write()
983 lfdirstate.write()
983 standins = [lfutil.standin(f) for f in forget]
984 standins = [lfutil.standin(f) for f in forget]
984 for f in standins:
985 for f in standins:
985 util.unlinkpath(repo.wjoin(f), ignoremissing=True)
986 util.unlinkpath(repo.wjoin(f), ignoremissing=True)
986 repo[None].forget(standins)
987 repo[None].forget(standins)
987 finally:
988 finally:
988 wlock.release()
989 wlock.release()
989
990
990 return result
991 return result
991
992
992 def getoutgoinglfiles(ui, repo, dest=None, **opts):
993 def getoutgoinglfiles(ui, repo, dest=None, **opts):
993 dest = ui.expandpath(dest or 'default-push', dest or 'default')
994 dest = ui.expandpath(dest or 'default-push', dest or 'default')
994 dest, branches = hg.parseurl(dest, opts.get('branch'))
995 dest, branches = hg.parseurl(dest, opts.get('branch'))
995 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
996 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
996 if revs:
997 if revs:
997 revs = [repo.lookup(rev) for rev in scmutil.revrange(repo, revs)]
998 revs = [repo.lookup(rev) for rev in scmutil.revrange(repo, revs)]
998
999
999 try:
1000 try:
1000 remote = hg.peer(repo, opts, dest)
1001 remote = hg.peer(repo, opts, dest)
1001 except error.RepoError:
1002 except error.RepoError:
1002 return None
1003 return None
1003 outgoing = discovery.findcommonoutgoing(repo, remote.peer(), force=False)
1004 outgoing = discovery.findcommonoutgoing(repo, remote.peer(), force=False)
1004 if not outgoing.missing:
1005 if not outgoing.missing:
1005 return outgoing.missing
1006 return outgoing.missing
1006 o = repo.changelog.nodesbetween(outgoing.missing, revs)[0]
1007 o = repo.changelog.nodesbetween(outgoing.missing, revs)[0]
1007 if opts.get('newest_first'):
1008 if opts.get('newest_first'):
1008 o.reverse()
1009 o.reverse()
1009
1010
1010 toupload = set()
1011 toupload = set()
1011 for n in o:
1012 for n in o:
1012 parents = [p for p in repo.changelog.parents(n) if p != node.nullid]
1013 parents = [p for p in repo.changelog.parents(n) if p != node.nullid]
1013 ctx = repo[n]
1014 ctx = repo[n]
1014 files = set(ctx.files())
1015 files = set(ctx.files())
1015 if len(parents) == 2:
1016 if len(parents) == 2:
1016 mc = ctx.manifest()
1017 mc = ctx.manifest()
1017 mp1 = ctx.parents()[0].manifest()
1018 mp1 = ctx.parents()[0].manifest()
1018 mp2 = ctx.parents()[1].manifest()
1019 mp2 = ctx.parents()[1].manifest()
1019 for f in mp1:
1020 for f in mp1:
1020 if f not in mc:
1021 if f not in mc:
1021 files.add(f)
1022 files.add(f)
1022 for f in mp2:
1023 for f in mp2:
1023 if f not in mc:
1024 if f not in mc:
1024 files.add(f)
1025 files.add(f)
1025 for f in mc:
1026 for f in mc:
1026 if mc[f] != mp1.get(f, None) or mc[f] != mp2.get(f, None):
1027 if mc[f] != mp1.get(f, None) or mc[f] != mp2.get(f, None):
1027 files.add(f)
1028 files.add(f)
1028 toupload = toupload.union(
1029 toupload = toupload.union(
1029 set([f for f in files if lfutil.isstandin(f) and f in ctx]))
1030 set([f for f in files if lfutil.isstandin(f) and f in ctx]))
1030 return sorted(toupload)
1031 return sorted(toupload)
1031
1032
1032 def overrideoutgoing(orig, ui, repo, dest=None, **opts):
1033 def overrideoutgoing(orig, ui, repo, dest=None, **opts):
1033 result = orig(ui, repo, dest, **opts)
1034 result = orig(ui, repo, dest, **opts)
1034
1035
1035 if opts.pop('large', None):
1036 if opts.pop('large', None):
1036 toupload = getoutgoinglfiles(ui, repo, dest, **opts)
1037 toupload = getoutgoinglfiles(ui, repo, dest, **opts)
1037 if toupload is None:
1038 if toupload is None:
1038 ui.status(_('largefiles: No remote repo\n'))
1039 ui.status(_('largefiles: No remote repo\n'))
1039 elif not toupload:
1040 elif not toupload:
1040 ui.status(_('largefiles: no files to upload\n'))
1041 ui.status(_('largefiles: no files to upload\n'))
1041 else:
1042 else:
1042 ui.status(_('largefiles to upload:\n'))
1043 ui.status(_('largefiles to upload:\n'))
1043 for file in toupload:
1044 for file in toupload:
1044 ui.status(lfutil.splitstandin(file) + '\n')
1045 ui.status(lfutil.splitstandin(file) + '\n')
1045 ui.status('\n')
1046 ui.status('\n')
1046
1047
1047 return result
1048 return result
1048
1049
1049 def overridesummary(orig, ui, repo, *pats, **opts):
1050 def overridesummary(orig, ui, repo, *pats, **opts):
1050 try:
1051 try:
1051 repo.lfstatus = True
1052 repo.lfstatus = True
1052 orig(ui, repo, *pats, **opts)
1053 orig(ui, repo, *pats, **opts)
1053 finally:
1054 finally:
1054 repo.lfstatus = False
1055 repo.lfstatus = False
1055
1056
1056 if opts.pop('large', None):
1057 if opts.pop('large', None):
1057 toupload = getoutgoinglfiles(ui, repo, None, **opts)
1058 toupload = getoutgoinglfiles(ui, repo, None, **opts)
1058 if toupload is None:
1059 if toupload is None:
1059 # i18n: column positioning for "hg summary"
1060 # i18n: column positioning for "hg summary"
1060 ui.status(_('largefiles: (no remote repo)\n'))
1061 ui.status(_('largefiles: (no remote repo)\n'))
1061 elif not toupload:
1062 elif not toupload:
1062 # i18n: column positioning for "hg summary"
1063 # i18n: column positioning for "hg summary"
1063 ui.status(_('largefiles: (no files to upload)\n'))
1064 ui.status(_('largefiles: (no files to upload)\n'))
1064 else:
1065 else:
1065 # i18n: column positioning for "hg summary"
1066 # i18n: column positioning for "hg summary"
1066 ui.status(_('largefiles: %d to upload\n') % len(toupload))
1067 ui.status(_('largefiles: %d to upload\n') % len(toupload))
1067
1068
1068 def scmutiladdremove(orig, repo, pats=[], opts={}, dry_run=None,
1069 def scmutiladdremove(orig, repo, pats=[], opts={}, dry_run=None,
1069 similarity=None):
1070 similarity=None):
1070 if not lfutil.islfilesrepo(repo):
1071 if not lfutil.islfilesrepo(repo):
1071 return orig(repo, pats, opts, dry_run, similarity)
1072 return orig(repo, pats, opts, dry_run, similarity)
1072 # Get the list of missing largefiles so we can remove them
1073 # Get the list of missing largefiles so we can remove them
1073 lfdirstate = lfutil.openlfdirstate(repo.ui, repo)
1074 lfdirstate = lfutil.openlfdirstate(repo.ui, repo)
1074 s = lfdirstate.status(match_.always(repo.root, repo.getcwd()), [], False,
1075 s = lfdirstate.status(match_.always(repo.root, repo.getcwd()), [], False,
1075 False, False)
1076 False, False)
1076 (unsure, modified, added, removed, missing, unknown, ignored, clean) = s
1077 (unsure, modified, added, removed, missing, unknown, ignored, clean) = s
1077
1078
1078 # Call into the normal remove code, but the removing of the standin, we want
1079 # Call into the normal remove code, but the removing of the standin, we want
1079 # to have handled by original addremove. Monkey patching here makes sure
1080 # to have handled by original addremove. Monkey patching here makes sure
1080 # we don't remove the standin in the largefiles code, preventing a very
1081 # we don't remove the standin in the largefiles code, preventing a very
1081 # confused state later.
1082 # confused state later.
1082 if missing:
1083 if missing:
1083 m = [repo.wjoin(f) for f in missing]
1084 m = [repo.wjoin(f) for f in missing]
1084 repo._isaddremove = True
1085 repo._isaddremove = True
1085 removelargefiles(repo.ui, repo, *m, **opts)
1086 removelargefiles(repo.ui, repo, *m, **opts)
1086 repo._isaddremove = False
1087 repo._isaddremove = False
1087 # Call into the normal add code, and any files that *should* be added as
1088 # Call into the normal add code, and any files that *should* be added as
1088 # largefiles will be
1089 # largefiles will be
1089 addlargefiles(repo.ui, repo, *pats, **opts)
1090 addlargefiles(repo.ui, repo, *pats, **opts)
1090 # Now that we've handled largefiles, hand off to the original addremove
1091 # Now that we've handled largefiles, hand off to the original addremove
1091 # function to take care of the rest. Make sure it doesn't do anything with
1092 # function to take care of the rest. Make sure it doesn't do anything with
1092 # largefiles by installing a matcher that will ignore them.
1093 # largefiles by installing a matcher that will ignore them.
1093 installnormalfilesmatchfn(repo[None].manifest())
1094 installnormalfilesmatchfn(repo[None].manifest())
1094 result = orig(repo, pats, opts, dry_run, similarity)
1095 result = orig(repo, pats, opts, dry_run, similarity)
1095 restorematchfn()
1096 restorematchfn()
1096 return result
1097 return result
1097
1098
1098 # Calling purge with --all will cause the largefiles to be deleted.
1099 # Calling purge with --all will cause the largefiles to be deleted.
1099 # Override repo.status to prevent this from happening.
1100 # Override repo.status to prevent this from happening.
1100 def overridepurge(orig, ui, repo, *dirs, **opts):
1101 def overridepurge(orig, ui, repo, *dirs, **opts):
1101 # XXX large file status is buggy when used on repo proxy.
1102 # XXX large file status is buggy when used on repo proxy.
1102 # XXX this needs to be investigate.
1103 # XXX this needs to be investigate.
1103 repo = repo.unfiltered()
1104 repo = repo.unfiltered()
1104 oldstatus = repo.status
1105 oldstatus = repo.status
1105 def overridestatus(node1='.', node2=None, match=None, ignored=False,
1106 def overridestatus(node1='.', node2=None, match=None, ignored=False,
1106 clean=False, unknown=False, listsubrepos=False):
1107 clean=False, unknown=False, listsubrepos=False):
1107 r = oldstatus(node1, node2, match, ignored, clean, unknown,
1108 r = oldstatus(node1, node2, match, ignored, clean, unknown,
1108 listsubrepos)
1109 listsubrepos)
1109 lfdirstate = lfutil.openlfdirstate(ui, repo)
1110 lfdirstate = lfutil.openlfdirstate(ui, repo)
1110 modified, added, removed, deleted, unknown, ignored, clean = r
1111 modified, added, removed, deleted, unknown, ignored, clean = r
1111 unknown = [f for f in unknown if lfdirstate[f] == '?']
1112 unknown = [f for f in unknown if lfdirstate[f] == '?']
1112 ignored = [f for f in ignored if lfdirstate[f] == '?']
1113 ignored = [f for f in ignored if lfdirstate[f] == '?']
1113 return modified, added, removed, deleted, unknown, ignored, clean
1114 return modified, added, removed, deleted, unknown, ignored, clean
1114 repo.status = overridestatus
1115 repo.status = overridestatus
1115 orig(ui, repo, *dirs, **opts)
1116 orig(ui, repo, *dirs, **opts)
1116 repo.status = oldstatus
1117 repo.status = oldstatus
1117
1118
1118 def overriderollback(orig, ui, repo, **opts):
1119 def overriderollback(orig, ui, repo, **opts):
1119 result = orig(ui, repo, **opts)
1120 result = orig(ui, repo, **opts)
1120 merge.update(repo, node=None, branchmerge=False, force=True,
1121 merge.update(repo, node=None, branchmerge=False, force=True,
1121 partial=lfutil.isstandin)
1122 partial=lfutil.isstandin)
1122 wlock = repo.wlock()
1123 wlock = repo.wlock()
1123 try:
1124 try:
1124 lfdirstate = lfutil.openlfdirstate(ui, repo)
1125 lfdirstate = lfutil.openlfdirstate(ui, repo)
1125 lfiles = lfutil.listlfiles(repo)
1126 lfiles = lfutil.listlfiles(repo)
1126 oldlfiles = lfutil.listlfiles(repo, repo[None].parents()[0].rev())
1127 oldlfiles = lfutil.listlfiles(repo, repo[None].parents()[0].rev())
1127 for file in lfiles:
1128 for file in lfiles:
1128 if file in oldlfiles:
1129 if file in oldlfiles:
1129 lfdirstate.normallookup(file)
1130 lfdirstate.normallookup(file)
1130 else:
1131 else:
1131 lfdirstate.add(file)
1132 lfdirstate.add(file)
1132 lfdirstate.write()
1133 lfdirstate.write()
1133 finally:
1134 finally:
1134 wlock.release()
1135 wlock.release()
1135 return result
1136 return result
1136
1137
1137 def overridetransplant(orig, ui, repo, *revs, **opts):
1138 def overridetransplant(orig, ui, repo, *revs, **opts):
1138 try:
1139 try:
1139 oldstandins = lfutil.getstandinsstate(repo)
1140 oldstandins = lfutil.getstandinsstate(repo)
1140 repo._istransplanting = True
1141 repo._istransplanting = True
1141 result = orig(ui, repo, *revs, **opts)
1142 result = orig(ui, repo, *revs, **opts)
1142 newstandins = lfutil.getstandinsstate(repo)
1143 newstandins = lfutil.getstandinsstate(repo)
1143 filelist = lfutil.getlfilestoupdate(oldstandins, newstandins)
1144 filelist = lfutil.getlfilestoupdate(oldstandins, newstandins)
1144 lfcommands.updatelfiles(repo.ui, repo, filelist=filelist,
1145 lfcommands.updatelfiles(repo.ui, repo, filelist=filelist,
1145 printmessage=True)
1146 printmessage=True)
1146 finally:
1147 finally:
1147 repo._istransplanting = False
1148 repo._istransplanting = False
1148 return result
1149 return result
1149
1150
1150 def overridecat(orig, ui, repo, file1, *pats, **opts):
1151 def overridecat(orig, ui, repo, file1, *pats, **opts):
1151 ctx = scmutil.revsingle(repo, opts.get('rev'))
1152 ctx = scmutil.revsingle(repo, opts.get('rev'))
1152 err = 1
1153 err = 1
1153 notbad = set()
1154 notbad = set()
1154 m = scmutil.match(ctx, (file1,) + pats, opts)
1155 m = scmutil.match(ctx, (file1,) + pats, opts)
1155 origmatchfn = m.matchfn
1156 origmatchfn = m.matchfn
1156 def lfmatchfn(f):
1157 def lfmatchfn(f):
1157 lf = lfutil.splitstandin(f)
1158 lf = lfutil.splitstandin(f)
1158 if lf is None:
1159 if lf is None:
1159 return origmatchfn(f)
1160 return origmatchfn(f)
1160 notbad.add(lf)
1161 notbad.add(lf)
1161 return origmatchfn(lf)
1162 return origmatchfn(lf)
1162 m.matchfn = lfmatchfn
1163 m.matchfn = lfmatchfn
1163 m.bad = lambda f, msg: f not in notbad
1164 m.bad = lambda f, msg: f not in notbad
1164 for f in ctx.walk(m):
1165 for f in ctx.walk(m):
1165 lf = lfutil.splitstandin(f)
1166 lf = lfutil.splitstandin(f)
1166 if lf is None:
1167 if lf is None:
1167 err = orig(ui, repo, f, **opts)
1168 err = orig(ui, repo, f, **opts)
1168 else:
1169 else:
1169 err = lfcommands.catlfile(repo, lf, ctx.rev(), opts.get('output'))
1170 err = lfcommands.catlfile(repo, lf, ctx.rev(), opts.get('output'))
1170 return err
1171 return err
1171
1172
1172 def mercurialsinkbefore(orig, sink):
1173 def mercurialsinkbefore(orig, sink):
1173 sink.repo._isconverting = True
1174 sink.repo._isconverting = True
1174 orig(sink)
1175 orig(sink)
1175
1176
1176 def mercurialsinkafter(orig, sink):
1177 def mercurialsinkafter(orig, sink):
1177 sink.repo._isconverting = False
1178 sink.repo._isconverting = False
1178 orig(sink)
1179 orig(sink)
@@ -1,2089 +1,2089 b''
1 $ USERCACHE="$TESTTMP/cache"; export USERCACHE
1 $ USERCACHE="$TESTTMP/cache"; export USERCACHE
2 $ mkdir "${USERCACHE}"
2 $ mkdir "${USERCACHE}"
3 $ cat >> $HGRCPATH <<EOF
3 $ cat >> $HGRCPATH <<EOF
4 > [extensions]
4 > [extensions]
5 > largefiles=
5 > largefiles=
6 > purge=
6 > purge=
7 > rebase=
7 > rebase=
8 > transplant=
8 > transplant=
9 > [phases]
9 > [phases]
10 > publish=False
10 > publish=False
11 > [largefiles]
11 > [largefiles]
12 > minsize=2
12 > minsize=2
13 > patterns=glob:**.dat
13 > patterns=glob:**.dat
14 > usercache=${USERCACHE}
14 > usercache=${USERCACHE}
15 > [hooks]
15 > [hooks]
16 > precommit=sh -c "echo \\"Invoking status precommit hook\\"; hg status"
16 > precommit=sh -c "echo \\"Invoking status precommit hook\\"; hg status"
17 > EOF
17 > EOF
18
18
19 Create the repo with a couple of revisions of both large and normal
19 Create the repo with a couple of revisions of both large and normal
20 files.
20 files.
21 Test status and dirstate of largefiles and that summary output is correct.
21 Test status and dirstate of largefiles and that summary output is correct.
22
22
23 $ hg init a
23 $ hg init a
24 $ cd a
24 $ cd a
25 $ mkdir sub
25 $ mkdir sub
26 $ echo normal1 > normal1
26 $ echo normal1 > normal1
27 $ echo normal2 > sub/normal2
27 $ echo normal2 > sub/normal2
28 $ echo large1 > large1
28 $ echo large1 > large1
29 $ echo large2 > sub/large2
29 $ echo large2 > sub/large2
30 $ hg add normal1 sub/normal2
30 $ hg add normal1 sub/normal2
31 $ hg add --large large1 sub/large2
31 $ hg add --large large1 sub/large2
32 $ hg commit -m "add files"
32 $ hg commit -m "add files"
33 Invoking status precommit hook
33 Invoking status precommit hook
34 A large1
34 A large1
35 A normal1
35 A normal1
36 A sub/large2
36 A sub/large2
37 A sub/normal2
37 A sub/normal2
38 $ touch large1 sub/large2
38 $ touch large1 sub/large2
39 $ sleep 1
39 $ sleep 1
40 $ hg st
40 $ hg st
41 $ hg debugstate --nodates
41 $ hg debugstate --nodates
42 n 644 41 .hglf/large1
42 n 644 41 .hglf/large1
43 n 644 41 .hglf/sub/large2
43 n 644 41 .hglf/sub/large2
44 n 644 8 normal1
44 n 644 8 normal1
45 n 644 8 sub/normal2
45 n 644 8 sub/normal2
46 $ hg debugstate --large
46 $ hg debugstate --large
47 n 644 7 large1
47 n 644 7 large1
48 n 644 7 sub/large2
48 n 644 7 sub/large2
49 $ echo normal11 > normal1
49 $ echo normal11 > normal1
50 $ echo normal22 > sub/normal2
50 $ echo normal22 > sub/normal2
51 $ echo large11 > large1
51 $ echo large11 > large1
52 $ echo large22 > sub/large2
52 $ echo large22 > sub/large2
53 $ hg commit -m "edit files"
53 $ hg commit -m "edit files"
54 Invoking status precommit hook
54 Invoking status precommit hook
55 M large1
55 M large1
56 M normal1
56 M normal1
57 M sub/large2
57 M sub/large2
58 M sub/normal2
58 M sub/normal2
59 $ hg sum --large
59 $ hg sum --large
60 parent: 1:ce8896473775 tip
60 parent: 1:ce8896473775 tip
61 edit files
61 edit files
62 branch: default
62 branch: default
63 commit: (clean)
63 commit: (clean)
64 update: (current)
64 update: (current)
65 largefiles: (no remote repo)
65 largefiles: (no remote repo)
66
66
67 Commit preserved largefile contents.
67 Commit preserved largefile contents.
68
68
69 $ cat normal1
69 $ cat normal1
70 normal11
70 normal11
71 $ cat large1
71 $ cat large1
72 large11
72 large11
73 $ cat sub/normal2
73 $ cat sub/normal2
74 normal22
74 normal22
75 $ cat sub/large2
75 $ cat sub/large2
76 large22
76 large22
77
77
78 Test status, subdir and unknown files
78 Test status, subdir and unknown files
79
79
80 $ echo unknown > sub/unknown
80 $ echo unknown > sub/unknown
81 $ hg st --all
81 $ hg st --all
82 ? sub/unknown
82 ? sub/unknown
83 C large1
83 C large1
84 C normal1
84 C normal1
85 C sub/large2
85 C sub/large2
86 C sub/normal2
86 C sub/normal2
87 $ hg st --all sub
87 $ hg st --all sub
88 ? sub/unknown
88 ? sub/unknown
89 C sub/large2
89 C sub/large2
90 C sub/normal2
90 C sub/normal2
91 $ rm sub/unknown
91 $ rm sub/unknown
92
92
93 Test messages and exit codes for remove warning cases
93 Test messages and exit codes for remove warning cases
94
94
95 $ hg remove -A large1
95 $ hg remove -A large1
96 not removing large1: file still exists
96 not removing large1: file still exists
97 [1]
97 [1]
98 $ echo 'modified' > large1
98 $ echo 'modified' > large1
99 $ hg remove large1
99 $ hg remove large1
100 not removing large1: file is modified (use -f to force removal)
100 not removing large1: file is modified (use -f to force removal)
101 [1]
101 [1]
102 $ echo 'new' > normalnew
102 $ echo 'new' > normalnew
103 $ hg add normalnew
103 $ hg add normalnew
104 $ echo 'new' > largenew
104 $ echo 'new' > largenew
105 $ hg add --large normalnew
105 $ hg add --large normalnew
106 normalnew already tracked!
106 normalnew already tracked!
107 $ hg remove normalnew largenew
107 $ hg remove normalnew largenew
108 not removing largenew: file is untracked
108 not removing largenew: file is untracked
109 not removing normalnew: file has been marked for add (use forget to undo)
109 not removing normalnew: file has been marked for add (use forget to undo)
110 [1]
110 [1]
111 $ rm normalnew largenew
111 $ rm normalnew largenew
112 $ hg up -Cq
112 $ hg up -Cq
113
113
114 Remove both largefiles and normal files.
114 Remove both largefiles and normal files.
115
115
116 $ hg remove normal1 large1
116 $ hg remove normal1 large1
117 $ hg status large1
117 $ hg status large1
118 R large1
118 R large1
119 $ hg commit -m "remove files"
119 $ hg commit -m "remove files"
120 Invoking status precommit hook
120 Invoking status precommit hook
121 R large1
121 R large1
122 R normal1
122 R normal1
123 $ ls
123 $ ls
124 sub
124 sub
125 $ echo "testlargefile" > large1-test
125 $ echo "testlargefile" > large1-test
126 $ hg add --large large1-test
126 $ hg add --large large1-test
127 $ hg st
127 $ hg st
128 A large1-test
128 A large1-test
129 $ hg rm large1-test
129 $ hg rm large1-test
130 not removing large1-test: file has been marked for add (use forget to undo)
130 not removing large1-test: file has been marked for add (use forget to undo)
131 [1]
131 [1]
132 $ hg st
132 $ hg st
133 A large1-test
133 A large1-test
134 $ hg forget large1-test
134 $ hg forget large1-test
135 $ hg st
135 $ hg st
136 ? large1-test
136 ? large1-test
137 $ hg remove large1-test
137 $ hg remove large1-test
138 not removing large1-test: file is untracked
138 not removing large1-test: file is untracked
139 [1]
139 [1]
140 $ hg forget large1-test
140 $ hg forget large1-test
141 not removing large1-test: file is already untracked
141 not removing large1-test: file is already untracked
142 [1]
142 [1]
143 $ rm large1-test
143 $ rm large1-test
144
144
145 Copy both largefiles and normal files (testing that status output is correct).
145 Copy both largefiles and normal files (testing that status output is correct).
146
146
147 $ hg cp sub/normal2 normal1
147 $ hg cp sub/normal2 normal1
148 $ hg cp sub/large2 large1
148 $ hg cp sub/large2 large1
149 $ hg commit -m "copy files"
149 $ hg commit -m "copy files"
150 Invoking status precommit hook
150 Invoking status precommit hook
151 A large1
151 A large1
152 A normal1
152 A normal1
153 $ cat normal1
153 $ cat normal1
154 normal22
154 normal22
155 $ cat large1
155 $ cat large1
156 large22
156 large22
157
157
158 Test moving largefiles and verify that normal files are also unaffected.
158 Test moving largefiles and verify that normal files are also unaffected.
159
159
160 $ hg mv normal1 normal3
160 $ hg mv normal1 normal3
161 $ hg mv large1 large3
161 $ hg mv large1 large3
162 $ hg mv sub/normal2 sub/normal4
162 $ hg mv sub/normal2 sub/normal4
163 $ hg mv sub/large2 sub/large4
163 $ hg mv sub/large2 sub/large4
164 $ hg commit -m "move files"
164 $ hg commit -m "move files"
165 Invoking status precommit hook
165 Invoking status precommit hook
166 A large3
166 A large3
167 A normal3
167 A normal3
168 A sub/large4
168 A sub/large4
169 A sub/normal4
169 A sub/normal4
170 R large1
170 R large1
171 R normal1
171 R normal1
172 R sub/large2
172 R sub/large2
173 R sub/normal2
173 R sub/normal2
174 $ cat normal3
174 $ cat normal3
175 normal22
175 normal22
176 $ cat large3
176 $ cat large3
177 large22
177 large22
178 $ cat sub/normal4
178 $ cat sub/normal4
179 normal22
179 normal22
180 $ cat sub/large4
180 $ cat sub/large4
181 large22
181 large22
182
182
183 Test copies and moves from a directory other than root (issue3516)
183 Test copies and moves from a directory other than root (issue3516)
184
184
185 $ cd ..
185 $ cd ..
186 $ hg init lf_cpmv
186 $ hg init lf_cpmv
187 $ cd lf_cpmv
187 $ cd lf_cpmv
188 $ mkdir dira
188 $ mkdir dira
189 $ mkdir dira/dirb
189 $ mkdir dira/dirb
190 $ touch dira/dirb/largefile
190 $ touch dira/dirb/largefile
191 $ hg add --large dira/dirb/largefile
191 $ hg add --large dira/dirb/largefile
192 $ hg commit -m "added"
192 $ hg commit -m "added"
193 Invoking status precommit hook
193 Invoking status precommit hook
194 A dira/dirb/largefile
194 A dira/dirb/largefile
195 $ cd dira
195 $ cd dira
196 $ hg cp dirb/largefile foo/largefile
196 $ hg cp dirb/largefile foo/largefile
197 $ hg ci -m "deep copy"
197 $ hg ci -m "deep copy"
198 Invoking status precommit hook
198 Invoking status precommit hook
199 A dira/foo/largefile
199 A dira/foo/largefile
200 $ find . | sort
200 $ find . | sort
201 .
201 .
202 ./dirb
202 ./dirb
203 ./dirb/largefile
203 ./dirb/largefile
204 ./foo
204 ./foo
205 ./foo/largefile
205 ./foo/largefile
206 $ hg mv foo/largefile baz/largefile
206 $ hg mv foo/largefile baz/largefile
207 $ hg ci -m "moved"
207 $ hg ci -m "moved"
208 Invoking status precommit hook
208 Invoking status precommit hook
209 A dira/baz/largefile
209 A dira/baz/largefile
210 R dira/foo/largefile
210 R dira/foo/largefile
211 $ find . | sort
211 $ find . | sort
212 .
212 .
213 ./baz
213 ./baz
214 ./baz/largefile
214 ./baz/largefile
215 ./dirb
215 ./dirb
216 ./dirb/largefile
216 ./dirb/largefile
217 ./foo
217 ./foo
218 $ cd ../../a
218 $ cd ../../a
219
219
220 #if serve
220 #if serve
221 Test display of largefiles in hgweb
221 Test display of largefiles in hgweb
222
222
223 $ hg serve -d -p $HGPORT --pid-file ../hg.pid
223 $ hg serve -d -p $HGPORT --pid-file ../hg.pid
224 $ cat ../hg.pid >> $DAEMON_PIDS
224 $ cat ../hg.pid >> $DAEMON_PIDS
225 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/tip/?style=raw'
225 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/tip/?style=raw'
226 200 Script output follows
226 200 Script output follows
227
227
228
228
229 drwxr-xr-x sub
229 drwxr-xr-x sub
230 -rw-r--r-- 41 large3
230 -rw-r--r-- 41 large3
231 -rw-r--r-- 9 normal3
231 -rw-r--r-- 9 normal3
232
232
233
233
234 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/tip/sub/?style=raw'
234 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/tip/sub/?style=raw'
235 200 Script output follows
235 200 Script output follows
236
236
237
237
238 -rw-r--r-- 41 large4
238 -rw-r--r-- 41 large4
239 -rw-r--r-- 9 normal4
239 -rw-r--r-- 9 normal4
240
240
241
241
242 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
242 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
243 #endif
243 #endif
244
244
245 Test archiving the various revisions. These hit corner cases known with
245 Test archiving the various revisions. These hit corner cases known with
246 archiving.
246 archiving.
247
247
248 $ hg archive -r 0 ../archive0
248 $ hg archive -r 0 ../archive0
249 $ hg archive -r 1 ../archive1
249 $ hg archive -r 1 ../archive1
250 $ hg archive -r 2 ../archive2
250 $ hg archive -r 2 ../archive2
251 $ hg archive -r 3 ../archive3
251 $ hg archive -r 3 ../archive3
252 $ hg archive -r 4 ../archive4
252 $ hg archive -r 4 ../archive4
253 $ cd ../archive0
253 $ cd ../archive0
254 $ cat normal1
254 $ cat normal1
255 normal1
255 normal1
256 $ cat large1
256 $ cat large1
257 large1
257 large1
258 $ cat sub/normal2
258 $ cat sub/normal2
259 normal2
259 normal2
260 $ cat sub/large2
260 $ cat sub/large2
261 large2
261 large2
262 $ cd ../archive1
262 $ cd ../archive1
263 $ cat normal1
263 $ cat normal1
264 normal11
264 normal11
265 $ cat large1
265 $ cat large1
266 large11
266 large11
267 $ cat sub/normal2
267 $ cat sub/normal2
268 normal22
268 normal22
269 $ cat sub/large2
269 $ cat sub/large2
270 large22
270 large22
271 $ cd ../archive2
271 $ cd ../archive2
272 $ ls
272 $ ls
273 sub
273 sub
274 $ cat sub/normal2
274 $ cat sub/normal2
275 normal22
275 normal22
276 $ cat sub/large2
276 $ cat sub/large2
277 large22
277 large22
278 $ cd ../archive3
278 $ cd ../archive3
279 $ cat normal1
279 $ cat normal1
280 normal22
280 normal22
281 $ cat large1
281 $ cat large1
282 large22
282 large22
283 $ cat sub/normal2
283 $ cat sub/normal2
284 normal22
284 normal22
285 $ cat sub/large2
285 $ cat sub/large2
286 large22
286 large22
287 $ cd ../archive4
287 $ cd ../archive4
288 $ cat normal3
288 $ cat normal3
289 normal22
289 normal22
290 $ cat large3
290 $ cat large3
291 large22
291 large22
292 $ cat sub/normal4
292 $ cat sub/normal4
293 normal22
293 normal22
294 $ cat sub/large4
294 $ cat sub/large4
295 large22
295 large22
296
296
297 Commit corner case: specify files to commit.
297 Commit corner case: specify files to commit.
298
298
299 $ cd ../a
299 $ cd ../a
300 $ echo normal3 > normal3
300 $ echo normal3 > normal3
301 $ echo large3 > large3
301 $ echo large3 > large3
302 $ echo normal4 > sub/normal4
302 $ echo normal4 > sub/normal4
303 $ echo large4 > sub/large4
303 $ echo large4 > sub/large4
304 $ hg commit normal3 large3 sub/normal4 sub/large4 -m "edit files again"
304 $ hg commit normal3 large3 sub/normal4 sub/large4 -m "edit files again"
305 Invoking status precommit hook
305 Invoking status precommit hook
306 M large3
306 M large3
307 M normal3
307 M normal3
308 M sub/large4
308 M sub/large4
309 M sub/normal4
309 M sub/normal4
310 $ cat normal3
310 $ cat normal3
311 normal3
311 normal3
312 $ cat large3
312 $ cat large3
313 large3
313 large3
314 $ cat sub/normal4
314 $ cat sub/normal4
315 normal4
315 normal4
316 $ cat sub/large4
316 $ cat sub/large4
317 large4
317 large4
318
318
319 One more commit corner case: commit from a subdirectory.
319 One more commit corner case: commit from a subdirectory.
320
320
321 $ cd ../a
321 $ cd ../a
322 $ echo normal33 > normal3
322 $ echo normal33 > normal3
323 $ echo large33 > large3
323 $ echo large33 > large3
324 $ echo normal44 > sub/normal4
324 $ echo normal44 > sub/normal4
325 $ echo large44 > sub/large4
325 $ echo large44 > sub/large4
326 $ cd sub
326 $ cd sub
327 $ hg commit -m "edit files yet again"
327 $ hg commit -m "edit files yet again"
328 Invoking status precommit hook
328 Invoking status precommit hook
329 M large3
329 M large3
330 M normal3
330 M normal3
331 M sub/large4
331 M sub/large4
332 M sub/normal4
332 M sub/normal4
333 $ cat ../normal3
333 $ cat ../normal3
334 normal33
334 normal33
335 $ cat ../large3
335 $ cat ../large3
336 large33
336 large33
337 $ cat normal4
337 $ cat normal4
338 normal44
338 normal44
339 $ cat large4
339 $ cat large4
340 large44
340 large44
341
341
342 Committing standins is not allowed.
342 Committing standins is not allowed.
343
343
344 $ cd ..
344 $ cd ..
345 $ echo large3 > large3
345 $ echo large3 > large3
346 $ hg commit .hglf/large3 -m "try to commit standin"
346 $ hg commit .hglf/large3 -m "try to commit standin"
347 abort: file ".hglf/large3" is a largefile standin
347 abort: file ".hglf/large3" is a largefile standin
348 (commit the largefile itself instead)
348 (commit the largefile itself instead)
349 [255]
349 [255]
350
350
351 Corner cases for adding largefiles.
351 Corner cases for adding largefiles.
352
352
353 $ echo large5 > large5
353 $ echo large5 > large5
354 $ hg add --large large5
354 $ hg add --large large5
355 $ hg add --large large5
355 $ hg add --large large5
356 large5 already a largefile
356 large5 already a largefile
357 $ mkdir sub2
357 $ mkdir sub2
358 $ echo large6 > sub2/large6
358 $ echo large6 > sub2/large6
359 $ echo large7 > sub2/large7
359 $ echo large7 > sub2/large7
360 $ hg add --large sub2
360 $ hg add --large sub2
361 adding sub2/large6 as a largefile (glob)
361 adding sub2/large6 as a largefile (glob)
362 adding sub2/large7 as a largefile (glob)
362 adding sub2/large7 as a largefile (glob)
363 $ hg st
363 $ hg st
364 M large3
364 M large3
365 A large5
365 A large5
366 A sub2/large6
366 A sub2/large6
367 A sub2/large7
367 A sub2/large7
368
368
369 Committing directories containing only largefiles.
369 Committing directories containing only largefiles.
370
370
371 $ mkdir -p z/y/x/m
371 $ mkdir -p z/y/x/m
372 $ touch z/y/x/m/large1
372 $ touch z/y/x/m/large1
373 $ touch z/y/x/large2
373 $ touch z/y/x/large2
374 $ hg add --large z/y/x/m/large1 z/y/x/large2
374 $ hg add --large z/y/x/m/large1 z/y/x/large2
375 $ hg commit -m "Subdir with directory only containing largefiles" z
375 $ hg commit -m "Subdir with directory only containing largefiles" z
376 Invoking status precommit hook
376 Invoking status precommit hook
377 M large3
377 M large3
378 A large5
378 A large5
379 A sub2/large6
379 A sub2/large6
380 A sub2/large7
380 A sub2/large7
381 A z/y/x/large2
381 A z/y/x/large2
382 A z/y/x/m/large1
382 A z/y/x/m/large1
383 $ hg rollback --quiet
383 $ hg rollback --quiet
384 $ touch z/y/x/m/normal
384 $ touch z/y/x/m/normal
385 $ hg add z/y/x/m/normal
385 $ hg add z/y/x/m/normal
386 $ hg commit -m "Subdir with mixed contents" z
386 $ hg commit -m "Subdir with mixed contents" z
387 Invoking status precommit hook
387 Invoking status precommit hook
388 M large3
388 M large3
389 A large5
389 A large5
390 A sub2/large6
390 A sub2/large6
391 A sub2/large7
391 A sub2/large7
392 A z/y/x/large2
392 A z/y/x/large2
393 A z/y/x/m/large1
393 A z/y/x/m/large1
394 A z/y/x/m/normal
394 A z/y/x/m/normal
395 $ hg st
395 $ hg st
396 M large3
396 M large3
397 A large5
397 A large5
398 A sub2/large6
398 A sub2/large6
399 A sub2/large7
399 A sub2/large7
400 $ hg rollback --quiet
400 $ hg rollback --quiet
401 $ hg revert z/y/x/large2 z/y/x/m/large1
401 $ hg revert z/y/x/large2 z/y/x/m/large1
402 $ rm z/y/x/large2 z/y/x/m/large1
402 $ rm z/y/x/large2 z/y/x/m/large1
403 $ hg commit -m "Subdir with normal contents" z
403 $ hg commit -m "Subdir with normal contents" z
404 Invoking status precommit hook
404 Invoking status precommit hook
405 M large3
405 M large3
406 A large5
406 A large5
407 A sub2/large6
407 A sub2/large6
408 A sub2/large7
408 A sub2/large7
409 A z/y/x/m/normal
409 A z/y/x/m/normal
410 $ hg st
410 $ hg st
411 M large3
411 M large3
412 A large5
412 A large5
413 A sub2/large6
413 A sub2/large6
414 A sub2/large7
414 A sub2/large7
415 $ hg rollback --quiet
415 $ hg rollback --quiet
416 $ hg revert --quiet z
416 $ hg revert --quiet z
417 $ hg commit -m "Empty subdir" z
417 $ hg commit -m "Empty subdir" z
418 abort: z: no match under directory!
418 abort: z: no match under directory!
419 [255]
419 [255]
420 $ rm -rf z
420 $ rm -rf z
421 $ hg ci -m "standin" .hglf
421 $ hg ci -m "standin" .hglf
422 abort: file ".hglf" is a largefile standin
422 abort: file ".hglf" is a largefile standin
423 (commit the largefile itself instead)
423 (commit the largefile itself instead)
424 [255]
424 [255]
425
425
426 Test "hg status" with combination of 'file pattern' and 'directory
426 Test "hg status" with combination of 'file pattern' and 'directory
427 pattern' for largefiles:
427 pattern' for largefiles:
428
428
429 $ hg status sub2/large6 sub2
429 $ hg status sub2/large6 sub2
430 A sub2/large6
430 A sub2/large6
431 A sub2/large7
431 A sub2/large7
432
432
433 Config settings (pattern **.dat, minsize 2 MB) are respected.
433 Config settings (pattern **.dat, minsize 2 MB) are respected.
434
434
435 $ echo testdata > test.dat
435 $ echo testdata > test.dat
436 $ dd bs=1k count=2k if=/dev/zero of=reallylarge > /dev/null 2> /dev/null
436 $ dd bs=1k count=2k if=/dev/zero of=reallylarge > /dev/null 2> /dev/null
437 $ hg add
437 $ hg add
438 adding reallylarge as a largefile
438 adding reallylarge as a largefile
439 adding test.dat as a largefile
439 adding test.dat as a largefile
440
440
441 Test that minsize and --lfsize handle float values;
441 Test that minsize and --lfsize handle float values;
442 also tests that --lfsize overrides largefiles.minsize.
442 also tests that --lfsize overrides largefiles.minsize.
443 (0.250 MB = 256 kB = 262144 B)
443 (0.250 MB = 256 kB = 262144 B)
444
444
445 $ dd if=/dev/zero of=ratherlarge bs=1024 count=256 > /dev/null 2> /dev/null
445 $ dd if=/dev/zero of=ratherlarge bs=1024 count=256 > /dev/null 2> /dev/null
446 $ dd if=/dev/zero of=medium bs=1024 count=128 > /dev/null 2> /dev/null
446 $ dd if=/dev/zero of=medium bs=1024 count=128 > /dev/null 2> /dev/null
447 $ hg --config largefiles.minsize=.25 add
447 $ hg --config largefiles.minsize=.25 add
448 adding ratherlarge as a largefile
448 adding ratherlarge as a largefile
449 adding medium
449 adding medium
450 $ hg forget medium
450 $ hg forget medium
451 $ hg --config largefiles.minsize=.25 add --lfsize=.125
451 $ hg --config largefiles.minsize=.25 add --lfsize=.125
452 adding medium as a largefile
452 adding medium as a largefile
453 $ dd if=/dev/zero of=notlarge bs=1024 count=127 > /dev/null 2> /dev/null
453 $ dd if=/dev/zero of=notlarge bs=1024 count=127 > /dev/null 2> /dev/null
454 $ hg --config largefiles.minsize=.25 add --lfsize=.125
454 $ hg --config largefiles.minsize=.25 add --lfsize=.125
455 adding notlarge
455 adding notlarge
456 $ hg forget notlarge
456 $ hg forget notlarge
457
457
458 Test forget on largefiles.
458 Test forget on largefiles.
459
459
460 $ hg forget large3 large5 test.dat reallylarge ratherlarge medium
460 $ hg forget large3 large5 test.dat reallylarge ratherlarge medium
461 $ hg commit -m "add/edit more largefiles"
461 $ hg commit -m "add/edit more largefiles"
462 Invoking status precommit hook
462 Invoking status precommit hook
463 A sub2/large6
463 A sub2/large6
464 A sub2/large7
464 A sub2/large7
465 R large3
465 R large3
466 ? large5
466 ? large5
467 ? medium
467 ? medium
468 ? notlarge
468 ? notlarge
469 ? ratherlarge
469 ? ratherlarge
470 ? reallylarge
470 ? reallylarge
471 ? test.dat
471 ? test.dat
472 $ hg st
472 $ hg st
473 ? large3
473 ? large3
474 ? large5
474 ? large5
475 ? medium
475 ? medium
476 ? notlarge
476 ? notlarge
477 ? ratherlarge
477 ? ratherlarge
478 ? reallylarge
478 ? reallylarge
479 ? test.dat
479 ? test.dat
480
480
481 Purge with largefiles: verify that largefiles are still in the working
481 Purge with largefiles: verify that largefiles are still in the working
482 dir after a purge.
482 dir after a purge.
483
483
484 $ hg purge --all
484 $ hg purge --all
485 $ cat sub/large4
485 $ cat sub/large4
486 large44
486 large44
487 $ cat sub2/large6
487 $ cat sub2/large6
488 large6
488 large6
489 $ cat sub2/large7
489 $ cat sub2/large7
490 large7
490 large7
491
491
492 Test addremove: verify that files that should be added as largfiles are added as
492 Test addremove: verify that files that should be added as largfiles are added as
493 such and that already-existing largfiles are not added as normal files by
493 such and that already-existing largfiles are not added as normal files by
494 accident.
494 accident.
495
495
496 $ rm normal3
496 $ rm normal3
497 $ rm sub/large4
497 $ rm sub/large4
498 $ echo "testing addremove with patterns" > testaddremove.dat
498 $ echo "testing addremove with patterns" > testaddremove.dat
499 $ echo "normaladdremove" > normaladdremove
499 $ echo "normaladdremove" > normaladdremove
500 $ hg addremove
500 $ hg addremove
501 removing sub/large4
501 removing sub/large4
502 adding testaddremove.dat as a largefile
502 adding testaddremove.dat as a largefile
503 removing normal3
503 removing normal3
504 adding normaladdremove
504 adding normaladdremove
505
505
506 Test addremove with -R
506 Test addremove with -R
507
507
508 $ hg up -C
508 $ hg up -C
509 getting changed largefiles
509 getting changed largefiles
510 1 largefiles updated, 0 removed
510 1 largefiles updated, 0 removed
511 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
511 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
512 $ rm normal3
512 $ rm normal3
513 $ rm sub/large4
513 $ rm sub/large4
514 $ echo "testing addremove with patterns" > testaddremove.dat
514 $ echo "testing addremove with patterns" > testaddremove.dat
515 $ echo "normaladdremove" > normaladdremove
515 $ echo "normaladdremove" > normaladdremove
516 $ cd ..
516 $ cd ..
517 $ hg -R a addremove
517 $ hg -R a addremove
518 removing sub/large4
518 removing sub/large4
519 adding a/testaddremove.dat as a largefile (glob)
519 adding a/testaddremove.dat as a largefile (glob)
520 removing normal3
520 removing normal3
521 adding normaladdremove
521 adding normaladdremove
522 $ cd a
522 $ cd a
523
523
524 Test 3364
524 Test 3364
525 $ hg clone . ../addrm
525 $ hg clone . ../addrm
526 updating to branch default
526 updating to branch default
527 getting changed largefiles
527 getting changed largefiles
528 3 largefiles updated, 0 removed
528 3 largefiles updated, 0 removed
529 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
529 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
530 $ cd ../addrm
530 $ cd ../addrm
531 $ cat >> .hg/hgrc <<EOF
531 $ cat >> .hg/hgrc <<EOF
532 > [hooks]
532 > [hooks]
533 > post-commit.stat=sh -c "echo \\"Invoking status postcommit hook\\"; hg status -A"
533 > post-commit.stat=sh -c "echo \\"Invoking status postcommit hook\\"; hg status -A"
534 > EOF
534 > EOF
535 $ touch foo
535 $ touch foo
536 $ hg add --large foo
536 $ hg add --large foo
537 $ hg ci -m "add foo"
537 $ hg ci -m "add foo"
538 Invoking status precommit hook
538 Invoking status precommit hook
539 A foo
539 A foo
540 Invoking status postcommit hook
540 Invoking status postcommit hook
541 C foo
541 C foo
542 C normal3
542 C normal3
543 C sub/large4
543 C sub/large4
544 C sub/normal4
544 C sub/normal4
545 C sub2/large6
545 C sub2/large6
546 C sub2/large7
546 C sub2/large7
547 $ rm foo
547 $ rm foo
548 $ hg st
548 $ hg st
549 ! foo
549 ! foo
550 hmm.. no precommit invoked, but there is a postcommit??
550 hmm.. no precommit invoked, but there is a postcommit??
551 $ hg ci -m "will not checkin"
551 $ hg ci -m "will not checkin"
552 nothing changed
552 nothing changed
553 Invoking status postcommit hook
553 Invoking status postcommit hook
554 ! foo
554 ! foo
555 C normal3
555 C normal3
556 C sub/large4
556 C sub/large4
557 C sub/normal4
557 C sub/normal4
558 C sub2/large6
558 C sub2/large6
559 C sub2/large7
559 C sub2/large7
560 [1]
560 [1]
561 $ hg addremove
561 $ hg addremove
562 removing foo
562 removing foo
563 $ hg st
563 $ hg st
564 R foo
564 R foo
565 $ hg ci -m "used to say nothing changed"
565 $ hg ci -m "used to say nothing changed"
566 Invoking status precommit hook
566 Invoking status precommit hook
567 R foo
567 R foo
568 Invoking status postcommit hook
568 Invoking status postcommit hook
569 C normal3
569 C normal3
570 C sub/large4
570 C sub/large4
571 C sub/normal4
571 C sub/normal4
572 C sub2/large6
572 C sub2/large6
573 C sub2/large7
573 C sub2/large7
574 $ hg st
574 $ hg st
575
575
576 Test 3507 (both normal files and largefiles were a problem)
576 Test 3507 (both normal files and largefiles were a problem)
577
577
578 $ touch normal
578 $ touch normal
579 $ touch large
579 $ touch large
580 $ hg add normal
580 $ hg add normal
581 $ hg add --large large
581 $ hg add --large large
582 $ hg ci -m "added"
582 $ hg ci -m "added"
583 Invoking status precommit hook
583 Invoking status precommit hook
584 A large
584 A large
585 A normal
585 A normal
586 Invoking status postcommit hook
586 Invoking status postcommit hook
587 C large
587 C large
588 C normal
588 C normal
589 C normal3
589 C normal3
590 C sub/large4
590 C sub/large4
591 C sub/normal4
591 C sub/normal4
592 C sub2/large6
592 C sub2/large6
593 C sub2/large7
593 C sub2/large7
594 $ hg remove normal
594 $ hg remove normal
595 $ hg addremove --traceback
595 $ hg addremove --traceback
596 $ hg ci -m "addremoved normal"
596 $ hg ci -m "addremoved normal"
597 Invoking status precommit hook
597 Invoking status precommit hook
598 R normal
598 R normal
599 Invoking status postcommit hook
599 Invoking status postcommit hook
600 C large
600 C large
601 C normal3
601 C normal3
602 C sub/large4
602 C sub/large4
603 C sub/normal4
603 C sub/normal4
604 C sub2/large6
604 C sub2/large6
605 C sub2/large7
605 C sub2/large7
606 $ hg up -C '.^'
606 $ hg up -C '.^'
607 getting changed largefiles
607 getting changed largefiles
608 0 largefiles updated, 0 removed
608 0 largefiles updated, 0 removed
609 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
609 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
610 $ hg remove large
610 $ hg remove large
611 $ hg addremove --traceback
611 $ hg addremove --traceback
612 $ hg ci -m "removed large"
612 $ hg ci -m "removed large"
613 Invoking status precommit hook
613 Invoking status precommit hook
614 R large
614 R large
615 created new head
615 created new head
616 Invoking status postcommit hook
616 Invoking status postcommit hook
617 C normal
617 C normal
618 C normal3
618 C normal3
619 C sub/large4
619 C sub/large4
620 C sub/normal4
620 C sub/normal4
621 C sub2/large6
621 C sub2/large6
622 C sub2/large7
622 C sub2/large7
623
623
624 Test commit -A (issue 3542)
624 Test commit -A (issue 3542)
625 $ echo large8 > large8
625 $ echo large8 > large8
626 $ hg add --large large8
626 $ hg add --large large8
627 $ hg ci -Am 'this used to add large8 as normal and commit both'
627 $ hg ci -Am 'this used to add large8 as normal and commit both'
628 Invoking status precommit hook
628 Invoking status precommit hook
629 A large8
629 A large8
630 Invoking status postcommit hook
630 Invoking status postcommit hook
631 C large8
631 C large8
632 C normal
632 C normal
633 C normal3
633 C normal3
634 C sub/large4
634 C sub/large4
635 C sub/normal4
635 C sub/normal4
636 C sub2/large6
636 C sub2/large6
637 C sub2/large7
637 C sub2/large7
638 $ rm large8
638 $ rm large8
639 $ hg ci -Am 'this used to not notice the rm'
639 $ hg ci -Am 'this used to not notice the rm'
640 removing large8
640 removing large8
641 Invoking status precommit hook
641 Invoking status precommit hook
642 R large8
642 R large8
643 Invoking status postcommit hook
643 Invoking status postcommit hook
644 C normal
644 C normal
645 C normal3
645 C normal3
646 C sub/large4
646 C sub/large4
647 C sub/normal4
647 C sub/normal4
648 C sub2/large6
648 C sub2/large6
649 C sub2/large7
649 C sub2/large7
650
650
651 Test that a standin can't be added as a large file
651 Test that a standin can't be added as a large file
652
652
653 $ touch large
653 $ touch large
654 $ hg add --large large
654 $ hg add --large large
655 $ hg ci -m "add"
655 $ hg ci -m "add"
656 Invoking status precommit hook
656 Invoking status precommit hook
657 A large
657 A large
658 Invoking status postcommit hook
658 Invoking status postcommit hook
659 C large
659 C large
660 C normal
660 C normal
661 C normal3
661 C normal3
662 C sub/large4
662 C sub/large4
663 C sub/normal4
663 C sub/normal4
664 C sub2/large6
664 C sub2/large6
665 C sub2/large7
665 C sub2/large7
666 $ hg remove large
666 $ hg remove large
667 $ touch large
667 $ touch large
668 $ hg addremove --config largefiles.patterns=**large --traceback
668 $ hg addremove --config largefiles.patterns=**large --traceback
669 adding large as a largefile
669 adding large as a largefile
670
670
671 Test that outgoing --large works (with revsets too)
671 Test that outgoing --large works (with revsets too)
672 $ hg outgoing --rev '.^' --large
672 $ hg outgoing --rev '.^' --large
673 comparing with $TESTTMP/a (glob)
673 comparing with $TESTTMP/a (glob)
674 searching for changes
674 searching for changes
675 changeset: 8:c02fd3b77ec4
675 changeset: 8:c02fd3b77ec4
676 user: test
676 user: test
677 date: Thu Jan 01 00:00:00 1970 +0000
677 date: Thu Jan 01 00:00:00 1970 +0000
678 summary: add foo
678 summary: add foo
679
679
680 changeset: 9:289dd08c9bbb
680 changeset: 9:289dd08c9bbb
681 user: test
681 user: test
682 date: Thu Jan 01 00:00:00 1970 +0000
682 date: Thu Jan 01 00:00:00 1970 +0000
683 summary: used to say nothing changed
683 summary: used to say nothing changed
684
684
685 changeset: 10:34f23ac6ac12
685 changeset: 10:34f23ac6ac12
686 user: test
686 user: test
687 date: Thu Jan 01 00:00:00 1970 +0000
687 date: Thu Jan 01 00:00:00 1970 +0000
688 summary: added
688 summary: added
689
689
690 changeset: 12:710c1b2f523c
690 changeset: 12:710c1b2f523c
691 parent: 10:34f23ac6ac12
691 parent: 10:34f23ac6ac12
692 user: test
692 user: test
693 date: Thu Jan 01 00:00:00 1970 +0000
693 date: Thu Jan 01 00:00:00 1970 +0000
694 summary: removed large
694 summary: removed large
695
695
696 changeset: 13:0a3e75774479
696 changeset: 13:0a3e75774479
697 user: test
697 user: test
698 date: Thu Jan 01 00:00:00 1970 +0000
698 date: Thu Jan 01 00:00:00 1970 +0000
699 summary: this used to add large8 as normal and commit both
699 summary: this used to add large8 as normal and commit both
700
700
701 changeset: 14:84f3d378175c
701 changeset: 14:84f3d378175c
702 user: test
702 user: test
703 date: Thu Jan 01 00:00:00 1970 +0000
703 date: Thu Jan 01 00:00:00 1970 +0000
704 summary: this used to not notice the rm
704 summary: this used to not notice the rm
705
705
706 searching for changes
706 searching for changes
707 largefiles to upload:
707 largefiles to upload:
708 foo
708 foo
709 large
709 large
710 large8
710 large8
711
711
712 $ cd ../a
712 $ cd ../a
713
713
714 Clone a largefiles repo.
714 Clone a largefiles repo.
715
715
716 $ hg clone . ../b
716 $ hg clone . ../b
717 updating to branch default
717 updating to branch default
718 getting changed largefiles
718 getting changed largefiles
719 3 largefiles updated, 0 removed
719 3 largefiles updated, 0 removed
720 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
720 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
721 $ cd ../b
721 $ cd ../b
722 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
722 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
723 7:daea875e9014 add/edit more largefiles
723 7:daea875e9014 add/edit more largefiles
724 6:4355d653f84f edit files yet again
724 6:4355d653f84f edit files yet again
725 5:9d5af5072dbd edit files again
725 5:9d5af5072dbd edit files again
726 4:74c02385b94c move files
726 4:74c02385b94c move files
727 3:9e8fbc4bce62 copy files
727 3:9e8fbc4bce62 copy files
728 2:51a0ae4d5864 remove files
728 2:51a0ae4d5864 remove files
729 1:ce8896473775 edit files
729 1:ce8896473775 edit files
730 0:30d30fe6a5be add files
730 0:30d30fe6a5be add files
731 $ cat normal3
731 $ cat normal3
732 normal33
732 normal33
733 $ cat sub/normal4
733 $ cat sub/normal4
734 normal44
734 normal44
735 $ cat sub/large4
735 $ cat sub/large4
736 large44
736 large44
737 $ cat sub2/large6
737 $ cat sub2/large6
738 large6
738 large6
739 $ cat sub2/large7
739 $ cat sub2/large7
740 large7
740 large7
741 $ cd ..
741 $ cd ..
742 $ hg clone a -r 3 c
742 $ hg clone a -r 3 c
743 adding changesets
743 adding changesets
744 adding manifests
744 adding manifests
745 adding file changes
745 adding file changes
746 added 4 changesets with 10 changes to 4 files
746 added 4 changesets with 10 changes to 4 files
747 updating to branch default
747 updating to branch default
748 getting changed largefiles
748 getting changed largefiles
749 2 largefiles updated, 0 removed
749 2 largefiles updated, 0 removed
750 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
750 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
751 $ cd c
751 $ cd c
752 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
752 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
753 3:9e8fbc4bce62 copy files
753 3:9e8fbc4bce62 copy files
754 2:51a0ae4d5864 remove files
754 2:51a0ae4d5864 remove files
755 1:ce8896473775 edit files
755 1:ce8896473775 edit files
756 0:30d30fe6a5be add files
756 0:30d30fe6a5be add files
757 $ cat normal1
757 $ cat normal1
758 normal22
758 normal22
759 $ cat large1
759 $ cat large1
760 large22
760 large22
761 $ cat sub/normal2
761 $ cat sub/normal2
762 normal22
762 normal22
763 $ cat sub/large2
763 $ cat sub/large2
764 large22
764 large22
765
765
766 Old revisions of a clone have correct largefiles content (this also
766 Old revisions of a clone have correct largefiles content (this also
767 tests update).
767 tests update).
768
768
769 $ hg update -r 1
769 $ hg update -r 1
770 getting changed largefiles
770 getting changed largefiles
771 1 largefiles updated, 0 removed
771 1 largefiles updated, 0 removed
772 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
772 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
773 $ cat large1
773 $ cat large1
774 large11
774 large11
775 $ cat sub/large2
775 $ cat sub/large2
776 large22
776 large22
777 $ cd ..
777 $ cd ..
778
778
779 Test cloning with --all-largefiles flag
779 Test cloning with --all-largefiles flag
780
780
781 $ rm "${USERCACHE}"/*
781 $ rm "${USERCACHE}"/*
782 $ hg clone --all-largefiles a a-backup
782 $ hg clone --all-largefiles a a-backup
783 updating to branch default
783 updating to branch default
784 getting changed largefiles
784 getting changed largefiles
785 3 largefiles updated, 0 removed
785 3 largefiles updated, 0 removed
786 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
786 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
787 8 additional largefiles cached
787 8 additional largefiles cached
788
788
789 $ rm "${USERCACHE}"/*
789 $ rm "${USERCACHE}"/*
790 $ hg clone --all-largefiles -u 0 a a-clone0
790 $ hg clone --all-largefiles -u 0 a a-clone0
791 updating to branch default
791 updating to branch default
792 getting changed largefiles
792 getting changed largefiles
793 2 largefiles updated, 0 removed
793 2 largefiles updated, 0 removed
794 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
794 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
795 9 additional largefiles cached
795 9 additional largefiles cached
796 $ hg -R a-clone0 sum
796 $ hg -R a-clone0 sum
797 parent: 0:30d30fe6a5be
797 parent: 0:30d30fe6a5be
798 add files
798 add files
799 branch: default
799 branch: default
800 commit: (clean)
800 commit: (clean)
801 update: 7 new changesets (update)
801 update: 7 new changesets (update)
802
802
803 $ rm "${USERCACHE}"/*
803 $ rm "${USERCACHE}"/*
804 $ hg clone --all-largefiles -u 1 a a-clone1
804 $ hg clone --all-largefiles -u 1 a a-clone1
805 updating to branch default
805 updating to branch default
806 getting changed largefiles
806 getting changed largefiles
807 2 largefiles updated, 0 removed
807 2 largefiles updated, 0 removed
808 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
808 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
809 8 additional largefiles cached
809 8 additional largefiles cached
810 $ hg -R a-clone1 verify --large --lfa --lfc
810 $ hg -R a-clone1 verify --large --lfa --lfc
811 checking changesets
811 checking changesets
812 checking manifests
812 checking manifests
813 crosschecking files in changesets and manifests
813 crosschecking files in changesets and manifests
814 checking files
814 checking files
815 10 files, 8 changesets, 24 total revisions
815 10 files, 8 changesets, 24 total revisions
816 searching 8 changesets for largefiles
816 searching 8 changesets for largefiles
817 verified contents of 13 revisions of 6 largefiles
817 verified contents of 13 revisions of 6 largefiles
818 $ hg -R a-clone1 sum
818 $ hg -R a-clone1 sum
819 parent: 1:ce8896473775
819 parent: 1:ce8896473775
820 edit files
820 edit files
821 branch: default
821 branch: default
822 commit: (clean)
822 commit: (clean)
823 update: 6 new changesets (update)
823 update: 6 new changesets (update)
824
824
825 $ rm "${USERCACHE}"/*
825 $ rm "${USERCACHE}"/*
826 $ hg clone --all-largefiles -U a a-clone-u
826 $ hg clone --all-largefiles -U a a-clone-u
827 11 additional largefiles cached
827 11 additional largefiles cached
828 $ hg -R a-clone-u sum
828 $ hg -R a-clone-u sum
829 parent: -1:000000000000 (no revision checked out)
829 parent: -1:000000000000 (no revision checked out)
830 branch: default
830 branch: default
831 commit: (clean)
831 commit: (clean)
832 update: 8 new changesets (update)
832 update: 8 new changesets (update)
833
833
834 Show computed destination directory:
834 Show computed destination directory:
835
835
836 $ mkdir xyz
836 $ mkdir xyz
837 $ cd xyz
837 $ cd xyz
838 $ hg clone ../a
838 $ hg clone ../a
839 destination directory: a
839 destination directory: a
840 updating to branch default
840 updating to branch default
841 getting changed largefiles
841 getting changed largefiles
842 3 largefiles updated, 0 removed
842 3 largefiles updated, 0 removed
843 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
843 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
844 $ cd ..
844 $ cd ..
845
845
846 Clone URL without path:
846 Clone URL without path:
847
847
848 $ hg clone file://
848 $ hg clone file://
849 abort: repository / not found!
849 abort: repository / not found!
850 [255]
850 [255]
851
851
852 Ensure base clone command argument validation
852 Ensure base clone command argument validation
853
853
854 $ hg clone -U -u 0 a a-clone-failure
854 $ hg clone -U -u 0 a a-clone-failure
855 abort: cannot specify both --noupdate and --updaterev
855 abort: cannot specify both --noupdate and --updaterev
856 [255]
856 [255]
857
857
858 $ hg clone --all-largefiles a ssh://localhost/a
858 $ hg clone --all-largefiles a ssh://localhost/a
859 abort: --all-largefiles is incompatible with non-local destination ssh://localhost/a
859 abort: --all-largefiles is incompatible with non-local destination ssh://localhost/a
860 [255]
860 [255]
861
861
862 Test pulling with --all-largefiles flag. Also test that the largefiles are
862 Test pulling with --all-largefiles flag. Also test that the largefiles are
863 downloaded from 'default' instead of 'default-push' when no source is specified
863 downloaded from 'default' instead of 'default-push' when no source is specified
864 (issue3584)
864 (issue3584)
865
865
866 $ rm -Rf a-backup
866 $ rm -Rf a-backup
867 $ hg clone -r 1 a a-backup
867 $ hg clone -r 1 a a-backup
868 adding changesets
868 adding changesets
869 adding manifests
869 adding manifests
870 adding file changes
870 adding file changes
871 added 2 changesets with 8 changes to 4 files
871 added 2 changesets with 8 changes to 4 files
872 updating to branch default
872 updating to branch default
873 getting changed largefiles
873 getting changed largefiles
874 2 largefiles updated, 0 removed
874 2 largefiles updated, 0 removed
875 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
875 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
876 $ rm "${USERCACHE}"/*
876 $ rm "${USERCACHE}"/*
877 $ cd a-backup
877 $ cd a-backup
878 $ hg pull --all-largefiles --config paths.default-push=bogus/path
878 $ hg pull --all-largefiles --config paths.default-push=bogus/path
879 pulling from $TESTTMP/a (glob)
879 pulling from $TESTTMP/a (glob)
880 searching for changes
880 searching for changes
881 adding changesets
881 adding changesets
882 adding manifests
882 adding manifests
883 adding file changes
883 adding file changes
884 added 6 changesets with 16 changes to 8 files
884 added 6 changesets with 16 changes to 8 files
885 (run 'hg update' to get a working copy)
885 (run 'hg update' to get a working copy)
886 caching new largefiles
886 caching largefiles for 1 heads
887 3 largefiles cached
887 3 largefiles cached
888 3 additional largefiles cached
888 3 additional largefiles cached
889 $ cd ..
889 $ cd ..
890
890
891 Rebasing between two repositories does not revert largefiles to old
891 Rebasing between two repositories does not revert largefiles to old
892 revisions (this was a very bad bug that took a lot of work to fix).
892 revisions (this was a very bad bug that took a lot of work to fix).
893
893
894 $ hg clone a d
894 $ hg clone a d
895 updating to branch default
895 updating to branch default
896 getting changed largefiles
896 getting changed largefiles
897 3 largefiles updated, 0 removed
897 3 largefiles updated, 0 removed
898 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
898 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
899 $ cd b
899 $ cd b
900 $ echo large4-modified > sub/large4
900 $ echo large4-modified > sub/large4
901 $ echo normal3-modified > normal3
901 $ echo normal3-modified > normal3
902 $ hg commit -m "modify normal file and largefile in repo b"
902 $ hg commit -m "modify normal file and largefile in repo b"
903 Invoking status precommit hook
903 Invoking status precommit hook
904 M normal3
904 M normal3
905 M sub/large4
905 M sub/large4
906 $ cd ../d
906 $ cd ../d
907 $ echo large6-modified > sub2/large6
907 $ echo large6-modified > sub2/large6
908 $ echo normal4-modified > sub/normal4
908 $ echo normal4-modified > sub/normal4
909 $ hg commit -m "modify normal file largefile in repo d"
909 $ hg commit -m "modify normal file largefile in repo d"
910 Invoking status precommit hook
910 Invoking status precommit hook
911 M sub/normal4
911 M sub/normal4
912 M sub2/large6
912 M sub2/large6
913 $ cd ..
913 $ cd ..
914 $ hg clone d e
914 $ hg clone d e
915 updating to branch default
915 updating to branch default
916 getting changed largefiles
916 getting changed largefiles
917 3 largefiles updated, 0 removed
917 3 largefiles updated, 0 removed
918 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
918 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
919 $ cd d
919 $ cd d
920
920
921 More rebase testing, but also test that the largefiles are downloaded from
921 More rebase testing, but also test that the largefiles are downloaded from
922 'default' instead of 'default-push' when no source is specified (issue3584).
922 'default' instead of 'default-push' when no source is specified (issue3584).
923 The error messages go away if repo 'b' is created with --all-largefiles.
923 The error messages go away if repo 'b' is created with --all-largefiles.
924 $ hg pull --rebase --all-largefiles --config paths.default-push=bogus/path --config paths.default=../b
924 $ hg pull --rebase --all-largefiles --config paths.default-push=bogus/path --config paths.default=../b
925 pulling from $TESTTMP/b (glob)
925 pulling from $TESTTMP/b (glob)
926 searching for changes
926 searching for changes
927 adding changesets
927 adding changesets
928 adding manifests
928 adding manifests
929 adding file changes
929 adding file changes
930 added 1 changesets with 2 changes to 2 files (+1 heads)
930 added 1 changesets with 2 changes to 2 files (+1 heads)
931 Invoking status precommit hook
931 Invoking status precommit hook
932 M sub/normal4
932 M sub/normal4
933 M sub2/large6
933 M sub2/large6
934 saved backup bundle to $TESTTMP/d/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
934 saved backup bundle to $TESTTMP/d/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
935 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file large3: can't get file locally (glob)
935 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file large3: can't get file locally (glob)
936 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file sub/large4: can't get file locally (glob)
936 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file sub/large4: can't get file locally (glob)
937 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file large1: can't get file locally (glob)
937 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file large1: can't get file locally (glob)
938 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file sub/large2: can't get file locally (glob)
938 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file sub/large2: can't get file locally (glob)
939 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file sub/large2: can't get file locally (glob)
939 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file sub/large2: can't get file locally (glob)
940 error getting id 5f78770c0e77ba4287ad6ef3071c9bf9c379742f from url file:$TESTTMP/b for file large1: can't get file locally (glob)
940 error getting id 5f78770c0e77ba4287ad6ef3071c9bf9c379742f from url file:$TESTTMP/b for file large1: can't get file locally (glob)
941 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file sub/large2: can't get file locally (glob)
941 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file sub/large2: can't get file locally (glob)
942 error getting id 4669e532d5b2c093a78eca010077e708a071bb64 from url file:$TESTTMP/b for file large1: can't get file locally (glob)
942 error getting id 4669e532d5b2c093a78eca010077e708a071bb64 from url file:$TESTTMP/b for file large1: can't get file locally (glob)
943 error getting id 1deebade43c8c498a3c8daddac0244dc55d1331d from url file:$TESTTMP/b for file sub/large2: can't get file locally (glob)
943 error getting id 1deebade43c8c498a3c8daddac0244dc55d1331d from url file:$TESTTMP/b for file sub/large2: can't get file locally (glob)
944 0 additional largefiles cached
944 0 additional largefiles cached
945 9 largefiles failed to download
945 9 largefiles failed to download
946 nothing to rebase
946 nothing to rebase
947 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
947 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
948 9:598410d3eb9a modify normal file largefile in repo d
948 9:598410d3eb9a modify normal file largefile in repo d
949 8:a381d2c8c80e modify normal file and largefile in repo b
949 8:a381d2c8c80e modify normal file and largefile in repo b
950 7:daea875e9014 add/edit more largefiles
950 7:daea875e9014 add/edit more largefiles
951 6:4355d653f84f edit files yet again
951 6:4355d653f84f edit files yet again
952 5:9d5af5072dbd edit files again
952 5:9d5af5072dbd edit files again
953 4:74c02385b94c move files
953 4:74c02385b94c move files
954 3:9e8fbc4bce62 copy files
954 3:9e8fbc4bce62 copy files
955 2:51a0ae4d5864 remove files
955 2:51a0ae4d5864 remove files
956 1:ce8896473775 edit files
956 1:ce8896473775 edit files
957 0:30d30fe6a5be add files
957 0:30d30fe6a5be add files
958 $ cat normal3
958 $ cat normal3
959 normal3-modified
959 normal3-modified
960 $ cat sub/normal4
960 $ cat sub/normal4
961 normal4-modified
961 normal4-modified
962 $ cat sub/large4
962 $ cat sub/large4
963 large4-modified
963 large4-modified
964 $ cat sub2/large6
964 $ cat sub2/large6
965 large6-modified
965 large6-modified
966 $ cat sub2/large7
966 $ cat sub2/large7
967 large7
967 large7
968 $ cd ../e
968 $ cd ../e
969 $ hg pull ../b
969 $ hg pull ../b
970 pulling from ../b
970 pulling from ../b
971 searching for changes
971 searching for changes
972 adding changesets
972 adding changesets
973 adding manifests
973 adding manifests
974 adding file changes
974 adding file changes
975 added 1 changesets with 2 changes to 2 files (+1 heads)
975 added 1 changesets with 2 changes to 2 files (+1 heads)
976 (run 'hg heads' to see heads, 'hg merge' to merge)
976 (run 'hg heads' to see heads, 'hg merge' to merge)
977 caching new largefiles
977 caching largefiles for 1 heads
978 0 largefiles cached
978 0 largefiles cached
979 $ hg rebase
979 $ hg rebase
980 Invoking status precommit hook
980 Invoking status precommit hook
981 M sub/normal4
981 M sub/normal4
982 M sub2/large6
982 M sub2/large6
983 saved backup bundle to $TESTTMP/e/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
983 saved backup bundle to $TESTTMP/e/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
984 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
984 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
985 9:598410d3eb9a modify normal file largefile in repo d
985 9:598410d3eb9a modify normal file largefile in repo d
986 8:a381d2c8c80e modify normal file and largefile in repo b
986 8:a381d2c8c80e modify normal file and largefile in repo b
987 7:daea875e9014 add/edit more largefiles
987 7:daea875e9014 add/edit more largefiles
988 6:4355d653f84f edit files yet again
988 6:4355d653f84f edit files yet again
989 5:9d5af5072dbd edit files again
989 5:9d5af5072dbd edit files again
990 4:74c02385b94c move files
990 4:74c02385b94c move files
991 3:9e8fbc4bce62 copy files
991 3:9e8fbc4bce62 copy files
992 2:51a0ae4d5864 remove files
992 2:51a0ae4d5864 remove files
993 1:ce8896473775 edit files
993 1:ce8896473775 edit files
994 0:30d30fe6a5be add files
994 0:30d30fe6a5be add files
995 $ cat normal3
995 $ cat normal3
996 normal3-modified
996 normal3-modified
997 $ cat sub/normal4
997 $ cat sub/normal4
998 normal4-modified
998 normal4-modified
999 $ cat sub/large4
999 $ cat sub/large4
1000 large4-modified
1000 large4-modified
1001 $ cat sub2/large6
1001 $ cat sub2/large6
1002 large6-modified
1002 large6-modified
1003 $ cat sub2/large7
1003 $ cat sub2/large7
1004 large7
1004 large7
1005
1005
1006 Log on largefiles
1006 Log on largefiles
1007
1007
1008 - same output
1008 - same output
1009 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' .hglf/sub/large4
1009 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' .hglf/sub/large4
1010 8:a381d2c8c80e modify normal file and largefile in repo b
1010 8:a381d2c8c80e modify normal file and largefile in repo b
1011 6:4355d653f84f edit files yet again
1011 6:4355d653f84f edit files yet again
1012 5:9d5af5072dbd edit files again
1012 5:9d5af5072dbd edit files again
1013 4:74c02385b94c move files
1013 4:74c02385b94c move files
1014 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' sub/large4
1014 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' sub/large4
1015 8:a381d2c8c80e modify normal file and largefile in repo b
1015 8:a381d2c8c80e modify normal file and largefile in repo b
1016 6:4355d653f84f edit files yet again
1016 6:4355d653f84f edit files yet again
1017 5:9d5af5072dbd edit files again
1017 5:9d5af5072dbd edit files again
1018 4:74c02385b94c move files
1018 4:74c02385b94c move files
1019
1019
1020 - .hglf only matches largefiles, without .hglf it matches 9 bco sub/normal
1020 - .hglf only matches largefiles, without .hglf it matches 9 bco sub/normal
1021 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' .hglf/sub
1021 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' .hglf/sub
1022 8:a381d2c8c80e modify normal file and largefile in repo b
1022 8:a381d2c8c80e modify normal file and largefile in repo b
1023 6:4355d653f84f edit files yet again
1023 6:4355d653f84f edit files yet again
1024 5:9d5af5072dbd edit files again
1024 5:9d5af5072dbd edit files again
1025 4:74c02385b94c move files
1025 4:74c02385b94c move files
1026 1:ce8896473775 edit files
1026 1:ce8896473775 edit files
1027 0:30d30fe6a5be add files
1027 0:30d30fe6a5be add files
1028 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' sub
1028 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' sub
1029 9:598410d3eb9a modify normal file largefile in repo d
1029 9:598410d3eb9a modify normal file largefile in repo d
1030 8:a381d2c8c80e modify normal file and largefile in repo b
1030 8:a381d2c8c80e modify normal file and largefile in repo b
1031 6:4355d653f84f edit files yet again
1031 6:4355d653f84f edit files yet again
1032 5:9d5af5072dbd edit files again
1032 5:9d5af5072dbd edit files again
1033 4:74c02385b94c move files
1033 4:74c02385b94c move files
1034 1:ce8896473775 edit files
1034 1:ce8896473775 edit files
1035 0:30d30fe6a5be add files
1035 0:30d30fe6a5be add files
1036
1036
1037 - globbing gives same result
1037 - globbing gives same result
1038 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' 'glob:sub/*'
1038 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' 'glob:sub/*'
1039 9:598410d3eb9a modify normal file largefile in repo d
1039 9:598410d3eb9a modify normal file largefile in repo d
1040 8:a381d2c8c80e modify normal file and largefile in repo b
1040 8:a381d2c8c80e modify normal file and largefile in repo b
1041 6:4355d653f84f edit files yet again
1041 6:4355d653f84f edit files yet again
1042 5:9d5af5072dbd edit files again
1042 5:9d5af5072dbd edit files again
1043 4:74c02385b94c move files
1043 4:74c02385b94c move files
1044 1:ce8896473775 edit files
1044 1:ce8896473775 edit files
1045 0:30d30fe6a5be add files
1045 0:30d30fe6a5be add files
1046
1046
1047 Rollback on largefiles.
1047 Rollback on largefiles.
1048
1048
1049 $ echo large4-modified-again > sub/large4
1049 $ echo large4-modified-again > sub/large4
1050 $ hg commit -m "Modify large4 again"
1050 $ hg commit -m "Modify large4 again"
1051 Invoking status precommit hook
1051 Invoking status precommit hook
1052 M sub/large4
1052 M sub/large4
1053 $ hg rollback
1053 $ hg rollback
1054 repository tip rolled back to revision 9 (undo commit)
1054 repository tip rolled back to revision 9 (undo commit)
1055 working directory now based on revision 9
1055 working directory now based on revision 9
1056 $ hg st
1056 $ hg st
1057 M sub/large4
1057 M sub/large4
1058 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
1058 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
1059 9:598410d3eb9a modify normal file largefile in repo d
1059 9:598410d3eb9a modify normal file largefile in repo d
1060 8:a381d2c8c80e modify normal file and largefile in repo b
1060 8:a381d2c8c80e modify normal file and largefile in repo b
1061 7:daea875e9014 add/edit more largefiles
1061 7:daea875e9014 add/edit more largefiles
1062 6:4355d653f84f edit files yet again
1062 6:4355d653f84f edit files yet again
1063 5:9d5af5072dbd edit files again
1063 5:9d5af5072dbd edit files again
1064 4:74c02385b94c move files
1064 4:74c02385b94c move files
1065 3:9e8fbc4bce62 copy files
1065 3:9e8fbc4bce62 copy files
1066 2:51a0ae4d5864 remove files
1066 2:51a0ae4d5864 remove files
1067 1:ce8896473775 edit files
1067 1:ce8896473775 edit files
1068 0:30d30fe6a5be add files
1068 0:30d30fe6a5be add files
1069 $ cat sub/large4
1069 $ cat sub/large4
1070 large4-modified-again
1070 large4-modified-again
1071
1071
1072 "update --check" refuses to update with uncommitted changes.
1072 "update --check" refuses to update with uncommitted changes.
1073 $ hg update --check 8
1073 $ hg update --check 8
1074 abort: uncommitted local changes
1074 abort: uncommitted local changes
1075 [255]
1075 [255]
1076
1076
1077 "update --clean" leaves correct largefiles in working copy, even when there is
1077 "update --clean" leaves correct largefiles in working copy, even when there is
1078 .orig files from revert in .hglf.
1078 .orig files from revert in .hglf.
1079
1079
1080 $ echo mistake > sub2/large7
1080 $ echo mistake > sub2/large7
1081 $ hg revert sub2/large7
1081 $ hg revert sub2/large7
1082 $ hg -q update --clean -r null
1082 $ hg -q update --clean -r null
1083 $ hg update --clean
1083 $ hg update --clean
1084 getting changed largefiles
1084 getting changed largefiles
1085 3 largefiles updated, 0 removed
1085 3 largefiles updated, 0 removed
1086 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1086 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1087 $ cat normal3
1087 $ cat normal3
1088 normal3-modified
1088 normal3-modified
1089 $ cat sub/normal4
1089 $ cat sub/normal4
1090 normal4-modified
1090 normal4-modified
1091 $ cat sub/large4
1091 $ cat sub/large4
1092 large4-modified
1092 large4-modified
1093 $ cat sub2/large6
1093 $ cat sub2/large6
1094 large6-modified
1094 large6-modified
1095 $ cat sub2/large7
1095 $ cat sub2/large7
1096 large7
1096 large7
1097 $ cat sub2/large7.orig
1097 $ cat sub2/large7.orig
1098 mistake
1098 mistake
1099 $ cat .hglf/sub2/large7.orig
1099 $ cat .hglf/sub2/large7.orig
1100 9dbfb2c79b1c40981b258c3efa1b10b03f18ad31
1100 9dbfb2c79b1c40981b258c3efa1b10b03f18ad31
1101
1101
1102 demonstrate misfeature: .orig file is overwritten on every update -C,
1102 demonstrate misfeature: .orig file is overwritten on every update -C,
1103 also when clean:
1103 also when clean:
1104 $ hg update --clean
1104 $ hg update --clean
1105 getting changed largefiles
1105 getting changed largefiles
1106 0 largefiles updated, 0 removed
1106 0 largefiles updated, 0 removed
1107 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1107 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1108 $ cat sub2/large7.orig
1108 $ cat sub2/large7.orig
1109 large7
1109 large7
1110 $ rm sub2/large7.orig .hglf/sub2/large7.orig
1110 $ rm sub2/large7.orig .hglf/sub2/large7.orig
1111
1111
1112 Now "update check" is happy.
1112 Now "update check" is happy.
1113 $ hg update --check 8
1113 $ hg update --check 8
1114 getting changed largefiles
1114 getting changed largefiles
1115 1 largefiles updated, 0 removed
1115 1 largefiles updated, 0 removed
1116 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1116 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1117 $ hg update --check
1117 $ hg update --check
1118 getting changed largefiles
1118 getting changed largefiles
1119 1 largefiles updated, 0 removed
1119 1 largefiles updated, 0 removed
1120 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1120 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1121
1121
1122 Test removing empty largefiles directories on update
1122 Test removing empty largefiles directories on update
1123 $ test -d sub2 && echo "sub2 exists"
1123 $ test -d sub2 && echo "sub2 exists"
1124 sub2 exists
1124 sub2 exists
1125 $ hg update -q null
1125 $ hg update -q null
1126 $ test -d sub2 && echo "error: sub2 should not exist anymore"
1126 $ test -d sub2 && echo "error: sub2 should not exist anymore"
1127 [1]
1127 [1]
1128 $ hg update -q
1128 $ hg update -q
1129
1129
1130 Test hg remove removes empty largefiles directories
1130 Test hg remove removes empty largefiles directories
1131 $ test -d sub2 && echo "sub2 exists"
1131 $ test -d sub2 && echo "sub2 exists"
1132 sub2 exists
1132 sub2 exists
1133 $ hg remove sub2/*
1133 $ hg remove sub2/*
1134 $ test -d sub2 && echo "error: sub2 should not exist anymore"
1134 $ test -d sub2 && echo "error: sub2 should not exist anymore"
1135 [1]
1135 [1]
1136 $ hg revert sub2/large6 sub2/large7
1136 $ hg revert sub2/large6 sub2/large7
1137
1137
1138 "revert" works on largefiles (and normal files too).
1138 "revert" works on largefiles (and normal files too).
1139 $ echo hack3 >> normal3
1139 $ echo hack3 >> normal3
1140 $ echo hack4 >> sub/normal4
1140 $ echo hack4 >> sub/normal4
1141 $ echo hack4 >> sub/large4
1141 $ echo hack4 >> sub/large4
1142 $ rm sub2/large6
1142 $ rm sub2/large6
1143 $ hg revert sub2/large6
1143 $ hg revert sub2/large6
1144 $ hg rm sub2/large6
1144 $ hg rm sub2/large6
1145 $ echo new >> sub2/large8
1145 $ echo new >> sub2/large8
1146 $ hg add --large sub2/large8
1146 $ hg add --large sub2/large8
1147 # XXX we don't really want to report that we're reverting the standin;
1147 # XXX we don't really want to report that we're reverting the standin;
1148 # that's just an implementation detail. But I don't see an obvious fix. ;-(
1148 # that's just an implementation detail. But I don't see an obvious fix. ;-(
1149 $ hg revert sub
1149 $ hg revert sub
1150 reverting .hglf/sub/large4 (glob)
1150 reverting .hglf/sub/large4 (glob)
1151 reverting sub/normal4 (glob)
1151 reverting sub/normal4 (glob)
1152 $ hg status
1152 $ hg status
1153 M normal3
1153 M normal3
1154 A sub2/large8
1154 A sub2/large8
1155 R sub2/large6
1155 R sub2/large6
1156 ? sub/large4.orig
1156 ? sub/large4.orig
1157 ? sub/normal4.orig
1157 ? sub/normal4.orig
1158 $ cat sub/normal4
1158 $ cat sub/normal4
1159 normal4-modified
1159 normal4-modified
1160 $ cat sub/large4
1160 $ cat sub/large4
1161 large4-modified
1161 large4-modified
1162 $ hg revert -a --no-backup
1162 $ hg revert -a --no-backup
1163 undeleting .hglf/sub2/large6 (glob)
1163 undeleting .hglf/sub2/large6 (glob)
1164 forgetting .hglf/sub2/large8 (glob)
1164 forgetting .hglf/sub2/large8 (glob)
1165 reverting normal3
1165 reverting normal3
1166 $ hg status
1166 $ hg status
1167 ? sub/large4.orig
1167 ? sub/large4.orig
1168 ? sub/normal4.orig
1168 ? sub/normal4.orig
1169 ? sub2/large8
1169 ? sub2/large8
1170 $ cat normal3
1170 $ cat normal3
1171 normal3-modified
1171 normal3-modified
1172 $ cat sub2/large6
1172 $ cat sub2/large6
1173 large6-modified
1173 large6-modified
1174 $ rm sub/*.orig sub2/large8
1174 $ rm sub/*.orig sub2/large8
1175
1175
1176 revert some files to an older revision
1176 revert some files to an older revision
1177 $ hg revert --no-backup -r 8 sub2
1177 $ hg revert --no-backup -r 8 sub2
1178 reverting .hglf/sub2/large6 (glob)
1178 reverting .hglf/sub2/large6 (glob)
1179 $ cat sub2/large6
1179 $ cat sub2/large6
1180 large6
1180 large6
1181 $ hg revert --no-backup -C -r '.^' sub2
1181 $ hg revert --no-backup -C -r '.^' sub2
1182 reverting .hglf/sub2/large6 (glob)
1182 reverting .hglf/sub2/large6 (glob)
1183 $ hg revert --no-backup sub2
1183 $ hg revert --no-backup sub2
1184 reverting .hglf/sub2/large6 (glob)
1184 reverting .hglf/sub2/large6 (glob)
1185 $ hg status
1185 $ hg status
1186
1186
1187 "verify --large" actually verifies largefiles
1187 "verify --large" actually verifies largefiles
1188
1188
1189 - Where Do We Come From? What Are We? Where Are We Going?
1189 - Where Do We Come From? What Are We? Where Are We Going?
1190 $ pwd
1190 $ pwd
1191 $TESTTMP/e
1191 $TESTTMP/e
1192 $ hg paths
1192 $ hg paths
1193 default = $TESTTMP/d (glob)
1193 default = $TESTTMP/d (glob)
1194
1194
1195 $ hg verify --large
1195 $ hg verify --large
1196 checking changesets
1196 checking changesets
1197 checking manifests
1197 checking manifests
1198 crosschecking files in changesets and manifests
1198 crosschecking files in changesets and manifests
1199 checking files
1199 checking files
1200 10 files, 10 changesets, 28 total revisions
1200 10 files, 10 changesets, 28 total revisions
1201 searching 1 changesets for largefiles
1201 searching 1 changesets for largefiles
1202 verified existence of 3 revisions of 3 largefiles
1202 verified existence of 3 revisions of 3 largefiles
1203
1203
1204 - introduce missing blob in local store repo and make sure that this is caught:
1204 - introduce missing blob in local store repo and make sure that this is caught:
1205 $ mv $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 .
1205 $ mv $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 .
1206 $ hg verify --large
1206 $ hg verify --large
1207 checking changesets
1207 checking changesets
1208 checking manifests
1208 checking manifests
1209 crosschecking files in changesets and manifests
1209 crosschecking files in changesets and manifests
1210 checking files
1210 checking files
1211 10 files, 10 changesets, 28 total revisions
1211 10 files, 10 changesets, 28 total revisions
1212 searching 1 changesets for largefiles
1212 searching 1 changesets for largefiles
1213 changeset 9:598410d3eb9a: sub/large4 references missing $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 (glob)
1213 changeset 9:598410d3eb9a: sub/large4 references missing $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 (glob)
1214 verified existence of 3 revisions of 3 largefiles
1214 verified existence of 3 revisions of 3 largefiles
1215 [1]
1215 [1]
1216
1216
1217 - introduce corruption and make sure that it is caught when checking content:
1217 - introduce corruption and make sure that it is caught when checking content:
1218 $ echo '5 cents' > $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928
1218 $ echo '5 cents' > $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928
1219 $ hg verify -q --large --lfc
1219 $ hg verify -q --large --lfc
1220 changeset 9:598410d3eb9a: sub/large4 references corrupted $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 (glob)
1220 changeset 9:598410d3eb9a: sub/large4 references corrupted $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 (glob)
1221 [1]
1221 [1]
1222
1222
1223 - cleanup
1223 - cleanup
1224 $ mv e166e74c7303192238d60af5a9c4ce9bef0b7928 $TESTTMP/d/.hg/largefiles/
1224 $ mv e166e74c7303192238d60af5a9c4ce9bef0b7928 $TESTTMP/d/.hg/largefiles/
1225
1225
1226 - verifying all revisions will fail because we didn't clone all largefiles to d:
1226 - verifying all revisions will fail because we didn't clone all largefiles to d:
1227 $ echo 'T-shirt' > $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4
1227 $ echo 'T-shirt' > $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4
1228 $ hg verify -q --lfa --lfc
1228 $ hg verify -q --lfa --lfc
1229 changeset 0:30d30fe6a5be: large1 references missing $TESTTMP/d/.hg/largefiles/4669e532d5b2c093a78eca010077e708a071bb64 (glob)
1229 changeset 0:30d30fe6a5be: large1 references missing $TESTTMP/d/.hg/largefiles/4669e532d5b2c093a78eca010077e708a071bb64 (glob)
1230 changeset 0:30d30fe6a5be: sub/large2 references missing $TESTTMP/d/.hg/largefiles/1deebade43c8c498a3c8daddac0244dc55d1331d (glob)
1230 changeset 0:30d30fe6a5be: sub/large2 references missing $TESTTMP/d/.hg/largefiles/1deebade43c8c498a3c8daddac0244dc55d1331d (glob)
1231 changeset 1:ce8896473775: large1 references missing $TESTTMP/d/.hg/largefiles/5f78770c0e77ba4287ad6ef3071c9bf9c379742f (glob)
1231 changeset 1:ce8896473775: large1 references missing $TESTTMP/d/.hg/largefiles/5f78770c0e77ba4287ad6ef3071c9bf9c379742f (glob)
1232 changeset 1:ce8896473775: sub/large2 references corrupted $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 (glob)
1232 changeset 1:ce8896473775: sub/large2 references corrupted $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 (glob)
1233 changeset 3:9e8fbc4bce62: large1 references corrupted $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 (glob)
1233 changeset 3:9e8fbc4bce62: large1 references corrupted $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 (glob)
1234 changeset 4:74c02385b94c: large3 references corrupted $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 (glob)
1234 changeset 4:74c02385b94c: large3 references corrupted $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 (glob)
1235 changeset 4:74c02385b94c: sub/large4 references corrupted $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 (glob)
1235 changeset 4:74c02385b94c: sub/large4 references corrupted $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 (glob)
1236 [1]
1236 [1]
1237
1237
1238 - cleanup
1238 - cleanup
1239 $ rm $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4
1239 $ rm $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4
1240
1240
1241 Merging does not revert to old versions of largefiles and also check
1241 Merging does not revert to old versions of largefiles and also check
1242 that merging after having pulled from a non-default remote works
1242 that merging after having pulled from a non-default remote works
1243 correctly.
1243 correctly.
1244
1244
1245 $ cd ..
1245 $ cd ..
1246 $ hg clone -r 7 e temp
1246 $ hg clone -r 7 e temp
1247 adding changesets
1247 adding changesets
1248 adding manifests
1248 adding manifests
1249 adding file changes
1249 adding file changes
1250 added 8 changesets with 24 changes to 10 files
1250 added 8 changesets with 24 changes to 10 files
1251 updating to branch default
1251 updating to branch default
1252 getting changed largefiles
1252 getting changed largefiles
1253 3 largefiles updated, 0 removed
1253 3 largefiles updated, 0 removed
1254 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1254 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1255 $ hg clone temp f
1255 $ hg clone temp f
1256 updating to branch default
1256 updating to branch default
1257 getting changed largefiles
1257 getting changed largefiles
1258 3 largefiles updated, 0 removed
1258 3 largefiles updated, 0 removed
1259 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1259 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1260 # Delete the largefiles in the largefiles system cache so that we have an
1260 # Delete the largefiles in the largefiles system cache so that we have an
1261 # opportunity to test that caching after a pull works.
1261 # opportunity to test that caching after a pull works.
1262 $ rm "${USERCACHE}"/*
1262 $ rm "${USERCACHE}"/*
1263 $ cd f
1263 $ cd f
1264 $ echo "large4-merge-test" > sub/large4
1264 $ echo "large4-merge-test" > sub/large4
1265 $ hg commit -m "Modify large4 to test merge"
1265 $ hg commit -m "Modify large4 to test merge"
1266 Invoking status precommit hook
1266 Invoking status precommit hook
1267 M sub/large4
1267 M sub/large4
1268 $ hg pull ../e
1268 $ hg pull ../e
1269 pulling from ../e
1269 pulling from ../e
1270 searching for changes
1270 searching for changes
1271 adding changesets
1271 adding changesets
1272 adding manifests
1272 adding manifests
1273 adding file changes
1273 adding file changes
1274 added 2 changesets with 4 changes to 4 files (+1 heads)
1274 added 2 changesets with 4 changes to 4 files (+1 heads)
1275 (run 'hg heads' to see heads, 'hg merge' to merge)
1275 (run 'hg heads' to see heads, 'hg merge' to merge)
1276 caching new largefiles
1276 caching largefiles for 1 heads
1277 2 largefiles cached
1277 2 largefiles cached
1278 $ hg merge
1278 $ hg merge
1279 merging sub/large4
1279 merging sub/large4
1280 largefile sub/large4 has a merge conflict
1280 largefile sub/large4 has a merge conflict
1281 keep (l)ocal or take (o)ther? l
1281 keep (l)ocal or take (o)ther? l
1282 3 files updated, 1 files merged, 0 files removed, 0 files unresolved
1282 3 files updated, 1 files merged, 0 files removed, 0 files unresolved
1283 (branch merge, don't forget to commit)
1283 (branch merge, don't forget to commit)
1284 getting changed largefiles
1284 getting changed largefiles
1285 1 largefiles updated, 0 removed
1285 1 largefiles updated, 0 removed
1286 $ hg commit -m "Merge repos e and f"
1286 $ hg commit -m "Merge repos e and f"
1287 Invoking status precommit hook
1287 Invoking status precommit hook
1288 M normal3
1288 M normal3
1289 M sub/normal4
1289 M sub/normal4
1290 M sub2/large6
1290 M sub2/large6
1291 $ cat normal3
1291 $ cat normal3
1292 normal3-modified
1292 normal3-modified
1293 $ cat sub/normal4
1293 $ cat sub/normal4
1294 normal4-modified
1294 normal4-modified
1295 $ cat sub/large4
1295 $ cat sub/large4
1296 large4-merge-test
1296 large4-merge-test
1297 $ cat sub2/large6
1297 $ cat sub2/large6
1298 large6-modified
1298 large6-modified
1299 $ cat sub2/large7
1299 $ cat sub2/large7
1300 large7
1300 large7
1301
1301
1302 Test status after merging with a branch that introduces a new largefile:
1302 Test status after merging with a branch that introduces a new largefile:
1303
1303
1304 $ echo large > large
1304 $ echo large > large
1305 $ hg add --large large
1305 $ hg add --large large
1306 $ hg commit -m 'add largefile'
1306 $ hg commit -m 'add largefile'
1307 Invoking status precommit hook
1307 Invoking status precommit hook
1308 A large
1308 A large
1309 $ hg update -q ".^"
1309 $ hg update -q ".^"
1310 $ echo change >> normal3
1310 $ echo change >> normal3
1311 $ hg commit -m 'some change'
1311 $ hg commit -m 'some change'
1312 Invoking status precommit hook
1312 Invoking status precommit hook
1313 M normal3
1313 M normal3
1314 created new head
1314 created new head
1315 $ hg merge
1315 $ hg merge
1316 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1316 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1317 (branch merge, don't forget to commit)
1317 (branch merge, don't forget to commit)
1318 getting changed largefiles
1318 getting changed largefiles
1319 1 largefiles updated, 0 removed
1319 1 largefiles updated, 0 removed
1320 $ hg status
1320 $ hg status
1321 M large
1321 M large
1322
1322
1323 - make sure update of merge with removed largefiles fails as expected
1323 - make sure update of merge with removed largefiles fails as expected
1324 $ hg rm sub2/large6
1324 $ hg rm sub2/large6
1325 $ hg up -r.
1325 $ hg up -r.
1326 abort: outstanding uncommitted merges
1326 abort: outstanding uncommitted merges
1327 [255]
1327 [255]
1328
1328
1329 - revert should be able to revert files introduced in a pending merge
1329 - revert should be able to revert files introduced in a pending merge
1330 $ hg revert --all -r .
1330 $ hg revert --all -r .
1331 removing .hglf/large (glob)
1331 removing .hglf/large (glob)
1332 undeleting .hglf/sub2/large6 (glob)
1332 undeleting .hglf/sub2/large6 (glob)
1333
1333
1334 Test that a normal file and a largefile with the same name and path cannot
1334 Test that a normal file and a largefile with the same name and path cannot
1335 coexist.
1335 coexist.
1336
1336
1337 $ rm sub2/large7
1337 $ rm sub2/large7
1338 $ echo "largeasnormal" > sub2/large7
1338 $ echo "largeasnormal" > sub2/large7
1339 $ hg add sub2/large7
1339 $ hg add sub2/large7
1340 sub2/large7 already a largefile
1340 sub2/large7 already a largefile
1341
1341
1342 Test that transplanting a largefile change works correctly.
1342 Test that transplanting a largefile change works correctly.
1343
1343
1344 $ cd ..
1344 $ cd ..
1345 $ hg clone -r 8 d g
1345 $ hg clone -r 8 d g
1346 adding changesets
1346 adding changesets
1347 adding manifests
1347 adding manifests
1348 adding file changes
1348 adding file changes
1349 added 9 changesets with 26 changes to 10 files
1349 added 9 changesets with 26 changes to 10 files
1350 updating to branch default
1350 updating to branch default
1351 getting changed largefiles
1351 getting changed largefiles
1352 3 largefiles updated, 0 removed
1352 3 largefiles updated, 0 removed
1353 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1353 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1354 $ cd g
1354 $ cd g
1355 $ hg transplant -s ../d 598410d3eb9a
1355 $ hg transplant -s ../d 598410d3eb9a
1356 searching for changes
1356 searching for changes
1357 searching for changes
1357 searching for changes
1358 adding changesets
1358 adding changesets
1359 adding manifests
1359 adding manifests
1360 adding file changes
1360 adding file changes
1361 added 1 changesets with 2 changes to 2 files
1361 added 1 changesets with 2 changes to 2 files
1362 getting changed largefiles
1362 getting changed largefiles
1363 1 largefiles updated, 0 removed
1363 1 largefiles updated, 0 removed
1364 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
1364 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
1365 9:598410d3eb9a modify normal file largefile in repo d
1365 9:598410d3eb9a modify normal file largefile in repo d
1366 8:a381d2c8c80e modify normal file and largefile in repo b
1366 8:a381d2c8c80e modify normal file and largefile in repo b
1367 7:daea875e9014 add/edit more largefiles
1367 7:daea875e9014 add/edit more largefiles
1368 6:4355d653f84f edit files yet again
1368 6:4355d653f84f edit files yet again
1369 5:9d5af5072dbd edit files again
1369 5:9d5af5072dbd edit files again
1370 4:74c02385b94c move files
1370 4:74c02385b94c move files
1371 3:9e8fbc4bce62 copy files
1371 3:9e8fbc4bce62 copy files
1372 2:51a0ae4d5864 remove files
1372 2:51a0ae4d5864 remove files
1373 1:ce8896473775 edit files
1373 1:ce8896473775 edit files
1374 0:30d30fe6a5be add files
1374 0:30d30fe6a5be add files
1375 $ cat normal3
1375 $ cat normal3
1376 normal3-modified
1376 normal3-modified
1377 $ cat sub/normal4
1377 $ cat sub/normal4
1378 normal4-modified
1378 normal4-modified
1379 $ cat sub/large4
1379 $ cat sub/large4
1380 large4-modified
1380 large4-modified
1381 $ cat sub2/large6
1381 $ cat sub2/large6
1382 large6-modified
1382 large6-modified
1383 $ cat sub2/large7
1383 $ cat sub2/large7
1384 large7
1384 large7
1385
1385
1386 Cat a largefile
1386 Cat a largefile
1387 $ hg cat normal3
1387 $ hg cat normal3
1388 normal3-modified
1388 normal3-modified
1389 $ hg cat sub/large4
1389 $ hg cat sub/large4
1390 large4-modified
1390 large4-modified
1391 $ rm "${USERCACHE}"/*
1391 $ rm "${USERCACHE}"/*
1392 $ hg cat -r a381d2c8c80e -o cat.out sub/large4
1392 $ hg cat -r a381d2c8c80e -o cat.out sub/large4
1393 $ cat cat.out
1393 $ cat cat.out
1394 large4-modified
1394 large4-modified
1395 $ rm cat.out
1395 $ rm cat.out
1396 $ hg cat -r a381d2c8c80e normal3
1396 $ hg cat -r a381d2c8c80e normal3
1397 normal3-modified
1397 normal3-modified
1398 $ hg cat -r '.^' normal3
1398 $ hg cat -r '.^' normal3
1399 normal3-modified
1399 normal3-modified
1400 $ hg cat -r '.^' sub/large4 doesntexist
1400 $ hg cat -r '.^' sub/large4 doesntexist
1401 large4-modified
1401 large4-modified
1402 doesntexist: no such file in rev a381d2c8c80e
1402 doesntexist: no such file in rev a381d2c8c80e
1403 [1]
1403 [1]
1404
1404
1405 Test that renaming a largefile results in correct output for status
1405 Test that renaming a largefile results in correct output for status
1406
1406
1407 $ hg rename sub/large4 large4-renamed
1407 $ hg rename sub/large4 large4-renamed
1408 $ hg commit -m "test rename output"
1408 $ hg commit -m "test rename output"
1409 Invoking status precommit hook
1409 Invoking status precommit hook
1410 A large4-renamed
1410 A large4-renamed
1411 R sub/large4
1411 R sub/large4
1412 $ cat large4-renamed
1412 $ cat large4-renamed
1413 large4-modified
1413 large4-modified
1414 $ cd sub2
1414 $ cd sub2
1415 $ hg rename large6 large6-renamed
1415 $ hg rename large6 large6-renamed
1416 $ hg st
1416 $ hg st
1417 A sub2/large6-renamed
1417 A sub2/large6-renamed
1418 R sub2/large6
1418 R sub2/large6
1419 $ cd ..
1419 $ cd ..
1420
1420
1421 Test --normal flag
1421 Test --normal flag
1422
1422
1423 $ dd if=/dev/zero bs=2k count=11k > new-largefile 2> /dev/null
1423 $ dd if=/dev/zero bs=2k count=11k > new-largefile 2> /dev/null
1424 $ hg add --normal --large new-largefile
1424 $ hg add --normal --large new-largefile
1425 abort: --normal cannot be used with --large
1425 abort: --normal cannot be used with --large
1426 [255]
1426 [255]
1427 $ hg add --normal new-largefile
1427 $ hg add --normal new-largefile
1428 new-largefile: up to 69 MB of RAM may be required to manage this file
1428 new-largefile: up to 69 MB of RAM may be required to manage this file
1429 (use 'hg revert new-largefile' to cancel the pending addition)
1429 (use 'hg revert new-largefile' to cancel the pending addition)
1430 $ cd ..
1430 $ cd ..
1431
1431
1432 #if serve
1432 #if serve
1433 vanilla clients not locked out from largefiles servers on vanilla repos
1433 vanilla clients not locked out from largefiles servers on vanilla repos
1434 $ mkdir r1
1434 $ mkdir r1
1435 $ cd r1
1435 $ cd r1
1436 $ hg init
1436 $ hg init
1437 $ echo c1 > f1
1437 $ echo c1 > f1
1438 $ hg add f1
1438 $ hg add f1
1439 $ hg commit -m "m1"
1439 $ hg commit -m "m1"
1440 Invoking status precommit hook
1440 Invoking status precommit hook
1441 A f1
1441 A f1
1442 $ cd ..
1442 $ cd ..
1443 $ hg serve -R r1 -d -p $HGPORT --pid-file hg.pid
1443 $ hg serve -R r1 -d -p $HGPORT --pid-file hg.pid
1444 $ cat hg.pid >> $DAEMON_PIDS
1444 $ cat hg.pid >> $DAEMON_PIDS
1445 $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT r2
1445 $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT r2
1446 requesting all changes
1446 requesting all changes
1447 adding changesets
1447 adding changesets
1448 adding manifests
1448 adding manifests
1449 adding file changes
1449 adding file changes
1450 added 1 changesets with 1 changes to 1 files
1450 added 1 changesets with 1 changes to 1 files
1451 updating to branch default
1451 updating to branch default
1452 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1452 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1453
1453
1454 largefiles clients still work with vanilla servers
1454 largefiles clients still work with vanilla servers
1455 $ hg --config extensions.largefiles=! serve -R r1 -d -p $HGPORT1 --pid-file hg.pid
1455 $ hg --config extensions.largefiles=! serve -R r1 -d -p $HGPORT1 --pid-file hg.pid
1456 $ cat hg.pid >> $DAEMON_PIDS
1456 $ cat hg.pid >> $DAEMON_PIDS
1457 $ hg clone http://localhost:$HGPORT1 r3
1457 $ hg clone http://localhost:$HGPORT1 r3
1458 requesting all changes
1458 requesting all changes
1459 adding changesets
1459 adding changesets
1460 adding manifests
1460 adding manifests
1461 adding file changes
1461 adding file changes
1462 added 1 changesets with 1 changes to 1 files
1462 added 1 changesets with 1 changes to 1 files
1463 updating to branch default
1463 updating to branch default
1464 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1464 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1465 #endif
1465 #endif
1466
1466
1467
1467
1468 vanilla clients locked out from largefiles http repos
1468 vanilla clients locked out from largefiles http repos
1469 $ mkdir r4
1469 $ mkdir r4
1470 $ cd r4
1470 $ cd r4
1471 $ hg init
1471 $ hg init
1472 $ echo c1 > f1
1472 $ echo c1 > f1
1473 $ hg add --large f1
1473 $ hg add --large f1
1474 $ hg commit -m "m1"
1474 $ hg commit -m "m1"
1475 Invoking status precommit hook
1475 Invoking status precommit hook
1476 A f1
1476 A f1
1477 $ cd ..
1477 $ cd ..
1478
1478
1479 largefiles can be pushed locally (issue3583)
1479 largefiles can be pushed locally (issue3583)
1480 $ hg init dest
1480 $ hg init dest
1481 $ cd r4
1481 $ cd r4
1482 $ hg outgoing ../dest
1482 $ hg outgoing ../dest
1483 comparing with ../dest
1483 comparing with ../dest
1484 searching for changes
1484 searching for changes
1485 changeset: 0:639881c12b4c
1485 changeset: 0:639881c12b4c
1486 tag: tip
1486 tag: tip
1487 user: test
1487 user: test
1488 date: Thu Jan 01 00:00:00 1970 +0000
1488 date: Thu Jan 01 00:00:00 1970 +0000
1489 summary: m1
1489 summary: m1
1490
1490
1491 $ hg push ../dest
1491 $ hg push ../dest
1492 pushing to ../dest
1492 pushing to ../dest
1493 searching for changes
1493 searching for changes
1494 searching for changes
1494 searching for changes
1495 adding changesets
1495 adding changesets
1496 adding manifests
1496 adding manifests
1497 adding file changes
1497 adding file changes
1498 added 1 changesets with 1 changes to 1 files
1498 added 1 changesets with 1 changes to 1 files
1499
1499
1500 exit code with nothing outgoing (issue3611)
1500 exit code with nothing outgoing (issue3611)
1501 $ hg outgoing ../dest
1501 $ hg outgoing ../dest
1502 comparing with ../dest
1502 comparing with ../dest
1503 searching for changes
1503 searching for changes
1504 no changes found
1504 no changes found
1505 [1]
1505 [1]
1506 $ cd ..
1506 $ cd ..
1507
1507
1508 #if serve
1508 #if serve
1509 $ hg serve -R r4 -d -p $HGPORT2 --pid-file hg.pid
1509 $ hg serve -R r4 -d -p $HGPORT2 --pid-file hg.pid
1510 $ cat hg.pid >> $DAEMON_PIDS
1510 $ cat hg.pid >> $DAEMON_PIDS
1511 $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT2 r5
1511 $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT2 r5
1512 abort: remote error:
1512 abort: remote error:
1513
1513
1514 This repository uses the largefiles extension.
1514 This repository uses the largefiles extension.
1515
1515
1516 Please enable it in your Mercurial config file.
1516 Please enable it in your Mercurial config file.
1517 [255]
1517 [255]
1518
1518
1519 used all HGPORTs, kill all daemons
1519 used all HGPORTs, kill all daemons
1520 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1520 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1521 #endif
1521 #endif
1522
1522
1523 vanilla clients locked out from largefiles ssh repos
1523 vanilla clients locked out from largefiles ssh repos
1524 $ hg --config extensions.largefiles=! clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/r4 r5
1524 $ hg --config extensions.largefiles=! clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/r4 r5
1525 abort: remote error:
1525 abort: remote error:
1526
1526
1527 This repository uses the largefiles extension.
1527 This repository uses the largefiles extension.
1528
1528
1529 Please enable it in your Mercurial config file.
1529 Please enable it in your Mercurial config file.
1530 [255]
1530 [255]
1531
1531
1532 #if serve
1532 #if serve
1533
1533
1534 largefiles clients refuse to push largefiles repos to vanilla servers
1534 largefiles clients refuse to push largefiles repos to vanilla servers
1535 $ mkdir r6
1535 $ mkdir r6
1536 $ cd r6
1536 $ cd r6
1537 $ hg init
1537 $ hg init
1538 $ echo c1 > f1
1538 $ echo c1 > f1
1539 $ hg add f1
1539 $ hg add f1
1540 $ hg commit -m "m1"
1540 $ hg commit -m "m1"
1541 Invoking status precommit hook
1541 Invoking status precommit hook
1542 A f1
1542 A f1
1543 $ cat >> .hg/hgrc <<!
1543 $ cat >> .hg/hgrc <<!
1544 > [web]
1544 > [web]
1545 > push_ssl = false
1545 > push_ssl = false
1546 > allow_push = *
1546 > allow_push = *
1547 > !
1547 > !
1548 $ cd ..
1548 $ cd ..
1549 $ hg clone r6 r7
1549 $ hg clone r6 r7
1550 updating to branch default
1550 updating to branch default
1551 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1551 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1552 $ cd r7
1552 $ cd r7
1553 $ echo c2 > f2
1553 $ echo c2 > f2
1554 $ hg add --large f2
1554 $ hg add --large f2
1555 $ hg commit -m "m2"
1555 $ hg commit -m "m2"
1556 Invoking status precommit hook
1556 Invoking status precommit hook
1557 A f2
1557 A f2
1558 $ hg --config extensions.largefiles=! -R ../r6 serve -d -p $HGPORT --pid-file ../hg.pid
1558 $ hg --config extensions.largefiles=! -R ../r6 serve -d -p $HGPORT --pid-file ../hg.pid
1559 $ cat ../hg.pid >> $DAEMON_PIDS
1559 $ cat ../hg.pid >> $DAEMON_PIDS
1560 $ hg push http://localhost:$HGPORT
1560 $ hg push http://localhost:$HGPORT
1561 pushing to http://localhost:$HGPORT/
1561 pushing to http://localhost:$HGPORT/
1562 searching for changes
1562 searching for changes
1563 abort: http://localhost:$HGPORT/ does not appear to be a largefile store
1563 abort: http://localhost:$HGPORT/ does not appear to be a largefile store
1564 [255]
1564 [255]
1565 $ cd ..
1565 $ cd ..
1566
1566
1567 putlfile errors are shown (issue3123)
1567 putlfile errors are shown (issue3123)
1568 Corrupt the cached largefile in r7 and move it out of the servers usercache
1568 Corrupt the cached largefile in r7 and move it out of the servers usercache
1569 $ mv r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8 .
1569 $ mv r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8 .
1570 $ echo 'client side corruption' > r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1570 $ echo 'client side corruption' > r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1571 $ rm "$USERCACHE/4cdac4d8b084d0b599525cf732437fb337d422a8"
1571 $ rm "$USERCACHE/4cdac4d8b084d0b599525cf732437fb337d422a8"
1572 $ hg init empty
1572 $ hg init empty
1573 $ hg serve -R empty -d -p $HGPORT1 --pid-file hg.pid \
1573 $ hg serve -R empty -d -p $HGPORT1 --pid-file hg.pid \
1574 > --config 'web.allow_push=*' --config web.push_ssl=False
1574 > --config 'web.allow_push=*' --config web.push_ssl=False
1575 $ cat hg.pid >> $DAEMON_PIDS
1575 $ cat hg.pid >> $DAEMON_PIDS
1576 $ hg push -R r7 http://localhost:$HGPORT1
1576 $ hg push -R r7 http://localhost:$HGPORT1
1577 pushing to http://localhost:$HGPORT1/
1577 pushing to http://localhost:$HGPORT1/
1578 searching for changes
1578 searching for changes
1579 remote: largefiles: failed to put 4cdac4d8b084d0b599525cf732437fb337d422a8 into store: largefile contents do not match hash
1579 remote: largefiles: failed to put 4cdac4d8b084d0b599525cf732437fb337d422a8 into store: largefile contents do not match hash
1580 abort: remotestore: could not put $TESTTMP/r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8 to remote store http://localhost:$HGPORT1/ (glob)
1580 abort: remotestore: could not put $TESTTMP/r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8 to remote store http://localhost:$HGPORT1/ (glob)
1581 [255]
1581 [255]
1582 $ mv 4cdac4d8b084d0b599525cf732437fb337d422a8 r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1582 $ mv 4cdac4d8b084d0b599525cf732437fb337d422a8 r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1583 Push of file that exists on server but is corrupted - magic healing would be nice ... but too magic
1583 Push of file that exists on server but is corrupted - magic healing would be nice ... but too magic
1584 $ echo "server side corruption" > empty/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1584 $ echo "server side corruption" > empty/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1585 $ hg push -R r7 http://localhost:$HGPORT1
1585 $ hg push -R r7 http://localhost:$HGPORT1
1586 pushing to http://localhost:$HGPORT1/
1586 pushing to http://localhost:$HGPORT1/
1587 searching for changes
1587 searching for changes
1588 searching for changes
1588 searching for changes
1589 remote: adding changesets
1589 remote: adding changesets
1590 remote: adding manifests
1590 remote: adding manifests
1591 remote: adding file changes
1591 remote: adding file changes
1592 remote: added 2 changesets with 2 changes to 2 files
1592 remote: added 2 changesets with 2 changes to 2 files
1593 $ cat empty/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1593 $ cat empty/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1594 server side corruption
1594 server side corruption
1595 $ rm -rf empty
1595 $ rm -rf empty
1596
1596
1597 Push a largefiles repository to a served empty repository
1597 Push a largefiles repository to a served empty repository
1598 $ hg init r8
1598 $ hg init r8
1599 $ echo c3 > r8/f1
1599 $ echo c3 > r8/f1
1600 $ hg add --large r8/f1 -R r8
1600 $ hg add --large r8/f1 -R r8
1601 $ hg commit -m "m1" -R r8
1601 $ hg commit -m "m1" -R r8
1602 Invoking status precommit hook
1602 Invoking status precommit hook
1603 A f1
1603 A f1
1604 $ hg init empty
1604 $ hg init empty
1605 $ hg serve -R empty -d -p $HGPORT2 --pid-file hg.pid \
1605 $ hg serve -R empty -d -p $HGPORT2 --pid-file hg.pid \
1606 > --config 'web.allow_push=*' --config web.push_ssl=False
1606 > --config 'web.allow_push=*' --config web.push_ssl=False
1607 $ cat hg.pid >> $DAEMON_PIDS
1607 $ cat hg.pid >> $DAEMON_PIDS
1608 $ rm "${USERCACHE}"/*
1608 $ rm "${USERCACHE}"/*
1609 $ hg push -R r8 http://localhost:$HGPORT2/#default
1609 $ hg push -R r8 http://localhost:$HGPORT2/#default
1610 pushing to http://localhost:$HGPORT2/
1610 pushing to http://localhost:$HGPORT2/
1611 searching for changes
1611 searching for changes
1612 searching for changes
1612 searching for changes
1613 remote: adding changesets
1613 remote: adding changesets
1614 remote: adding manifests
1614 remote: adding manifests
1615 remote: adding file changes
1615 remote: adding file changes
1616 remote: added 1 changesets with 1 changes to 1 files
1616 remote: added 1 changesets with 1 changes to 1 files
1617 $ [ -f "${USERCACHE}"/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1617 $ [ -f "${USERCACHE}"/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1618 $ [ -f empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1618 $ [ -f empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1619
1619
1620 Clone over http, no largefiles pulled on clone.
1620 Clone over http, no largefiles pulled on clone.
1621
1621
1622 $ hg clone http://localhost:$HGPORT2/#default http-clone -U
1622 $ hg clone http://localhost:$HGPORT2/#default http-clone -U
1623 adding changesets
1623 adding changesets
1624 adding manifests
1624 adding manifests
1625 adding file changes
1625 adding file changes
1626 added 1 changesets with 1 changes to 1 files
1626 added 1 changesets with 1 changes to 1 files
1627
1627
1628 test 'verify' with remotestore:
1628 test 'verify' with remotestore:
1629
1629
1630 $ rm "${USERCACHE}"/02a439e5c31c526465ab1a0ca1f431f76b827b90
1630 $ rm "${USERCACHE}"/02a439e5c31c526465ab1a0ca1f431f76b827b90
1631 $ mv empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 .
1631 $ mv empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 .
1632 $ hg -R http-clone verify --large --lfa
1632 $ hg -R http-clone verify --large --lfa
1633 checking changesets
1633 checking changesets
1634 checking manifests
1634 checking manifests
1635 crosschecking files in changesets and manifests
1635 crosschecking files in changesets and manifests
1636 checking files
1636 checking files
1637 1 files, 1 changesets, 1 total revisions
1637 1 files, 1 changesets, 1 total revisions
1638 searching 1 changesets for largefiles
1638 searching 1 changesets for largefiles
1639 changeset 0:cf03e5bb9936: f1 missing
1639 changeset 0:cf03e5bb9936: f1 missing
1640 verified existence of 1 revisions of 1 largefiles
1640 verified existence of 1 revisions of 1 largefiles
1641 [1]
1641 [1]
1642 $ mv 02a439e5c31c526465ab1a0ca1f431f76b827b90 empty/.hg/largefiles/
1642 $ mv 02a439e5c31c526465ab1a0ca1f431f76b827b90 empty/.hg/largefiles/
1643 $ hg -R http-clone -q verify --large --lfa
1643 $ hg -R http-clone -q verify --large --lfa
1644
1644
1645 largefiles pulled on update - a largefile missing on the server:
1645 largefiles pulled on update - a largefile missing on the server:
1646 $ mv empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 .
1646 $ mv empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 .
1647 $ hg -R http-clone up --config largefiles.usercache=http-clone-usercache
1647 $ hg -R http-clone up --config largefiles.usercache=http-clone-usercache
1648 getting changed largefiles
1648 getting changed largefiles
1649 abort: remotestore: largefile 02a439e5c31c526465ab1a0ca1f431f76b827b90 is missing
1649 abort: remotestore: largefile 02a439e5c31c526465ab1a0ca1f431f76b827b90 is missing
1650 [255]
1650 [255]
1651 $ hg -R http-clone up -Cqr null
1651 $ hg -R http-clone up -Cqr null
1652
1652
1653 largefiles pulled on update - a largefile corrupted on the server:
1653 largefiles pulled on update - a largefile corrupted on the server:
1654 $ echo corruption > empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90
1654 $ echo corruption > empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90
1655 $ hg -R http-clone up --config largefiles.usercache=http-clone-usercache
1655 $ hg -R http-clone up --config largefiles.usercache=http-clone-usercache
1656 getting changed largefiles
1656 getting changed largefiles
1657 f1: data corruption (expected 02a439e5c31c526465ab1a0ca1f431f76b827b90, got 6a7bb2556144babe3899b25e5428123735bb1e27)
1657 f1: data corruption (expected 02a439e5c31c526465ab1a0ca1f431f76b827b90, got 6a7bb2556144babe3899b25e5428123735bb1e27)
1658 0 largefiles updated, 0 removed
1658 0 largefiles updated, 0 removed
1659 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1659 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1660 $ hg -R http-clone st
1660 $ hg -R http-clone st
1661 ! f1
1661 ! f1
1662 $ [ ! -f http-clone/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1662 $ [ ! -f http-clone/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1663 $ [ ! -f http-clone/f1 ]
1663 $ [ ! -f http-clone/f1 ]
1664 $ [ ! -f http-clone-usercache ]
1664 $ [ ! -f http-clone-usercache ]
1665 $ hg -R http-clone verify --large --lfc
1665 $ hg -R http-clone verify --large --lfc
1666 checking changesets
1666 checking changesets
1667 checking manifests
1667 checking manifests
1668 crosschecking files in changesets and manifests
1668 crosschecking files in changesets and manifests
1669 checking files
1669 checking files
1670 1 files, 1 changesets, 1 total revisions
1670 1 files, 1 changesets, 1 total revisions
1671 searching 1 changesets for largefiles
1671 searching 1 changesets for largefiles
1672 verified contents of 1 revisions of 1 largefiles
1672 verified contents of 1 revisions of 1 largefiles
1673 $ hg -R http-clone up -Cqr null
1673 $ hg -R http-clone up -Cqr null
1674
1674
1675 largefiles pulled on update - no server side problems:
1675 largefiles pulled on update - no server side problems:
1676 $ mv 02a439e5c31c526465ab1a0ca1f431f76b827b90 empty/.hg/largefiles/
1676 $ mv 02a439e5c31c526465ab1a0ca1f431f76b827b90 empty/.hg/largefiles/
1677 $ hg -R http-clone --debug up --config largefiles.usercache=http-clone-usercache
1677 $ hg -R http-clone --debug up --config largefiles.usercache=http-clone-usercache
1678 resolving manifests
1678 resolving manifests
1679 overwrite: False, partial: False
1679 overwrite: False, partial: False
1680 ancestor: 000000000000, local: 000000000000+, remote: cf03e5bb9936
1680 ancestor: 000000000000, local: 000000000000+, remote: cf03e5bb9936
1681 .hglf/f1: remote created -> g
1681 .hglf/f1: remote created -> g
1682 updating: .hglf/f1 1/1 files (100.00%)
1682 updating: .hglf/f1 1/1 files (100.00%)
1683 getting .hglf/f1
1683 getting .hglf/f1
1684 getting changed largefiles
1684 getting changed largefiles
1685 using http://localhost:$HGPORT2/
1685 using http://localhost:$HGPORT2/
1686 sending capabilities command
1686 sending capabilities command
1687 getting largefiles: 0/1 lfile (0.00%)
1687 getting largefiles: 0/1 lfile (0.00%)
1688 getting f1:02a439e5c31c526465ab1a0ca1f431f76b827b90
1688 getting f1:02a439e5c31c526465ab1a0ca1f431f76b827b90
1689 sending batch command
1689 sending batch command
1690 sending getlfile command
1690 sending getlfile command
1691 found 02a439e5c31c526465ab1a0ca1f431f76b827b90 in store
1691 found 02a439e5c31c526465ab1a0ca1f431f76b827b90 in store
1692 1 largefiles updated, 0 removed
1692 1 largefiles updated, 0 removed
1693 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1693 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1694
1694
1695 $ ls http-clone-usercache/*
1695 $ ls http-clone-usercache/*
1696 http-clone-usercache/02a439e5c31c526465ab1a0ca1f431f76b827b90
1696 http-clone-usercache/02a439e5c31c526465ab1a0ca1f431f76b827b90
1697
1697
1698 $ rm -rf empty http-clone*
1698 $ rm -rf empty http-clone*
1699
1699
1700 used all HGPORTs, kill all daemons
1700 used all HGPORTs, kill all daemons
1701 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1701 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1702
1702
1703 #endif
1703 #endif
1704
1704
1705
1705
1706 #if unix-permissions
1706 #if unix-permissions
1707
1707
1708 Clone a local repository owned by another user
1708 Clone a local repository owned by another user
1709 We have to simulate that here by setting $HOME and removing write permissions
1709 We have to simulate that here by setting $HOME and removing write permissions
1710 $ ORIGHOME="$HOME"
1710 $ ORIGHOME="$HOME"
1711 $ mkdir alice
1711 $ mkdir alice
1712 $ HOME="`pwd`/alice"
1712 $ HOME="`pwd`/alice"
1713 $ cd alice
1713 $ cd alice
1714 $ hg init pubrepo
1714 $ hg init pubrepo
1715 $ cd pubrepo
1715 $ cd pubrepo
1716 $ dd if=/dev/zero bs=1k count=11k > a-large-file 2> /dev/null
1716 $ dd if=/dev/zero bs=1k count=11k > a-large-file 2> /dev/null
1717 $ hg add --large a-large-file
1717 $ hg add --large a-large-file
1718 $ hg commit -m "Add a large file"
1718 $ hg commit -m "Add a large file"
1719 Invoking status precommit hook
1719 Invoking status precommit hook
1720 A a-large-file
1720 A a-large-file
1721 $ cd ..
1721 $ cd ..
1722 $ chmod -R a-w pubrepo
1722 $ chmod -R a-w pubrepo
1723 $ cd ..
1723 $ cd ..
1724 $ mkdir bob
1724 $ mkdir bob
1725 $ HOME="`pwd`/bob"
1725 $ HOME="`pwd`/bob"
1726 $ cd bob
1726 $ cd bob
1727 $ hg clone --pull ../alice/pubrepo pubrepo
1727 $ hg clone --pull ../alice/pubrepo pubrepo
1728 requesting all changes
1728 requesting all changes
1729 adding changesets
1729 adding changesets
1730 adding manifests
1730 adding manifests
1731 adding file changes
1731 adding file changes
1732 added 1 changesets with 1 changes to 1 files
1732 added 1 changesets with 1 changes to 1 files
1733 updating to branch default
1733 updating to branch default
1734 getting changed largefiles
1734 getting changed largefiles
1735 1 largefiles updated, 0 removed
1735 1 largefiles updated, 0 removed
1736 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1736 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1737 $ cd ..
1737 $ cd ..
1738 $ chmod -R u+w alice/pubrepo
1738 $ chmod -R u+w alice/pubrepo
1739 $ HOME="$ORIGHOME"
1739 $ HOME="$ORIGHOME"
1740
1740
1741 #endif
1741 #endif
1742
1742
1743 #if symlink
1743 #if symlink
1744
1744
1745 Symlink to a large largefile should behave the same as a symlink to a normal file
1745 Symlink to a large largefile should behave the same as a symlink to a normal file
1746 $ hg init largesymlink
1746 $ hg init largesymlink
1747 $ cd largesymlink
1747 $ cd largesymlink
1748 $ dd if=/dev/zero bs=1k count=10k of=largefile 2>/dev/null
1748 $ dd if=/dev/zero bs=1k count=10k of=largefile 2>/dev/null
1749 $ hg add --large largefile
1749 $ hg add --large largefile
1750 $ hg commit -m "commit a large file"
1750 $ hg commit -m "commit a large file"
1751 Invoking status precommit hook
1751 Invoking status precommit hook
1752 A largefile
1752 A largefile
1753 $ ln -s largefile largelink
1753 $ ln -s largefile largelink
1754 $ hg add largelink
1754 $ hg add largelink
1755 $ hg commit -m "commit a large symlink"
1755 $ hg commit -m "commit a large symlink"
1756 Invoking status precommit hook
1756 Invoking status precommit hook
1757 A largelink
1757 A largelink
1758 $ rm -f largelink
1758 $ rm -f largelink
1759 $ hg up >/dev/null
1759 $ hg up >/dev/null
1760 $ test -f largelink
1760 $ test -f largelink
1761 [1]
1761 [1]
1762 $ test -L largelink
1762 $ test -L largelink
1763 [1]
1763 [1]
1764 $ rm -f largelink # make next part of the test independent of the previous
1764 $ rm -f largelink # make next part of the test independent of the previous
1765 $ hg up -C >/dev/null
1765 $ hg up -C >/dev/null
1766 $ test -f largelink
1766 $ test -f largelink
1767 $ test -L largelink
1767 $ test -L largelink
1768 $ cd ..
1768 $ cd ..
1769
1769
1770 #endif
1770 #endif
1771
1771
1772 test for pattern matching on 'hg status':
1772 test for pattern matching on 'hg status':
1773 to boost performance, largefiles checks whether specified patterns are
1773 to boost performance, largefiles checks whether specified patterns are
1774 related to largefiles in working directory (NOT to STANDIN) or not.
1774 related to largefiles in working directory (NOT to STANDIN) or not.
1775
1775
1776 $ hg init statusmatch
1776 $ hg init statusmatch
1777 $ cd statusmatch
1777 $ cd statusmatch
1778
1778
1779 $ mkdir -p a/b/c/d
1779 $ mkdir -p a/b/c/d
1780 $ echo normal > a/b/c/d/e.normal.txt
1780 $ echo normal > a/b/c/d/e.normal.txt
1781 $ hg add a/b/c/d/e.normal.txt
1781 $ hg add a/b/c/d/e.normal.txt
1782 $ echo large > a/b/c/d/e.large.txt
1782 $ echo large > a/b/c/d/e.large.txt
1783 $ hg add --large a/b/c/d/e.large.txt
1783 $ hg add --large a/b/c/d/e.large.txt
1784 $ mkdir -p a/b/c/x
1784 $ mkdir -p a/b/c/x
1785 $ echo normal > a/b/c/x/y.normal.txt
1785 $ echo normal > a/b/c/x/y.normal.txt
1786 $ hg add a/b/c/x/y.normal.txt
1786 $ hg add a/b/c/x/y.normal.txt
1787 $ hg commit -m 'add files'
1787 $ hg commit -m 'add files'
1788 Invoking status precommit hook
1788 Invoking status precommit hook
1789 A a/b/c/d/e.large.txt
1789 A a/b/c/d/e.large.txt
1790 A a/b/c/d/e.normal.txt
1790 A a/b/c/d/e.normal.txt
1791 A a/b/c/x/y.normal.txt
1791 A a/b/c/x/y.normal.txt
1792
1792
1793 (1) no pattern: no performance boost
1793 (1) no pattern: no performance boost
1794 $ hg status -A
1794 $ hg status -A
1795 C a/b/c/d/e.large.txt
1795 C a/b/c/d/e.large.txt
1796 C a/b/c/d/e.normal.txt
1796 C a/b/c/d/e.normal.txt
1797 C a/b/c/x/y.normal.txt
1797 C a/b/c/x/y.normal.txt
1798
1798
1799 (2) pattern not related to largefiles: performance boost
1799 (2) pattern not related to largefiles: performance boost
1800 $ hg status -A a/b/c/x
1800 $ hg status -A a/b/c/x
1801 C a/b/c/x/y.normal.txt
1801 C a/b/c/x/y.normal.txt
1802
1802
1803 (3) pattern related to largefiles: no performance boost
1803 (3) pattern related to largefiles: no performance boost
1804 $ hg status -A a/b/c/d
1804 $ hg status -A a/b/c/d
1805 C a/b/c/d/e.large.txt
1805 C a/b/c/d/e.large.txt
1806 C a/b/c/d/e.normal.txt
1806 C a/b/c/d/e.normal.txt
1807
1807
1808 (4) pattern related to STANDIN (not to largefiles): performance boost
1808 (4) pattern related to STANDIN (not to largefiles): performance boost
1809 $ hg status -A .hglf/a
1809 $ hg status -A .hglf/a
1810 C .hglf/a/b/c/d/e.large.txt
1810 C .hglf/a/b/c/d/e.large.txt
1811
1811
1812 (5) mixed case: no performance boost
1812 (5) mixed case: no performance boost
1813 $ hg status -A a/b/c/x a/b/c/d
1813 $ hg status -A a/b/c/x a/b/c/d
1814 C a/b/c/d/e.large.txt
1814 C a/b/c/d/e.large.txt
1815 C a/b/c/d/e.normal.txt
1815 C a/b/c/d/e.normal.txt
1816 C a/b/c/x/y.normal.txt
1816 C a/b/c/x/y.normal.txt
1817
1817
1818 verify that largefiles doesn't break filesets
1818 verify that largefiles doesn't break filesets
1819
1819
1820 $ hg log --rev . --exclude "set:binary()"
1820 $ hg log --rev . --exclude "set:binary()"
1821 changeset: 0:41bd42f10efa
1821 changeset: 0:41bd42f10efa
1822 tag: tip
1822 tag: tip
1823 user: test
1823 user: test
1824 date: Thu Jan 01 00:00:00 1970 +0000
1824 date: Thu Jan 01 00:00:00 1970 +0000
1825 summary: add files
1825 summary: add files
1826
1826
1827 verify that large files in subrepos handled properly
1827 verify that large files in subrepos handled properly
1828 $ hg init subrepo
1828 $ hg init subrepo
1829 $ echo "subrepo = subrepo" > .hgsub
1829 $ echo "subrepo = subrepo" > .hgsub
1830 $ hg add .hgsub
1830 $ hg add .hgsub
1831 $ hg ci -m "add subrepo"
1831 $ hg ci -m "add subrepo"
1832 Invoking status precommit hook
1832 Invoking status precommit hook
1833 A .hgsub
1833 A .hgsub
1834 ? .hgsubstate
1834 ? .hgsubstate
1835 $ echo "rev 1" > subrepo/large.txt
1835 $ echo "rev 1" > subrepo/large.txt
1836 $ hg -R subrepo add --large subrepo/large.txt
1836 $ hg -R subrepo add --large subrepo/large.txt
1837 $ hg sum
1837 $ hg sum
1838 parent: 1:8ee150ea2e9c tip
1838 parent: 1:8ee150ea2e9c tip
1839 add subrepo
1839 add subrepo
1840 branch: default
1840 branch: default
1841 commit: 1 subrepos
1841 commit: 1 subrepos
1842 update: (current)
1842 update: (current)
1843 $ hg st
1843 $ hg st
1844 $ hg st -S
1844 $ hg st -S
1845 A subrepo/large.txt
1845 A subrepo/large.txt
1846 $ hg ci -S -m "commit top repo"
1846 $ hg ci -S -m "commit top repo"
1847 committing subrepository subrepo
1847 committing subrepository subrepo
1848 Invoking status precommit hook
1848 Invoking status precommit hook
1849 A large.txt
1849 A large.txt
1850 Invoking status precommit hook
1850 Invoking status precommit hook
1851 M .hgsubstate
1851 M .hgsubstate
1852 # No differences
1852 # No differences
1853 $ hg st -S
1853 $ hg st -S
1854 $ hg sum
1854 $ hg sum
1855 parent: 2:ce4cd0c527a6 tip
1855 parent: 2:ce4cd0c527a6 tip
1856 commit top repo
1856 commit top repo
1857 branch: default
1857 branch: default
1858 commit: (clean)
1858 commit: (clean)
1859 update: (current)
1859 update: (current)
1860 $ echo "rev 2" > subrepo/large.txt
1860 $ echo "rev 2" > subrepo/large.txt
1861 $ hg st -S
1861 $ hg st -S
1862 M subrepo/large.txt
1862 M subrepo/large.txt
1863 $ hg sum
1863 $ hg sum
1864 parent: 2:ce4cd0c527a6 tip
1864 parent: 2:ce4cd0c527a6 tip
1865 commit top repo
1865 commit top repo
1866 branch: default
1866 branch: default
1867 commit: 1 subrepos
1867 commit: 1 subrepos
1868 update: (current)
1868 update: (current)
1869 $ hg ci -m "this commit should fail without -S"
1869 $ hg ci -m "this commit should fail without -S"
1870 abort: uncommitted changes in subrepo subrepo
1870 abort: uncommitted changes in subrepo subrepo
1871 (use --subrepos for recursive commit)
1871 (use --subrepos for recursive commit)
1872 [255]
1872 [255]
1873
1873
1874 Add a normal file to the subrepo, then test archiving
1874 Add a normal file to the subrepo, then test archiving
1875
1875
1876 $ echo 'normal file' > subrepo/normal.txt
1876 $ echo 'normal file' > subrepo/normal.txt
1877 $ hg -R subrepo add subrepo/normal.txt
1877 $ hg -R subrepo add subrepo/normal.txt
1878
1878
1879 Lock in subrepo, otherwise the change isn't archived
1879 Lock in subrepo, otherwise the change isn't archived
1880
1880
1881 $ hg ci -S -m "add normal file to top level"
1881 $ hg ci -S -m "add normal file to top level"
1882 committing subrepository subrepo
1882 committing subrepository subrepo
1883 Invoking status precommit hook
1883 Invoking status precommit hook
1884 M large.txt
1884 M large.txt
1885 A normal.txt
1885 A normal.txt
1886 Invoking status precommit hook
1886 Invoking status precommit hook
1887 M .hgsubstate
1887 M .hgsubstate
1888 $ hg archive -S ../lf_subrepo_archive
1888 $ hg archive -S ../lf_subrepo_archive
1889 $ find ../lf_subrepo_archive | sort
1889 $ find ../lf_subrepo_archive | sort
1890 ../lf_subrepo_archive
1890 ../lf_subrepo_archive
1891 ../lf_subrepo_archive/.hg_archival.txt
1891 ../lf_subrepo_archive/.hg_archival.txt
1892 ../lf_subrepo_archive/.hgsub
1892 ../lf_subrepo_archive/.hgsub
1893 ../lf_subrepo_archive/.hgsubstate
1893 ../lf_subrepo_archive/.hgsubstate
1894 ../lf_subrepo_archive/a
1894 ../lf_subrepo_archive/a
1895 ../lf_subrepo_archive/a/b
1895 ../lf_subrepo_archive/a/b
1896 ../lf_subrepo_archive/a/b/c
1896 ../lf_subrepo_archive/a/b/c
1897 ../lf_subrepo_archive/a/b/c/d
1897 ../lf_subrepo_archive/a/b/c/d
1898 ../lf_subrepo_archive/a/b/c/d/e.large.txt
1898 ../lf_subrepo_archive/a/b/c/d/e.large.txt
1899 ../lf_subrepo_archive/a/b/c/d/e.normal.txt
1899 ../lf_subrepo_archive/a/b/c/d/e.normal.txt
1900 ../lf_subrepo_archive/a/b/c/x
1900 ../lf_subrepo_archive/a/b/c/x
1901 ../lf_subrepo_archive/a/b/c/x/y.normal.txt
1901 ../lf_subrepo_archive/a/b/c/x/y.normal.txt
1902 ../lf_subrepo_archive/subrepo
1902 ../lf_subrepo_archive/subrepo
1903 ../lf_subrepo_archive/subrepo/large.txt
1903 ../lf_subrepo_archive/subrepo/large.txt
1904 ../lf_subrepo_archive/subrepo/normal.txt
1904 ../lf_subrepo_archive/subrepo/normal.txt
1905
1905
1906 Test update with subrepos.
1906 Test update with subrepos.
1907
1907
1908 $ hg update 0
1908 $ hg update 0
1909 getting changed largefiles
1909 getting changed largefiles
1910 0 largefiles updated, 1 removed
1910 0 largefiles updated, 1 removed
1911 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
1911 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
1912 $ hg status -S
1912 $ hg status -S
1913 $ hg update tip
1913 $ hg update tip
1914 getting changed largefiles
1914 getting changed largefiles
1915 1 largefiles updated, 0 removed
1915 1 largefiles updated, 0 removed
1916 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1916 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1917 $ hg status -S
1917 $ hg status -S
1918 # modify a large file
1918 # modify a large file
1919 $ echo "modified" > subrepo/large.txt
1919 $ echo "modified" > subrepo/large.txt
1920 $ hg st -S
1920 $ hg st -S
1921 M subrepo/large.txt
1921 M subrepo/large.txt
1922 # update -C should revert the change.
1922 # update -C should revert the change.
1923 $ hg update -C
1923 $ hg update -C
1924 getting changed largefiles
1924 getting changed largefiles
1925 1 largefiles updated, 0 removed
1925 1 largefiles updated, 0 removed
1926 getting changed largefiles
1926 getting changed largefiles
1927 0 largefiles updated, 0 removed
1927 0 largefiles updated, 0 removed
1928 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1928 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1929 $ hg status -S
1929 $ hg status -S
1930
1930
1931 Test archiving a revision that references a subrepo that is not yet
1931 Test archiving a revision that references a subrepo that is not yet
1932 cloned (see test-subrepo-recursion.t):
1932 cloned (see test-subrepo-recursion.t):
1933
1933
1934 $ hg clone -U . ../empty
1934 $ hg clone -U . ../empty
1935 $ cd ../empty
1935 $ cd ../empty
1936 $ hg archive --subrepos -r tip ../archive.tar.gz
1936 $ hg archive --subrepos -r tip ../archive.tar.gz
1937 cloning subrepo subrepo from $TESTTMP/statusmatch/subrepo
1937 cloning subrepo subrepo from $TESTTMP/statusmatch/subrepo
1938 $ cd ..
1938 $ cd ..
1939
1939
1940 Test that addremove picks up largefiles prior to the initial commit (issue3541)
1940 Test that addremove picks up largefiles prior to the initial commit (issue3541)
1941
1941
1942 $ hg init addrm2
1942 $ hg init addrm2
1943 $ cd addrm2
1943 $ cd addrm2
1944 $ touch large.dat
1944 $ touch large.dat
1945 $ touch large2.dat
1945 $ touch large2.dat
1946 $ touch normal
1946 $ touch normal
1947 $ hg add --large large.dat
1947 $ hg add --large large.dat
1948 $ hg addremove -v
1948 $ hg addremove -v
1949 adding large2.dat as a largefile
1949 adding large2.dat as a largefile
1950 adding normal
1950 adding normal
1951
1951
1952 Test that forgetting all largefiles reverts to islfilesrepo() == False
1952 Test that forgetting all largefiles reverts to islfilesrepo() == False
1953 (addremove will add *.dat as normal files now)
1953 (addremove will add *.dat as normal files now)
1954 $ hg forget large.dat
1954 $ hg forget large.dat
1955 $ hg forget large2.dat
1955 $ hg forget large2.dat
1956 $ hg addremove -v
1956 $ hg addremove -v
1957 adding large.dat
1957 adding large.dat
1958 adding large2.dat
1958 adding large2.dat
1959
1959
1960 Test commit's addremove option prior to the first commit
1960 Test commit's addremove option prior to the first commit
1961 $ hg forget large.dat
1961 $ hg forget large.dat
1962 $ hg forget large2.dat
1962 $ hg forget large2.dat
1963 $ hg add --large large.dat
1963 $ hg add --large large.dat
1964 $ hg ci -Am "commit"
1964 $ hg ci -Am "commit"
1965 adding large2.dat as a largefile
1965 adding large2.dat as a largefile
1966 Invoking status precommit hook
1966 Invoking status precommit hook
1967 A large.dat
1967 A large.dat
1968 A large2.dat
1968 A large2.dat
1969 A normal
1969 A normal
1970 $ find .hglf | sort
1970 $ find .hglf | sort
1971 .hglf
1971 .hglf
1972 .hglf/large.dat
1972 .hglf/large.dat
1973 .hglf/large2.dat
1973 .hglf/large2.dat
1974
1974
1975 Test actions on largefiles using relative paths from subdir
1975 Test actions on largefiles using relative paths from subdir
1976
1976
1977 $ mkdir sub
1977 $ mkdir sub
1978 $ cd sub
1978 $ cd sub
1979 $ echo anotherlarge > anotherlarge
1979 $ echo anotherlarge > anotherlarge
1980 $ hg add --large anotherlarge
1980 $ hg add --large anotherlarge
1981 $ hg st
1981 $ hg st
1982 A sub/anotherlarge
1982 A sub/anotherlarge
1983 $ hg st anotherlarge
1983 $ hg st anotherlarge
1984 A anotherlarge
1984 A anotherlarge
1985 $ hg commit -m anotherlarge anotherlarge
1985 $ hg commit -m anotherlarge anotherlarge
1986 Invoking status precommit hook
1986 Invoking status precommit hook
1987 A sub/anotherlarge
1987 A sub/anotherlarge
1988 $ hg log anotherlarge
1988 $ hg log anotherlarge
1989 changeset: 1:9627a577c5e9
1989 changeset: 1:9627a577c5e9
1990 tag: tip
1990 tag: tip
1991 user: test
1991 user: test
1992 date: Thu Jan 01 00:00:00 1970 +0000
1992 date: Thu Jan 01 00:00:00 1970 +0000
1993 summary: anotherlarge
1993 summary: anotherlarge
1994
1994
1995 $ echo more >> anotherlarge
1995 $ echo more >> anotherlarge
1996 $ hg st .
1996 $ hg st .
1997 M anotherlarge
1997 M anotherlarge
1998 $ hg cat anotherlarge
1998 $ hg cat anotherlarge
1999 anotherlarge
1999 anotherlarge
2000 $ hg revert anotherlarge
2000 $ hg revert anotherlarge
2001 $ hg st
2001 $ hg st
2002 ? sub/anotherlarge.orig
2002 ? sub/anotherlarge.orig
2003 $ cd ..
2003 $ cd ..
2004
2004
2005 $ cd ..
2005 $ cd ..
2006
2006
2007 issue3651: summary/outgoing with largefiles shows "no remote repo"
2007 issue3651: summary/outgoing with largefiles shows "no remote repo"
2008 unexpectedly
2008 unexpectedly
2009
2009
2010 $ mkdir issue3651
2010 $ mkdir issue3651
2011 $ cd issue3651
2011 $ cd issue3651
2012
2012
2013 $ hg init src
2013 $ hg init src
2014 $ echo a > src/a
2014 $ echo a > src/a
2015 $ hg -R src add --large src/a
2015 $ hg -R src add --large src/a
2016 $ hg -R src commit -m '#0'
2016 $ hg -R src commit -m '#0'
2017 Invoking status precommit hook
2017 Invoking status precommit hook
2018 A a
2018 A a
2019
2019
2020 check messages when no remote repository is specified:
2020 check messages when no remote repository is specified:
2021 "no remote repo" route for "hg outgoing --large" is not tested here,
2021 "no remote repo" route for "hg outgoing --large" is not tested here,
2022 because it can't be reproduced easily.
2022 because it can't be reproduced easily.
2023
2023
2024 $ hg init clone1
2024 $ hg init clone1
2025 $ hg -R clone1 -q pull src
2025 $ hg -R clone1 -q pull src
2026 $ hg -R clone1 -q update
2026 $ hg -R clone1 -q update
2027 $ hg -R clone1 paths | grep default
2027 $ hg -R clone1 paths | grep default
2028 [1]
2028 [1]
2029
2029
2030 $ hg -R clone1 summary --large
2030 $ hg -R clone1 summary --large
2031 parent: 0:fc0bd45326d3 tip
2031 parent: 0:fc0bd45326d3 tip
2032 #0
2032 #0
2033 branch: default
2033 branch: default
2034 commit: (clean)
2034 commit: (clean)
2035 update: (current)
2035 update: (current)
2036 largefiles: (no remote repo)
2036 largefiles: (no remote repo)
2037
2037
2038 check messages when there is no files to upload:
2038 check messages when there is no files to upload:
2039
2039
2040 $ hg -q clone src clone2
2040 $ hg -q clone src clone2
2041 $ hg -R clone2 paths | grep default
2041 $ hg -R clone2 paths | grep default
2042 default = $TESTTMP/issue3651/src (glob)
2042 default = $TESTTMP/issue3651/src (glob)
2043
2043
2044 $ hg -R clone2 summary --large
2044 $ hg -R clone2 summary --large
2045 parent: 0:fc0bd45326d3 tip
2045 parent: 0:fc0bd45326d3 tip
2046 #0
2046 #0
2047 branch: default
2047 branch: default
2048 commit: (clean)
2048 commit: (clean)
2049 update: (current)
2049 update: (current)
2050 searching for changes
2050 searching for changes
2051 largefiles: (no files to upload)
2051 largefiles: (no files to upload)
2052 $ hg -R clone2 outgoing --large
2052 $ hg -R clone2 outgoing --large
2053 comparing with $TESTTMP/issue3651/src (glob)
2053 comparing with $TESTTMP/issue3651/src (glob)
2054 searching for changes
2054 searching for changes
2055 no changes found
2055 no changes found
2056 searching for changes
2056 searching for changes
2057 largefiles: no files to upload
2057 largefiles: no files to upload
2058 [1]
2058 [1]
2059
2059
2060 check messages when there are files to upload:
2060 check messages when there are files to upload:
2061
2061
2062 $ echo b > clone2/b
2062 $ echo b > clone2/b
2063 $ hg -R clone2 add --large clone2/b
2063 $ hg -R clone2 add --large clone2/b
2064 $ hg -R clone2 commit -m '#1'
2064 $ hg -R clone2 commit -m '#1'
2065 Invoking status precommit hook
2065 Invoking status precommit hook
2066 A b
2066 A b
2067 $ hg -R clone2 summary --large
2067 $ hg -R clone2 summary --large
2068 parent: 1:1acbe71ce432 tip
2068 parent: 1:1acbe71ce432 tip
2069 #1
2069 #1
2070 branch: default
2070 branch: default
2071 commit: (clean)
2071 commit: (clean)
2072 update: (current)
2072 update: (current)
2073 searching for changes
2073 searching for changes
2074 largefiles: 1 to upload
2074 largefiles: 1 to upload
2075 $ hg -R clone2 outgoing --large
2075 $ hg -R clone2 outgoing --large
2076 comparing with $TESTTMP/issue3651/src (glob)
2076 comparing with $TESTTMP/issue3651/src (glob)
2077 searching for changes
2077 searching for changes
2078 changeset: 1:1acbe71ce432
2078 changeset: 1:1acbe71ce432
2079 tag: tip
2079 tag: tip
2080 user: test
2080 user: test
2081 date: Thu Jan 01 00:00:00 1970 +0000
2081 date: Thu Jan 01 00:00:00 1970 +0000
2082 summary: #1
2082 summary: #1
2083
2083
2084 searching for changes
2084 searching for changes
2085 largefiles to upload:
2085 largefiles to upload:
2086 b
2086 b
2087
2087
2088
2088
2089 $ cd ..
2089 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now