annotate hgext/largefiles/overrides.py @ 16093:7e30f5f2285f

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