annotate hgext/largefiles/overrides.py @ 15916:c96148346af8

largefiles: cache new largefiles for new heads when pulling When the user pulls from a remote repository that is not his default repo, it is quite likely that he will pull a new head. This means that if he tries to merge or rebase with the other head, he will run into a problem becuase largefiles has no way of tracking where the remote repository for this other head is, so it cannot download the largefiles from this other remote repository. It will attempt to download them from its default remote repository, which will not yet contain the largefiles. This patch solves this problem by caching any new largefiles for all heads directly into the system cache at the time of the pull, so they are available later. This behavior is actually more in line with Mercurial's distributed nature, because pulling already implies we have a connection to the remote server, but merging or rebasing does not.
author Na'Tosha Bard <natosha@unity3d.com>
date Wed, 18 Jan 2012 11:33:14 +0100
parents 264087940d5b
children 2dc599583ebe
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)):
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
162 os.unlink(repo.wjoin(f))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
163 currentdir = os.path.split(f)[0]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
164 while currentdir and not os.listdir(repo.wjoin(currentdir)):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
165 os.rmdir(repo.wjoin(currentdir))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
166 currentdir = os.path.split(currentdir)[0]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
167 lfdirstate.remove(f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
168 lfdirstate.write()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
169 forget = [lfutil.standin(f) for f in forget]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
170 remove = [lfutil.standin(f) for f in remove]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
171 lfutil.repo_forget(repo, forget)
15792
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
172 # 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
173 # function handle this.
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
174 if not getattr(repo, "_isaddremove", False):
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
175 lfutil.repo_remove(repo, remove, unlink=True)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
176 finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
177 wlock.release()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
178
15792
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
179 # -- Wrappers: modify existing commands --------------------------------
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
180
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
181 # 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
182 # 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
183 # 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
184 # version of add.
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
185 def override_add(orig, ui, repo, *pats, **opts):
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
186 bad = add_largefiles(ui, repo, *pats, **opts)
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
187 installnormalfilesmatchfn(repo[None].manifest())
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
188 result = orig(ui, repo, *pats, **opts)
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
189 restorematchfn()
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
190
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
191 return (result == 1 or bad) and 1 or 0
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
192
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
193 def override_remove(orig, ui, repo, *pats, **opts):
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
194 installnormalfilesmatchfn(repo[None].manifest())
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
195 orig(ui, repo, *pats, **opts)
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
196 restorematchfn()
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
197 remove_largefiles(ui, repo, *pats, **opts)
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
198
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
199 def override_status(orig, ui, repo, *pats, **opts):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
200 try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
201 repo.lfstatus = True
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
202 return orig(ui, repo, *pats, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
203 finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
204 repo.lfstatus = False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
205
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
206 def override_log(orig, ui, repo, *pats, **opts):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
207 try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
208 repo.lfstatus = True
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
209 orig(ui, repo, *pats, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
210 finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
211 repo.lfstatus = False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
212
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
213 def override_verify(orig, ui, repo, *pats, **opts):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
214 large = opts.pop('large', False)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
215 all = opts.pop('lfa', False)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
216 contents = opts.pop('lfc', False)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
217
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
218 result = orig(ui, repo, *pats, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
219 if large:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
220 result = result or lfcommands.verifylfiles(ui, repo, all, contents)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
221 return result
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
222
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
223 # Override needs to refresh standins so that update's normal merge
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
224 # will go through properly. Then the other update hook (overriding repo.update)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
225 # will get the new files. Filemerge is also overriden so that the merge
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
226 # will merge standins correctly.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
227 def override_update(orig, ui, repo, *pats, **opts):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
228 lfdirstate = lfutil.openlfdirstate(ui, repo)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
229 s = lfdirstate.status(match_.always(repo.root, repo.getcwd()), [], False,
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
230 False, False)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
231 (unsure, modified, added, removed, missing, unknown, ignored, clean) = s
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
232
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15229
diff changeset
233 # 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
234 # largefiles getting updated
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
235 wlock = repo.wlock()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
236 try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
237 if opts['check']:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
238 mod = len(modified) > 0
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
239 for lfile in unsure:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
240 standin = lfutil.standin(lfile)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
241 if repo['.'][standin].data().strip() != \
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
242 lfutil.hashfile(repo.wjoin(lfile)):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
243 mod = True
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
244 else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
245 lfdirstate.normal(lfile)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
246 lfdirstate.write()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
247 if mod:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
248 raise util.Abort(_('uncommitted local changes'))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
249 # XXX handle removed differently
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
250 if not opts['clean']:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
251 for lfile in unsure + modified + added:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
252 lfutil.updatestandin(repo, lfutil.standin(lfile))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
253 finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
254 wlock.release()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
255 return orig(ui, repo, *pats, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
256
15663
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
257 # 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
258 # _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
259 # 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
260 #
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
261 # 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
262 # 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
263 #
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
264 # 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
265 # 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
266 # case further in the overridden manifestmerge function below.
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
267 def override_checkunknown(origfn, wctx, mctx, folding):
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
268 origunknown = wctx.unknown()
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
269 wctx._unknown = filter(lambda f: lfutil.standin(f) not in wctx, origunknown)
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
270 try:
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
271 return origfn(wctx, mctx, folding)
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
272 finally:
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
273 wctx._unknown = origunknown
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
274
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
275 # 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
276 # 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
277 #
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
278 # 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
279 # 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
280 #
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
281 # 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
282 # 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
283 # 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
284 # 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
285 # 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
286 #
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
287 # 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
288 # 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
289 # 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
290 # triggers a merge action.
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
291 #
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
292 # 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
293 # 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
294 # 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
295 # 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
296 # presumably changed on purpose.
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
297 #
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
298 # 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
299 # 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
300 # will update the largefiles.
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
301 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
302 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
303 processed = []
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
304
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
305 for action in actions:
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
306 if overwrite:
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
307 processed.append(action)
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
308 continue
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
309 f, m = action[:2]
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
310
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
311 choices = (_('&Largefile'), _('&Normal file'))
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
312 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
313 # 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
314 # the second parent
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
315 lfile = lfutil.splitstandin(f)
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
316 standin = f
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
317 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
318 '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
319 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
320 processed.append((lfile, "r"))
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
321 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
322 else:
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
323 processed.append((standin, "r"))
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
324 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
325 # 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
326 # the second parent
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
327 standin = lfutil.standin(f)
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
328 lfile = f
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
329 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
330 '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
331 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
332 processed.append((lfile, "r"))
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
333 else:
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
334 processed.append((standin, "r"))
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
335 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
336 else:
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
337 processed.append(action)
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
338
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
339 return processed
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
340
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15229
diff changeset
341 # 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
342 # largefiles. This will handle identical edits, and copy/rename +
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15229
diff changeset
343 # edit without prompting the user.
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
344 def override_filemerge(origfn, repo, mynode, orig, fcd, fco, fca):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
345 # Use better variable names here. Because this is a wrapper we cannot
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
346 # change the variable names in the function declaration.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
347 fcdest, fcother, fcancestor = fcd, fco, fca
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
348 if not lfutil.isstandin(orig):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
349 return origfn(repo, mynode, orig, fcdest, fcother, fcancestor)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
350 else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
351 if not fcother.cmp(fcdest): # files identical?
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
352 return None
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
353
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
354 # backwards, use working dir parent as ancestor
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
355 if fcancestor == fcother:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
356 fcancestor = fcdest.parents()[0]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
357
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
358 if orig != fcother.path():
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
359 repo.ui.status(_('merging %s and %s to %s\n')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
360 % (lfutil.splitstandin(orig),
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
361 lfutil.splitstandin(fcother.path()),
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
362 lfutil.splitstandin(fcdest.path())))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
363 else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
364 repo.ui.status(_('merging %s\n')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
365 % lfutil.splitstandin(fcdest.path()))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
366
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
367 if fcancestor.path() != fcother.path() and fcother.data() == \
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
368 fcancestor.data():
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
369 return 0
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
370 if fcancestor.path() != fcdest.path() and fcdest.data() == \
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
371 fcancestor.data():
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
372 repo.wwrite(fcdest.path(), fcother.data(), fcother.flags())
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
373 return 0
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
374
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
375 if repo.ui.promptchoice(_('largefile %s has a merge conflict\n'
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
376 'keep (l)ocal or take (o)ther?') %
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
377 lfutil.splitstandin(orig),
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
378 (_('&Local'), _('&Other')), 0) == 0:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
379 return 0
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
380 else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
381 repo.wwrite(fcdest.path(), fcother.data(), fcother.flags())
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
382 return 0
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
383
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15229
diff changeset
384 # 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
385 # 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
386 # 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
387 # 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
388 # dirstate updated.
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
389 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
390 # doesn't remove largefile on rename
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
391 if len(pats) < 2:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
392 # this isn't legal, let the original function deal with it
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
393 return orig(ui, repo, pats, opts, rename)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
394
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
395 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
396 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
397 return os.path.join(repo.wjoin(lfutil.standin(path)))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
398
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
399 fullpats = scmutil.expandpats(pats)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
400 dest = fullpats[-1]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
401
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
402 if os.path.isdir(dest):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
403 if not os.path.isdir(makestandin(dest)):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
404 os.makedirs(makestandin(dest))
15254
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
405 # 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
406 # 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
407 # 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
408 # match largefiles and run it again.
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
409 nonormalfiles = False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
410 nolfiles = False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
411 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
412 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
413 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
414 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
415 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
416 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
417 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
418 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
419 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
420 result = 0
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
421 finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
422 restorematchfn()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
423
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
424 # The first rename can cause our current working directory to be removed.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
425 # In that case there is nothing left to copy/rename so just quit.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
426 try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
427 repo.getcwd()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
428 except OSError:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
429 return result
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
430
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
431 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
432 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
433 # 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
434 # 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
435 wlock = repo.wlock()
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
436
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
437 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
438 oldmatch = None # for the closure
15306
94527d67f3da largefiles: fix some badly named function parameters
Greg Ward <greg@gerg.ca>
parents: 15305
diff changeset
439 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
440 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
441 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
442 # 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
443 # 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
444 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
445 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
446 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
447 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
448 newpats.append(pat)
15306
94527d67f3da largefiles: fix some badly named function parameters
Greg Ward <greg@gerg.ca>
parents: 15305
diff changeset
449 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
450 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
451 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
452 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
453 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
454 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
455 m.matchfn = lambda f: (lfutil.isstandin(f) and
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
456 lfile(lfutil.splitstandin(f)) and
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
457 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
458 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
459 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
460 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
461 listpats = []
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
462 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
463 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
464 listpats.append(pat)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
465 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
466 listpats.append(makestandin(pat))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
467
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
468 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
469 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
470 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
471 def override_copyfile(src, dest):
15598
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
472 if (lfutil.shortname in src and
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
473 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
474 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
475 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
476 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
477 _('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
478 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
479 origcopyfile(src, dest)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
480
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
481 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
482 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
483 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
484 util.copyfile = origcopyfile
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
485
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
486 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
487 for (src, dest) in copiedfiles:
15598
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
488 if (lfutil.shortname in src and
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
489 dest.startswith(repo.wjoin(lfutil.shortname))):
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
490 srclfile = src.replace(repo.wjoin(lfutil.standin('')), '')
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
491 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
492 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
493 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
494 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
495 if rename:
15598
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
496 os.rename(repo.wjoin(srclfile), repo.wjoin(destlfile))
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
497 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
498 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
499 util.copyfile(srclfile, destlfile)
15598
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
500 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
501 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
502 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
503 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
504 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
505 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
506 nolfiles = True
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
507 finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
508 restorematchfn()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
509 wlock.release()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
510
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
511 if nolfiles and nonormalfiles:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
512 raise util.Abort(_('no files to copy'))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
513
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
514 return result
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
515
15254
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
516 # 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
517 # 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
518 # 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
519 # the necessary largefiles.
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
520 #
15254
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
521 # 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
522 # 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
523 # 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
524 # 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
525 # to their proper state
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
526 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
527 # 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
528 # 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
529 # prevent others from changing them in their incorrect state.
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
530 wlock = repo.wlock()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
531 try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
532 lfdirstate = lfutil.openlfdirstate(ui, repo)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
533 (modified, added, removed, missing, unknown, ignored, clean) = \
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
534 lfutil.lfdirstate_status(lfdirstate, repo, repo['.'].rev())
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
535 for lfile in modified:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
536 lfutil.updatestandin(repo, lfutil.standin(lfile))
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):
15306
94527d67f3da largefiles: fix some badly named function parameters
Greg Ward <greg@gerg.ca>
parents: 15305
diff changeset
546 if lfutil.standin(f) in ctx or 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.
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
902 repo._isaddremove = True
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
903 remove_largefiles(ui, repo, *missing, **opts)
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
904 repo._isaddremove = False
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
905 # 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
906 # largefiles will be
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
907 add_largefiles(ui, repo, *pats, **opts)
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
908 # 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
909 # 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
910 # largefiles by installing a matcher that will ignore them.
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
911 installnormalfilesmatchfn(repo[None].manifest())
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
912 result = orig(ui, repo, *pats, **opts)
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
913 restorematchfn()
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
914 return result
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
915
15254
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
916 # Calling purge with --all will cause the largefiles to be deleted.
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
917 # Override repo.status to prevent this from happening.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
918 def override_purge(orig, ui, repo, *dirs, **opts):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
919 oldstatus = repo.status
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
920 def override_status(node1='.', node2=None, match=None, ignored=False,
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
921 clean=False, unknown=False, listsubrepos=False):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
922 r = oldstatus(node1, node2, match, ignored, clean, unknown,
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
923 listsubrepos)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
924 lfdirstate = lfutil.openlfdirstate(ui, repo)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
925 modified, added, removed, deleted, unknown, ignored, clean = r
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
926 unknown = [f for f in unknown if lfdirstate[f] == '?']
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
927 ignored = [f for f in ignored if lfdirstate[f] == '?']
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
928 return modified, added, removed, deleted, unknown, ignored, clean
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
929 repo.status = override_status
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
930 orig(ui, repo, *dirs, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
931 repo.status = oldstatus
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
932
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
933 def override_rollback(orig, ui, repo, **opts):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
934 result = orig(ui, repo, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
935 merge.update(repo, node=None, branchmerge=False, force=True,
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
936 partial=lfutil.isstandin)
15794
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
937 wlock = repo.wlock()
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
938 try:
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
939 lfdirstate = lfutil.openlfdirstate(ui, repo)
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
940 lfiles = lfutil.listlfiles(repo)
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
941 oldlfiles = lfutil.listlfiles(repo, repo[None].parents()[0].rev())
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
942 for file in lfiles:
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
943 if file in oldlfiles:
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
944 lfdirstate.normallookup(file)
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
945 else:
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
946 lfdirstate.add(file)
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
947 lfdirstate.write()
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
948 finally:
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
949 wlock.release()
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
950 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
951
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 def override_transplant(orig, ui, repo, *revs, **opts):
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 result = orig(ui, repo, *revs, **opts)
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
954 lfcommands.updatelfiles(repo.ui, repo)
155d0f8fb7e5 largefiles: fix bad bug where transplanting a changeset with a largefile will result in an old largefile being comitted later on
Na'Tosha Bard <natosha@unity3d.com>
parents: 15369
diff changeset
955 return result