##// END OF EJS Templates
repo: rephrase the "missing requirement" error message...
Mads Kiilerich -
r20820:f8e531a3 default
parent child Browse files
Show More
@@ -1,932 +1,932 b''
1 # scmutil.py - Mercurial core utility functions
1 # scmutil.py - Mercurial core utility functions
2 #
2 #
3 # Copyright Matt Mackall <mpm@selenic.com>
3 # Copyright Matt Mackall <mpm@selenic.com>
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8 from i18n import _
8 from i18n import _
9 from mercurial.node import nullrev
9 from mercurial.node import nullrev
10 import util, error, osutil, revset, similar, encoding, phases, parsers
10 import util, error, osutil, revset, similar, encoding, phases, parsers
11 import pathutil
11 import pathutil
12 import match as matchmod
12 import match as matchmod
13 import os, errno, re, glob
13 import os, errno, re, glob
14
14
15 if os.name == 'nt':
15 if os.name == 'nt':
16 import scmwindows as scmplatform
16 import scmwindows as scmplatform
17 else:
17 else:
18 import scmposix as scmplatform
18 import scmposix as scmplatform
19
19
20 systemrcpath = scmplatform.systemrcpath
20 systemrcpath = scmplatform.systemrcpath
21 userrcpath = scmplatform.userrcpath
21 userrcpath = scmplatform.userrcpath
22
22
23 def itersubrepos(ctx1, ctx2):
23 def itersubrepos(ctx1, ctx2):
24 """find subrepos in ctx1 or ctx2"""
24 """find subrepos in ctx1 or ctx2"""
25 # Create a (subpath, ctx) mapping where we prefer subpaths from
25 # Create a (subpath, ctx) mapping where we prefer subpaths from
26 # ctx1. The subpaths from ctx2 are important when the .hgsub file
26 # ctx1. The subpaths from ctx2 are important when the .hgsub file
27 # has been modified (in ctx2) but not yet committed (in ctx1).
27 # has been modified (in ctx2) but not yet committed (in ctx1).
28 subpaths = dict.fromkeys(ctx2.substate, ctx2)
28 subpaths = dict.fromkeys(ctx2.substate, ctx2)
29 subpaths.update(dict.fromkeys(ctx1.substate, ctx1))
29 subpaths.update(dict.fromkeys(ctx1.substate, ctx1))
30 for subpath, ctx in sorted(subpaths.iteritems()):
30 for subpath, ctx in sorted(subpaths.iteritems()):
31 yield subpath, ctx.sub(subpath)
31 yield subpath, ctx.sub(subpath)
32
32
33 def nochangesfound(ui, repo, excluded=None):
33 def nochangesfound(ui, repo, excluded=None):
34 '''Report no changes for push/pull, excluded is None or a list of
34 '''Report no changes for push/pull, excluded is None or a list of
35 nodes excluded from the push/pull.
35 nodes excluded from the push/pull.
36 '''
36 '''
37 secretlist = []
37 secretlist = []
38 if excluded:
38 if excluded:
39 for n in excluded:
39 for n in excluded:
40 if n not in repo:
40 if n not in repo:
41 # discovery should not have included the filtered revision,
41 # discovery should not have included the filtered revision,
42 # we have to explicitly exclude it until discovery is cleanup.
42 # we have to explicitly exclude it until discovery is cleanup.
43 continue
43 continue
44 ctx = repo[n]
44 ctx = repo[n]
45 if ctx.phase() >= phases.secret and not ctx.extinct():
45 if ctx.phase() >= phases.secret and not ctx.extinct():
46 secretlist.append(n)
46 secretlist.append(n)
47
47
48 if secretlist:
48 if secretlist:
49 ui.status(_("no changes found (ignored %d secret changesets)\n")
49 ui.status(_("no changes found (ignored %d secret changesets)\n")
50 % len(secretlist))
50 % len(secretlist))
51 else:
51 else:
52 ui.status(_("no changes found\n"))
52 ui.status(_("no changes found\n"))
53
53
54 def checknewlabel(repo, lbl, kind):
54 def checknewlabel(repo, lbl, kind):
55 # Do not use the "kind" parameter in ui output.
55 # Do not use the "kind" parameter in ui output.
56 # It makes strings difficult to translate.
56 # It makes strings difficult to translate.
57 if lbl in ['tip', '.', 'null']:
57 if lbl in ['tip', '.', 'null']:
58 raise util.Abort(_("the name '%s' is reserved") % lbl)
58 raise util.Abort(_("the name '%s' is reserved") % lbl)
59 for c in (':', '\0', '\n', '\r'):
59 for c in (':', '\0', '\n', '\r'):
60 if c in lbl:
60 if c in lbl:
61 raise util.Abort(_("%r cannot be used in a name") % c)
61 raise util.Abort(_("%r cannot be used in a name") % c)
62 try:
62 try:
63 int(lbl)
63 int(lbl)
64 raise util.Abort(_("cannot use an integer as a name"))
64 raise util.Abort(_("cannot use an integer as a name"))
65 except ValueError:
65 except ValueError:
66 pass
66 pass
67
67
68 def checkfilename(f):
68 def checkfilename(f):
69 '''Check that the filename f is an acceptable filename for a tracked file'''
69 '''Check that the filename f is an acceptable filename for a tracked file'''
70 if '\r' in f or '\n' in f:
70 if '\r' in f or '\n' in f:
71 raise util.Abort(_("'\\n' and '\\r' disallowed in filenames: %r") % f)
71 raise util.Abort(_("'\\n' and '\\r' disallowed in filenames: %r") % f)
72
72
73 def checkportable(ui, f):
73 def checkportable(ui, f):
74 '''Check if filename f is portable and warn or abort depending on config'''
74 '''Check if filename f is portable and warn or abort depending on config'''
75 checkfilename(f)
75 checkfilename(f)
76 abort, warn = checkportabilityalert(ui)
76 abort, warn = checkportabilityalert(ui)
77 if abort or warn:
77 if abort or warn:
78 msg = util.checkwinfilename(f)
78 msg = util.checkwinfilename(f)
79 if msg:
79 if msg:
80 msg = "%s: %r" % (msg, f)
80 msg = "%s: %r" % (msg, f)
81 if abort:
81 if abort:
82 raise util.Abort(msg)
82 raise util.Abort(msg)
83 ui.warn(_("warning: %s\n") % msg)
83 ui.warn(_("warning: %s\n") % msg)
84
84
85 def checkportabilityalert(ui):
85 def checkportabilityalert(ui):
86 '''check if the user's config requests nothing, a warning, or abort for
86 '''check if the user's config requests nothing, a warning, or abort for
87 non-portable filenames'''
87 non-portable filenames'''
88 val = ui.config('ui', 'portablefilenames', 'warn')
88 val = ui.config('ui', 'portablefilenames', 'warn')
89 lval = val.lower()
89 lval = val.lower()
90 bval = util.parsebool(val)
90 bval = util.parsebool(val)
91 abort = os.name == 'nt' or lval == 'abort'
91 abort = os.name == 'nt' or lval == 'abort'
92 warn = bval or lval == 'warn'
92 warn = bval or lval == 'warn'
93 if bval is None and not (warn or abort or lval == 'ignore'):
93 if bval is None and not (warn or abort or lval == 'ignore'):
94 raise error.ConfigError(
94 raise error.ConfigError(
95 _("ui.portablefilenames value is invalid ('%s')") % val)
95 _("ui.portablefilenames value is invalid ('%s')") % val)
96 return abort, warn
96 return abort, warn
97
97
98 class casecollisionauditor(object):
98 class casecollisionauditor(object):
99 def __init__(self, ui, abort, dirstate):
99 def __init__(self, ui, abort, dirstate):
100 self._ui = ui
100 self._ui = ui
101 self._abort = abort
101 self._abort = abort
102 allfiles = '\0'.join(dirstate._map)
102 allfiles = '\0'.join(dirstate._map)
103 self._loweredfiles = set(encoding.lower(allfiles).split('\0'))
103 self._loweredfiles = set(encoding.lower(allfiles).split('\0'))
104 self._dirstate = dirstate
104 self._dirstate = dirstate
105 # The purpose of _newfiles is so that we don't complain about
105 # The purpose of _newfiles is so that we don't complain about
106 # case collisions if someone were to call this object with the
106 # case collisions if someone were to call this object with the
107 # same filename twice.
107 # same filename twice.
108 self._newfiles = set()
108 self._newfiles = set()
109
109
110 def __call__(self, f):
110 def __call__(self, f):
111 if f in self._newfiles:
111 if f in self._newfiles:
112 return
112 return
113 fl = encoding.lower(f)
113 fl = encoding.lower(f)
114 if fl in self._loweredfiles and f not in self._dirstate:
114 if fl in self._loweredfiles and f not in self._dirstate:
115 msg = _('possible case-folding collision for %s') % f
115 msg = _('possible case-folding collision for %s') % f
116 if self._abort:
116 if self._abort:
117 raise util.Abort(msg)
117 raise util.Abort(msg)
118 self._ui.warn(_("warning: %s\n") % msg)
118 self._ui.warn(_("warning: %s\n") % msg)
119 self._loweredfiles.add(fl)
119 self._loweredfiles.add(fl)
120 self._newfiles.add(f)
120 self._newfiles.add(f)
121
121
122 class abstractvfs(object):
122 class abstractvfs(object):
123 """Abstract base class; cannot be instantiated"""
123 """Abstract base class; cannot be instantiated"""
124
124
125 def __init__(self, *args, **kwargs):
125 def __init__(self, *args, **kwargs):
126 '''Prevent instantiation; don't call this from subclasses.'''
126 '''Prevent instantiation; don't call this from subclasses.'''
127 raise NotImplementedError('attempted instantiating ' + str(type(self)))
127 raise NotImplementedError('attempted instantiating ' + str(type(self)))
128
128
129 def tryread(self, path):
129 def tryread(self, path):
130 '''gracefully return an empty string for missing files'''
130 '''gracefully return an empty string for missing files'''
131 try:
131 try:
132 return self.read(path)
132 return self.read(path)
133 except IOError, inst:
133 except IOError, inst:
134 if inst.errno != errno.ENOENT:
134 if inst.errno != errno.ENOENT:
135 raise
135 raise
136 return ""
136 return ""
137
137
138 def open(self, path, mode="r", text=False, atomictemp=False):
138 def open(self, path, mode="r", text=False, atomictemp=False):
139 self.open = self.__call__
139 self.open = self.__call__
140 return self.__call__(path, mode, text, atomictemp)
140 return self.__call__(path, mode, text, atomictemp)
141
141
142 def read(self, path):
142 def read(self, path):
143 fp = self(path, 'rb')
143 fp = self(path, 'rb')
144 try:
144 try:
145 return fp.read()
145 return fp.read()
146 finally:
146 finally:
147 fp.close()
147 fp.close()
148
148
149 def write(self, path, data):
149 def write(self, path, data):
150 fp = self(path, 'wb')
150 fp = self(path, 'wb')
151 try:
151 try:
152 return fp.write(data)
152 return fp.write(data)
153 finally:
153 finally:
154 fp.close()
154 fp.close()
155
155
156 def append(self, path, data):
156 def append(self, path, data):
157 fp = self(path, 'ab')
157 fp = self(path, 'ab')
158 try:
158 try:
159 return fp.write(data)
159 return fp.write(data)
160 finally:
160 finally:
161 fp.close()
161 fp.close()
162
162
163 def chmod(self, path, mode):
163 def chmod(self, path, mode):
164 return os.chmod(self.join(path), mode)
164 return os.chmod(self.join(path), mode)
165
165
166 def exists(self, path=None):
166 def exists(self, path=None):
167 return os.path.exists(self.join(path))
167 return os.path.exists(self.join(path))
168
168
169 def fstat(self, fp):
169 def fstat(self, fp):
170 return util.fstat(fp)
170 return util.fstat(fp)
171
171
172 def isdir(self, path=None):
172 def isdir(self, path=None):
173 return os.path.isdir(self.join(path))
173 return os.path.isdir(self.join(path))
174
174
175 def isfile(self, path=None):
175 def isfile(self, path=None):
176 return os.path.isfile(self.join(path))
176 return os.path.isfile(self.join(path))
177
177
178 def islink(self, path=None):
178 def islink(self, path=None):
179 return os.path.islink(self.join(path))
179 return os.path.islink(self.join(path))
180
180
181 def lstat(self, path=None):
181 def lstat(self, path=None):
182 return os.lstat(self.join(path))
182 return os.lstat(self.join(path))
183
183
184 def makedir(self, path=None, notindexed=True):
184 def makedir(self, path=None, notindexed=True):
185 return util.makedir(self.join(path), notindexed)
185 return util.makedir(self.join(path), notindexed)
186
186
187 def makedirs(self, path=None, mode=None):
187 def makedirs(self, path=None, mode=None):
188 return util.makedirs(self.join(path), mode)
188 return util.makedirs(self.join(path), mode)
189
189
190 def makelock(self, info, path):
190 def makelock(self, info, path):
191 return util.makelock(info, self.join(path))
191 return util.makelock(info, self.join(path))
192
192
193 def mkdir(self, path=None):
193 def mkdir(self, path=None):
194 return os.mkdir(self.join(path))
194 return os.mkdir(self.join(path))
195
195
196 def readdir(self, path=None, stat=None, skip=None):
196 def readdir(self, path=None, stat=None, skip=None):
197 return osutil.listdir(self.join(path), stat, skip)
197 return osutil.listdir(self.join(path), stat, skip)
198
198
199 def readlock(self, path):
199 def readlock(self, path):
200 return util.readlock(self.join(path))
200 return util.readlock(self.join(path))
201
201
202 def rename(self, src, dst):
202 def rename(self, src, dst):
203 return util.rename(self.join(src), self.join(dst))
203 return util.rename(self.join(src), self.join(dst))
204
204
205 def readlink(self, path):
205 def readlink(self, path):
206 return os.readlink(self.join(path))
206 return os.readlink(self.join(path))
207
207
208 def setflags(self, path, l, x):
208 def setflags(self, path, l, x):
209 return util.setflags(self.join(path), l, x)
209 return util.setflags(self.join(path), l, x)
210
210
211 def stat(self, path=None):
211 def stat(self, path=None):
212 return os.stat(self.join(path))
212 return os.stat(self.join(path))
213
213
214 def unlink(self, path=None):
214 def unlink(self, path=None):
215 return util.unlink(self.join(path))
215 return util.unlink(self.join(path))
216
216
217 def utime(self, path=None, t=None):
217 def utime(self, path=None, t=None):
218 return os.utime(self.join(path), t)
218 return os.utime(self.join(path), t)
219
219
220 class vfs(abstractvfs):
220 class vfs(abstractvfs):
221 '''Operate files relative to a base directory
221 '''Operate files relative to a base directory
222
222
223 This class is used to hide the details of COW semantics and
223 This class is used to hide the details of COW semantics and
224 remote file access from higher level code.
224 remote file access from higher level code.
225 '''
225 '''
226 def __init__(self, base, audit=True, expandpath=False, realpath=False):
226 def __init__(self, base, audit=True, expandpath=False, realpath=False):
227 if expandpath:
227 if expandpath:
228 base = util.expandpath(base)
228 base = util.expandpath(base)
229 if realpath:
229 if realpath:
230 base = os.path.realpath(base)
230 base = os.path.realpath(base)
231 self.base = base
231 self.base = base
232 self._setmustaudit(audit)
232 self._setmustaudit(audit)
233 self.createmode = None
233 self.createmode = None
234 self._trustnlink = None
234 self._trustnlink = None
235
235
236 def _getmustaudit(self):
236 def _getmustaudit(self):
237 return self._audit
237 return self._audit
238
238
239 def _setmustaudit(self, onoff):
239 def _setmustaudit(self, onoff):
240 self._audit = onoff
240 self._audit = onoff
241 if onoff:
241 if onoff:
242 self.audit = pathutil.pathauditor(self.base)
242 self.audit = pathutil.pathauditor(self.base)
243 else:
243 else:
244 self.audit = util.always
244 self.audit = util.always
245
245
246 mustaudit = property(_getmustaudit, _setmustaudit)
246 mustaudit = property(_getmustaudit, _setmustaudit)
247
247
248 @util.propertycache
248 @util.propertycache
249 def _cansymlink(self):
249 def _cansymlink(self):
250 return util.checklink(self.base)
250 return util.checklink(self.base)
251
251
252 @util.propertycache
252 @util.propertycache
253 def _chmod(self):
253 def _chmod(self):
254 return util.checkexec(self.base)
254 return util.checkexec(self.base)
255
255
256 def _fixfilemode(self, name):
256 def _fixfilemode(self, name):
257 if self.createmode is None or not self._chmod:
257 if self.createmode is None or not self._chmod:
258 return
258 return
259 os.chmod(name, self.createmode & 0666)
259 os.chmod(name, self.createmode & 0666)
260
260
261 def __call__(self, path, mode="r", text=False, atomictemp=False):
261 def __call__(self, path, mode="r", text=False, atomictemp=False):
262 if self._audit:
262 if self._audit:
263 r = util.checkosfilename(path)
263 r = util.checkosfilename(path)
264 if r:
264 if r:
265 raise util.Abort("%s: %r" % (r, path))
265 raise util.Abort("%s: %r" % (r, path))
266 self.audit(path)
266 self.audit(path)
267 f = self.join(path)
267 f = self.join(path)
268
268
269 if not text and "b" not in mode:
269 if not text and "b" not in mode:
270 mode += "b" # for that other OS
270 mode += "b" # for that other OS
271
271
272 nlink = -1
272 nlink = -1
273 if mode not in ('r', 'rb'):
273 if mode not in ('r', 'rb'):
274 dirname, basename = util.split(f)
274 dirname, basename = util.split(f)
275 # If basename is empty, then the path is malformed because it points
275 # If basename is empty, then the path is malformed because it points
276 # to a directory. Let the posixfile() call below raise IOError.
276 # to a directory. Let the posixfile() call below raise IOError.
277 if basename:
277 if basename:
278 if atomictemp:
278 if atomictemp:
279 util.ensuredirs(dirname, self.createmode)
279 util.ensuredirs(dirname, self.createmode)
280 return util.atomictempfile(f, mode, self.createmode)
280 return util.atomictempfile(f, mode, self.createmode)
281 try:
281 try:
282 if 'w' in mode:
282 if 'w' in mode:
283 util.unlink(f)
283 util.unlink(f)
284 nlink = 0
284 nlink = 0
285 else:
285 else:
286 # nlinks() may behave differently for files on Windows
286 # nlinks() may behave differently for files on Windows
287 # shares if the file is open.
287 # shares if the file is open.
288 fd = util.posixfile(f)
288 fd = util.posixfile(f)
289 nlink = util.nlinks(f)
289 nlink = util.nlinks(f)
290 if nlink < 1:
290 if nlink < 1:
291 nlink = 2 # force mktempcopy (issue1922)
291 nlink = 2 # force mktempcopy (issue1922)
292 fd.close()
292 fd.close()
293 except (OSError, IOError), e:
293 except (OSError, IOError), e:
294 if e.errno != errno.ENOENT:
294 if e.errno != errno.ENOENT:
295 raise
295 raise
296 nlink = 0
296 nlink = 0
297 util.ensuredirs(dirname, self.createmode)
297 util.ensuredirs(dirname, self.createmode)
298 if nlink > 0:
298 if nlink > 0:
299 if self._trustnlink is None:
299 if self._trustnlink is None:
300 self._trustnlink = nlink > 1 or util.checknlink(f)
300 self._trustnlink = nlink > 1 or util.checknlink(f)
301 if nlink > 1 or not self._trustnlink:
301 if nlink > 1 or not self._trustnlink:
302 util.rename(util.mktempcopy(f), f)
302 util.rename(util.mktempcopy(f), f)
303 fp = util.posixfile(f, mode)
303 fp = util.posixfile(f, mode)
304 if nlink == 0:
304 if nlink == 0:
305 self._fixfilemode(f)
305 self._fixfilemode(f)
306 return fp
306 return fp
307
307
308 def symlink(self, src, dst):
308 def symlink(self, src, dst):
309 self.audit(dst)
309 self.audit(dst)
310 linkname = self.join(dst)
310 linkname = self.join(dst)
311 try:
311 try:
312 os.unlink(linkname)
312 os.unlink(linkname)
313 except OSError:
313 except OSError:
314 pass
314 pass
315
315
316 util.ensuredirs(os.path.dirname(linkname), self.createmode)
316 util.ensuredirs(os.path.dirname(linkname), self.createmode)
317
317
318 if self._cansymlink:
318 if self._cansymlink:
319 try:
319 try:
320 os.symlink(src, linkname)
320 os.symlink(src, linkname)
321 except OSError, err:
321 except OSError, err:
322 raise OSError(err.errno, _('could not symlink to %r: %s') %
322 raise OSError(err.errno, _('could not symlink to %r: %s') %
323 (src, err.strerror), linkname)
323 (src, err.strerror), linkname)
324 else:
324 else:
325 self.write(dst, src)
325 self.write(dst, src)
326
326
327 def join(self, path):
327 def join(self, path):
328 if path:
328 if path:
329 return os.path.join(self.base, path)
329 return os.path.join(self.base, path)
330 else:
330 else:
331 return self.base
331 return self.base
332
332
333 opener = vfs
333 opener = vfs
334
334
335 class auditvfs(object):
335 class auditvfs(object):
336 def __init__(self, vfs):
336 def __init__(self, vfs):
337 self.vfs = vfs
337 self.vfs = vfs
338
338
339 def _getmustaudit(self):
339 def _getmustaudit(self):
340 return self.vfs.mustaudit
340 return self.vfs.mustaudit
341
341
342 def _setmustaudit(self, onoff):
342 def _setmustaudit(self, onoff):
343 self.vfs.mustaudit = onoff
343 self.vfs.mustaudit = onoff
344
344
345 mustaudit = property(_getmustaudit, _setmustaudit)
345 mustaudit = property(_getmustaudit, _setmustaudit)
346
346
347 class filtervfs(abstractvfs, auditvfs):
347 class filtervfs(abstractvfs, auditvfs):
348 '''Wrapper vfs for filtering filenames with a function.'''
348 '''Wrapper vfs for filtering filenames with a function.'''
349
349
350 def __init__(self, vfs, filter):
350 def __init__(self, vfs, filter):
351 auditvfs.__init__(self, vfs)
351 auditvfs.__init__(self, vfs)
352 self._filter = filter
352 self._filter = filter
353
353
354 def __call__(self, path, *args, **kwargs):
354 def __call__(self, path, *args, **kwargs):
355 return self.vfs(self._filter(path), *args, **kwargs)
355 return self.vfs(self._filter(path), *args, **kwargs)
356
356
357 def join(self, path):
357 def join(self, path):
358 if path:
358 if path:
359 return self.vfs.join(self._filter(path))
359 return self.vfs.join(self._filter(path))
360 else:
360 else:
361 return self.vfs.join(path)
361 return self.vfs.join(path)
362
362
363 filteropener = filtervfs
363 filteropener = filtervfs
364
364
365 class readonlyvfs(abstractvfs, auditvfs):
365 class readonlyvfs(abstractvfs, auditvfs):
366 '''Wrapper vfs preventing any writing.'''
366 '''Wrapper vfs preventing any writing.'''
367
367
368 def __init__(self, vfs):
368 def __init__(self, vfs):
369 auditvfs.__init__(self, vfs)
369 auditvfs.__init__(self, vfs)
370
370
371 def __call__(self, path, mode='r', *args, **kw):
371 def __call__(self, path, mode='r', *args, **kw):
372 if mode not in ('r', 'rb'):
372 if mode not in ('r', 'rb'):
373 raise util.Abort('this vfs is read only')
373 raise util.Abort('this vfs is read only')
374 return self.vfs(path, mode, *args, **kw)
374 return self.vfs(path, mode, *args, **kw)
375
375
376
376
377 def walkrepos(path, followsym=False, seen_dirs=None, recurse=False):
377 def walkrepos(path, followsym=False, seen_dirs=None, recurse=False):
378 '''yield every hg repository under path, always recursively.
378 '''yield every hg repository under path, always recursively.
379 The recurse flag will only control recursion into repo working dirs'''
379 The recurse flag will only control recursion into repo working dirs'''
380 def errhandler(err):
380 def errhandler(err):
381 if err.filename == path:
381 if err.filename == path:
382 raise err
382 raise err
383 samestat = getattr(os.path, 'samestat', None)
383 samestat = getattr(os.path, 'samestat', None)
384 if followsym and samestat is not None:
384 if followsym and samestat is not None:
385 def adddir(dirlst, dirname):
385 def adddir(dirlst, dirname):
386 match = False
386 match = False
387 dirstat = os.stat(dirname)
387 dirstat = os.stat(dirname)
388 for lstdirstat in dirlst:
388 for lstdirstat in dirlst:
389 if samestat(dirstat, lstdirstat):
389 if samestat(dirstat, lstdirstat):
390 match = True
390 match = True
391 break
391 break
392 if not match:
392 if not match:
393 dirlst.append(dirstat)
393 dirlst.append(dirstat)
394 return not match
394 return not match
395 else:
395 else:
396 followsym = False
396 followsym = False
397
397
398 if (seen_dirs is None) and followsym:
398 if (seen_dirs is None) and followsym:
399 seen_dirs = []
399 seen_dirs = []
400 adddir(seen_dirs, path)
400 adddir(seen_dirs, path)
401 for root, dirs, files in os.walk(path, topdown=True, onerror=errhandler):
401 for root, dirs, files in os.walk(path, topdown=True, onerror=errhandler):
402 dirs.sort()
402 dirs.sort()
403 if '.hg' in dirs:
403 if '.hg' in dirs:
404 yield root # found a repository
404 yield root # found a repository
405 qroot = os.path.join(root, '.hg', 'patches')
405 qroot = os.path.join(root, '.hg', 'patches')
406 if os.path.isdir(os.path.join(qroot, '.hg')):
406 if os.path.isdir(os.path.join(qroot, '.hg')):
407 yield qroot # we have a patch queue repo here
407 yield qroot # we have a patch queue repo here
408 if recurse:
408 if recurse:
409 # avoid recursing inside the .hg directory
409 # avoid recursing inside the .hg directory
410 dirs.remove('.hg')
410 dirs.remove('.hg')
411 else:
411 else:
412 dirs[:] = [] # don't descend further
412 dirs[:] = [] # don't descend further
413 elif followsym:
413 elif followsym:
414 newdirs = []
414 newdirs = []
415 for d in dirs:
415 for d in dirs:
416 fname = os.path.join(root, d)
416 fname = os.path.join(root, d)
417 if adddir(seen_dirs, fname):
417 if adddir(seen_dirs, fname):
418 if os.path.islink(fname):
418 if os.path.islink(fname):
419 for hgname in walkrepos(fname, True, seen_dirs):
419 for hgname in walkrepos(fname, True, seen_dirs):
420 yield hgname
420 yield hgname
421 else:
421 else:
422 newdirs.append(d)
422 newdirs.append(d)
423 dirs[:] = newdirs
423 dirs[:] = newdirs
424
424
425 def osrcpath():
425 def osrcpath():
426 '''return default os-specific hgrc search path'''
426 '''return default os-specific hgrc search path'''
427 path = systemrcpath()
427 path = systemrcpath()
428 path.extend(userrcpath())
428 path.extend(userrcpath())
429 path = [os.path.normpath(f) for f in path]
429 path = [os.path.normpath(f) for f in path]
430 return path
430 return path
431
431
432 _rcpath = None
432 _rcpath = None
433
433
434 def rcpath():
434 def rcpath():
435 '''return hgrc search path. if env var HGRCPATH is set, use it.
435 '''return hgrc search path. if env var HGRCPATH is set, use it.
436 for each item in path, if directory, use files ending in .rc,
436 for each item in path, if directory, use files ending in .rc,
437 else use item.
437 else use item.
438 make HGRCPATH empty to only look in .hg/hgrc of current repo.
438 make HGRCPATH empty to only look in .hg/hgrc of current repo.
439 if no HGRCPATH, use default os-specific path.'''
439 if no HGRCPATH, use default os-specific path.'''
440 global _rcpath
440 global _rcpath
441 if _rcpath is None:
441 if _rcpath is None:
442 if 'HGRCPATH' in os.environ:
442 if 'HGRCPATH' in os.environ:
443 _rcpath = []
443 _rcpath = []
444 for p in os.environ['HGRCPATH'].split(os.pathsep):
444 for p in os.environ['HGRCPATH'].split(os.pathsep):
445 if not p:
445 if not p:
446 continue
446 continue
447 p = util.expandpath(p)
447 p = util.expandpath(p)
448 if os.path.isdir(p):
448 if os.path.isdir(p):
449 for f, kind in osutil.listdir(p):
449 for f, kind in osutil.listdir(p):
450 if f.endswith('.rc'):
450 if f.endswith('.rc'):
451 _rcpath.append(os.path.join(p, f))
451 _rcpath.append(os.path.join(p, f))
452 else:
452 else:
453 _rcpath.append(p)
453 _rcpath.append(p)
454 else:
454 else:
455 _rcpath = osrcpath()
455 _rcpath = osrcpath()
456 return _rcpath
456 return _rcpath
457
457
458 def revsingle(repo, revspec, default='.'):
458 def revsingle(repo, revspec, default='.'):
459 if not revspec and revspec != 0:
459 if not revspec and revspec != 0:
460 return repo[default]
460 return repo[default]
461
461
462 l = revrange(repo, [revspec])
462 l = revrange(repo, [revspec])
463 if len(l) < 1:
463 if len(l) < 1:
464 raise util.Abort(_('empty revision set'))
464 raise util.Abort(_('empty revision set'))
465 return repo[l[-1]]
465 return repo[l[-1]]
466
466
467 def revpair(repo, revs):
467 def revpair(repo, revs):
468 if not revs:
468 if not revs:
469 return repo.dirstate.p1(), None
469 return repo.dirstate.p1(), None
470
470
471 l = revrange(repo, revs)
471 l = revrange(repo, revs)
472
472
473 if len(l) == 0:
473 if len(l) == 0:
474 raise util.Abort(_('empty revision range'))
474 raise util.Abort(_('empty revision range'))
475
475
476 if len(l) == 1 and len(revs) == 1 and _revrangesep not in revs[0]:
476 if len(l) == 1 and len(revs) == 1 and _revrangesep not in revs[0]:
477 return repo.lookup(l[0]), None
477 return repo.lookup(l[0]), None
478
478
479 return repo.lookup(l[0]), repo.lookup(l[-1])
479 return repo.lookup(l[0]), repo.lookup(l[-1])
480
480
481 _revrangesep = ':'
481 _revrangesep = ':'
482
482
483 def revrange(repo, revs):
483 def revrange(repo, revs):
484 """Yield revision as strings from a list of revision specifications."""
484 """Yield revision as strings from a list of revision specifications."""
485
485
486 def revfix(repo, val, defval):
486 def revfix(repo, val, defval):
487 if not val and val != 0 and defval is not None:
487 if not val and val != 0 and defval is not None:
488 return defval
488 return defval
489 return repo[val].rev()
489 return repo[val].rev()
490
490
491 seen, l = set(), revset.baseset([])
491 seen, l = set(), revset.baseset([])
492 for spec in revs:
492 for spec in revs:
493 if l and not seen:
493 if l and not seen:
494 seen = set(l)
494 seen = set(l)
495 # attempt to parse old-style ranges first to deal with
495 # attempt to parse old-style ranges first to deal with
496 # things like old-tag which contain query metacharacters
496 # things like old-tag which contain query metacharacters
497 try:
497 try:
498 if isinstance(spec, int):
498 if isinstance(spec, int):
499 seen.add(spec)
499 seen.add(spec)
500 l = l + revset.baseset([spec])
500 l = l + revset.baseset([spec])
501 continue
501 continue
502
502
503 if _revrangesep in spec:
503 if _revrangesep in spec:
504 start, end = spec.split(_revrangesep, 1)
504 start, end = spec.split(_revrangesep, 1)
505 start = revfix(repo, start, 0)
505 start = revfix(repo, start, 0)
506 end = revfix(repo, end, len(repo) - 1)
506 end = revfix(repo, end, len(repo) - 1)
507 if end == nullrev and start < 0:
507 if end == nullrev and start < 0:
508 start = nullrev
508 start = nullrev
509 rangeiter = repo.changelog.revs(start, end)
509 rangeiter = repo.changelog.revs(start, end)
510 if not seen and not l:
510 if not seen and not l:
511 # by far the most common case: revs = ["-1:0"]
511 # by far the most common case: revs = ["-1:0"]
512 l = revset.baseset(rangeiter)
512 l = revset.baseset(rangeiter)
513 # defer syncing seen until next iteration
513 # defer syncing seen until next iteration
514 continue
514 continue
515 newrevs = set(rangeiter)
515 newrevs = set(rangeiter)
516 if seen:
516 if seen:
517 newrevs.difference_update(seen)
517 newrevs.difference_update(seen)
518 seen.update(newrevs)
518 seen.update(newrevs)
519 else:
519 else:
520 seen = newrevs
520 seen = newrevs
521 l = l + revset.baseset(sorted(newrevs, reverse=start > end))
521 l = l + revset.baseset(sorted(newrevs, reverse=start > end))
522 continue
522 continue
523 elif spec and spec in repo: # single unquoted rev
523 elif spec and spec in repo: # single unquoted rev
524 rev = revfix(repo, spec, None)
524 rev = revfix(repo, spec, None)
525 if rev in seen:
525 if rev in seen:
526 continue
526 continue
527 seen.add(rev)
527 seen.add(rev)
528 l = l + revset.baseset([rev])
528 l = l + revset.baseset([rev])
529 continue
529 continue
530 except error.RepoLookupError:
530 except error.RepoLookupError:
531 pass
531 pass
532
532
533 # fall through to new-style queries if old-style fails
533 # fall through to new-style queries if old-style fails
534 m = revset.match(repo.ui, spec, repo)
534 m = revset.match(repo.ui, spec, repo)
535 if seen or l:
535 if seen or l:
536 dl = [r for r in m(repo, revset.spanset(repo)) if r not in seen]
536 dl = [r for r in m(repo, revset.spanset(repo)) if r not in seen]
537 l = l + revset.baseset(dl)
537 l = l + revset.baseset(dl)
538 seen.update(dl)
538 seen.update(dl)
539 else:
539 else:
540 l = m(repo, revset.spanset(repo))
540 l = m(repo, revset.spanset(repo))
541
541
542 return l
542 return l
543
543
544 def expandpats(pats):
544 def expandpats(pats):
545 if not util.expandglobs:
545 if not util.expandglobs:
546 return list(pats)
546 return list(pats)
547 ret = []
547 ret = []
548 for p in pats:
548 for p in pats:
549 kind, name = matchmod._patsplit(p, None)
549 kind, name = matchmod._patsplit(p, None)
550 if kind is None:
550 if kind is None:
551 try:
551 try:
552 globbed = glob.glob(name)
552 globbed = glob.glob(name)
553 except re.error:
553 except re.error:
554 globbed = [name]
554 globbed = [name]
555 if globbed:
555 if globbed:
556 ret.extend(globbed)
556 ret.extend(globbed)
557 continue
557 continue
558 ret.append(p)
558 ret.append(p)
559 return ret
559 return ret
560
560
561 def matchandpats(ctx, pats=[], opts={}, globbed=False, default='relpath'):
561 def matchandpats(ctx, pats=[], opts={}, globbed=False, default='relpath'):
562 if pats == ("",):
562 if pats == ("",):
563 pats = []
563 pats = []
564 if not globbed and default == 'relpath':
564 if not globbed and default == 'relpath':
565 pats = expandpats(pats or [])
565 pats = expandpats(pats or [])
566
566
567 m = ctx.match(pats, opts.get('include'), opts.get('exclude'),
567 m = ctx.match(pats, opts.get('include'), opts.get('exclude'),
568 default)
568 default)
569 def badfn(f, msg):
569 def badfn(f, msg):
570 ctx._repo.ui.warn("%s: %s\n" % (m.rel(f), msg))
570 ctx._repo.ui.warn("%s: %s\n" % (m.rel(f), msg))
571 m.bad = badfn
571 m.bad = badfn
572 return m, pats
572 return m, pats
573
573
574 def match(ctx, pats=[], opts={}, globbed=False, default='relpath'):
574 def match(ctx, pats=[], opts={}, globbed=False, default='relpath'):
575 return matchandpats(ctx, pats, opts, globbed, default)[0]
575 return matchandpats(ctx, pats, opts, globbed, default)[0]
576
576
577 def matchall(repo):
577 def matchall(repo):
578 return matchmod.always(repo.root, repo.getcwd())
578 return matchmod.always(repo.root, repo.getcwd())
579
579
580 def matchfiles(repo, files):
580 def matchfiles(repo, files):
581 return matchmod.exact(repo.root, repo.getcwd(), files)
581 return matchmod.exact(repo.root, repo.getcwd(), files)
582
582
583 def addremove(repo, pats=[], opts={}, dry_run=None, similarity=None):
583 def addremove(repo, pats=[], opts={}, dry_run=None, similarity=None):
584 if dry_run is None:
584 if dry_run is None:
585 dry_run = opts.get('dry_run')
585 dry_run = opts.get('dry_run')
586 if similarity is None:
586 if similarity is None:
587 similarity = float(opts.get('similarity') or 0)
587 similarity = float(opts.get('similarity') or 0)
588 # we'd use status here, except handling of symlinks and ignore is tricky
588 # we'd use status here, except handling of symlinks and ignore is tricky
589 m = match(repo[None], pats, opts)
589 m = match(repo[None], pats, opts)
590 rejected = []
590 rejected = []
591 m.bad = lambda x, y: rejected.append(x)
591 m.bad = lambda x, y: rejected.append(x)
592
592
593 added, unknown, deleted, removed = _interestingfiles(repo, m)
593 added, unknown, deleted, removed = _interestingfiles(repo, m)
594
594
595 unknownset = set(unknown)
595 unknownset = set(unknown)
596 toprint = unknownset.copy()
596 toprint = unknownset.copy()
597 toprint.update(deleted)
597 toprint.update(deleted)
598 for abs in sorted(toprint):
598 for abs in sorted(toprint):
599 if repo.ui.verbose or not m.exact(abs):
599 if repo.ui.verbose or not m.exact(abs):
600 rel = m.rel(abs)
600 rel = m.rel(abs)
601 if abs in unknownset:
601 if abs in unknownset:
602 status = _('adding %s\n') % ((pats and rel) or abs)
602 status = _('adding %s\n') % ((pats and rel) or abs)
603 else:
603 else:
604 status = _('removing %s\n') % ((pats and rel) or abs)
604 status = _('removing %s\n') % ((pats and rel) or abs)
605 repo.ui.status(status)
605 repo.ui.status(status)
606
606
607 renames = _findrenames(repo, m, added + unknown, removed + deleted,
607 renames = _findrenames(repo, m, added + unknown, removed + deleted,
608 similarity)
608 similarity)
609
609
610 if not dry_run:
610 if not dry_run:
611 _markchanges(repo, unknown, deleted, renames)
611 _markchanges(repo, unknown, deleted, renames)
612
612
613 for f in rejected:
613 for f in rejected:
614 if f in m.files():
614 if f in m.files():
615 return 1
615 return 1
616 return 0
616 return 0
617
617
618 def marktouched(repo, files, similarity=0.0):
618 def marktouched(repo, files, similarity=0.0):
619 '''Assert that files have somehow been operated upon. files are relative to
619 '''Assert that files have somehow been operated upon. files are relative to
620 the repo root.'''
620 the repo root.'''
621 m = matchfiles(repo, files)
621 m = matchfiles(repo, files)
622 rejected = []
622 rejected = []
623 m.bad = lambda x, y: rejected.append(x)
623 m.bad = lambda x, y: rejected.append(x)
624
624
625 added, unknown, deleted, removed = _interestingfiles(repo, m)
625 added, unknown, deleted, removed = _interestingfiles(repo, m)
626
626
627 if repo.ui.verbose:
627 if repo.ui.verbose:
628 unknownset = set(unknown)
628 unknownset = set(unknown)
629 toprint = unknownset.copy()
629 toprint = unknownset.copy()
630 toprint.update(deleted)
630 toprint.update(deleted)
631 for abs in sorted(toprint):
631 for abs in sorted(toprint):
632 if abs in unknownset:
632 if abs in unknownset:
633 status = _('adding %s\n') % abs
633 status = _('adding %s\n') % abs
634 else:
634 else:
635 status = _('removing %s\n') % abs
635 status = _('removing %s\n') % abs
636 repo.ui.status(status)
636 repo.ui.status(status)
637
637
638 renames = _findrenames(repo, m, added + unknown, removed + deleted,
638 renames = _findrenames(repo, m, added + unknown, removed + deleted,
639 similarity)
639 similarity)
640
640
641 _markchanges(repo, unknown, deleted, renames)
641 _markchanges(repo, unknown, deleted, renames)
642
642
643 for f in rejected:
643 for f in rejected:
644 if f in m.files():
644 if f in m.files():
645 return 1
645 return 1
646 return 0
646 return 0
647
647
648 def _interestingfiles(repo, matcher):
648 def _interestingfiles(repo, matcher):
649 '''Walk dirstate with matcher, looking for files that addremove would care
649 '''Walk dirstate with matcher, looking for files that addremove would care
650 about.
650 about.
651
651
652 This is different from dirstate.status because it doesn't care about
652 This is different from dirstate.status because it doesn't care about
653 whether files are modified or clean.'''
653 whether files are modified or clean.'''
654 added, unknown, deleted, removed = [], [], [], []
654 added, unknown, deleted, removed = [], [], [], []
655 audit_path = pathutil.pathauditor(repo.root)
655 audit_path = pathutil.pathauditor(repo.root)
656
656
657 ctx = repo[None]
657 ctx = repo[None]
658 dirstate = repo.dirstate
658 dirstate = repo.dirstate
659 walkresults = dirstate.walk(matcher, sorted(ctx.substate), True, False,
659 walkresults = dirstate.walk(matcher, sorted(ctx.substate), True, False,
660 full=False)
660 full=False)
661 for abs, st in walkresults.iteritems():
661 for abs, st in walkresults.iteritems():
662 dstate = dirstate[abs]
662 dstate = dirstate[abs]
663 if dstate == '?' and audit_path.check(abs):
663 if dstate == '?' and audit_path.check(abs):
664 unknown.append(abs)
664 unknown.append(abs)
665 elif dstate != 'r' and not st:
665 elif dstate != 'r' and not st:
666 deleted.append(abs)
666 deleted.append(abs)
667 # for finding renames
667 # for finding renames
668 elif dstate == 'r':
668 elif dstate == 'r':
669 removed.append(abs)
669 removed.append(abs)
670 elif dstate == 'a':
670 elif dstate == 'a':
671 added.append(abs)
671 added.append(abs)
672
672
673 return added, unknown, deleted, removed
673 return added, unknown, deleted, removed
674
674
675 def _findrenames(repo, matcher, added, removed, similarity):
675 def _findrenames(repo, matcher, added, removed, similarity):
676 '''Find renames from removed files to added ones.'''
676 '''Find renames from removed files to added ones.'''
677 renames = {}
677 renames = {}
678 if similarity > 0:
678 if similarity > 0:
679 for old, new, score in similar.findrenames(repo, added, removed,
679 for old, new, score in similar.findrenames(repo, added, removed,
680 similarity):
680 similarity):
681 if (repo.ui.verbose or not matcher.exact(old)
681 if (repo.ui.verbose or not matcher.exact(old)
682 or not matcher.exact(new)):
682 or not matcher.exact(new)):
683 repo.ui.status(_('recording removal of %s as rename to %s '
683 repo.ui.status(_('recording removal of %s as rename to %s '
684 '(%d%% similar)\n') %
684 '(%d%% similar)\n') %
685 (matcher.rel(old), matcher.rel(new),
685 (matcher.rel(old), matcher.rel(new),
686 score * 100))
686 score * 100))
687 renames[new] = old
687 renames[new] = old
688 return renames
688 return renames
689
689
690 def _markchanges(repo, unknown, deleted, renames):
690 def _markchanges(repo, unknown, deleted, renames):
691 '''Marks the files in unknown as added, the files in deleted as removed,
691 '''Marks the files in unknown as added, the files in deleted as removed,
692 and the files in renames as copied.'''
692 and the files in renames as copied.'''
693 wctx = repo[None]
693 wctx = repo[None]
694 wlock = repo.wlock()
694 wlock = repo.wlock()
695 try:
695 try:
696 wctx.forget(deleted)
696 wctx.forget(deleted)
697 wctx.add(unknown)
697 wctx.add(unknown)
698 for new, old in renames.iteritems():
698 for new, old in renames.iteritems():
699 wctx.copy(old, new)
699 wctx.copy(old, new)
700 finally:
700 finally:
701 wlock.release()
701 wlock.release()
702
702
703 def dirstatecopy(ui, repo, wctx, src, dst, dryrun=False, cwd=None):
703 def dirstatecopy(ui, repo, wctx, src, dst, dryrun=False, cwd=None):
704 """Update the dirstate to reflect the intent of copying src to dst. For
704 """Update the dirstate to reflect the intent of copying src to dst. For
705 different reasons it might not end with dst being marked as copied from src.
705 different reasons it might not end with dst being marked as copied from src.
706 """
706 """
707 origsrc = repo.dirstate.copied(src) or src
707 origsrc = repo.dirstate.copied(src) or src
708 if dst == origsrc: # copying back a copy?
708 if dst == origsrc: # copying back a copy?
709 if repo.dirstate[dst] not in 'mn' and not dryrun:
709 if repo.dirstate[dst] not in 'mn' and not dryrun:
710 repo.dirstate.normallookup(dst)
710 repo.dirstate.normallookup(dst)
711 else:
711 else:
712 if repo.dirstate[origsrc] == 'a' and origsrc == src:
712 if repo.dirstate[origsrc] == 'a' and origsrc == src:
713 if not ui.quiet:
713 if not ui.quiet:
714 ui.warn(_("%s has not been committed yet, so no copy "
714 ui.warn(_("%s has not been committed yet, so no copy "
715 "data will be stored for %s.\n")
715 "data will be stored for %s.\n")
716 % (repo.pathto(origsrc, cwd), repo.pathto(dst, cwd)))
716 % (repo.pathto(origsrc, cwd), repo.pathto(dst, cwd)))
717 if repo.dirstate[dst] in '?r' and not dryrun:
717 if repo.dirstate[dst] in '?r' and not dryrun:
718 wctx.add([dst])
718 wctx.add([dst])
719 elif not dryrun:
719 elif not dryrun:
720 wctx.copy(origsrc, dst)
720 wctx.copy(origsrc, dst)
721
721
722 def readrequires(opener, supported):
722 def readrequires(opener, supported):
723 '''Reads and parses .hg/requires and checks if all entries found
723 '''Reads and parses .hg/requires and checks if all entries found
724 are in the list of supported features.'''
724 are in the list of supported features.'''
725 requirements = set(opener.read("requires").splitlines())
725 requirements = set(opener.read("requires").splitlines())
726 missings = []
726 missings = []
727 for r in requirements:
727 for r in requirements:
728 if r not in supported:
728 if r not in supported:
729 if not r or not r[0].isalnum():
729 if not r or not r[0].isalnum():
730 raise error.RequirementError(_(".hg/requires file is corrupt"))
730 raise error.RequirementError(_(".hg/requires file is corrupt"))
731 missings.append(r)
731 missings.append(r)
732 missings.sort()
732 missings.sort()
733 if missings:
733 if missings:
734 raise error.RequirementError(
734 raise error.RequirementError(
735 _("unknown repository format: requires features '%s' (upgrade "
735 _("repository requires features unknown to this Mercurial: %s")
736 "Mercurial)") % "', '".join(missings),
736 % " ".join(missings),
737 hint=_("see http://mercurial.selenic.com/wiki/MissingRequirement"
737 hint=_("see http://mercurial.selenic.com/wiki/MissingRequirement"
738 " for details"))
738 " for more information"))
739 return requirements
739 return requirements
740
740
741 class filecachesubentry(object):
741 class filecachesubentry(object):
742 def __init__(self, path, stat):
742 def __init__(self, path, stat):
743 self.path = path
743 self.path = path
744 self.cachestat = None
744 self.cachestat = None
745 self._cacheable = None
745 self._cacheable = None
746
746
747 if stat:
747 if stat:
748 self.cachestat = filecachesubentry.stat(self.path)
748 self.cachestat = filecachesubentry.stat(self.path)
749
749
750 if self.cachestat:
750 if self.cachestat:
751 self._cacheable = self.cachestat.cacheable()
751 self._cacheable = self.cachestat.cacheable()
752 else:
752 else:
753 # None means we don't know yet
753 # None means we don't know yet
754 self._cacheable = None
754 self._cacheable = None
755
755
756 def refresh(self):
756 def refresh(self):
757 if self.cacheable():
757 if self.cacheable():
758 self.cachestat = filecachesubentry.stat(self.path)
758 self.cachestat = filecachesubentry.stat(self.path)
759
759
760 def cacheable(self):
760 def cacheable(self):
761 if self._cacheable is not None:
761 if self._cacheable is not None:
762 return self._cacheable
762 return self._cacheable
763
763
764 # we don't know yet, assume it is for now
764 # we don't know yet, assume it is for now
765 return True
765 return True
766
766
767 def changed(self):
767 def changed(self):
768 # no point in going further if we can't cache it
768 # no point in going further if we can't cache it
769 if not self.cacheable():
769 if not self.cacheable():
770 return True
770 return True
771
771
772 newstat = filecachesubentry.stat(self.path)
772 newstat = filecachesubentry.stat(self.path)
773
773
774 # we may not know if it's cacheable yet, check again now
774 # we may not know if it's cacheable yet, check again now
775 if newstat and self._cacheable is None:
775 if newstat and self._cacheable is None:
776 self._cacheable = newstat.cacheable()
776 self._cacheable = newstat.cacheable()
777
777
778 # check again
778 # check again
779 if not self._cacheable:
779 if not self._cacheable:
780 return True
780 return True
781
781
782 if self.cachestat != newstat:
782 if self.cachestat != newstat:
783 self.cachestat = newstat
783 self.cachestat = newstat
784 return True
784 return True
785 else:
785 else:
786 return False
786 return False
787
787
788 @staticmethod
788 @staticmethod
789 def stat(path):
789 def stat(path):
790 try:
790 try:
791 return util.cachestat(path)
791 return util.cachestat(path)
792 except OSError, e:
792 except OSError, e:
793 if e.errno != errno.ENOENT:
793 if e.errno != errno.ENOENT:
794 raise
794 raise
795
795
796 class filecacheentry(object):
796 class filecacheentry(object):
797 def __init__(self, paths, stat=True):
797 def __init__(self, paths, stat=True):
798 self._entries = []
798 self._entries = []
799 for path in paths:
799 for path in paths:
800 self._entries.append(filecachesubentry(path, stat))
800 self._entries.append(filecachesubentry(path, stat))
801
801
802 def changed(self):
802 def changed(self):
803 '''true if any entry has changed'''
803 '''true if any entry has changed'''
804 for entry in self._entries:
804 for entry in self._entries:
805 if entry.changed():
805 if entry.changed():
806 return True
806 return True
807 return False
807 return False
808
808
809 def refresh(self):
809 def refresh(self):
810 for entry in self._entries:
810 for entry in self._entries:
811 entry.refresh()
811 entry.refresh()
812
812
813 class filecache(object):
813 class filecache(object):
814 '''A property like decorator that tracks files under .hg/ for updates.
814 '''A property like decorator that tracks files under .hg/ for updates.
815
815
816 Records stat info when called in _filecache.
816 Records stat info when called in _filecache.
817
817
818 On subsequent calls, compares old stat info with new info, and recreates the
818 On subsequent calls, compares old stat info with new info, and recreates the
819 object when any of the files changes, updating the new stat info in
819 object when any of the files changes, updating the new stat info in
820 _filecache.
820 _filecache.
821
821
822 Mercurial either atomic renames or appends for files under .hg,
822 Mercurial either atomic renames or appends for files under .hg,
823 so to ensure the cache is reliable we need the filesystem to be able
823 so to ensure the cache is reliable we need the filesystem to be able
824 to tell us if a file has been replaced. If it can't, we fallback to
824 to tell us if a file has been replaced. If it can't, we fallback to
825 recreating the object on every call (essentially the same behaviour as
825 recreating the object on every call (essentially the same behaviour as
826 propertycache).
826 propertycache).
827
827
828 '''
828 '''
829 def __init__(self, *paths):
829 def __init__(self, *paths):
830 self.paths = paths
830 self.paths = paths
831
831
832 def join(self, obj, fname):
832 def join(self, obj, fname):
833 """Used to compute the runtime path of a cached file.
833 """Used to compute the runtime path of a cached file.
834
834
835 Users should subclass filecache and provide their own version of this
835 Users should subclass filecache and provide their own version of this
836 function to call the appropriate join function on 'obj' (an instance
836 function to call the appropriate join function on 'obj' (an instance
837 of the class that its member function was decorated).
837 of the class that its member function was decorated).
838 """
838 """
839 return obj.join(fname)
839 return obj.join(fname)
840
840
841 def __call__(self, func):
841 def __call__(self, func):
842 self.func = func
842 self.func = func
843 self.name = func.__name__
843 self.name = func.__name__
844 return self
844 return self
845
845
846 def __get__(self, obj, type=None):
846 def __get__(self, obj, type=None):
847 # do we need to check if the file changed?
847 # do we need to check if the file changed?
848 if self.name in obj.__dict__:
848 if self.name in obj.__dict__:
849 assert self.name in obj._filecache, self.name
849 assert self.name in obj._filecache, self.name
850 return obj.__dict__[self.name]
850 return obj.__dict__[self.name]
851
851
852 entry = obj._filecache.get(self.name)
852 entry = obj._filecache.get(self.name)
853
853
854 if entry:
854 if entry:
855 if entry.changed():
855 if entry.changed():
856 entry.obj = self.func(obj)
856 entry.obj = self.func(obj)
857 else:
857 else:
858 paths = [self.join(obj, path) for path in self.paths]
858 paths = [self.join(obj, path) for path in self.paths]
859
859
860 # We stat -before- creating the object so our cache doesn't lie if
860 # We stat -before- creating the object so our cache doesn't lie if
861 # a writer modified between the time we read and stat
861 # a writer modified between the time we read and stat
862 entry = filecacheentry(paths, True)
862 entry = filecacheentry(paths, True)
863 entry.obj = self.func(obj)
863 entry.obj = self.func(obj)
864
864
865 obj._filecache[self.name] = entry
865 obj._filecache[self.name] = entry
866
866
867 obj.__dict__[self.name] = entry.obj
867 obj.__dict__[self.name] = entry.obj
868 return entry.obj
868 return entry.obj
869
869
870 def __set__(self, obj, value):
870 def __set__(self, obj, value):
871 if self.name not in obj._filecache:
871 if self.name not in obj._filecache:
872 # we add an entry for the missing value because X in __dict__
872 # we add an entry for the missing value because X in __dict__
873 # implies X in _filecache
873 # implies X in _filecache
874 paths = [self.join(obj, path) for path in self.paths]
874 paths = [self.join(obj, path) for path in self.paths]
875 ce = filecacheentry(paths, False)
875 ce = filecacheentry(paths, False)
876 obj._filecache[self.name] = ce
876 obj._filecache[self.name] = ce
877 else:
877 else:
878 ce = obj._filecache[self.name]
878 ce = obj._filecache[self.name]
879
879
880 ce.obj = value # update cached copy
880 ce.obj = value # update cached copy
881 obj.__dict__[self.name] = value # update copy returned by obj.x
881 obj.__dict__[self.name] = value # update copy returned by obj.x
882
882
883 def __delete__(self, obj):
883 def __delete__(self, obj):
884 try:
884 try:
885 del obj.__dict__[self.name]
885 del obj.__dict__[self.name]
886 except KeyError:
886 except KeyError:
887 raise AttributeError(self.name)
887 raise AttributeError(self.name)
888
888
889 class dirs(object):
889 class dirs(object):
890 '''a multiset of directory names from a dirstate or manifest'''
890 '''a multiset of directory names from a dirstate or manifest'''
891
891
892 def __init__(self, map, skip=None):
892 def __init__(self, map, skip=None):
893 self._dirs = {}
893 self._dirs = {}
894 addpath = self.addpath
894 addpath = self.addpath
895 if util.safehasattr(map, 'iteritems') and skip is not None:
895 if util.safehasattr(map, 'iteritems') and skip is not None:
896 for f, s in map.iteritems():
896 for f, s in map.iteritems():
897 if s[0] != skip:
897 if s[0] != skip:
898 addpath(f)
898 addpath(f)
899 else:
899 else:
900 for f in map:
900 for f in map:
901 addpath(f)
901 addpath(f)
902
902
903 def addpath(self, path):
903 def addpath(self, path):
904 dirs = self._dirs
904 dirs = self._dirs
905 for base in finddirs(path):
905 for base in finddirs(path):
906 if base in dirs:
906 if base in dirs:
907 dirs[base] += 1
907 dirs[base] += 1
908 return
908 return
909 dirs[base] = 1
909 dirs[base] = 1
910
910
911 def delpath(self, path):
911 def delpath(self, path):
912 dirs = self._dirs
912 dirs = self._dirs
913 for base in finddirs(path):
913 for base in finddirs(path):
914 if dirs[base] > 1:
914 if dirs[base] > 1:
915 dirs[base] -= 1
915 dirs[base] -= 1
916 return
916 return
917 del dirs[base]
917 del dirs[base]
918
918
919 def __iter__(self):
919 def __iter__(self):
920 return self._dirs.iterkeys()
920 return self._dirs.iterkeys()
921
921
922 def __contains__(self, d):
922 def __contains__(self, d):
923 return d in self._dirs
923 return d in self._dirs
924
924
925 if util.safehasattr(parsers, 'dirs'):
925 if util.safehasattr(parsers, 'dirs'):
926 dirs = parsers.dirs
926 dirs = parsers.dirs
927
927
928 def finddirs(path):
928 def finddirs(path):
929 pos = path.rfind('/')
929 pos = path.rfind('/')
930 while pos != -1:
930 while pos != -1:
931 yield path[:pos]
931 yield path[:pos]
932 pos = path.rfind('/', 0, pos)
932 pos = path.rfind('/', 0, pos)
@@ -1,356 +1,356 b''
1 commit date test
1 commit date test
2
2
3 $ hg init test
3 $ hg init test
4 $ cd test
4 $ cd test
5 $ echo foo > foo
5 $ echo foo > foo
6 $ hg add foo
6 $ hg add foo
7 $ HGEDITOR=true hg commit -m ""
7 $ HGEDITOR=true hg commit -m ""
8 abort: empty commit message
8 abort: empty commit message
9 [255]
9 [255]
10 $ hg commit -d '0 0' -m commit-1
10 $ hg commit -d '0 0' -m commit-1
11 $ echo foo >> foo
11 $ echo foo >> foo
12 $ hg commit -d '1 4444444' -m commit-3
12 $ hg commit -d '1 4444444' -m commit-3
13 abort: impossible time zone offset: 4444444
13 abort: impossible time zone offset: 4444444
14 [255]
14 [255]
15 $ hg commit -d '1 15.1' -m commit-4
15 $ hg commit -d '1 15.1' -m commit-4
16 abort: invalid date: '1\t15.1'
16 abort: invalid date: '1\t15.1'
17 [255]
17 [255]
18 $ hg commit -d 'foo bar' -m commit-5
18 $ hg commit -d 'foo bar' -m commit-5
19 abort: invalid date: 'foo bar'
19 abort: invalid date: 'foo bar'
20 [255]
20 [255]
21 $ hg commit -d ' 1 4444' -m commit-6
21 $ hg commit -d ' 1 4444' -m commit-6
22 $ hg commit -d '111111111111 0' -m commit-7
22 $ hg commit -d '111111111111 0' -m commit-7
23 abort: date exceeds 32 bits: 111111111111
23 abort: date exceeds 32 bits: 111111111111
24 [255]
24 [255]
25 $ hg commit -d '-7654321 3600' -m commit-7
25 $ hg commit -d '-7654321 3600' -m commit-7
26 abort: negative date value: -7654321
26 abort: negative date value: -7654321
27 [255]
27 [255]
28
28
29 commit added file that has been deleted
29 commit added file that has been deleted
30
30
31 $ echo bar > bar
31 $ echo bar > bar
32 $ hg add bar
32 $ hg add bar
33 $ rm bar
33 $ rm bar
34 $ hg commit -m commit-8
34 $ hg commit -m commit-8
35 nothing changed (1 missing files, see 'hg status')
35 nothing changed (1 missing files, see 'hg status')
36 [1]
36 [1]
37 $ hg commit -m commit-8-2 bar
37 $ hg commit -m commit-8-2 bar
38 abort: bar: file not found!
38 abort: bar: file not found!
39 [255]
39 [255]
40
40
41 $ hg -q revert -a --no-backup
41 $ hg -q revert -a --no-backup
42
42
43 $ mkdir dir
43 $ mkdir dir
44 $ echo boo > dir/file
44 $ echo boo > dir/file
45 $ hg add
45 $ hg add
46 adding dir/file (glob)
46 adding dir/file (glob)
47 $ hg -v commit -m commit-9 dir
47 $ hg -v commit -m commit-9 dir
48 dir/file
48 dir/file
49 committed changeset 2:d2a76177cb42
49 committed changeset 2:d2a76177cb42
50
50
51 $ echo > dir.file
51 $ echo > dir.file
52 $ hg add
52 $ hg add
53 adding dir.file
53 adding dir.file
54 $ hg commit -m commit-10 dir dir.file
54 $ hg commit -m commit-10 dir dir.file
55 abort: dir: no match under directory!
55 abort: dir: no match under directory!
56 [255]
56 [255]
57
57
58 $ echo >> dir/file
58 $ echo >> dir/file
59 $ mkdir bleh
59 $ mkdir bleh
60 $ mkdir dir2
60 $ mkdir dir2
61 $ cd bleh
61 $ cd bleh
62 $ hg commit -m commit-11 .
62 $ hg commit -m commit-11 .
63 abort: bleh: no match under directory!
63 abort: bleh: no match under directory!
64 [255]
64 [255]
65 $ hg commit -m commit-12 ../dir ../dir2
65 $ hg commit -m commit-12 ../dir ../dir2
66 abort: dir2: no match under directory!
66 abort: dir2: no match under directory!
67 [255]
67 [255]
68 $ hg -v commit -m commit-13 ../dir
68 $ hg -v commit -m commit-13 ../dir
69 dir/file
69 dir/file
70 committed changeset 3:1cd62a2d8db5
70 committed changeset 3:1cd62a2d8db5
71 $ cd ..
71 $ cd ..
72
72
73 $ hg commit -m commit-14 does-not-exist
73 $ hg commit -m commit-14 does-not-exist
74 abort: does-not-exist: * (glob)
74 abort: does-not-exist: * (glob)
75 [255]
75 [255]
76
76
77 #if symlink
77 #if symlink
78 $ ln -s foo baz
78 $ ln -s foo baz
79 $ hg commit -m commit-15 baz
79 $ hg commit -m commit-15 baz
80 abort: baz: file not tracked!
80 abort: baz: file not tracked!
81 [255]
81 [255]
82 #endif
82 #endif
83
83
84 $ touch quux
84 $ touch quux
85 $ hg commit -m commit-16 quux
85 $ hg commit -m commit-16 quux
86 abort: quux: file not tracked!
86 abort: quux: file not tracked!
87 [255]
87 [255]
88 $ echo >> dir/file
88 $ echo >> dir/file
89 $ hg -v commit -m commit-17 dir/file
89 $ hg -v commit -m commit-17 dir/file
90 dir/file
90 dir/file
91 committed changeset 4:49176991390e
91 committed changeset 4:49176991390e
92
92
93 An empty date was interpreted as epoch origin
93 An empty date was interpreted as epoch origin
94
94
95 $ echo foo >> foo
95 $ echo foo >> foo
96 $ hg commit -d '' -m commit-no-date
96 $ hg commit -d '' -m commit-no-date
97 $ hg tip --template '{date|isodate}\n' | grep '1970'
97 $ hg tip --template '{date|isodate}\n' | grep '1970'
98 [1]
98 [1]
99
99
100 Make sure we do not obscure unknown requires file entries (issue2649)
100 Make sure we do not obscure unknown requires file entries (issue2649)
101
101
102 $ echo foo >> foo
102 $ echo foo >> foo
103 $ echo fake >> .hg/requires
103 $ echo fake >> .hg/requires
104 $ hg commit -m bla
104 $ hg commit -m bla
105 abort: unknown repository format: requires features 'fake' (upgrade Mercurial)!
105 abort: repository requires features unknown to this Mercurial: fake!
106 (see http://mercurial.selenic.com/wiki/MissingRequirement for details)
106 (see http://mercurial.selenic.com/wiki/MissingRequirement for more information)
107 [255]
107 [255]
108
108
109 $ cd ..
109 $ cd ..
110
110
111
111
112 partial subdir commit test
112 partial subdir commit test
113
113
114 $ hg init test2
114 $ hg init test2
115 $ cd test2
115 $ cd test2
116 $ mkdir foo
116 $ mkdir foo
117 $ echo foo > foo/foo
117 $ echo foo > foo/foo
118 $ mkdir bar
118 $ mkdir bar
119 $ echo bar > bar/bar
119 $ echo bar > bar/bar
120 $ hg add
120 $ hg add
121 adding bar/bar (glob)
121 adding bar/bar (glob)
122 adding foo/foo (glob)
122 adding foo/foo (glob)
123 $ hg ci -m commit-subdir-1 foo
123 $ hg ci -m commit-subdir-1 foo
124 $ hg ci -m commit-subdir-2 bar
124 $ hg ci -m commit-subdir-2 bar
125
125
126 subdir log 1
126 subdir log 1
127
127
128 $ hg log -v foo
128 $ hg log -v foo
129 changeset: 0:f97e73a25882
129 changeset: 0:f97e73a25882
130 user: test
130 user: test
131 date: Thu Jan 01 00:00:00 1970 +0000
131 date: Thu Jan 01 00:00:00 1970 +0000
132 files: foo/foo
132 files: foo/foo
133 description:
133 description:
134 commit-subdir-1
134 commit-subdir-1
135
135
136
136
137
137
138 subdir log 2
138 subdir log 2
139
139
140 $ hg log -v bar
140 $ hg log -v bar
141 changeset: 1:aa809156d50d
141 changeset: 1:aa809156d50d
142 tag: tip
142 tag: tip
143 user: test
143 user: test
144 date: Thu Jan 01 00:00:00 1970 +0000
144 date: Thu Jan 01 00:00:00 1970 +0000
145 files: bar/bar
145 files: bar/bar
146 description:
146 description:
147 commit-subdir-2
147 commit-subdir-2
148
148
149
149
150
150
151 full log
151 full log
152
152
153 $ hg log -v
153 $ hg log -v
154 changeset: 1:aa809156d50d
154 changeset: 1:aa809156d50d
155 tag: tip
155 tag: tip
156 user: test
156 user: test
157 date: Thu Jan 01 00:00:00 1970 +0000
157 date: Thu Jan 01 00:00:00 1970 +0000
158 files: bar/bar
158 files: bar/bar
159 description:
159 description:
160 commit-subdir-2
160 commit-subdir-2
161
161
162
162
163 changeset: 0:f97e73a25882
163 changeset: 0:f97e73a25882
164 user: test
164 user: test
165 date: Thu Jan 01 00:00:00 1970 +0000
165 date: Thu Jan 01 00:00:00 1970 +0000
166 files: foo/foo
166 files: foo/foo
167 description:
167 description:
168 commit-subdir-1
168 commit-subdir-1
169
169
170
170
171 $ cd ..
171 $ cd ..
172
172
173
173
174 dot and subdir commit test
174 dot and subdir commit test
175
175
176 $ hg init test3
176 $ hg init test3
177 $ cd test3
177 $ cd test3
178 $ mkdir foo
178 $ mkdir foo
179 $ echo foo content > foo/plain-file
179 $ echo foo content > foo/plain-file
180 $ hg add foo/plain-file
180 $ hg add foo/plain-file
181 $ hg ci -m commit-foo-subdir foo
181 $ hg ci -m commit-foo-subdir foo
182 $ echo modified foo content > foo/plain-file
182 $ echo modified foo content > foo/plain-file
183 $ hg ci -m commit-foo-dot .
183 $ hg ci -m commit-foo-dot .
184
184
185 full log
185 full log
186
186
187 $ hg log -v
187 $ hg log -v
188 changeset: 1:95b38e3a5b2e
188 changeset: 1:95b38e3a5b2e
189 tag: tip
189 tag: tip
190 user: test
190 user: test
191 date: Thu Jan 01 00:00:00 1970 +0000
191 date: Thu Jan 01 00:00:00 1970 +0000
192 files: foo/plain-file
192 files: foo/plain-file
193 description:
193 description:
194 commit-foo-dot
194 commit-foo-dot
195
195
196
196
197 changeset: 0:65d4e9386227
197 changeset: 0:65d4e9386227
198 user: test
198 user: test
199 date: Thu Jan 01 00:00:00 1970 +0000
199 date: Thu Jan 01 00:00:00 1970 +0000
200 files: foo/plain-file
200 files: foo/plain-file
201 description:
201 description:
202 commit-foo-subdir
202 commit-foo-subdir
203
203
204
204
205
205
206 subdir log
206 subdir log
207
207
208 $ cd foo
208 $ cd foo
209 $ hg log .
209 $ hg log .
210 changeset: 1:95b38e3a5b2e
210 changeset: 1:95b38e3a5b2e
211 tag: tip
211 tag: tip
212 user: test
212 user: test
213 date: Thu Jan 01 00:00:00 1970 +0000
213 date: Thu Jan 01 00:00:00 1970 +0000
214 summary: commit-foo-dot
214 summary: commit-foo-dot
215
215
216 changeset: 0:65d4e9386227
216 changeset: 0:65d4e9386227
217 user: test
217 user: test
218 date: Thu Jan 01 00:00:00 1970 +0000
218 date: Thu Jan 01 00:00:00 1970 +0000
219 summary: commit-foo-subdir
219 summary: commit-foo-subdir
220
220
221 $ cd ..
221 $ cd ..
222 $ cd ..
222 $ cd ..
223
223
224 Issue1049: Hg permits partial commit of merge without warning
224 Issue1049: Hg permits partial commit of merge without warning
225
225
226 $ hg init issue1049
226 $ hg init issue1049
227 $ cd issue1049
227 $ cd issue1049
228 $ echo a > a
228 $ echo a > a
229 $ hg ci -Ama
229 $ hg ci -Ama
230 adding a
230 adding a
231 $ echo a >> a
231 $ echo a >> a
232 $ hg ci -mb
232 $ hg ci -mb
233 $ hg up 0
233 $ hg up 0
234 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
234 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
235 $ echo b >> a
235 $ echo b >> a
236 $ hg ci -mc
236 $ hg ci -mc
237 created new head
237 created new head
238 $ HGMERGE=true hg merge
238 $ HGMERGE=true hg merge
239 merging a
239 merging a
240 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
240 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
241 (branch merge, don't forget to commit)
241 (branch merge, don't forget to commit)
242
242
243 should fail because we are specifying a file name
243 should fail because we are specifying a file name
244
244
245 $ hg ci -mmerge a
245 $ hg ci -mmerge a
246 abort: cannot partially commit a merge (do not specify files or patterns)
246 abort: cannot partially commit a merge (do not specify files or patterns)
247 [255]
247 [255]
248
248
249 should fail because we are specifying a pattern
249 should fail because we are specifying a pattern
250
250
251 $ hg ci -mmerge -I a
251 $ hg ci -mmerge -I a
252 abort: cannot partially commit a merge (do not specify files or patterns)
252 abort: cannot partially commit a merge (do not specify files or patterns)
253 [255]
253 [255]
254
254
255 should succeed
255 should succeed
256
256
257 $ hg ci -mmerge
257 $ hg ci -mmerge
258 $ cd ..
258 $ cd ..
259
259
260
260
261 test commit message content
261 test commit message content
262
262
263 $ hg init commitmsg
263 $ hg init commitmsg
264 $ cd commitmsg
264 $ cd commitmsg
265 $ echo changed > changed
265 $ echo changed > changed
266 $ echo removed > removed
266 $ echo removed > removed
267 $ hg book currentbookmark
267 $ hg book currentbookmark
268 $ hg ci -qAm init
268 $ hg ci -qAm init
269
269
270 $ hg rm removed
270 $ hg rm removed
271 $ echo changed >> changed
271 $ echo changed >> changed
272 $ echo added > added
272 $ echo added > added
273 $ hg add added
273 $ hg add added
274 $ HGEDITOR=cat hg ci -A
274 $ HGEDITOR=cat hg ci -A
275
275
276
276
277 HG: Enter commit message. Lines beginning with 'HG:' are removed.
277 HG: Enter commit message. Lines beginning with 'HG:' are removed.
278 HG: Leave message empty to abort commit.
278 HG: Leave message empty to abort commit.
279 HG: --
279 HG: --
280 HG: user: test
280 HG: user: test
281 HG: branch 'default'
281 HG: branch 'default'
282 HG: bookmark 'currentbookmark'
282 HG: bookmark 'currentbookmark'
283 HG: added added
283 HG: added added
284 HG: changed changed
284 HG: changed changed
285 HG: removed removed
285 HG: removed removed
286 abort: empty commit message
286 abort: empty commit message
287 [255]
287 [255]
288
288
289 test saving last-message.txt
289 test saving last-message.txt
290
290
291 $ hg init sub
291 $ hg init sub
292 $ echo a > sub/a
292 $ echo a > sub/a
293 $ hg -R sub add sub/a
293 $ hg -R sub add sub/a
294 $ cat > sub/.hg/hgrc <<EOF
294 $ cat > sub/.hg/hgrc <<EOF
295 > [hooks]
295 > [hooks]
296 > precommit.test-saving-last-message = false
296 > precommit.test-saving-last-message = false
297 > EOF
297 > EOF
298
298
299 $ echo 'sub = sub' > .hgsub
299 $ echo 'sub = sub' > .hgsub
300 $ hg add .hgsub
300 $ hg add .hgsub
301
301
302 $ cat > $TESTDIR/editor.sh <<EOF
302 $ cat > $TESTDIR/editor.sh <<EOF
303 > echo "==== before editing:"
303 > echo "==== before editing:"
304 > cat \$1
304 > cat \$1
305 > echo "===="
305 > echo "===="
306 > echo "test saving last-message.txt" >> \$1
306 > echo "test saving last-message.txt" >> \$1
307 > EOF
307 > EOF
308
308
309 $ rm -f .hg/last-message.txt
309 $ rm -f .hg/last-message.txt
310 $ HGEDITOR="sh $TESTDIR/editor.sh" hg commit -S -q
310 $ HGEDITOR="sh $TESTDIR/editor.sh" hg commit -S -q
311 ==== before editing:
311 ==== before editing:
312
312
313
313
314 HG: Enter commit message. Lines beginning with 'HG:' are removed.
314 HG: Enter commit message. Lines beginning with 'HG:' are removed.
315 HG: Leave message empty to abort commit.
315 HG: Leave message empty to abort commit.
316 HG: --
316 HG: --
317 HG: user: test
317 HG: user: test
318 HG: branch 'default'
318 HG: branch 'default'
319 HG: bookmark 'currentbookmark'
319 HG: bookmark 'currentbookmark'
320 HG: subrepo sub
320 HG: subrepo sub
321 HG: added .hgsub
321 HG: added .hgsub
322 HG: added added
322 HG: added added
323 HG: changed .hgsubstate
323 HG: changed .hgsubstate
324 HG: changed changed
324 HG: changed changed
325 HG: removed removed
325 HG: removed removed
326 ====
326 ====
327 abort: precommit.test-saving-last-message hook exited with status 1 (in subrepo sub)
327 abort: precommit.test-saving-last-message hook exited with status 1 (in subrepo sub)
328 [255]
328 [255]
329 $ cat .hg/last-message.txt
329 $ cat .hg/last-message.txt
330
330
331
331
332 test saving last-message.txt
332 test saving last-message.txt
333
333
334 $ cd ..
334 $ cd ..
335
335
336
336
337 commit copy
337 commit copy
338
338
339 $ hg init dir2
339 $ hg init dir2
340 $ cd dir2
340 $ cd dir2
341 $ echo bleh > bar
341 $ echo bleh > bar
342 $ hg add bar
342 $ hg add bar
343 $ hg ci -m 'add bar'
343 $ hg ci -m 'add bar'
344
344
345 $ hg cp bar foo
345 $ hg cp bar foo
346 $ echo >> bar
346 $ echo >> bar
347 $ hg ci -m 'cp bar foo; change bar'
347 $ hg ci -m 'cp bar foo; change bar'
348
348
349 $ hg debugrename foo
349 $ hg debugrename foo
350 foo renamed from bar:26d3ca0dfd18e44d796b564e38dd173c9668d3a9
350 foo renamed from bar:26d3ca0dfd18e44d796b564e38dd173c9668d3a9
351 $ hg debugindex bar
351 $ hg debugindex bar
352 rev offset length ..... linkrev nodeid p1 p2 (re)
352 rev offset length ..... linkrev nodeid p1 p2 (re)
353 0 0 6 ..... 0 26d3ca0dfd18 000000000000 000000000000 (re)
353 0 0 6 ..... 0 26d3ca0dfd18 000000000000 000000000000 (re)
354 1 6 7 ..... 1 d267bddd54f7 26d3ca0dfd18 000000000000 (re)
354 1 6 7 ..... 1 d267bddd54f7 26d3ca0dfd18 000000000000 (re)
355
355
356 $ cd ..
356 $ cd ..
@@ -1,126 +1,126 b''
1 $ "$TESTDIR/hghave" serve || exit 80
1 $ "$TESTDIR/hghave" serve || exit 80
2
2
3 #if no-outer-repo
3 #if no-outer-repo
4
4
5 no repo
5 no repo
6
6
7 $ hg id
7 $ hg id
8 abort: there is no Mercurial repository here (.hg not found)
8 abort: there is no Mercurial repository here (.hg not found)
9 [255]
9 [255]
10
10
11 #endif
11 #endif
12
12
13 create repo
13 create repo
14
14
15 $ hg init test
15 $ hg init test
16 $ cd test
16 $ cd test
17 $ echo a > a
17 $ echo a > a
18 $ hg ci -Ama
18 $ hg ci -Ama
19 adding a
19 adding a
20
20
21 basic id usage
21 basic id usage
22
22
23 $ hg id
23 $ hg id
24 cb9a9f314b8b tip
24 cb9a9f314b8b tip
25 $ hg id --debug
25 $ hg id --debug
26 cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b tip
26 cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b tip
27 $ hg id -q
27 $ hg id -q
28 cb9a9f314b8b
28 cb9a9f314b8b
29 $ hg id -v
29 $ hg id -v
30 cb9a9f314b8b tip
30 cb9a9f314b8b tip
31
31
32 with options
32 with options
33
33
34 $ hg id -r.
34 $ hg id -r.
35 cb9a9f314b8b tip
35 cb9a9f314b8b tip
36 $ hg id -n
36 $ hg id -n
37 0
37 0
38 $ hg id -t
38 $ hg id -t
39 tip
39 tip
40 $ hg id -b
40 $ hg id -b
41 default
41 default
42 $ hg id -i
42 $ hg id -i
43 cb9a9f314b8b
43 cb9a9f314b8b
44 $ hg id -n -t -b -i
44 $ hg id -n -t -b -i
45 cb9a9f314b8b 0 default tip
45 cb9a9f314b8b 0 default tip
46
46
47 with modifications
47 with modifications
48
48
49 $ echo b > a
49 $ echo b > a
50 $ hg id -n -t -b -i
50 $ hg id -n -t -b -i
51 cb9a9f314b8b+ 0+ default tip
51 cb9a9f314b8b+ 0+ default tip
52
52
53 other local repo
53 other local repo
54
54
55 $ cd ..
55 $ cd ..
56 $ hg -R test id
56 $ hg -R test id
57 cb9a9f314b8b+ tip
57 cb9a9f314b8b+ tip
58 #if no-outer-repo
58 #if no-outer-repo
59 $ hg id test
59 $ hg id test
60 cb9a9f314b8b+ tip
60 cb9a9f314b8b+ tip
61 #endif
61 #endif
62
62
63 with remote http repo
63 with remote http repo
64
64
65 $ cd test
65 $ cd test
66 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid
66 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid
67 $ cat hg.pid >> $DAEMON_PIDS
67 $ cat hg.pid >> $DAEMON_PIDS
68 $ hg id http://localhost:$HGPORT1/
68 $ hg id http://localhost:$HGPORT1/
69 cb9a9f314b8b
69 cb9a9f314b8b
70
70
71 remote with rev number?
71 remote with rev number?
72
72
73 $ hg id -n http://localhost:$HGPORT1/
73 $ hg id -n http://localhost:$HGPORT1/
74 abort: can't query remote revision number, branch, or tags
74 abort: can't query remote revision number, branch, or tags
75 [255]
75 [255]
76
76
77 remote with tags?
77 remote with tags?
78
78
79 $ hg id -t http://localhost:$HGPORT1/
79 $ hg id -t http://localhost:$HGPORT1/
80 abort: can't query remote revision number, branch, or tags
80 abort: can't query remote revision number, branch, or tags
81 [255]
81 [255]
82
82
83 remote with branch?
83 remote with branch?
84
84
85 $ hg id -b http://localhost:$HGPORT1/
85 $ hg id -b http://localhost:$HGPORT1/
86 abort: can't query remote revision number, branch, or tags
86 abort: can't query remote revision number, branch, or tags
87 [255]
87 [255]
88
88
89 test bookmark support
89 test bookmark support
90
90
91 $ hg bookmark Y
91 $ hg bookmark Y
92 $ hg bookmark Z
92 $ hg bookmark Z
93 $ hg bookmarks
93 $ hg bookmarks
94 Y 0:cb9a9f314b8b
94 Y 0:cb9a9f314b8b
95 * Z 0:cb9a9f314b8b
95 * Z 0:cb9a9f314b8b
96 $ hg id
96 $ hg id
97 cb9a9f314b8b+ tip Y/Z
97 cb9a9f314b8b+ tip Y/Z
98 $ hg id --bookmarks
98 $ hg id --bookmarks
99 Y Z
99 Y Z
100
100
101 test remote identify with bookmarks
101 test remote identify with bookmarks
102
102
103 $ hg id http://localhost:$HGPORT1/
103 $ hg id http://localhost:$HGPORT1/
104 cb9a9f314b8b Y/Z
104 cb9a9f314b8b Y/Z
105 $ hg id --bookmarks http://localhost:$HGPORT1/
105 $ hg id --bookmarks http://localhost:$HGPORT1/
106 Y Z
106 Y Z
107 $ hg id -r . http://localhost:$HGPORT1/
107 $ hg id -r . http://localhost:$HGPORT1/
108 cb9a9f314b8b Y/Z
108 cb9a9f314b8b Y/Z
109 $ hg id --bookmarks -r . http://localhost:$HGPORT1/
109 $ hg id --bookmarks -r . http://localhost:$HGPORT1/
110 Y Z
110 Y Z
111
111
112 Make sure we do not obscure unknown requires file entries (issue2649)
112 Make sure we do not obscure unknown requires file entries (issue2649)
113
113
114 $ echo fake >> .hg/requires
114 $ echo fake >> .hg/requires
115 $ hg id
115 $ hg id
116 abort: unknown repository format: requires features 'fake' (upgrade Mercurial)!
116 abort: repository requires features unknown to this Mercurial: fake!
117 (see http://mercurial.selenic.com/wiki/MissingRequirement for details)
117 (see http://mercurial.selenic.com/wiki/MissingRequirement for more information)
118 [255]
118 [255]
119
119
120 $ cd ..
120 $ cd ..
121 #if no-outer-repo
121 #if no-outer-repo
122 $ hg id test
122 $ hg id test
123 abort: unknown repository format: requires features 'fake' (upgrade Mercurial)!
123 abort: repository requires features unknown to this Mercurial: fake!
124 (see http://mercurial.selenic.com/wiki/MissingRequirement for details)
124 (see http://mercurial.selenic.com/wiki/MissingRequirement for more information)
125 [255]
125 [255]
126 #endif
126 #endif
@@ -1,2290 +1,2290 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 $ hg log -qf sub2/large7
741 $ hg log -qf sub2/large7
742 7:daea875e9014
742 7:daea875e9014
743 $ cd ..
743 $ cd ..
744 $ hg clone a -r 3 c
744 $ hg clone a -r 3 c
745 adding changesets
745 adding changesets
746 adding manifests
746 adding manifests
747 adding file changes
747 adding file changes
748 added 4 changesets with 10 changes to 4 files
748 added 4 changesets with 10 changes to 4 files
749 updating to branch default
749 updating to branch default
750 getting changed largefiles
750 getting changed largefiles
751 2 largefiles updated, 0 removed
751 2 largefiles updated, 0 removed
752 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
752 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
753 $ cd c
753 $ cd c
754 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
754 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
755 3:9e8fbc4bce62 copy files
755 3:9e8fbc4bce62 copy files
756 2:51a0ae4d5864 remove files
756 2:51a0ae4d5864 remove files
757 1:ce8896473775 edit files
757 1:ce8896473775 edit files
758 0:30d30fe6a5be add files
758 0:30d30fe6a5be add files
759 $ cat normal1
759 $ cat normal1
760 normal22
760 normal22
761 $ cat large1
761 $ cat large1
762 large22
762 large22
763 $ cat sub/normal2
763 $ cat sub/normal2
764 normal22
764 normal22
765 $ cat sub/large2
765 $ cat sub/large2
766 large22
766 large22
767
767
768 Old revisions of a clone have correct largefiles content (this also
768 Old revisions of a clone have correct largefiles content (this also
769 tests update).
769 tests update).
770
770
771 $ hg update -r 1
771 $ hg update -r 1
772 getting changed largefiles
772 getting changed largefiles
773 1 largefiles updated, 0 removed
773 1 largefiles updated, 0 removed
774 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
774 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
775 $ cat large1
775 $ cat large1
776 large11
776 large11
777 $ cat sub/large2
777 $ cat sub/large2
778 large22
778 large22
779 $ cd ..
779 $ cd ..
780
780
781 Test cloning with --all-largefiles flag
781 Test cloning with --all-largefiles flag
782
782
783 $ rm "${USERCACHE}"/*
783 $ rm "${USERCACHE}"/*
784 $ hg clone --all-largefiles a a-backup
784 $ hg clone --all-largefiles a a-backup
785 updating to branch default
785 updating to branch default
786 getting changed largefiles
786 getting changed largefiles
787 3 largefiles updated, 0 removed
787 3 largefiles updated, 0 removed
788 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
788 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
789 8 additional largefiles cached
789 8 additional largefiles cached
790
790
791 $ rm "${USERCACHE}"/*
791 $ rm "${USERCACHE}"/*
792 $ hg clone --all-largefiles -u 0 a a-clone0
792 $ hg clone --all-largefiles -u 0 a a-clone0
793 updating to branch default
793 updating to branch default
794 getting changed largefiles
794 getting changed largefiles
795 2 largefiles updated, 0 removed
795 2 largefiles updated, 0 removed
796 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
796 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
797 9 additional largefiles cached
797 9 additional largefiles cached
798 $ hg -R a-clone0 sum
798 $ hg -R a-clone0 sum
799 parent: 0:30d30fe6a5be
799 parent: 0:30d30fe6a5be
800 add files
800 add files
801 branch: default
801 branch: default
802 commit: (clean)
802 commit: (clean)
803 update: 7 new changesets (update)
803 update: 7 new changesets (update)
804
804
805 $ rm "${USERCACHE}"/*
805 $ rm "${USERCACHE}"/*
806 $ hg clone --all-largefiles -u 1 a a-clone1
806 $ hg clone --all-largefiles -u 1 a a-clone1
807 updating to branch default
807 updating to branch default
808 getting changed largefiles
808 getting changed largefiles
809 2 largefiles updated, 0 removed
809 2 largefiles updated, 0 removed
810 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
810 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
811 8 additional largefiles cached
811 8 additional largefiles cached
812 $ hg -R a-clone1 verify --large --lfa --lfc
812 $ hg -R a-clone1 verify --large --lfa --lfc
813 checking changesets
813 checking changesets
814 checking manifests
814 checking manifests
815 crosschecking files in changesets and manifests
815 crosschecking files in changesets and manifests
816 checking files
816 checking files
817 10 files, 8 changesets, 24 total revisions
817 10 files, 8 changesets, 24 total revisions
818 searching 8 changesets for largefiles
818 searching 8 changesets for largefiles
819 verified contents of 13 revisions of 6 largefiles
819 verified contents of 13 revisions of 6 largefiles
820 $ hg -R a-clone1 sum
820 $ hg -R a-clone1 sum
821 parent: 1:ce8896473775
821 parent: 1:ce8896473775
822 edit files
822 edit files
823 branch: default
823 branch: default
824 commit: (clean)
824 commit: (clean)
825 update: 6 new changesets (update)
825 update: 6 new changesets (update)
826
826
827 $ rm "${USERCACHE}"/*
827 $ rm "${USERCACHE}"/*
828 $ hg clone --all-largefiles -U a a-clone-u
828 $ hg clone --all-largefiles -U a a-clone-u
829 11 additional largefiles cached
829 11 additional largefiles cached
830 $ hg -R a-clone-u sum
830 $ hg -R a-clone-u sum
831 parent: -1:000000000000 (no revision checked out)
831 parent: -1:000000000000 (no revision checked out)
832 branch: default
832 branch: default
833 commit: (clean)
833 commit: (clean)
834 update: 8 new changesets (update)
834 update: 8 new changesets (update)
835
835
836 Show computed destination directory:
836 Show computed destination directory:
837
837
838 $ mkdir xyz
838 $ mkdir xyz
839 $ cd xyz
839 $ cd xyz
840 $ hg clone ../a
840 $ hg clone ../a
841 destination directory: a
841 destination directory: a
842 updating to branch default
842 updating to branch default
843 getting changed largefiles
843 getting changed largefiles
844 3 largefiles updated, 0 removed
844 3 largefiles updated, 0 removed
845 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
845 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
846 $ cd ..
846 $ cd ..
847
847
848 Clone URL without path:
848 Clone URL without path:
849
849
850 $ hg clone file://
850 $ hg clone file://
851 abort: repository / not found!
851 abort: repository / not found!
852 [255]
852 [255]
853
853
854 Ensure base clone command argument validation
854 Ensure base clone command argument validation
855
855
856 $ hg clone -U -u 0 a a-clone-failure
856 $ hg clone -U -u 0 a a-clone-failure
857 abort: cannot specify both --noupdate and --updaterev
857 abort: cannot specify both --noupdate and --updaterev
858 [255]
858 [255]
859
859
860 $ hg clone --all-largefiles a ssh://localhost/a
860 $ hg clone --all-largefiles a ssh://localhost/a
861 abort: --all-largefiles is incompatible with non-local destination ssh://localhost/a
861 abort: --all-largefiles is incompatible with non-local destination ssh://localhost/a
862 [255]
862 [255]
863
863
864 Test pulling with --all-largefiles flag. Also test that the largefiles are
864 Test pulling with --all-largefiles flag. Also test that the largefiles are
865 downloaded from 'default' instead of 'default-push' when no source is specified
865 downloaded from 'default' instead of 'default-push' when no source is specified
866 (issue3584)
866 (issue3584)
867
867
868 $ rm -Rf a-backup
868 $ rm -Rf a-backup
869 $ hg clone -r 1 a a-backup
869 $ hg clone -r 1 a a-backup
870 adding changesets
870 adding changesets
871 adding manifests
871 adding manifests
872 adding file changes
872 adding file changes
873 added 2 changesets with 8 changes to 4 files
873 added 2 changesets with 8 changes to 4 files
874 updating to branch default
874 updating to branch default
875 getting changed largefiles
875 getting changed largefiles
876 2 largefiles updated, 0 removed
876 2 largefiles updated, 0 removed
877 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
877 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
878 $ rm "${USERCACHE}"/*
878 $ rm "${USERCACHE}"/*
879 $ cd a-backup
879 $ cd a-backup
880 $ hg pull --all-largefiles --config paths.default-push=bogus/path
880 $ hg pull --all-largefiles --config paths.default-push=bogus/path
881 pulling from $TESTTMP/a (glob)
881 pulling from $TESTTMP/a (glob)
882 searching for changes
882 searching for changes
883 adding changesets
883 adding changesets
884 adding manifests
884 adding manifests
885 adding file changes
885 adding file changes
886 added 6 changesets with 16 changes to 8 files
886 added 6 changesets with 16 changes to 8 files
887 (run 'hg update' to get a working copy)
887 (run 'hg update' to get a working copy)
888 6 largefiles cached
888 6 largefiles cached
889
889
890 redo pull with --lfrev and check it pulls largefiles for the right revs
890 redo pull with --lfrev and check it pulls largefiles for the right revs
891
891
892 $ hg rollback
892 $ hg rollback
893 repository tip rolled back to revision 1 (undo pull)
893 repository tip rolled back to revision 1 (undo pull)
894 $ hg pull -v --lfrev 'heads(pulled())+min(pulled())'
894 $ hg pull -v --lfrev 'heads(pulled())+min(pulled())'
895 pulling from $TESTTMP/a (glob)
895 pulling from $TESTTMP/a (glob)
896 searching for changes
896 searching for changes
897 all local heads known remotely
897 all local heads known remotely
898 6 changesets found
898 6 changesets found
899 adding changesets
899 adding changesets
900 adding manifests
900 adding manifests
901 adding file changes
901 adding file changes
902 added 6 changesets with 16 changes to 8 files
902 added 6 changesets with 16 changes to 8 files
903 calling hook changegroup.lfiles: hgext.largefiles.reposetup.checkrequireslfiles
903 calling hook changegroup.lfiles: hgext.largefiles.reposetup.checkrequireslfiles
904 (run 'hg update' to get a working copy)
904 (run 'hg update' to get a working copy)
905 pulling largefiles for revision 7
905 pulling largefiles for revision 7
906 found 971fb41e78fea4f8e0ba5244784239371cb00591 in store
906 found 971fb41e78fea4f8e0ba5244784239371cb00591 in store
907 found 0d6d75887db61b2c7e6c74b5dd8fc6ad50c0cc30 in store
907 found 0d6d75887db61b2c7e6c74b5dd8fc6ad50c0cc30 in store
908 found bb3151689acb10f0c3125c560d5e63df914bc1af in store
908 found bb3151689acb10f0c3125c560d5e63df914bc1af in store
909 pulling largefiles for revision 2
909 pulling largefiles for revision 2
910 found eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 in store
910 found eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 in store
911 0 largefiles cached
911 0 largefiles cached
912
912
913 lfpull
913 lfpull
914
914
915 $ hg lfpull -r : --config largefiles.usercache=usercache-lfpull
915 $ hg lfpull -r : --config largefiles.usercache=usercache-lfpull
916 2 largefiles cached
916 2 largefiles cached
917 $ hg lfpull -v -r 4+2 --config largefiles.usercache=usercache-lfpull
917 $ hg lfpull -v -r 4+2 --config largefiles.usercache=usercache-lfpull
918 pulling largefiles for revision 4
918 pulling largefiles for revision 4
919 found eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 in store
919 found eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 in store
920 found eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 in store
920 found eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 in store
921 pulling largefiles for revision 2
921 pulling largefiles for revision 2
922 found eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 in store
922 found eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 in store
923 0 largefiles cached
923 0 largefiles cached
924
924
925 $ ls usercache-lfpull/* | sort
925 $ ls usercache-lfpull/* | sort
926 usercache-lfpull/1deebade43c8c498a3c8daddac0244dc55d1331d
926 usercache-lfpull/1deebade43c8c498a3c8daddac0244dc55d1331d
927 usercache-lfpull/4669e532d5b2c093a78eca010077e708a071bb64
927 usercache-lfpull/4669e532d5b2c093a78eca010077e708a071bb64
928
928
929 $ cd ..
929 $ cd ..
930
930
931 Rebasing between two repositories does not revert largefiles to old
931 Rebasing between two repositories does not revert largefiles to old
932 revisions (this was a very bad bug that took a lot of work to fix).
932 revisions (this was a very bad bug that took a lot of work to fix).
933
933
934 $ hg clone a d
934 $ hg clone a d
935 updating to branch default
935 updating to branch default
936 getting changed largefiles
936 getting changed largefiles
937 3 largefiles updated, 0 removed
937 3 largefiles updated, 0 removed
938 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
938 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
939 $ cd b
939 $ cd b
940 $ echo large4-modified > sub/large4
940 $ echo large4-modified > sub/large4
941 $ echo normal3-modified > normal3
941 $ echo normal3-modified > normal3
942 $ hg commit -m "modify normal file and largefile in repo b"
942 $ hg commit -m "modify normal file and largefile in repo b"
943 Invoking status precommit hook
943 Invoking status precommit hook
944 M normal3
944 M normal3
945 M sub/large4
945 M sub/large4
946 $ cd ../d
946 $ cd ../d
947 $ echo large6-modified > sub2/large6
947 $ echo large6-modified > sub2/large6
948 $ echo normal4-modified > sub/normal4
948 $ echo normal4-modified > sub/normal4
949 $ hg commit -m "modify normal file largefile in repo d"
949 $ hg commit -m "modify normal file largefile in repo d"
950 Invoking status precommit hook
950 Invoking status precommit hook
951 M sub/normal4
951 M sub/normal4
952 M sub2/large6
952 M sub2/large6
953 $ cd ..
953 $ cd ..
954 $ hg clone d e
954 $ hg clone d e
955 updating to branch default
955 updating to branch default
956 getting changed largefiles
956 getting changed largefiles
957 3 largefiles updated, 0 removed
957 3 largefiles updated, 0 removed
958 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
958 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
959 $ cd d
959 $ cd d
960
960
961 More rebase testing, but also test that the largefiles are downloaded from
961 More rebase testing, but also test that the largefiles are downloaded from
962 'default-push' when no source is specified (issue3584). (The largefile from the
962 'default-push' when no source is specified (issue3584). (The largefile from the
963 pulled revision is however not downloaded but found in the local cache.)
963 pulled revision is however not downloaded but found in the local cache.)
964 Largefiles are fetched for the new pulled revision, not for existing revisions,
964 Largefiles are fetched for the new pulled revision, not for existing revisions,
965 rebased or not.
965 rebased or not.
966
966
967 $ [ ! -f .hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 ]
967 $ [ ! -f .hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 ]
968 $ hg pull --rebase --all-largefiles --config paths.default-push=bogus/path --config paths.default=../b
968 $ hg pull --rebase --all-largefiles --config paths.default-push=bogus/path --config paths.default=../b
969 pulling from $TESTTMP/b (glob)
969 pulling from $TESTTMP/b (glob)
970 searching for changes
970 searching for changes
971 adding changesets
971 adding changesets
972 adding manifests
972 adding manifests
973 adding file changes
973 adding file changes
974 added 1 changesets with 2 changes to 2 files (+1 heads)
974 added 1 changesets with 2 changes to 2 files (+1 heads)
975 Invoking status precommit hook
975 Invoking status precommit hook
976 M sub/normal4
976 M sub/normal4
977 M sub2/large6
977 M sub2/large6
978 saved backup bundle to $TESTTMP/d/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
978 saved backup bundle to $TESTTMP/d/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
979 0 largefiles cached
979 0 largefiles cached
980 nothing to rebase - working directory parent is also destination
980 nothing to rebase - working directory parent is also destination
981 $ [ -f .hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 ]
981 $ [ -f .hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 ]
982 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
982 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
983 9:598410d3eb9a modify normal file largefile in repo d
983 9:598410d3eb9a modify normal file largefile in repo d
984 8:a381d2c8c80e modify normal file and largefile in repo b
984 8:a381d2c8c80e modify normal file and largefile in repo b
985 7:daea875e9014 add/edit more largefiles
985 7:daea875e9014 add/edit more largefiles
986 6:4355d653f84f edit files yet again
986 6:4355d653f84f edit files yet again
987 5:9d5af5072dbd edit files again
987 5:9d5af5072dbd edit files again
988 4:74c02385b94c move files
988 4:74c02385b94c move files
989 3:9e8fbc4bce62 copy files
989 3:9e8fbc4bce62 copy files
990 2:51a0ae4d5864 remove files
990 2:51a0ae4d5864 remove files
991 1:ce8896473775 edit files
991 1:ce8896473775 edit files
992 0:30d30fe6a5be add files
992 0:30d30fe6a5be add files
993 $ cat normal3
993 $ cat normal3
994 normal3-modified
994 normal3-modified
995 $ cat sub/normal4
995 $ cat sub/normal4
996 normal4-modified
996 normal4-modified
997 $ cat sub/large4
997 $ cat sub/large4
998 large4-modified
998 large4-modified
999 $ cat sub2/large6
999 $ cat sub2/large6
1000 large6-modified
1000 large6-modified
1001 $ cat sub2/large7
1001 $ cat sub2/large7
1002 large7
1002 large7
1003 $ cd ../e
1003 $ cd ../e
1004 $ hg pull ../b
1004 $ hg pull ../b
1005 pulling from ../b
1005 pulling from ../b
1006 searching for changes
1006 searching for changes
1007 adding changesets
1007 adding changesets
1008 adding manifests
1008 adding manifests
1009 adding file changes
1009 adding file changes
1010 added 1 changesets with 2 changes to 2 files (+1 heads)
1010 added 1 changesets with 2 changes to 2 files (+1 heads)
1011 (run 'hg heads' to see heads, 'hg merge' to merge)
1011 (run 'hg heads' to see heads, 'hg merge' to merge)
1012 $ hg rebase
1012 $ hg rebase
1013 Invoking status precommit hook
1013 Invoking status precommit hook
1014 M sub/normal4
1014 M sub/normal4
1015 M sub2/large6
1015 M sub2/large6
1016 saved backup bundle to $TESTTMP/e/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
1016 saved backup bundle to $TESTTMP/e/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
1017 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
1017 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
1018 9:598410d3eb9a modify normal file largefile in repo d
1018 9:598410d3eb9a modify normal file largefile in repo d
1019 8:a381d2c8c80e modify normal file and largefile in repo b
1019 8:a381d2c8c80e modify normal file and largefile in repo b
1020 7:daea875e9014 add/edit more largefiles
1020 7:daea875e9014 add/edit more largefiles
1021 6:4355d653f84f edit files yet again
1021 6:4355d653f84f edit files yet again
1022 5:9d5af5072dbd edit files again
1022 5:9d5af5072dbd edit files again
1023 4:74c02385b94c move files
1023 4:74c02385b94c move files
1024 3:9e8fbc4bce62 copy files
1024 3:9e8fbc4bce62 copy files
1025 2:51a0ae4d5864 remove files
1025 2:51a0ae4d5864 remove files
1026 1:ce8896473775 edit files
1026 1:ce8896473775 edit files
1027 0:30d30fe6a5be add files
1027 0:30d30fe6a5be add files
1028 $ cat normal3
1028 $ cat normal3
1029 normal3-modified
1029 normal3-modified
1030 $ cat sub/normal4
1030 $ cat sub/normal4
1031 normal4-modified
1031 normal4-modified
1032 $ cat sub/large4
1032 $ cat sub/large4
1033 large4-modified
1033 large4-modified
1034 $ cat sub2/large6
1034 $ cat sub2/large6
1035 large6-modified
1035 large6-modified
1036 $ cat sub2/large7
1036 $ cat sub2/large7
1037 large7
1037 large7
1038
1038
1039 Log on largefiles
1039 Log on largefiles
1040
1040
1041 - same output
1041 - same output
1042 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' .hglf/sub/large4
1042 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' .hglf/sub/large4
1043 8:a381d2c8c80e modify normal file and largefile in repo b
1043 8:a381d2c8c80e modify normal file and largefile in repo b
1044 6:4355d653f84f edit files yet again
1044 6:4355d653f84f edit files yet again
1045 5:9d5af5072dbd edit files again
1045 5:9d5af5072dbd edit files again
1046 4:74c02385b94c move files
1046 4:74c02385b94c move files
1047 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' sub/large4
1047 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' sub/large4
1048 8:a381d2c8c80e modify normal file and largefile in repo b
1048 8:a381d2c8c80e modify normal file and largefile in repo b
1049 6:4355d653f84f edit files yet again
1049 6:4355d653f84f edit files yet again
1050 5:9d5af5072dbd edit files again
1050 5:9d5af5072dbd edit files again
1051 4:74c02385b94c move files
1051 4:74c02385b94c move files
1052
1052
1053 - .hglf only matches largefiles, without .hglf it matches 9 bco sub/normal
1053 - .hglf only matches largefiles, without .hglf it matches 9 bco sub/normal
1054 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' .hglf/sub
1054 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' .hglf/sub
1055 8:a381d2c8c80e modify normal file and largefile in repo b
1055 8:a381d2c8c80e modify normal file and largefile in repo b
1056 6:4355d653f84f edit files yet again
1056 6:4355d653f84f edit files yet again
1057 5:9d5af5072dbd edit files again
1057 5:9d5af5072dbd edit files again
1058 4:74c02385b94c move files
1058 4:74c02385b94c move files
1059 1:ce8896473775 edit files
1059 1:ce8896473775 edit files
1060 0:30d30fe6a5be add files
1060 0:30d30fe6a5be add files
1061 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' sub
1061 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' sub
1062 9:598410d3eb9a modify normal file largefile in repo d
1062 9:598410d3eb9a modify normal file largefile in repo d
1063 8:a381d2c8c80e modify normal file and largefile in repo b
1063 8:a381d2c8c80e modify normal file and largefile in repo b
1064 6:4355d653f84f edit files yet again
1064 6:4355d653f84f edit files yet again
1065 5:9d5af5072dbd edit files again
1065 5:9d5af5072dbd edit files again
1066 4:74c02385b94c move files
1066 4:74c02385b94c move files
1067 1:ce8896473775 edit files
1067 1:ce8896473775 edit files
1068 0:30d30fe6a5be add files
1068 0:30d30fe6a5be add files
1069
1069
1070 - globbing gives same result
1070 - globbing gives same result
1071 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' 'glob:sub/*'
1071 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' 'glob:sub/*'
1072 9:598410d3eb9a modify normal file largefile in repo d
1072 9:598410d3eb9a modify normal file largefile in repo d
1073 8:a381d2c8c80e modify normal file and largefile in repo b
1073 8:a381d2c8c80e modify normal file and largefile in repo b
1074 6:4355d653f84f edit files yet again
1074 6:4355d653f84f edit files yet again
1075 5:9d5af5072dbd edit files again
1075 5:9d5af5072dbd edit files again
1076 4:74c02385b94c move files
1076 4:74c02385b94c move files
1077 1:ce8896473775 edit files
1077 1:ce8896473775 edit files
1078 0:30d30fe6a5be add files
1078 0:30d30fe6a5be add files
1079
1079
1080 Rollback on largefiles.
1080 Rollback on largefiles.
1081
1081
1082 $ echo large4-modified-again > sub/large4
1082 $ echo large4-modified-again > sub/large4
1083 $ hg commit -m "Modify large4 again"
1083 $ hg commit -m "Modify large4 again"
1084 Invoking status precommit hook
1084 Invoking status precommit hook
1085 M sub/large4
1085 M sub/large4
1086 $ hg rollback
1086 $ hg rollback
1087 repository tip rolled back to revision 9 (undo commit)
1087 repository tip rolled back to revision 9 (undo commit)
1088 working directory now based on revision 9
1088 working directory now based on revision 9
1089 $ hg st
1089 $ hg st
1090 M sub/large4
1090 M sub/large4
1091 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
1091 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
1092 9:598410d3eb9a modify normal file largefile in repo d
1092 9:598410d3eb9a modify normal file largefile in repo d
1093 8:a381d2c8c80e modify normal file and largefile in repo b
1093 8:a381d2c8c80e modify normal file and largefile in repo b
1094 7:daea875e9014 add/edit more largefiles
1094 7:daea875e9014 add/edit more largefiles
1095 6:4355d653f84f edit files yet again
1095 6:4355d653f84f edit files yet again
1096 5:9d5af5072dbd edit files again
1096 5:9d5af5072dbd edit files again
1097 4:74c02385b94c move files
1097 4:74c02385b94c move files
1098 3:9e8fbc4bce62 copy files
1098 3:9e8fbc4bce62 copy files
1099 2:51a0ae4d5864 remove files
1099 2:51a0ae4d5864 remove files
1100 1:ce8896473775 edit files
1100 1:ce8896473775 edit files
1101 0:30d30fe6a5be add files
1101 0:30d30fe6a5be add files
1102 $ cat sub/large4
1102 $ cat sub/large4
1103 large4-modified-again
1103 large4-modified-again
1104
1104
1105 "update --check" refuses to update with uncommitted changes.
1105 "update --check" refuses to update with uncommitted changes.
1106 $ hg update --check 8
1106 $ hg update --check 8
1107 abort: uncommitted changes
1107 abort: uncommitted changes
1108 [255]
1108 [255]
1109
1109
1110 "update --clean" leaves correct largefiles in working copy, even when there is
1110 "update --clean" leaves correct largefiles in working copy, even when there is
1111 .orig files from revert in .hglf.
1111 .orig files from revert in .hglf.
1112
1112
1113 $ echo mistake > sub2/large7
1113 $ echo mistake > sub2/large7
1114 $ hg revert sub2/large7
1114 $ hg revert sub2/large7
1115 $ hg -q update --clean -r null
1115 $ hg -q update --clean -r null
1116 $ hg update --clean
1116 $ hg update --clean
1117 getting changed largefiles
1117 getting changed largefiles
1118 3 largefiles updated, 0 removed
1118 3 largefiles updated, 0 removed
1119 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1119 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1120 $ cat normal3
1120 $ cat normal3
1121 normal3-modified
1121 normal3-modified
1122 $ cat sub/normal4
1122 $ cat sub/normal4
1123 normal4-modified
1123 normal4-modified
1124 $ cat sub/large4
1124 $ cat sub/large4
1125 large4-modified
1125 large4-modified
1126 $ cat sub2/large6
1126 $ cat sub2/large6
1127 large6-modified
1127 large6-modified
1128 $ cat sub2/large7
1128 $ cat sub2/large7
1129 large7
1129 large7
1130 $ cat sub2/large7.orig
1130 $ cat sub2/large7.orig
1131 mistake
1131 mistake
1132 $ cat .hglf/sub2/large7.orig
1132 $ cat .hglf/sub2/large7.orig
1133 9dbfb2c79b1c40981b258c3efa1b10b03f18ad31
1133 9dbfb2c79b1c40981b258c3efa1b10b03f18ad31
1134
1134
1135 demonstrate misfeature: .orig file is overwritten on every update -C,
1135 demonstrate misfeature: .orig file is overwritten on every update -C,
1136 also when clean:
1136 also when clean:
1137 $ hg update --clean
1137 $ hg update --clean
1138 getting changed largefiles
1138 getting changed largefiles
1139 0 largefiles updated, 0 removed
1139 0 largefiles updated, 0 removed
1140 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1140 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1141 $ cat sub2/large7.orig
1141 $ cat sub2/large7.orig
1142 large7
1142 large7
1143 $ rm sub2/large7.orig .hglf/sub2/large7.orig
1143 $ rm sub2/large7.orig .hglf/sub2/large7.orig
1144
1144
1145 Now "update check" is happy.
1145 Now "update check" is happy.
1146 $ hg update --check 8
1146 $ hg update --check 8
1147 getting changed largefiles
1147 getting changed largefiles
1148 1 largefiles updated, 0 removed
1148 1 largefiles updated, 0 removed
1149 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1149 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1150 $ hg update --check
1150 $ hg update --check
1151 getting changed largefiles
1151 getting changed largefiles
1152 1 largefiles updated, 0 removed
1152 1 largefiles updated, 0 removed
1153 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1153 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1154
1154
1155 Test removing empty largefiles directories on update
1155 Test removing empty largefiles directories on update
1156 $ test -d sub2 && echo "sub2 exists"
1156 $ test -d sub2 && echo "sub2 exists"
1157 sub2 exists
1157 sub2 exists
1158 $ hg update -q null
1158 $ hg update -q null
1159 $ test -d sub2 && echo "error: sub2 should not exist anymore"
1159 $ test -d sub2 && echo "error: sub2 should not exist anymore"
1160 [1]
1160 [1]
1161 $ hg update -q
1161 $ hg update -q
1162
1162
1163 Test hg remove removes empty largefiles directories
1163 Test hg remove removes empty largefiles directories
1164 $ test -d sub2 && echo "sub2 exists"
1164 $ test -d sub2 && echo "sub2 exists"
1165 sub2 exists
1165 sub2 exists
1166 $ hg remove sub2/*
1166 $ hg remove sub2/*
1167 $ test -d sub2 && echo "error: sub2 should not exist anymore"
1167 $ test -d sub2 && echo "error: sub2 should not exist anymore"
1168 [1]
1168 [1]
1169 $ hg revert sub2/large6 sub2/large7
1169 $ hg revert sub2/large6 sub2/large7
1170
1170
1171 "revert" works on largefiles (and normal files too).
1171 "revert" works on largefiles (and normal files too).
1172 $ echo hack3 >> normal3
1172 $ echo hack3 >> normal3
1173 $ echo hack4 >> sub/normal4
1173 $ echo hack4 >> sub/normal4
1174 $ echo hack4 >> sub/large4
1174 $ echo hack4 >> sub/large4
1175 $ rm sub2/large6
1175 $ rm sub2/large6
1176 $ hg revert sub2/large6
1176 $ hg revert sub2/large6
1177 $ hg rm sub2/large6
1177 $ hg rm sub2/large6
1178 $ echo new >> sub2/large8
1178 $ echo new >> sub2/large8
1179 $ hg add --large sub2/large8
1179 $ hg add --large sub2/large8
1180 # XXX we don't really want to report that we're reverting the standin;
1180 # XXX we don't really want to report that we're reverting the standin;
1181 # that's just an implementation detail. But I don't see an obvious fix. ;-(
1181 # that's just an implementation detail. But I don't see an obvious fix. ;-(
1182 $ hg revert sub
1182 $ hg revert sub
1183 reverting .hglf/sub/large4 (glob)
1183 reverting .hglf/sub/large4 (glob)
1184 reverting sub/normal4 (glob)
1184 reverting sub/normal4 (glob)
1185 $ hg status
1185 $ hg status
1186 M normal3
1186 M normal3
1187 A sub2/large8
1187 A sub2/large8
1188 R sub2/large6
1188 R sub2/large6
1189 ? sub/large4.orig
1189 ? sub/large4.orig
1190 ? sub/normal4.orig
1190 ? sub/normal4.orig
1191 $ cat sub/normal4
1191 $ cat sub/normal4
1192 normal4-modified
1192 normal4-modified
1193 $ cat sub/large4
1193 $ cat sub/large4
1194 large4-modified
1194 large4-modified
1195 $ hg revert -a --no-backup
1195 $ hg revert -a --no-backup
1196 undeleting .hglf/sub2/large6 (glob)
1196 undeleting .hglf/sub2/large6 (glob)
1197 forgetting .hglf/sub2/large8 (glob)
1197 forgetting .hglf/sub2/large8 (glob)
1198 reverting normal3
1198 reverting normal3
1199 $ hg status
1199 $ hg status
1200 ? sub/large4.orig
1200 ? sub/large4.orig
1201 ? sub/normal4.orig
1201 ? sub/normal4.orig
1202 ? sub2/large8
1202 ? sub2/large8
1203 $ cat normal3
1203 $ cat normal3
1204 normal3-modified
1204 normal3-modified
1205 $ cat sub2/large6
1205 $ cat sub2/large6
1206 large6-modified
1206 large6-modified
1207 $ rm sub/*.orig sub2/large8
1207 $ rm sub/*.orig sub2/large8
1208
1208
1209 revert some files to an older revision
1209 revert some files to an older revision
1210 $ hg revert --no-backup -r 8 sub2
1210 $ hg revert --no-backup -r 8 sub2
1211 reverting .hglf/sub2/large6 (glob)
1211 reverting .hglf/sub2/large6 (glob)
1212 $ cat sub2/large6
1212 $ cat sub2/large6
1213 large6
1213 large6
1214 $ hg revert --no-backup -C -r '.^' sub2
1214 $ hg revert --no-backup -C -r '.^' sub2
1215 reverting .hglf/sub2/large6 (glob)
1215 reverting .hglf/sub2/large6 (glob)
1216 $ hg revert --no-backup sub2
1216 $ hg revert --no-backup sub2
1217 reverting .hglf/sub2/large6 (glob)
1217 reverting .hglf/sub2/large6 (glob)
1218 $ hg status
1218 $ hg status
1219
1219
1220 "verify --large" actually verifies largefiles
1220 "verify --large" actually verifies largefiles
1221
1221
1222 - Where Do We Come From? What Are We? Where Are We Going?
1222 - Where Do We Come From? What Are We? Where Are We Going?
1223 $ pwd
1223 $ pwd
1224 $TESTTMP/e
1224 $TESTTMP/e
1225 $ hg paths
1225 $ hg paths
1226 default = $TESTTMP/d (glob)
1226 default = $TESTTMP/d (glob)
1227
1227
1228 $ hg verify --large
1228 $ hg verify --large
1229 checking changesets
1229 checking changesets
1230 checking manifests
1230 checking manifests
1231 crosschecking files in changesets and manifests
1231 crosschecking files in changesets and manifests
1232 checking files
1232 checking files
1233 10 files, 10 changesets, 28 total revisions
1233 10 files, 10 changesets, 28 total revisions
1234 searching 1 changesets for largefiles
1234 searching 1 changesets for largefiles
1235 verified existence of 3 revisions of 3 largefiles
1235 verified existence of 3 revisions of 3 largefiles
1236
1236
1237 - introduce missing blob in local store repo and make sure that this is caught:
1237 - introduce missing blob in local store repo and make sure that this is caught:
1238 $ mv $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 .
1238 $ mv $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 .
1239 $ hg verify --large
1239 $ hg verify --large
1240 checking changesets
1240 checking changesets
1241 checking manifests
1241 checking manifests
1242 crosschecking files in changesets and manifests
1242 crosschecking files in changesets and manifests
1243 checking files
1243 checking files
1244 10 files, 10 changesets, 28 total revisions
1244 10 files, 10 changesets, 28 total revisions
1245 searching 1 changesets for largefiles
1245 searching 1 changesets for largefiles
1246 changeset 9:598410d3eb9a: sub/large4 references missing $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 (glob)
1246 changeset 9:598410d3eb9a: sub/large4 references missing $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 (glob)
1247 verified existence of 3 revisions of 3 largefiles
1247 verified existence of 3 revisions of 3 largefiles
1248 [1]
1248 [1]
1249
1249
1250 - introduce corruption and make sure that it is caught when checking content:
1250 - introduce corruption and make sure that it is caught when checking content:
1251 $ echo '5 cents' > $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928
1251 $ echo '5 cents' > $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928
1252 $ hg verify -q --large --lfc
1252 $ hg verify -q --large --lfc
1253 changeset 9:598410d3eb9a: sub/large4 references corrupted $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 (glob)
1253 changeset 9:598410d3eb9a: sub/large4 references corrupted $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 (glob)
1254 [1]
1254 [1]
1255
1255
1256 - cleanup
1256 - cleanup
1257 $ mv e166e74c7303192238d60af5a9c4ce9bef0b7928 $TESTTMP/d/.hg/largefiles/
1257 $ mv e166e74c7303192238d60af5a9c4ce9bef0b7928 $TESTTMP/d/.hg/largefiles/
1258
1258
1259 - verifying all revisions will fail because we didn't clone all largefiles to d:
1259 - verifying all revisions will fail because we didn't clone all largefiles to d:
1260 $ echo 'T-shirt' > $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4
1260 $ echo 'T-shirt' > $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4
1261 $ hg verify -q --lfa --lfc
1261 $ hg verify -q --lfa --lfc
1262 changeset 0:30d30fe6a5be: large1 references missing $TESTTMP/d/.hg/largefiles/4669e532d5b2c093a78eca010077e708a071bb64 (glob)
1262 changeset 0:30d30fe6a5be: large1 references missing $TESTTMP/d/.hg/largefiles/4669e532d5b2c093a78eca010077e708a071bb64 (glob)
1263 changeset 0:30d30fe6a5be: sub/large2 references missing $TESTTMP/d/.hg/largefiles/1deebade43c8c498a3c8daddac0244dc55d1331d (glob)
1263 changeset 0:30d30fe6a5be: sub/large2 references missing $TESTTMP/d/.hg/largefiles/1deebade43c8c498a3c8daddac0244dc55d1331d (glob)
1264 changeset 1:ce8896473775: large1 references missing $TESTTMP/d/.hg/largefiles/5f78770c0e77ba4287ad6ef3071c9bf9c379742f (glob)
1264 changeset 1:ce8896473775: large1 references missing $TESTTMP/d/.hg/largefiles/5f78770c0e77ba4287ad6ef3071c9bf9c379742f (glob)
1265 changeset 1:ce8896473775: sub/large2 references corrupted $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 (glob)
1265 changeset 1:ce8896473775: sub/large2 references corrupted $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 (glob)
1266 changeset 3:9e8fbc4bce62: large1 references corrupted $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 (glob)
1266 changeset 3:9e8fbc4bce62: large1 references corrupted $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 (glob)
1267 changeset 4:74c02385b94c: large3 references corrupted $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 (glob)
1267 changeset 4:74c02385b94c: large3 references corrupted $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 (glob)
1268 changeset 4:74c02385b94c: sub/large4 references corrupted $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 (glob)
1268 changeset 4:74c02385b94c: sub/large4 references corrupted $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 (glob)
1269 changeset 5:9d5af5072dbd: large3 references missing $TESTTMP/d/.hg/largefiles/baaf12afde9d8d67f25dab6dced0d2bf77dba47c (glob)
1269 changeset 5:9d5af5072dbd: large3 references missing $TESTTMP/d/.hg/largefiles/baaf12afde9d8d67f25dab6dced0d2bf77dba47c (glob)
1270 changeset 5:9d5af5072dbd: sub/large4 references missing $TESTTMP/d/.hg/largefiles/aeb2210d19f02886dde00dac279729a48471e2f9 (glob)
1270 changeset 5:9d5af5072dbd: sub/large4 references missing $TESTTMP/d/.hg/largefiles/aeb2210d19f02886dde00dac279729a48471e2f9 (glob)
1271 changeset 6:4355d653f84f: large3 references missing $TESTTMP/d/.hg/largefiles/7838695e10da2bb75ac1156565f40a2595fa2fa0 (glob)
1271 changeset 6:4355d653f84f: large3 references missing $TESTTMP/d/.hg/largefiles/7838695e10da2bb75ac1156565f40a2595fa2fa0 (glob)
1272 [1]
1272 [1]
1273
1273
1274 - cleanup
1274 - cleanup
1275 $ rm $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4
1275 $ rm $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4
1276 $ rm -f .hglf/sub/*.orig
1276 $ rm -f .hglf/sub/*.orig
1277
1277
1278 Update to revision with missing largefile - and make sure it really is missing
1278 Update to revision with missing largefile - and make sure it really is missing
1279
1279
1280 $ rm ${USERCACHE}/7838695e10da2bb75ac1156565f40a2595fa2fa0
1280 $ rm ${USERCACHE}/7838695e10da2bb75ac1156565f40a2595fa2fa0
1281 $ hg up -r 6
1281 $ hg up -r 6
1282 getting changed largefiles
1282 getting changed largefiles
1283 large3: largefile 7838695e10da2bb75ac1156565f40a2595fa2fa0 not available from file:/*/$TESTTMP/d (glob)
1283 large3: largefile 7838695e10da2bb75ac1156565f40a2595fa2fa0 not available from file:/*/$TESTTMP/d (glob)
1284 1 largefiles updated, 2 removed
1284 1 largefiles updated, 2 removed
1285 4 files updated, 0 files merged, 2 files removed, 0 files unresolved
1285 4 files updated, 0 files merged, 2 files removed, 0 files unresolved
1286 $ rm normal3
1286 $ rm normal3
1287 $ echo >> sub/normal4
1287 $ echo >> sub/normal4
1288 $ hg ci -m 'commit with missing files'
1288 $ hg ci -m 'commit with missing files'
1289 Invoking status precommit hook
1289 Invoking status precommit hook
1290 M sub/normal4
1290 M sub/normal4
1291 ! large3
1291 ! large3
1292 ! normal3
1292 ! normal3
1293 created new head
1293 created new head
1294 $ hg st
1294 $ hg st
1295 ! large3
1295 ! large3
1296 ! normal3
1296 ! normal3
1297 $ hg up -r.
1297 $ hg up -r.
1298 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1298 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1299 $ hg st
1299 $ hg st
1300 ! large3
1300 ! large3
1301 ! normal3
1301 ! normal3
1302 $ hg up -Cr.
1302 $ hg up -Cr.
1303 getting changed largefiles
1303 getting changed largefiles
1304 large3: largefile 7838695e10da2bb75ac1156565f40a2595fa2fa0 not available from file:/*/$TESTTMP/d (glob)
1304 large3: largefile 7838695e10da2bb75ac1156565f40a2595fa2fa0 not available from file:/*/$TESTTMP/d (glob)
1305 0 largefiles updated, 0 removed
1305 0 largefiles updated, 0 removed
1306 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1306 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1307 $ hg st
1307 $ hg st
1308 ! large3
1308 ! large3
1309 $ hg rollback
1309 $ hg rollback
1310 repository tip rolled back to revision 9 (undo commit)
1310 repository tip rolled back to revision 9 (undo commit)
1311 working directory now based on revision 6
1311 working directory now based on revision 6
1312
1312
1313 Merge with revision with missing largefile - and make sure it tries to fetch it.
1313 Merge with revision with missing largefile - and make sure it tries to fetch it.
1314
1314
1315 $ hg up -Cqr null
1315 $ hg up -Cqr null
1316 $ echo f > f
1316 $ echo f > f
1317 $ hg ci -Am branch
1317 $ hg ci -Am branch
1318 adding f
1318 adding f
1319 Invoking status precommit hook
1319 Invoking status precommit hook
1320 A f
1320 A f
1321 created new head
1321 created new head
1322 $ hg merge -r 6
1322 $ hg merge -r 6
1323 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
1323 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
1324 (branch merge, don't forget to commit)
1324 (branch merge, don't forget to commit)
1325 getting changed largefiles
1325 getting changed largefiles
1326 large3: largefile 7838695e10da2bb75ac1156565f40a2595fa2fa0 not available from file:/*/$TESTTMP/d (glob)
1326 large3: largefile 7838695e10da2bb75ac1156565f40a2595fa2fa0 not available from file:/*/$TESTTMP/d (glob)
1327 1 largefiles updated, 0 removed
1327 1 largefiles updated, 0 removed
1328
1328
1329 $ hg rollback -q
1329 $ hg rollback -q
1330 $ hg up -Cq
1330 $ hg up -Cq
1331
1331
1332 Pulling 0 revisions with --all-largefiles should not fetch for all revisions
1332 Pulling 0 revisions with --all-largefiles should not fetch for all revisions
1333
1333
1334 $ hg pull --all-largefiles
1334 $ hg pull --all-largefiles
1335 pulling from $TESTTMP/d (glob)
1335 pulling from $TESTTMP/d (glob)
1336 searching for changes
1336 searching for changes
1337 no changes found
1337 no changes found
1338
1338
1339 Merging does not revert to old versions of largefiles and also check
1339 Merging does not revert to old versions of largefiles and also check
1340 that merging after having pulled from a non-default remote works
1340 that merging after having pulled from a non-default remote works
1341 correctly.
1341 correctly.
1342
1342
1343 $ cd ..
1343 $ cd ..
1344 $ hg clone -r 7 e temp
1344 $ hg clone -r 7 e temp
1345 adding changesets
1345 adding changesets
1346 adding manifests
1346 adding manifests
1347 adding file changes
1347 adding file changes
1348 added 8 changesets with 24 changes to 10 files
1348 added 8 changesets with 24 changes to 10 files
1349 updating to branch default
1349 updating to branch default
1350 getting changed largefiles
1350 getting changed largefiles
1351 3 largefiles updated, 0 removed
1351 3 largefiles updated, 0 removed
1352 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1352 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1353 $ hg clone temp f
1353 $ hg clone temp f
1354 updating to branch default
1354 updating to branch default
1355 getting changed largefiles
1355 getting changed largefiles
1356 3 largefiles updated, 0 removed
1356 3 largefiles updated, 0 removed
1357 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1357 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1358 # Delete the largefiles in the largefiles system cache so that we have an
1358 # Delete the largefiles in the largefiles system cache so that we have an
1359 # opportunity to test that caching after a pull works.
1359 # opportunity to test that caching after a pull works.
1360 $ rm "${USERCACHE}"/*
1360 $ rm "${USERCACHE}"/*
1361 $ cd f
1361 $ cd f
1362 $ echo "large4-merge-test" > sub/large4
1362 $ echo "large4-merge-test" > sub/large4
1363 $ hg commit -m "Modify large4 to test merge"
1363 $ hg commit -m "Modify large4 to test merge"
1364 Invoking status precommit hook
1364 Invoking status precommit hook
1365 M sub/large4
1365 M sub/large4
1366 # Test --cache-largefiles flag
1366 # Test --cache-largefiles flag
1367 $ hg pull --lfrev 'heads(pulled())' ../e
1367 $ hg pull --lfrev 'heads(pulled())' ../e
1368 pulling from ../e
1368 pulling from ../e
1369 searching for changes
1369 searching for changes
1370 adding changesets
1370 adding changesets
1371 adding manifests
1371 adding manifests
1372 adding file changes
1372 adding file changes
1373 added 2 changesets with 4 changes to 4 files (+1 heads)
1373 added 2 changesets with 4 changes to 4 files (+1 heads)
1374 (run 'hg heads' to see heads, 'hg merge' to merge)
1374 (run 'hg heads' to see heads, 'hg merge' to merge)
1375 2 largefiles cached
1375 2 largefiles cached
1376 $ hg merge
1376 $ hg merge
1377 largefile sub/large4 has a merge conflict
1377 largefile sub/large4 has a merge conflict
1378 ancestor was 971fb41e78fea4f8e0ba5244784239371cb00591
1378 ancestor was 971fb41e78fea4f8e0ba5244784239371cb00591
1379 keep (l)ocal d846f26643bfa8ec210be40cc93cc6b7ff1128ea or
1379 keep (l)ocal d846f26643bfa8ec210be40cc93cc6b7ff1128ea or
1380 take (o)ther e166e74c7303192238d60af5a9c4ce9bef0b7928? l
1380 take (o)ther e166e74c7303192238d60af5a9c4ce9bef0b7928? l
1381 3 files updated, 1 files merged, 0 files removed, 0 files unresolved
1381 3 files updated, 1 files merged, 0 files removed, 0 files unresolved
1382 (branch merge, don't forget to commit)
1382 (branch merge, don't forget to commit)
1383 getting changed largefiles
1383 getting changed largefiles
1384 1 largefiles updated, 0 removed
1384 1 largefiles updated, 0 removed
1385 $ hg commit -m "Merge repos e and f"
1385 $ hg commit -m "Merge repos e and f"
1386 Invoking status precommit hook
1386 Invoking status precommit hook
1387 M normal3
1387 M normal3
1388 M sub/normal4
1388 M sub/normal4
1389 M sub2/large6
1389 M sub2/large6
1390 $ cat normal3
1390 $ cat normal3
1391 normal3-modified
1391 normal3-modified
1392 $ cat sub/normal4
1392 $ cat sub/normal4
1393 normal4-modified
1393 normal4-modified
1394 $ cat sub/large4
1394 $ cat sub/large4
1395 large4-merge-test
1395 large4-merge-test
1396 $ cat sub2/large6
1396 $ cat sub2/large6
1397 large6-modified
1397 large6-modified
1398 $ cat sub2/large7
1398 $ cat sub2/large7
1399 large7
1399 large7
1400
1400
1401 Test status after merging with a branch that introduces a new largefile:
1401 Test status after merging with a branch that introduces a new largefile:
1402
1402
1403 $ echo large > large
1403 $ echo large > large
1404 $ hg add --large large
1404 $ hg add --large large
1405 $ hg commit -m 'add largefile'
1405 $ hg commit -m 'add largefile'
1406 Invoking status precommit hook
1406 Invoking status precommit hook
1407 A large
1407 A large
1408 $ hg update -q ".^"
1408 $ hg update -q ".^"
1409 $ echo change >> normal3
1409 $ echo change >> normal3
1410 $ hg commit -m 'some change'
1410 $ hg commit -m 'some change'
1411 Invoking status precommit hook
1411 Invoking status precommit hook
1412 M normal3
1412 M normal3
1413 created new head
1413 created new head
1414 $ hg merge
1414 $ hg merge
1415 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1415 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1416 (branch merge, don't forget to commit)
1416 (branch merge, don't forget to commit)
1417 getting changed largefiles
1417 getting changed largefiles
1418 1 largefiles updated, 0 removed
1418 1 largefiles updated, 0 removed
1419 $ hg status
1419 $ hg status
1420 M large
1420 M large
1421
1421
1422 - make sure update of merge with removed largefiles fails as expected
1422 - make sure update of merge with removed largefiles fails as expected
1423 $ hg rm sub2/large6
1423 $ hg rm sub2/large6
1424 $ hg up -r.
1424 $ hg up -r.
1425 abort: outstanding uncommitted merges
1425 abort: outstanding uncommitted merges
1426 [255]
1426 [255]
1427
1427
1428 - revert should be able to revert files introduced in a pending merge
1428 - revert should be able to revert files introduced in a pending merge
1429 $ hg revert --all -r .
1429 $ hg revert --all -r .
1430 removing .hglf/large (glob)
1430 removing .hglf/large (glob)
1431 undeleting .hglf/sub2/large6 (glob)
1431 undeleting .hglf/sub2/large6 (glob)
1432
1432
1433 Test that a normal file and a largefile with the same name and path cannot
1433 Test that a normal file and a largefile with the same name and path cannot
1434 coexist.
1434 coexist.
1435
1435
1436 $ rm sub2/large7
1436 $ rm sub2/large7
1437 $ echo "largeasnormal" > sub2/large7
1437 $ echo "largeasnormal" > sub2/large7
1438 $ hg add sub2/large7
1438 $ hg add sub2/large7
1439 sub2/large7 already a largefile
1439 sub2/large7 already a largefile
1440
1440
1441 Test that transplanting a largefile change works correctly.
1441 Test that transplanting a largefile change works correctly.
1442
1442
1443 $ cd ..
1443 $ cd ..
1444 $ hg clone -r 8 d g
1444 $ hg clone -r 8 d g
1445 adding changesets
1445 adding changesets
1446 adding manifests
1446 adding manifests
1447 adding file changes
1447 adding file changes
1448 added 9 changesets with 26 changes to 10 files
1448 added 9 changesets with 26 changes to 10 files
1449 updating to branch default
1449 updating to branch default
1450 getting changed largefiles
1450 getting changed largefiles
1451 3 largefiles updated, 0 removed
1451 3 largefiles updated, 0 removed
1452 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1452 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1453 $ cd g
1453 $ cd g
1454 $ hg transplant -s ../d 598410d3eb9a
1454 $ hg transplant -s ../d 598410d3eb9a
1455 searching for changes
1455 searching for changes
1456 searching for changes
1456 searching for changes
1457 adding changesets
1457 adding changesets
1458 adding manifests
1458 adding manifests
1459 adding file changes
1459 adding file changes
1460 added 1 changesets with 2 changes to 2 files
1460 added 1 changesets with 2 changes to 2 files
1461 getting changed largefiles
1461 getting changed largefiles
1462 1 largefiles updated, 0 removed
1462 1 largefiles updated, 0 removed
1463 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
1463 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
1464 9:598410d3eb9a modify normal file largefile in repo d
1464 9:598410d3eb9a modify normal file largefile in repo d
1465 8:a381d2c8c80e modify normal file and largefile in repo b
1465 8:a381d2c8c80e modify normal file and largefile in repo b
1466 7:daea875e9014 add/edit more largefiles
1466 7:daea875e9014 add/edit more largefiles
1467 6:4355d653f84f edit files yet again
1467 6:4355d653f84f edit files yet again
1468 5:9d5af5072dbd edit files again
1468 5:9d5af5072dbd edit files again
1469 4:74c02385b94c move files
1469 4:74c02385b94c move files
1470 3:9e8fbc4bce62 copy files
1470 3:9e8fbc4bce62 copy files
1471 2:51a0ae4d5864 remove files
1471 2:51a0ae4d5864 remove files
1472 1:ce8896473775 edit files
1472 1:ce8896473775 edit files
1473 0:30d30fe6a5be add files
1473 0:30d30fe6a5be add files
1474 $ cat normal3
1474 $ cat normal3
1475 normal3-modified
1475 normal3-modified
1476 $ cat sub/normal4
1476 $ cat sub/normal4
1477 normal4-modified
1477 normal4-modified
1478 $ cat sub/large4
1478 $ cat sub/large4
1479 large4-modified
1479 large4-modified
1480 $ cat sub2/large6
1480 $ cat sub2/large6
1481 large6-modified
1481 large6-modified
1482 $ cat sub2/large7
1482 $ cat sub2/large7
1483 large7
1483 large7
1484
1484
1485 Cat a largefile
1485 Cat a largefile
1486 $ hg cat normal3
1486 $ hg cat normal3
1487 normal3-modified
1487 normal3-modified
1488 $ hg cat sub/large4
1488 $ hg cat sub/large4
1489 large4-modified
1489 large4-modified
1490 $ rm "${USERCACHE}"/*
1490 $ rm "${USERCACHE}"/*
1491 $ hg cat -r a381d2c8c80e -o cat.out sub/large4
1491 $ hg cat -r a381d2c8c80e -o cat.out sub/large4
1492 $ cat cat.out
1492 $ cat cat.out
1493 large4-modified
1493 large4-modified
1494 $ rm cat.out
1494 $ rm cat.out
1495 $ hg cat -r a381d2c8c80e normal3
1495 $ hg cat -r a381d2c8c80e normal3
1496 normal3-modified
1496 normal3-modified
1497 $ hg cat -r '.^' normal3
1497 $ hg cat -r '.^' normal3
1498 normal3-modified
1498 normal3-modified
1499 $ hg cat -r '.^' sub/large4 doesntexist
1499 $ hg cat -r '.^' sub/large4 doesntexist
1500 large4-modified
1500 large4-modified
1501 doesntexist: no such file in rev a381d2c8c80e
1501 doesntexist: no such file in rev a381d2c8c80e
1502 $ hg --cwd sub cat -r '.^' large4
1502 $ hg --cwd sub cat -r '.^' large4
1503 large4-modified
1503 large4-modified
1504 $ hg --cwd sub cat -r '.^' ../normal3
1504 $ hg --cwd sub cat -r '.^' ../normal3
1505 normal3-modified
1505 normal3-modified
1506
1506
1507 Test that renaming a largefile results in correct output for status
1507 Test that renaming a largefile results in correct output for status
1508
1508
1509 $ hg rename sub/large4 large4-renamed
1509 $ hg rename sub/large4 large4-renamed
1510 $ hg commit -m "test rename output"
1510 $ hg commit -m "test rename output"
1511 Invoking status precommit hook
1511 Invoking status precommit hook
1512 A large4-renamed
1512 A large4-renamed
1513 R sub/large4
1513 R sub/large4
1514 $ cat large4-renamed
1514 $ cat large4-renamed
1515 large4-modified
1515 large4-modified
1516 $ cd sub2
1516 $ cd sub2
1517 $ hg rename large6 large6-renamed
1517 $ hg rename large6 large6-renamed
1518 $ hg st
1518 $ hg st
1519 A sub2/large6-renamed
1519 A sub2/large6-renamed
1520 R sub2/large6
1520 R sub2/large6
1521 $ cd ..
1521 $ cd ..
1522
1522
1523 Test --normal flag
1523 Test --normal flag
1524
1524
1525 $ dd if=/dev/zero bs=2k count=11k > new-largefile 2> /dev/null
1525 $ dd if=/dev/zero bs=2k count=11k > new-largefile 2> /dev/null
1526 $ hg add --normal --large new-largefile
1526 $ hg add --normal --large new-largefile
1527 abort: --normal cannot be used with --large
1527 abort: --normal cannot be used with --large
1528 [255]
1528 [255]
1529 $ hg add --normal new-largefile
1529 $ hg add --normal new-largefile
1530 new-largefile: up to 69 MB of RAM may be required to manage this file
1530 new-largefile: up to 69 MB of RAM may be required to manage this file
1531 (use 'hg revert new-largefile' to cancel the pending addition)
1531 (use 'hg revert new-largefile' to cancel the pending addition)
1532 $ cd ..
1532 $ cd ..
1533
1533
1534 #if serve
1534 #if serve
1535 vanilla clients not locked out from largefiles servers on vanilla repos
1535 vanilla clients not locked out from largefiles servers on vanilla repos
1536 $ mkdir r1
1536 $ mkdir r1
1537 $ cd r1
1537 $ cd r1
1538 $ hg init
1538 $ hg init
1539 $ echo c1 > f1
1539 $ echo c1 > f1
1540 $ hg add f1
1540 $ hg add f1
1541 $ hg commit -m "m1"
1541 $ hg commit -m "m1"
1542 Invoking status precommit hook
1542 Invoking status precommit hook
1543 A f1
1543 A f1
1544 $ cd ..
1544 $ cd ..
1545 $ hg serve -R r1 -d -p $HGPORT --pid-file hg.pid
1545 $ hg serve -R r1 -d -p $HGPORT --pid-file hg.pid
1546 $ cat hg.pid >> $DAEMON_PIDS
1546 $ cat hg.pid >> $DAEMON_PIDS
1547 $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT r2
1547 $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT r2
1548 requesting all changes
1548 requesting all changes
1549 adding changesets
1549 adding changesets
1550 adding manifests
1550 adding manifests
1551 adding file changes
1551 adding file changes
1552 added 1 changesets with 1 changes to 1 files
1552 added 1 changesets with 1 changes to 1 files
1553 updating to branch default
1553 updating to branch default
1554 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1554 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1555
1555
1556 largefiles clients still work with vanilla servers
1556 largefiles clients still work with vanilla servers
1557 $ hg --config extensions.largefiles=! serve -R r1 -d -p $HGPORT1 --pid-file hg.pid
1557 $ hg --config extensions.largefiles=! serve -R r1 -d -p $HGPORT1 --pid-file hg.pid
1558 $ cat hg.pid >> $DAEMON_PIDS
1558 $ cat hg.pid >> $DAEMON_PIDS
1559 $ hg clone http://localhost:$HGPORT1 r3
1559 $ hg clone http://localhost:$HGPORT1 r3
1560 requesting all changes
1560 requesting all changes
1561 adding changesets
1561 adding changesets
1562 adding manifests
1562 adding manifests
1563 adding file changes
1563 adding file changes
1564 added 1 changesets with 1 changes to 1 files
1564 added 1 changesets with 1 changes to 1 files
1565 updating to branch default
1565 updating to branch default
1566 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1566 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1567 #endif
1567 #endif
1568
1568
1569
1569
1570 vanilla clients locked out from largefiles http repos
1570 vanilla clients locked out from largefiles http repos
1571 $ mkdir r4
1571 $ mkdir r4
1572 $ cd r4
1572 $ cd r4
1573 $ hg init
1573 $ hg init
1574 $ echo c1 > f1
1574 $ echo c1 > f1
1575 $ hg add --large f1
1575 $ hg add --large f1
1576 $ hg commit -m "m1"
1576 $ hg commit -m "m1"
1577 Invoking status precommit hook
1577 Invoking status precommit hook
1578 A f1
1578 A f1
1579 $ cd ..
1579 $ cd ..
1580
1580
1581 largefiles can be pushed locally (issue3583)
1581 largefiles can be pushed locally (issue3583)
1582 $ hg init dest
1582 $ hg init dest
1583 $ cd r4
1583 $ cd r4
1584 $ hg outgoing ../dest
1584 $ hg outgoing ../dest
1585 comparing with ../dest
1585 comparing with ../dest
1586 searching for changes
1586 searching for changes
1587 changeset: 0:639881c12b4c
1587 changeset: 0:639881c12b4c
1588 tag: tip
1588 tag: tip
1589 user: test
1589 user: test
1590 date: Thu Jan 01 00:00:00 1970 +0000
1590 date: Thu Jan 01 00:00:00 1970 +0000
1591 summary: m1
1591 summary: m1
1592
1592
1593 $ hg push ../dest
1593 $ hg push ../dest
1594 pushing to ../dest
1594 pushing to ../dest
1595 searching for changes
1595 searching for changes
1596 searching for changes
1596 searching for changes
1597 adding changesets
1597 adding changesets
1598 adding manifests
1598 adding manifests
1599 adding file changes
1599 adding file changes
1600 added 1 changesets with 1 changes to 1 files
1600 added 1 changesets with 1 changes to 1 files
1601
1601
1602 exit code with nothing outgoing (issue3611)
1602 exit code with nothing outgoing (issue3611)
1603 $ hg outgoing ../dest
1603 $ hg outgoing ../dest
1604 comparing with ../dest
1604 comparing with ../dest
1605 searching for changes
1605 searching for changes
1606 no changes found
1606 no changes found
1607 [1]
1607 [1]
1608 $ cd ..
1608 $ cd ..
1609
1609
1610 #if serve
1610 #if serve
1611 $ hg serve -R r4 -d -p $HGPORT2 --pid-file hg.pid
1611 $ hg serve -R r4 -d -p $HGPORT2 --pid-file hg.pid
1612 $ cat hg.pid >> $DAEMON_PIDS
1612 $ cat hg.pid >> $DAEMON_PIDS
1613 $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT2 r5
1613 $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT2 r5
1614 abort: remote error:
1614 abort: remote error:
1615
1615
1616 This repository uses the largefiles extension.
1616 This repository uses the largefiles extension.
1617
1617
1618 Please enable it in your Mercurial config file.
1618 Please enable it in your Mercurial config file.
1619 [255]
1619 [255]
1620
1620
1621 used all HGPORTs, kill all daemons
1621 used all HGPORTs, kill all daemons
1622 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1622 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1623 #endif
1623 #endif
1624
1624
1625 vanilla clients locked out from largefiles ssh repos
1625 vanilla clients locked out from largefiles ssh repos
1626 $ hg --config extensions.largefiles=! clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/r4 r5
1626 $ hg --config extensions.largefiles=! clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/r4 r5
1627 abort: remote error:
1627 abort: remote error:
1628
1628
1629 This repository uses the largefiles extension.
1629 This repository uses the largefiles extension.
1630
1630
1631 Please enable it in your Mercurial config file.
1631 Please enable it in your Mercurial config file.
1632 [255]
1632 [255]
1633
1633
1634 #if serve
1634 #if serve
1635
1635
1636 largefiles clients refuse to push largefiles repos to vanilla servers
1636 largefiles clients refuse to push largefiles repos to vanilla servers
1637 $ mkdir r6
1637 $ mkdir r6
1638 $ cd r6
1638 $ cd r6
1639 $ hg init
1639 $ hg init
1640 $ echo c1 > f1
1640 $ echo c1 > f1
1641 $ hg add f1
1641 $ hg add f1
1642 $ hg commit -m "m1"
1642 $ hg commit -m "m1"
1643 Invoking status precommit hook
1643 Invoking status precommit hook
1644 A f1
1644 A f1
1645 $ cat >> .hg/hgrc <<!
1645 $ cat >> .hg/hgrc <<!
1646 > [web]
1646 > [web]
1647 > push_ssl = false
1647 > push_ssl = false
1648 > allow_push = *
1648 > allow_push = *
1649 > !
1649 > !
1650 $ cd ..
1650 $ cd ..
1651 $ hg clone r6 r7
1651 $ hg clone r6 r7
1652 updating to branch default
1652 updating to branch default
1653 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1653 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1654 $ cd r7
1654 $ cd r7
1655 $ echo c2 > f2
1655 $ echo c2 > f2
1656 $ hg add --large f2
1656 $ hg add --large f2
1657 $ hg commit -m "m2"
1657 $ hg commit -m "m2"
1658 Invoking status precommit hook
1658 Invoking status precommit hook
1659 A f2
1659 A f2
1660 $ hg --config extensions.largefiles=! -R ../r6 serve -d -p $HGPORT --pid-file ../hg.pid
1660 $ hg --config extensions.largefiles=! -R ../r6 serve -d -p $HGPORT --pid-file ../hg.pid
1661 $ cat ../hg.pid >> $DAEMON_PIDS
1661 $ cat ../hg.pid >> $DAEMON_PIDS
1662 $ hg push http://localhost:$HGPORT
1662 $ hg push http://localhost:$HGPORT
1663 pushing to http://localhost:$HGPORT/
1663 pushing to http://localhost:$HGPORT/
1664 searching for changes
1664 searching for changes
1665 abort: http://localhost:$HGPORT/ does not appear to be a largefile store
1665 abort: http://localhost:$HGPORT/ does not appear to be a largefile store
1666 [255]
1666 [255]
1667 $ cd ..
1667 $ cd ..
1668
1668
1669 putlfile errors are shown (issue3123)
1669 putlfile errors are shown (issue3123)
1670 Corrupt the cached largefile in r7 and move it out of the servers usercache
1670 Corrupt the cached largefile in r7 and move it out of the servers usercache
1671 $ mv r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8 .
1671 $ mv r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8 .
1672 $ echo 'client side corruption' > r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1672 $ echo 'client side corruption' > r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1673 $ rm "$USERCACHE/4cdac4d8b084d0b599525cf732437fb337d422a8"
1673 $ rm "$USERCACHE/4cdac4d8b084d0b599525cf732437fb337d422a8"
1674 $ hg init empty
1674 $ hg init empty
1675 $ hg serve -R empty -d -p $HGPORT1 --pid-file hg.pid \
1675 $ hg serve -R empty -d -p $HGPORT1 --pid-file hg.pid \
1676 > --config 'web.allow_push=*' --config web.push_ssl=False
1676 > --config 'web.allow_push=*' --config web.push_ssl=False
1677 $ cat hg.pid >> $DAEMON_PIDS
1677 $ cat hg.pid >> $DAEMON_PIDS
1678 $ hg push -R r7 http://localhost:$HGPORT1
1678 $ hg push -R r7 http://localhost:$HGPORT1
1679 pushing to http://localhost:$HGPORT1/
1679 pushing to http://localhost:$HGPORT1/
1680 searching for changes
1680 searching for changes
1681 remote: largefiles: failed to put 4cdac4d8b084d0b599525cf732437fb337d422a8 into store: largefile contents do not match hash
1681 remote: largefiles: failed to put 4cdac4d8b084d0b599525cf732437fb337d422a8 into store: largefile contents do not match hash
1682 abort: remotestore: could not put $TESTTMP/r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8 to remote store http://localhost:$HGPORT1/ (glob)
1682 abort: remotestore: could not put $TESTTMP/r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8 to remote store http://localhost:$HGPORT1/ (glob)
1683 [255]
1683 [255]
1684 $ mv 4cdac4d8b084d0b599525cf732437fb337d422a8 r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1684 $ mv 4cdac4d8b084d0b599525cf732437fb337d422a8 r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1685 Push of file that exists on server but is corrupted - magic healing would be nice ... but too magic
1685 Push of file that exists on server but is corrupted - magic healing would be nice ... but too magic
1686 $ echo "server side corruption" > empty/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1686 $ echo "server side corruption" > empty/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1687 $ hg push -R r7 http://localhost:$HGPORT1
1687 $ hg push -R r7 http://localhost:$HGPORT1
1688 pushing to http://localhost:$HGPORT1/
1688 pushing to http://localhost:$HGPORT1/
1689 searching for changes
1689 searching for changes
1690 searching for changes
1690 searching for changes
1691 remote: adding changesets
1691 remote: adding changesets
1692 remote: adding manifests
1692 remote: adding manifests
1693 remote: adding file changes
1693 remote: adding file changes
1694 remote: added 2 changesets with 2 changes to 2 files
1694 remote: added 2 changesets with 2 changes to 2 files
1695 $ cat empty/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1695 $ cat empty/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1696 server side corruption
1696 server side corruption
1697 $ rm -rf empty
1697 $ rm -rf empty
1698
1698
1699 Push a largefiles repository to a served empty repository
1699 Push a largefiles repository to a served empty repository
1700 $ hg init r8
1700 $ hg init r8
1701 $ echo c3 > r8/f1
1701 $ echo c3 > r8/f1
1702 $ hg add --large r8/f1 -R r8
1702 $ hg add --large r8/f1 -R r8
1703 $ hg commit -m "m1" -R r8
1703 $ hg commit -m "m1" -R r8
1704 Invoking status precommit hook
1704 Invoking status precommit hook
1705 A f1
1705 A f1
1706 $ hg init empty
1706 $ hg init empty
1707 $ hg serve -R empty -d -p $HGPORT2 --pid-file hg.pid \
1707 $ hg serve -R empty -d -p $HGPORT2 --pid-file hg.pid \
1708 > --config 'web.allow_push=*' --config web.push_ssl=False
1708 > --config 'web.allow_push=*' --config web.push_ssl=False
1709 $ cat hg.pid >> $DAEMON_PIDS
1709 $ cat hg.pid >> $DAEMON_PIDS
1710 $ rm "${USERCACHE}"/*
1710 $ rm "${USERCACHE}"/*
1711 $ hg push -R r8 http://localhost:$HGPORT2/#default
1711 $ hg push -R r8 http://localhost:$HGPORT2/#default
1712 pushing to http://localhost:$HGPORT2/
1712 pushing to http://localhost:$HGPORT2/
1713 searching for changes
1713 searching for changes
1714 searching for changes
1714 searching for changes
1715 remote: adding changesets
1715 remote: adding changesets
1716 remote: adding manifests
1716 remote: adding manifests
1717 remote: adding file changes
1717 remote: adding file changes
1718 remote: added 1 changesets with 1 changes to 1 files
1718 remote: added 1 changesets with 1 changes to 1 files
1719 $ [ -f "${USERCACHE}"/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1719 $ [ -f "${USERCACHE}"/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1720 $ [ -f empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1720 $ [ -f empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1721
1721
1722 Clone over http, no largefiles pulled on clone.
1722 Clone over http, no largefiles pulled on clone.
1723
1723
1724 $ hg clone http://localhost:$HGPORT2/#default http-clone -U
1724 $ hg clone http://localhost:$HGPORT2/#default http-clone -U
1725 adding changesets
1725 adding changesets
1726 adding manifests
1726 adding manifests
1727 adding file changes
1727 adding file changes
1728 added 1 changesets with 1 changes to 1 files
1728 added 1 changesets with 1 changes to 1 files
1729
1729
1730 test 'verify' with remotestore:
1730 test 'verify' with remotestore:
1731
1731
1732 $ rm "${USERCACHE}"/02a439e5c31c526465ab1a0ca1f431f76b827b90
1732 $ rm "${USERCACHE}"/02a439e5c31c526465ab1a0ca1f431f76b827b90
1733 $ mv empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 .
1733 $ mv empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 .
1734 $ hg -R http-clone verify --large --lfa
1734 $ hg -R http-clone verify --large --lfa
1735 checking changesets
1735 checking changesets
1736 checking manifests
1736 checking manifests
1737 crosschecking files in changesets and manifests
1737 crosschecking files in changesets and manifests
1738 checking files
1738 checking files
1739 1 files, 1 changesets, 1 total revisions
1739 1 files, 1 changesets, 1 total revisions
1740 searching 1 changesets for largefiles
1740 searching 1 changesets for largefiles
1741 changeset 0:cf03e5bb9936: f1 missing
1741 changeset 0:cf03e5bb9936: f1 missing
1742 verified existence of 1 revisions of 1 largefiles
1742 verified existence of 1 revisions of 1 largefiles
1743 [1]
1743 [1]
1744 $ mv 02a439e5c31c526465ab1a0ca1f431f76b827b90 empty/.hg/largefiles/
1744 $ mv 02a439e5c31c526465ab1a0ca1f431f76b827b90 empty/.hg/largefiles/
1745 $ hg -R http-clone -q verify --large --lfa
1745 $ hg -R http-clone -q verify --large --lfa
1746
1746
1747 largefiles pulled on update - a largefile missing on the server:
1747 largefiles pulled on update - a largefile missing on the server:
1748 $ mv empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 .
1748 $ mv empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 .
1749 $ hg -R http-clone up --config largefiles.usercache=http-clone-usercache
1749 $ hg -R http-clone up --config largefiles.usercache=http-clone-usercache
1750 getting changed largefiles
1750 getting changed largefiles
1751 f1: largefile 02a439e5c31c526465ab1a0ca1f431f76b827b90 not available from http://localhost:$HGPORT2/
1751 f1: largefile 02a439e5c31c526465ab1a0ca1f431f76b827b90 not available from http://localhost:$HGPORT2/
1752 0 largefiles updated, 0 removed
1752 0 largefiles updated, 0 removed
1753 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1753 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1754 $ hg -R http-clone st
1754 $ hg -R http-clone st
1755 ! f1
1755 ! f1
1756 $ hg -R http-clone up -Cqr null
1756 $ hg -R http-clone up -Cqr null
1757
1757
1758 largefiles pulled on update - a largefile corrupted on the server:
1758 largefiles pulled on update - a largefile corrupted on the server:
1759 $ echo corruption > empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90
1759 $ echo corruption > empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90
1760 $ hg -R http-clone up --config largefiles.usercache=http-clone-usercache
1760 $ hg -R http-clone up --config largefiles.usercache=http-clone-usercache
1761 getting changed largefiles
1761 getting changed largefiles
1762 f1: data corruption (expected 02a439e5c31c526465ab1a0ca1f431f76b827b90, got 6a7bb2556144babe3899b25e5428123735bb1e27)
1762 f1: data corruption (expected 02a439e5c31c526465ab1a0ca1f431f76b827b90, got 6a7bb2556144babe3899b25e5428123735bb1e27)
1763 0 largefiles updated, 0 removed
1763 0 largefiles updated, 0 removed
1764 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1764 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1765 $ hg -R http-clone st
1765 $ hg -R http-clone st
1766 ! f1
1766 ! f1
1767 $ [ ! -f http-clone/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1767 $ [ ! -f http-clone/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1768 $ [ ! -f http-clone/f1 ]
1768 $ [ ! -f http-clone/f1 ]
1769 $ [ ! -f http-clone-usercache ]
1769 $ [ ! -f http-clone-usercache ]
1770 $ hg -R http-clone verify --large --lfc
1770 $ hg -R http-clone verify --large --lfc
1771 checking changesets
1771 checking changesets
1772 checking manifests
1772 checking manifests
1773 crosschecking files in changesets and manifests
1773 crosschecking files in changesets and manifests
1774 checking files
1774 checking files
1775 1 files, 1 changesets, 1 total revisions
1775 1 files, 1 changesets, 1 total revisions
1776 searching 1 changesets for largefiles
1776 searching 1 changesets for largefiles
1777 verified contents of 1 revisions of 1 largefiles
1777 verified contents of 1 revisions of 1 largefiles
1778 $ hg -R http-clone up -Cqr null
1778 $ hg -R http-clone up -Cqr null
1779
1779
1780 largefiles pulled on update - no server side problems:
1780 largefiles pulled on update - no server side problems:
1781 $ mv 02a439e5c31c526465ab1a0ca1f431f76b827b90 empty/.hg/largefiles/
1781 $ mv 02a439e5c31c526465ab1a0ca1f431f76b827b90 empty/.hg/largefiles/
1782 $ hg -R http-clone --debug up --config largefiles.usercache=http-clone-usercache
1782 $ hg -R http-clone --debug up --config largefiles.usercache=http-clone-usercache
1783 resolving manifests
1783 resolving manifests
1784 branchmerge: False, force: False, partial: False
1784 branchmerge: False, force: False, partial: False
1785 ancestor: 000000000000, local: 000000000000+, remote: cf03e5bb9936
1785 ancestor: 000000000000, local: 000000000000+, remote: cf03e5bb9936
1786 .hglf/f1: remote created -> g
1786 .hglf/f1: remote created -> g
1787 getting .hglf/f1
1787 getting .hglf/f1
1788 updating: .hglf/f1 1/1 files (100.00%)
1788 updating: .hglf/f1 1/1 files (100.00%)
1789 getting changed largefiles
1789 getting changed largefiles
1790 using http://localhost:$HGPORT2/
1790 using http://localhost:$HGPORT2/
1791 sending capabilities command
1791 sending capabilities command
1792 sending batch command
1792 sending batch command
1793 getting largefiles: 0/1 lfile (0.00%)
1793 getting largefiles: 0/1 lfile (0.00%)
1794 getting f1:02a439e5c31c526465ab1a0ca1f431f76b827b90
1794 getting f1:02a439e5c31c526465ab1a0ca1f431f76b827b90
1795 sending getlfile command
1795 sending getlfile command
1796 found 02a439e5c31c526465ab1a0ca1f431f76b827b90 in store
1796 found 02a439e5c31c526465ab1a0ca1f431f76b827b90 in store
1797 1 largefiles updated, 0 removed
1797 1 largefiles updated, 0 removed
1798 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1798 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1799
1799
1800 $ ls http-clone-usercache/*
1800 $ ls http-clone-usercache/*
1801 http-clone-usercache/02a439e5c31c526465ab1a0ca1f431f76b827b90
1801 http-clone-usercache/02a439e5c31c526465ab1a0ca1f431f76b827b90
1802
1802
1803 $ rm -rf empty http-clone*
1803 $ rm -rf empty http-clone*
1804
1804
1805 used all HGPORTs, kill all daemons
1805 used all HGPORTs, kill all daemons
1806 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1806 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1807
1807
1808 #endif
1808 #endif
1809
1809
1810
1810
1811 #if unix-permissions
1811 #if unix-permissions
1812
1812
1813 Clone a local repository owned by another user
1813 Clone a local repository owned by another user
1814 We have to simulate that here by setting $HOME and removing write permissions
1814 We have to simulate that here by setting $HOME and removing write permissions
1815 $ ORIGHOME="$HOME"
1815 $ ORIGHOME="$HOME"
1816 $ mkdir alice
1816 $ mkdir alice
1817 $ HOME="`pwd`/alice"
1817 $ HOME="`pwd`/alice"
1818 $ cd alice
1818 $ cd alice
1819 $ hg init pubrepo
1819 $ hg init pubrepo
1820 $ cd pubrepo
1820 $ cd pubrepo
1821 $ dd if=/dev/zero bs=1k count=11k > a-large-file 2> /dev/null
1821 $ dd if=/dev/zero bs=1k count=11k > a-large-file 2> /dev/null
1822 $ hg add --large a-large-file
1822 $ hg add --large a-large-file
1823 $ hg commit -m "Add a large file"
1823 $ hg commit -m "Add a large file"
1824 Invoking status precommit hook
1824 Invoking status precommit hook
1825 A a-large-file
1825 A a-large-file
1826 $ cd ..
1826 $ cd ..
1827 $ chmod -R a-w pubrepo
1827 $ chmod -R a-w pubrepo
1828 $ cd ..
1828 $ cd ..
1829 $ mkdir bob
1829 $ mkdir bob
1830 $ HOME="`pwd`/bob"
1830 $ HOME="`pwd`/bob"
1831 $ cd bob
1831 $ cd bob
1832 $ hg clone --pull ../alice/pubrepo pubrepo
1832 $ hg clone --pull ../alice/pubrepo pubrepo
1833 requesting all changes
1833 requesting all changes
1834 adding changesets
1834 adding changesets
1835 adding manifests
1835 adding manifests
1836 adding file changes
1836 adding file changes
1837 added 1 changesets with 1 changes to 1 files
1837 added 1 changesets with 1 changes to 1 files
1838 updating to branch default
1838 updating to branch default
1839 getting changed largefiles
1839 getting changed largefiles
1840 1 largefiles updated, 0 removed
1840 1 largefiles updated, 0 removed
1841 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1841 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1842 $ cd ..
1842 $ cd ..
1843 $ chmod -R u+w alice/pubrepo
1843 $ chmod -R u+w alice/pubrepo
1844 $ HOME="$ORIGHOME"
1844 $ HOME="$ORIGHOME"
1845
1845
1846 #endif
1846 #endif
1847
1847
1848 #if symlink
1848 #if symlink
1849
1849
1850 Symlink to a large largefile should behave the same as a symlink to a normal file
1850 Symlink to a large largefile should behave the same as a symlink to a normal file
1851 $ hg init largesymlink
1851 $ hg init largesymlink
1852 $ cd largesymlink
1852 $ cd largesymlink
1853 $ dd if=/dev/zero bs=1k count=10k of=largefile 2>/dev/null
1853 $ dd if=/dev/zero bs=1k count=10k of=largefile 2>/dev/null
1854 $ hg add --large largefile
1854 $ hg add --large largefile
1855 $ hg commit -m "commit a large file"
1855 $ hg commit -m "commit a large file"
1856 Invoking status precommit hook
1856 Invoking status precommit hook
1857 A largefile
1857 A largefile
1858 $ ln -s largefile largelink
1858 $ ln -s largefile largelink
1859 $ hg add largelink
1859 $ hg add largelink
1860 $ hg commit -m "commit a large symlink"
1860 $ hg commit -m "commit a large symlink"
1861 Invoking status precommit hook
1861 Invoking status precommit hook
1862 A largelink
1862 A largelink
1863 $ rm -f largelink
1863 $ rm -f largelink
1864 $ hg up >/dev/null
1864 $ hg up >/dev/null
1865 $ test -f largelink
1865 $ test -f largelink
1866 [1]
1866 [1]
1867 $ test -L largelink
1867 $ test -L largelink
1868 [1]
1868 [1]
1869 $ rm -f largelink # make next part of the test independent of the previous
1869 $ rm -f largelink # make next part of the test independent of the previous
1870 $ hg up -C >/dev/null
1870 $ hg up -C >/dev/null
1871 $ test -f largelink
1871 $ test -f largelink
1872 $ test -L largelink
1872 $ test -L largelink
1873 $ cd ..
1873 $ cd ..
1874
1874
1875 #endif
1875 #endif
1876
1876
1877 test for pattern matching on 'hg status':
1877 test for pattern matching on 'hg status':
1878 to boost performance, largefiles checks whether specified patterns are
1878 to boost performance, largefiles checks whether specified patterns are
1879 related to largefiles in working directory (NOT to STANDIN) or not.
1879 related to largefiles in working directory (NOT to STANDIN) or not.
1880
1880
1881 $ hg init statusmatch
1881 $ hg init statusmatch
1882 $ cd statusmatch
1882 $ cd statusmatch
1883
1883
1884 $ mkdir -p a/b/c/d
1884 $ mkdir -p a/b/c/d
1885 $ echo normal > a/b/c/d/e.normal.txt
1885 $ echo normal > a/b/c/d/e.normal.txt
1886 $ hg add a/b/c/d/e.normal.txt
1886 $ hg add a/b/c/d/e.normal.txt
1887 $ echo large > a/b/c/d/e.large.txt
1887 $ echo large > a/b/c/d/e.large.txt
1888 $ hg add --large a/b/c/d/e.large.txt
1888 $ hg add --large a/b/c/d/e.large.txt
1889 $ mkdir -p a/b/c/x
1889 $ mkdir -p a/b/c/x
1890 $ echo normal > a/b/c/x/y.normal.txt
1890 $ echo normal > a/b/c/x/y.normal.txt
1891 $ hg add a/b/c/x/y.normal.txt
1891 $ hg add a/b/c/x/y.normal.txt
1892 $ hg commit -m 'add files'
1892 $ hg commit -m 'add files'
1893 Invoking status precommit hook
1893 Invoking status precommit hook
1894 A a/b/c/d/e.large.txt
1894 A a/b/c/d/e.large.txt
1895 A a/b/c/d/e.normal.txt
1895 A a/b/c/d/e.normal.txt
1896 A a/b/c/x/y.normal.txt
1896 A a/b/c/x/y.normal.txt
1897
1897
1898 (1) no pattern: no performance boost
1898 (1) no pattern: no performance boost
1899 $ hg status -A
1899 $ hg status -A
1900 C a/b/c/d/e.large.txt
1900 C a/b/c/d/e.large.txt
1901 C a/b/c/d/e.normal.txt
1901 C a/b/c/d/e.normal.txt
1902 C a/b/c/x/y.normal.txt
1902 C a/b/c/x/y.normal.txt
1903
1903
1904 (2) pattern not related to largefiles: performance boost
1904 (2) pattern not related to largefiles: performance boost
1905 $ hg status -A a/b/c/x
1905 $ hg status -A a/b/c/x
1906 C a/b/c/x/y.normal.txt
1906 C a/b/c/x/y.normal.txt
1907
1907
1908 (3) pattern related to largefiles: no performance boost
1908 (3) pattern related to largefiles: no performance boost
1909 $ hg status -A a/b/c/d
1909 $ hg status -A a/b/c/d
1910 C a/b/c/d/e.large.txt
1910 C a/b/c/d/e.large.txt
1911 C a/b/c/d/e.normal.txt
1911 C a/b/c/d/e.normal.txt
1912
1912
1913 (4) pattern related to STANDIN (not to largefiles): performance boost
1913 (4) pattern related to STANDIN (not to largefiles): performance boost
1914 $ hg status -A .hglf/a
1914 $ hg status -A .hglf/a
1915 C .hglf/a/b/c/d/e.large.txt
1915 C .hglf/a/b/c/d/e.large.txt
1916
1916
1917 (5) mixed case: no performance boost
1917 (5) mixed case: no performance boost
1918 $ hg status -A a/b/c/x a/b/c/d
1918 $ hg status -A a/b/c/x a/b/c/d
1919 C a/b/c/d/e.large.txt
1919 C a/b/c/d/e.large.txt
1920 C a/b/c/d/e.normal.txt
1920 C a/b/c/d/e.normal.txt
1921 C a/b/c/x/y.normal.txt
1921 C a/b/c/x/y.normal.txt
1922
1922
1923 verify that largefiles doesn't break filesets
1923 verify that largefiles doesn't break filesets
1924
1924
1925 $ hg log --rev . --exclude "set:binary()"
1925 $ hg log --rev . --exclude "set:binary()"
1926 changeset: 0:41bd42f10efa
1926 changeset: 0:41bd42f10efa
1927 tag: tip
1927 tag: tip
1928 user: test
1928 user: test
1929 date: Thu Jan 01 00:00:00 1970 +0000
1929 date: Thu Jan 01 00:00:00 1970 +0000
1930 summary: add files
1930 summary: add files
1931
1931
1932 verify that large files in subrepos handled properly
1932 verify that large files in subrepos handled properly
1933 $ hg init subrepo
1933 $ hg init subrepo
1934 $ echo "subrepo = subrepo" > .hgsub
1934 $ echo "subrepo = subrepo" > .hgsub
1935 $ hg add .hgsub
1935 $ hg add .hgsub
1936 $ hg ci -m "add subrepo"
1936 $ hg ci -m "add subrepo"
1937 Invoking status precommit hook
1937 Invoking status precommit hook
1938 A .hgsub
1938 A .hgsub
1939 ? .hgsubstate
1939 ? .hgsubstate
1940 $ echo "rev 1" > subrepo/large.txt
1940 $ echo "rev 1" > subrepo/large.txt
1941 $ hg -R subrepo add --large subrepo/large.txt
1941 $ hg -R subrepo add --large subrepo/large.txt
1942 $ hg sum
1942 $ hg sum
1943 parent: 1:8ee150ea2e9c tip
1943 parent: 1:8ee150ea2e9c tip
1944 add subrepo
1944 add subrepo
1945 branch: default
1945 branch: default
1946 commit: 1 subrepos
1946 commit: 1 subrepos
1947 update: (current)
1947 update: (current)
1948 $ hg st
1948 $ hg st
1949 $ hg st -S
1949 $ hg st -S
1950 A subrepo/large.txt
1950 A subrepo/large.txt
1951 $ hg ci -S -m "commit top repo"
1951 $ hg ci -S -m "commit top repo"
1952 committing subrepository subrepo
1952 committing subrepository subrepo
1953 Invoking status precommit hook
1953 Invoking status precommit hook
1954 A large.txt
1954 A large.txt
1955 Invoking status precommit hook
1955 Invoking status precommit hook
1956 M .hgsubstate
1956 M .hgsubstate
1957 # No differences
1957 # No differences
1958 $ hg st -S
1958 $ hg st -S
1959 $ hg sum
1959 $ hg sum
1960 parent: 2:ce4cd0c527a6 tip
1960 parent: 2:ce4cd0c527a6 tip
1961 commit top repo
1961 commit top repo
1962 branch: default
1962 branch: default
1963 commit: (clean)
1963 commit: (clean)
1964 update: (current)
1964 update: (current)
1965 $ echo "rev 2" > subrepo/large.txt
1965 $ echo "rev 2" > subrepo/large.txt
1966 $ hg st -S
1966 $ hg st -S
1967 M subrepo/large.txt
1967 M subrepo/large.txt
1968 $ hg sum
1968 $ hg sum
1969 parent: 2:ce4cd0c527a6 tip
1969 parent: 2:ce4cd0c527a6 tip
1970 commit top repo
1970 commit top repo
1971 branch: default
1971 branch: default
1972 commit: 1 subrepos
1972 commit: 1 subrepos
1973 update: (current)
1973 update: (current)
1974 $ hg ci -m "this commit should fail without -S"
1974 $ hg ci -m "this commit should fail without -S"
1975 abort: uncommitted changes in subrepo subrepo
1975 abort: uncommitted changes in subrepo subrepo
1976 (use --subrepos for recursive commit)
1976 (use --subrepos for recursive commit)
1977 [255]
1977 [255]
1978
1978
1979 Add a normal file to the subrepo, then test archiving
1979 Add a normal file to the subrepo, then test archiving
1980
1980
1981 $ echo 'normal file' > subrepo/normal.txt
1981 $ echo 'normal file' > subrepo/normal.txt
1982 $ hg -R subrepo add subrepo/normal.txt
1982 $ hg -R subrepo add subrepo/normal.txt
1983
1983
1984 Lock in subrepo, otherwise the change isn't archived
1984 Lock in subrepo, otherwise the change isn't archived
1985
1985
1986 $ hg ci -S -m "add normal file to top level"
1986 $ hg ci -S -m "add normal file to top level"
1987 committing subrepository subrepo
1987 committing subrepository subrepo
1988 Invoking status precommit hook
1988 Invoking status precommit hook
1989 M large.txt
1989 M large.txt
1990 A normal.txt
1990 A normal.txt
1991 Invoking status precommit hook
1991 Invoking status precommit hook
1992 M .hgsubstate
1992 M .hgsubstate
1993 $ hg archive -S ../lf_subrepo_archive
1993 $ hg archive -S ../lf_subrepo_archive
1994 $ find ../lf_subrepo_archive | sort
1994 $ find ../lf_subrepo_archive | sort
1995 ../lf_subrepo_archive
1995 ../lf_subrepo_archive
1996 ../lf_subrepo_archive/.hg_archival.txt
1996 ../lf_subrepo_archive/.hg_archival.txt
1997 ../lf_subrepo_archive/.hgsub
1997 ../lf_subrepo_archive/.hgsub
1998 ../lf_subrepo_archive/.hgsubstate
1998 ../lf_subrepo_archive/.hgsubstate
1999 ../lf_subrepo_archive/a
1999 ../lf_subrepo_archive/a
2000 ../lf_subrepo_archive/a/b
2000 ../lf_subrepo_archive/a/b
2001 ../lf_subrepo_archive/a/b/c
2001 ../lf_subrepo_archive/a/b/c
2002 ../lf_subrepo_archive/a/b/c/d
2002 ../lf_subrepo_archive/a/b/c/d
2003 ../lf_subrepo_archive/a/b/c/d/e.large.txt
2003 ../lf_subrepo_archive/a/b/c/d/e.large.txt
2004 ../lf_subrepo_archive/a/b/c/d/e.normal.txt
2004 ../lf_subrepo_archive/a/b/c/d/e.normal.txt
2005 ../lf_subrepo_archive/a/b/c/x
2005 ../lf_subrepo_archive/a/b/c/x
2006 ../lf_subrepo_archive/a/b/c/x/y.normal.txt
2006 ../lf_subrepo_archive/a/b/c/x/y.normal.txt
2007 ../lf_subrepo_archive/subrepo
2007 ../lf_subrepo_archive/subrepo
2008 ../lf_subrepo_archive/subrepo/large.txt
2008 ../lf_subrepo_archive/subrepo/large.txt
2009 ../lf_subrepo_archive/subrepo/normal.txt
2009 ../lf_subrepo_archive/subrepo/normal.txt
2010
2010
2011 Test update with subrepos.
2011 Test update with subrepos.
2012
2012
2013 $ hg update 0
2013 $ hg update 0
2014 getting changed largefiles
2014 getting changed largefiles
2015 0 largefiles updated, 1 removed
2015 0 largefiles updated, 1 removed
2016 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
2016 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
2017 $ hg status -S
2017 $ hg status -S
2018 $ hg update tip
2018 $ hg update tip
2019 getting changed largefiles
2019 getting changed largefiles
2020 1 largefiles updated, 0 removed
2020 1 largefiles updated, 0 removed
2021 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
2021 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
2022 $ hg status -S
2022 $ hg status -S
2023 # modify a large file
2023 # modify a large file
2024 $ echo "modified" > subrepo/large.txt
2024 $ echo "modified" > subrepo/large.txt
2025 $ hg st -S
2025 $ hg st -S
2026 M subrepo/large.txt
2026 M subrepo/large.txt
2027 # update -C should revert the change.
2027 # update -C should revert the change.
2028 $ hg update -C
2028 $ hg update -C
2029 getting changed largefiles
2029 getting changed largefiles
2030 1 largefiles updated, 0 removed
2030 1 largefiles updated, 0 removed
2031 getting changed largefiles
2031 getting changed largefiles
2032 0 largefiles updated, 0 removed
2032 0 largefiles updated, 0 removed
2033 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
2033 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
2034 $ hg status -S
2034 $ hg status -S
2035
2035
2036 Test archiving a revision that references a subrepo that is not yet
2036 Test archiving a revision that references a subrepo that is not yet
2037 cloned (see test-subrepo-recursion.t):
2037 cloned (see test-subrepo-recursion.t):
2038
2038
2039 $ hg clone -U . ../empty
2039 $ hg clone -U . ../empty
2040 $ cd ../empty
2040 $ cd ../empty
2041 $ hg archive --subrepos -r tip ../archive.tar.gz
2041 $ hg archive --subrepos -r tip ../archive.tar.gz
2042 cloning subrepo subrepo from $TESTTMP/statusmatch/subrepo
2042 cloning subrepo subrepo from $TESTTMP/statusmatch/subrepo
2043 $ cd ..
2043 $ cd ..
2044
2044
2045 Test that addremove picks up largefiles prior to the initial commit (issue3541)
2045 Test that addremove picks up largefiles prior to the initial commit (issue3541)
2046
2046
2047 $ hg init addrm2
2047 $ hg init addrm2
2048 $ cd addrm2
2048 $ cd addrm2
2049 $ touch large.dat
2049 $ touch large.dat
2050 $ touch large2.dat
2050 $ touch large2.dat
2051 $ touch normal
2051 $ touch normal
2052 $ hg add --large large.dat
2052 $ hg add --large large.dat
2053 $ hg addremove -v
2053 $ hg addremove -v
2054 adding large2.dat as a largefile
2054 adding large2.dat as a largefile
2055 adding normal
2055 adding normal
2056
2056
2057 Test that forgetting all largefiles reverts to islfilesrepo() == False
2057 Test that forgetting all largefiles reverts to islfilesrepo() == False
2058 (addremove will add *.dat as normal files now)
2058 (addremove will add *.dat as normal files now)
2059 $ hg forget large.dat
2059 $ hg forget large.dat
2060 $ hg forget large2.dat
2060 $ hg forget large2.dat
2061 $ hg addremove -v
2061 $ hg addremove -v
2062 adding large.dat
2062 adding large.dat
2063 adding large2.dat
2063 adding large2.dat
2064
2064
2065 Test commit's addremove option prior to the first commit
2065 Test commit's addremove option prior to the first commit
2066 $ hg forget large.dat
2066 $ hg forget large.dat
2067 $ hg forget large2.dat
2067 $ hg forget large2.dat
2068 $ hg add --large large.dat
2068 $ hg add --large large.dat
2069 $ hg ci -Am "commit"
2069 $ hg ci -Am "commit"
2070 adding large2.dat as a largefile
2070 adding large2.dat as a largefile
2071 Invoking status precommit hook
2071 Invoking status precommit hook
2072 A large.dat
2072 A large.dat
2073 A large2.dat
2073 A large2.dat
2074 A normal
2074 A normal
2075 $ find .hglf | sort
2075 $ find .hglf | sort
2076 .hglf
2076 .hglf
2077 .hglf/large.dat
2077 .hglf/large.dat
2078 .hglf/large2.dat
2078 .hglf/large2.dat
2079
2079
2080 Test actions on largefiles using relative paths from subdir
2080 Test actions on largefiles using relative paths from subdir
2081
2081
2082 $ mkdir sub
2082 $ mkdir sub
2083 $ cd sub
2083 $ cd sub
2084 $ echo anotherlarge > anotherlarge
2084 $ echo anotherlarge > anotherlarge
2085 $ hg add --large anotherlarge
2085 $ hg add --large anotherlarge
2086 $ hg st
2086 $ hg st
2087 A sub/anotherlarge
2087 A sub/anotherlarge
2088 $ hg st anotherlarge
2088 $ hg st anotherlarge
2089 A anotherlarge
2089 A anotherlarge
2090 $ hg commit -m anotherlarge anotherlarge
2090 $ hg commit -m anotherlarge anotherlarge
2091 Invoking status precommit hook
2091 Invoking status precommit hook
2092 A sub/anotherlarge
2092 A sub/anotherlarge
2093 $ hg log anotherlarge
2093 $ hg log anotherlarge
2094 changeset: 1:9627a577c5e9
2094 changeset: 1:9627a577c5e9
2095 tag: tip
2095 tag: tip
2096 user: test
2096 user: test
2097 date: Thu Jan 01 00:00:00 1970 +0000
2097 date: Thu Jan 01 00:00:00 1970 +0000
2098 summary: anotherlarge
2098 summary: anotherlarge
2099
2099
2100 $ echo more >> anotherlarge
2100 $ echo more >> anotherlarge
2101 $ hg st .
2101 $ hg st .
2102 M anotherlarge
2102 M anotherlarge
2103 $ hg cat anotherlarge
2103 $ hg cat anotherlarge
2104 anotherlarge
2104 anotherlarge
2105 $ hg revert anotherlarge
2105 $ hg revert anotherlarge
2106 $ hg st
2106 $ hg st
2107 ? sub/anotherlarge.orig
2107 ? sub/anotherlarge.orig
2108 $ cd ..
2108 $ cd ..
2109
2109
2110 $ cd ..
2110 $ cd ..
2111
2111
2112 issue3651: summary/outgoing with largefiles shows "no remote repo"
2112 issue3651: summary/outgoing with largefiles shows "no remote repo"
2113 unexpectedly
2113 unexpectedly
2114
2114
2115 $ mkdir issue3651
2115 $ mkdir issue3651
2116 $ cd issue3651
2116 $ cd issue3651
2117
2117
2118 $ hg init src
2118 $ hg init src
2119 $ echo a > src/a
2119 $ echo a > src/a
2120 $ hg -R src add --large src/a
2120 $ hg -R src add --large src/a
2121 $ hg -R src commit -m '#0'
2121 $ hg -R src commit -m '#0'
2122 Invoking status precommit hook
2122 Invoking status precommit hook
2123 A a
2123 A a
2124
2124
2125 check messages when no remote repository is specified:
2125 check messages when no remote repository is specified:
2126 "no remote repo" route for "hg outgoing --large" is not tested here,
2126 "no remote repo" route for "hg outgoing --large" is not tested here,
2127 because it can't be reproduced easily.
2127 because it can't be reproduced easily.
2128
2128
2129 $ hg init clone1
2129 $ hg init clone1
2130 $ hg -R clone1 -q pull src
2130 $ hg -R clone1 -q pull src
2131 $ hg -R clone1 -q update
2131 $ hg -R clone1 -q update
2132 $ hg -R clone1 paths | grep default
2132 $ hg -R clone1 paths | grep default
2133 [1]
2133 [1]
2134
2134
2135 $ hg -R clone1 summary --large
2135 $ hg -R clone1 summary --large
2136 parent: 0:fc0bd45326d3 tip
2136 parent: 0:fc0bd45326d3 tip
2137 #0
2137 #0
2138 branch: default
2138 branch: default
2139 commit: (clean)
2139 commit: (clean)
2140 update: (current)
2140 update: (current)
2141 largefiles: (no remote repo)
2141 largefiles: (no remote repo)
2142
2142
2143 check messages when there is no files to upload:
2143 check messages when there is no files to upload:
2144
2144
2145 $ hg -q clone src clone2
2145 $ hg -q clone src clone2
2146 $ hg -R clone2 paths | grep default
2146 $ hg -R clone2 paths | grep default
2147 default = $TESTTMP/issue3651/src (glob)
2147 default = $TESTTMP/issue3651/src (glob)
2148
2148
2149 $ hg -R clone2 summary --large
2149 $ hg -R clone2 summary --large
2150 parent: 0:fc0bd45326d3 tip
2150 parent: 0:fc0bd45326d3 tip
2151 #0
2151 #0
2152 branch: default
2152 branch: default
2153 commit: (clean)
2153 commit: (clean)
2154 update: (current)
2154 update: (current)
2155 searching for changes
2155 searching for changes
2156 largefiles: (no files to upload)
2156 largefiles: (no files to upload)
2157 $ hg -R clone2 outgoing --large
2157 $ hg -R clone2 outgoing --large
2158 comparing with $TESTTMP/issue3651/src (glob)
2158 comparing with $TESTTMP/issue3651/src (glob)
2159 searching for changes
2159 searching for changes
2160 no changes found
2160 no changes found
2161 searching for changes
2161 searching for changes
2162 largefiles: no files to upload
2162 largefiles: no files to upload
2163 [1]
2163 [1]
2164
2164
2165 check messages when there are files to upload:
2165 check messages when there are files to upload:
2166
2166
2167 $ echo b > clone2/b
2167 $ echo b > clone2/b
2168 $ hg -R clone2 add --large clone2/b
2168 $ hg -R clone2 add --large clone2/b
2169 $ hg -R clone2 commit -m '#1'
2169 $ hg -R clone2 commit -m '#1'
2170 Invoking status precommit hook
2170 Invoking status precommit hook
2171 A b
2171 A b
2172 $ hg -R clone2 summary --large
2172 $ hg -R clone2 summary --large
2173 parent: 1:1acbe71ce432 tip
2173 parent: 1:1acbe71ce432 tip
2174 #1
2174 #1
2175 branch: default
2175 branch: default
2176 commit: (clean)
2176 commit: (clean)
2177 update: (current)
2177 update: (current)
2178 searching for changes
2178 searching for changes
2179 largefiles: 1 to upload
2179 largefiles: 1 to upload
2180 $ hg -R clone2 outgoing --large
2180 $ hg -R clone2 outgoing --large
2181 comparing with $TESTTMP/issue3651/src (glob)
2181 comparing with $TESTTMP/issue3651/src (glob)
2182 searching for changes
2182 searching for changes
2183 changeset: 1:1acbe71ce432
2183 changeset: 1:1acbe71ce432
2184 tag: tip
2184 tag: tip
2185 user: test
2185 user: test
2186 date: Thu Jan 01 00:00:00 1970 +0000
2186 date: Thu Jan 01 00:00:00 1970 +0000
2187 summary: #1
2187 summary: #1
2188
2188
2189 searching for changes
2189 searching for changes
2190 largefiles to upload:
2190 largefiles to upload:
2191 b
2191 b
2192
2192
2193
2193
2194 $ cd ..
2194 $ cd ..
2195
2195
2196 merge action 'd' for 'local renamed directory to d2/g' which has no filename
2196 merge action 'd' for 'local renamed directory to d2/g' which has no filename
2197
2197
2198 $ hg init merge-action
2198 $ hg init merge-action
2199 $ cd merge-action
2199 $ cd merge-action
2200 $ touch l
2200 $ touch l
2201 $ hg add --large l
2201 $ hg add --large l
2202 $ mkdir d1
2202 $ mkdir d1
2203 $ touch d1/f
2203 $ touch d1/f
2204 $ hg ci -Aqm0
2204 $ hg ci -Aqm0
2205 Invoking status precommit hook
2205 Invoking status precommit hook
2206 A d1/f
2206 A d1/f
2207 A l
2207 A l
2208 $ echo > d1/f
2208 $ echo > d1/f
2209 $ touch d1/g
2209 $ touch d1/g
2210 $ hg ci -Aqm1
2210 $ hg ci -Aqm1
2211 Invoking status precommit hook
2211 Invoking status precommit hook
2212 M d1/f
2212 M d1/f
2213 A d1/g
2213 A d1/g
2214 $ hg up -qr0
2214 $ hg up -qr0
2215 $ hg mv d1 d2
2215 $ hg mv d1 d2
2216 moving d1/f to d2/f (glob)
2216 moving d1/f to d2/f (glob)
2217 $ hg ci -qm2
2217 $ hg ci -qm2
2218 Invoking status precommit hook
2218 Invoking status precommit hook
2219 A d2/f
2219 A d2/f
2220 R d1/f
2220 R d1/f
2221 $ hg merge
2221 $ hg merge
2222 merging d2/f and d1/f to d2/f
2222 merging d2/f and d1/f to d2/f
2223 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
2223 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
2224 (branch merge, don't forget to commit)
2224 (branch merge, don't forget to commit)
2225 getting changed largefiles
2225 getting changed largefiles
2226 0 largefiles updated, 0 removed
2226 0 largefiles updated, 0 removed
2227 $ cd ..
2227 $ cd ..
2228
2228
2229 Check whether "largefiles" feature is supported only in repositories
2229 Check whether "largefiles" feature is supported only in repositories
2230 enabling largefiles extension.
2230 enabling largefiles extension.
2231
2231
2232 $ mkdir individualenabling
2232 $ mkdir individualenabling
2233 $ cd individualenabling
2233 $ cd individualenabling
2234
2234
2235 $ hg init enabledlocally
2235 $ hg init enabledlocally
2236 $ echo large > enabledlocally/large
2236 $ echo large > enabledlocally/large
2237 $ hg -R enabledlocally add --large enabledlocally/large
2237 $ hg -R enabledlocally add --large enabledlocally/large
2238 $ hg -R enabledlocally commit -m '#0'
2238 $ hg -R enabledlocally commit -m '#0'
2239 Invoking status precommit hook
2239 Invoking status precommit hook
2240 A large
2240 A large
2241
2241
2242 $ hg init notenabledlocally
2242 $ hg init notenabledlocally
2243 $ echo large > notenabledlocally/large
2243 $ echo large > notenabledlocally/large
2244 $ hg -R notenabledlocally add --large notenabledlocally/large
2244 $ hg -R notenabledlocally add --large notenabledlocally/large
2245 $ hg -R notenabledlocally commit -m '#0'
2245 $ hg -R notenabledlocally commit -m '#0'
2246 Invoking status precommit hook
2246 Invoking status precommit hook
2247 A large
2247 A large
2248
2248
2249 $ cat >> $HGRCPATH <<EOF
2249 $ cat >> $HGRCPATH <<EOF
2250 > [extensions]
2250 > [extensions]
2251 > # disable globally
2251 > # disable globally
2252 > largefiles=!
2252 > largefiles=!
2253 > EOF
2253 > EOF
2254 $ cat >> enabledlocally/.hg/hgrc <<EOF
2254 $ cat >> enabledlocally/.hg/hgrc <<EOF
2255 > [extensions]
2255 > [extensions]
2256 > # enable locally
2256 > # enable locally
2257 > largefiles=
2257 > largefiles=
2258 > EOF
2258 > EOF
2259 $ hg -R enabledlocally root
2259 $ hg -R enabledlocally root
2260 $TESTTMP/individualenabling/enabledlocally (glob)
2260 $TESTTMP/individualenabling/enabledlocally (glob)
2261 $ hg -R notenabledlocally root
2261 $ hg -R notenabledlocally root
2262 abort: unknown repository format: requires features 'largefiles' (upgrade Mercurial)!
2262 abort: repository requires features unknown to this Mercurial: largefiles!
2263 (see http://mercurial.selenic.com/wiki/MissingRequirement for details)
2263 (see http://mercurial.selenic.com/wiki/MissingRequirement for more information)
2264 [255]
2264 [255]
2265
2265
2266 $ hg init push-dst
2266 $ hg init push-dst
2267 $ hg -R enabledlocally push push-dst
2267 $ hg -R enabledlocally push push-dst
2268 pushing to push-dst
2268 pushing to push-dst
2269 abort: required features are not supported in the destination: largefiles
2269 abort: required features are not supported in the destination: largefiles
2270 [255]
2270 [255]
2271
2271
2272 $ hg init pull-src
2272 $ hg init pull-src
2273 $ hg -R pull-src pull enabledlocally
2273 $ hg -R pull-src pull enabledlocally
2274 pulling from enabledlocally
2274 pulling from enabledlocally
2275 abort: required features are not supported in the destination: largefiles
2275 abort: required features are not supported in the destination: largefiles
2276 [255]
2276 [255]
2277
2277
2278 $ hg clone enabledlocally clone-dst
2278 $ hg clone enabledlocally clone-dst
2279 abort: unknown repository format: requires features 'largefiles' (upgrade Mercurial)!
2279 abort: repository requires features unknown to this Mercurial: largefiles!
2280 (see http://mercurial.selenic.com/wiki/MissingRequirement for details)
2280 (see http://mercurial.selenic.com/wiki/MissingRequirement for more information)
2281 [255]
2281 [255]
2282 $ test -d clone-dst
2282 $ test -d clone-dst
2283 [1]
2283 [1]
2284 $ hg clone --pull enabledlocally clone-pull-dst
2284 $ hg clone --pull enabledlocally clone-pull-dst
2285 abort: required features are not supported in the destination: largefiles
2285 abort: required features are not supported in the destination: largefiles
2286 [255]
2286 [255]
2287 $ test -d clone-pull-dst
2287 $ test -d clone-pull-dst
2288 [1]
2288 [1]
2289
2289
2290 $ cd ..
2290 $ cd ..
@@ -1,72 +1,72 b''
1 $ hg init t
1 $ hg init t
2 $ cd t
2 $ cd t
3 $ echo a > a
3 $ echo a > a
4 $ hg add a
4 $ hg add a
5 $ hg commit -m test
5 $ hg commit -m test
6 $ rm .hg/requires
6 $ rm .hg/requires
7 $ hg tip
7 $ hg tip
8 abort: index 00changelog.i unknown format 2!
8 abort: index 00changelog.i unknown format 2!
9 [255]
9 [255]
10 $ echo indoor-pool > .hg/requires
10 $ echo indoor-pool > .hg/requires
11 $ hg tip
11 $ hg tip
12 abort: unknown repository format: requires features 'indoor-pool' (upgrade Mercurial)!
12 abort: repository requires features unknown to this Mercurial: indoor-pool!
13 (see http://mercurial.selenic.com/wiki/MissingRequirement for details)
13 (see http://mercurial.selenic.com/wiki/MissingRequirement for more information)
14 [255]
14 [255]
15 $ echo outdoor-pool >> .hg/requires
15 $ echo outdoor-pool >> .hg/requires
16 $ hg tip
16 $ hg tip
17 abort: unknown repository format: requires features 'indoor-pool', 'outdoor-pool' (upgrade Mercurial)!
17 abort: repository requires features unknown to this Mercurial: indoor-pool outdoor-pool!
18 (see http://mercurial.selenic.com/wiki/MissingRequirement for details)
18 (see http://mercurial.selenic.com/wiki/MissingRequirement for more information)
19 [255]
19 [255]
20 $ cd ..
20 $ cd ..
21
21
22 Test checking between features supported locally and ones required in
22 Test checking between features supported locally and ones required in
23 another repository of push/pull/clone on localhost:
23 another repository of push/pull/clone on localhost:
24
24
25 $ mkdir supported-locally
25 $ mkdir supported-locally
26 $ cd supported-locally
26 $ cd supported-locally
27
27
28 $ hg init supported
28 $ hg init supported
29 $ echo a > supported/a
29 $ echo a > supported/a
30 $ hg -R supported commit -Am '#0 at supported'
30 $ hg -R supported commit -Am '#0 at supported'
31 adding a
31 adding a
32
32
33 $ echo 'featuresetup-test' >> supported/.hg/requires
33 $ echo 'featuresetup-test' >> supported/.hg/requires
34 $ cat > $TESTTMP/supported-locally/supportlocally.py <<EOF
34 $ cat > $TESTTMP/supported-locally/supportlocally.py <<EOF
35 > from mercurial import localrepo, extensions
35 > from mercurial import localrepo, extensions
36 > def featuresetup(ui, supported):
36 > def featuresetup(ui, supported):
37 > for name, module in extensions.extensions(ui):
37 > for name, module in extensions.extensions(ui):
38 > if __name__ == module.__name__:
38 > if __name__ == module.__name__:
39 > # support specific feature locally
39 > # support specific feature locally
40 > supported |= set(['featuresetup-test'])
40 > supported |= set(['featuresetup-test'])
41 > return
41 > return
42 > def uisetup(ui):
42 > def uisetup(ui):
43 > localrepo.localrepository.featuresetupfuncs.add(featuresetup)
43 > localrepo.localrepository.featuresetupfuncs.add(featuresetup)
44 > EOF
44 > EOF
45 $ cat > supported/.hg/hgrc <<EOF
45 $ cat > supported/.hg/hgrc <<EOF
46 > [extensions]
46 > [extensions]
47 > # enable extension locally
47 > # enable extension locally
48 > supportlocally = $TESTTMP/supported-locally/supportlocally.py
48 > supportlocally = $TESTTMP/supported-locally/supportlocally.py
49 > EOF
49 > EOF
50 $ hg -R supported status
50 $ hg -R supported status
51
51
52 $ hg init push-dst
52 $ hg init push-dst
53 $ hg -R supported push push-dst
53 $ hg -R supported push push-dst
54 pushing to push-dst
54 pushing to push-dst
55 abort: required features are not supported in the destination: featuresetup-test
55 abort: required features are not supported in the destination: featuresetup-test
56 [255]
56 [255]
57
57
58 $ hg init pull-src
58 $ hg init pull-src
59 $ hg -R pull-src pull supported
59 $ hg -R pull-src pull supported
60 pulling from supported
60 pulling from supported
61 abort: required features are not supported in the destination: featuresetup-test
61 abort: required features are not supported in the destination: featuresetup-test
62 [255]
62 [255]
63
63
64 $ hg clone supported clone-dst
64 $ hg clone supported clone-dst
65 abort: unknown repository format: requires features 'featuresetup-test' (upgrade Mercurial)!
65 abort: repository requires features unknown to this Mercurial: featuresetup-test!
66 (see http://mercurial.selenic.com/wiki/MissingRequirement for details)
66 (see http://mercurial.selenic.com/wiki/MissingRequirement for more information)
67 [255]
67 [255]
68 $ hg clone --pull supported clone-dst
68 $ hg clone --pull supported clone-dst
69 abort: required features are not supported in the destination: featuresetup-test
69 abort: required features are not supported in the destination: featuresetup-test
70 [255]
70 [255]
71
71
72 $ cd ..
72 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now