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