Mercurial > public > mercurial-scm > hg
annotate hgext/largefiles/lfcommands.py @ 35348:576ba8194fa8
py3: handle keyword arguments correctly in hgext/largefiles/
Keys of keyword arguments must be str(unicode) on Python 3. The transformer
which we use on Python 3, appends b'' in front of each string literal, so this
may lead in KeyError or None return even when the key is present by we are using
bytes value and it's stored in unicodes. This patch and all the similar patches
handle this by either converting the keys of kwargs to bytes using
'pycompat.byteskwargs()' or adding r'' so that the transformer won't append
b''.
This next 23 patches follows the above mentioned way to handle keyword
arguments.
Differential Revision: https://phab.mercurial-scm.org/D1624
author | Pulkit Goyal <7895pulkit@gmail.com> |
---|---|
date | Sun, 10 Dec 2017 02:52:48 +0530 |
parents | aef2b98d9352 |
children | 8a0cac20a1ad |
rev | line source |
---|---|
15168 | 1 # Copyright 2009-2010 Gregory P. Ward |
2 # Copyright 2009-2010 Intelerad Medical Systems Incorporated | |
3 # Copyright 2010-2011 Fog Creek Software | |
4 # Copyright 2010-2011 Unity Technologies | |
5 # | |
6 # This software may be used and distributed according to the terms of the | |
7 # GNU General Public License version 2 or any later version. | |
8 | |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15230
diff
changeset
|
9 '''High-level command function for lfconvert, plus the cmdtable.''' |
29308
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
10 from __future__ import absolute_import |
15168 | 11 |
29308
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
12 import errno |
29341
0d83ad967bf8
cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents:
29317
diff
changeset
|
13 import hashlib |
29308
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
14 import os |
15168 | 15 import shutil |
16 | |
17 from mercurial.i18n import _ | |
18 | |
29308
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
19 from mercurial import ( |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
20 cmdutil, |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
21 context, |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
22 error, |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
23 hg, |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
24 lock, |
29317
5ec25534ef4f
largefiles: rename match_ to matchmod import in lfcommands
liscju <piotr.listkiewicz@gmail.com>
parents:
29308
diff
changeset
|
25 match as matchmod, |
29308
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
26 node, |
35348
576ba8194fa8
py3: handle keyword arguments correctly in hgext/largefiles/
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35186
diff
changeset
|
27 pycompat, |
32337
46ba2cdda476
registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
31740
diff
changeset
|
28 registrar, |
29308
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
29 scmutil, |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
30 util, |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
31 ) |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
32 |
29308
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
33 from ..convert import ( |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
34 convcmd, |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
35 filemap, |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
36 ) |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
37 |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
38 from . import ( |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
39 lfutil, |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
40 storefactory |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
41 ) |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
42 |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
43 release = lock.release |
15168 | 44 |
45 # -- Commands ---------------------------------------------------------- | |
46 | |
21242
4c94229c51fb
largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21088
diff
changeset
|
47 cmdtable = {} |
32337
46ba2cdda476
registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
31740
diff
changeset
|
48 command = registrar.command(cmdtable) |
21242
4c94229c51fb
largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21088
diff
changeset
|
49 |
4c94229c51fb
largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21088
diff
changeset
|
50 @command('lfconvert', |
4c94229c51fb
largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21088
diff
changeset
|
51 [('s', 'size', '', |
4c94229c51fb
largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21088
diff
changeset
|
52 _('minimum size (MB) for files to be converted as largefiles'), 'SIZE'), |
4c94229c51fb
largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21088
diff
changeset
|
53 ('', 'to-normal', False, |
4c94229c51fb
largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21088
diff
changeset
|
54 _('convert from a largefiles repo to a normal repo')), |
4c94229c51fb
largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21088
diff
changeset
|
55 ], |
21770
15d434bee41c
largefiles: define norepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21689
diff
changeset
|
56 _('hg lfconvert SOURCE DEST [FILE ...]'), |
21785
a730b002c5db
largefiles: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21770
diff
changeset
|
57 norepo=True, |
a730b002c5db
largefiles: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21770
diff
changeset
|
58 inferrepo=True) |
15168 | 59 def lfconvert(ui, src, dest, *pats, **opts): |
15230 | 60 '''convert a normal repository to a largefiles repository |
15168 | 61 |
15230 | 62 Convert repository SOURCE to a new repository DEST, identical to |
63 SOURCE except that certain files will be converted as largefiles: | |
64 specifically, any file that matches any PATTERN *or* whose size is | |
65 above the minimum size threshold is converted as a largefile. The | |
66 size used to determine whether or not to track a file as a | |
67 largefile is the size of the first version of the file. The | |
68 minimum size can be specified either with --size or in | |
69 configuration as ``largefiles.size``. | |
70 | |
71 After running this command you will need to make sure that | |
72 largefiles is enabled anywhere you intend to push the new | |
73 repository. | |
74 | |
15332
0db47b8d025f
largefiles: rename lfconvert --tonormal option to --to-normal
Greg Ward <greg@gerg.ca>
parents:
15317
diff
changeset
|
75 Use --to-normal to convert largefiles back to normal files; after |
15230 | 76 this, the DEST repository can be used without largefiles at all.''' |
15168 | 77 |
35348
576ba8194fa8
py3: handle keyword arguments correctly in hgext/largefiles/
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35186
diff
changeset
|
78 opts = pycompat.byteskwargs(opts) |
15332
0db47b8d025f
largefiles: rename lfconvert --tonormal option to --to-normal
Greg Ward <greg@gerg.ca>
parents:
15317
diff
changeset
|
79 if opts['to_normal']: |
15168 | 80 tolfile = False |
81 else: | |
82 tolfile = True | |
15227
a7686abf73a6
largefiles: factor out lfutil.getminsize()
Greg Ward <greg@gerg.ca>
parents:
15224
diff
changeset
|
83 size = lfutil.getminsize(ui, True, opts.get('size'), default=None) |
15340
0e58513cc59a
largefiles: rearrange how lfconvert detects non-local repos
Greg Ward <greg@gerg.ca>
parents:
15339
diff
changeset
|
84 |
0e58513cc59a
largefiles: rearrange how lfconvert detects non-local repos
Greg Ward <greg@gerg.ca>
parents:
15339
diff
changeset
|
85 if not hg.islocal(src): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
86 raise error.Abort(_('%s is not a local Mercurial repo') % src) |
15340
0e58513cc59a
largefiles: rearrange how lfconvert detects non-local repos
Greg Ward <greg@gerg.ca>
parents:
15339
diff
changeset
|
87 if not hg.islocal(dest): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
88 raise error.Abort(_('%s is not a local Mercurial repo') % dest) |
15340
0e58513cc59a
largefiles: rearrange how lfconvert detects non-local repos
Greg Ward <greg@gerg.ca>
parents:
15339
diff
changeset
|
89 |
15339
be1377d19018
largefiles: test lfconvert error handling; remove redundant code
Greg Ward <greg@gerg.ca>
parents:
15332
diff
changeset
|
90 rsrc = hg.repository(ui, src) |
be1377d19018
largefiles: test lfconvert error handling; remove redundant code
Greg Ward <greg@gerg.ca>
parents:
15332
diff
changeset
|
91 ui.status(_('initializing destination %s\n') % dest) |
be1377d19018
largefiles: test lfconvert error handling; remove redundant code
Greg Ward <greg@gerg.ca>
parents:
15332
diff
changeset
|
92 rdst = hg.repository(ui, dest, create=True) |
15168 | 93 |
15171
547da6115d1d
largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents:
15170
diff
changeset
|
94 success = False |
16717
1eede2ea2041
largefiles: use wlock for lfconvert (issue3444)
Mads Kiilerich <mads@kiilerich.com>
parents:
16551
diff
changeset
|
95 dstwlock = dstlock = None |
15168 | 96 try: |
97 # Get a list of all changesets in the source. The easy way to do this | |
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17299
diff
changeset
|
98 # is to simply walk the changelog, using changelog.nodesbetween(). |
15168 | 99 # Take a look at mercurial/revlog.py:639 for more details. |
100 # Use a generator instead of a list to decrease memory usage | |
101 ctxs = (rsrc[ctx] for ctx in rsrc.changelog.nodesbetween(None, | |
102 rsrc.heads())[0]) | |
103 revmap = {node.nullid: node.nullid} | |
104 if tolfile: | |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
105 # Lock destination to prevent modification while it is converted to. |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
106 # Don't need to lock src because we are just reading from its |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
107 # history which can't change. |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
108 dstwlock = rdst.wlock() |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
109 dstlock = rdst.lock() |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
110 |
15168 | 111 lfiles = set() |
112 normalfiles = set() | |
113 if not pats: | |
34756
3f3c6d12095d
configitems: register the 'largefiles.patterns' config
Boris Feld <boris.feld@octobus.net>
parents:
34083
diff
changeset
|
114 pats = ui.configlist(lfutil.longname, 'patterns') |
15168 | 115 if pats: |
29317
5ec25534ef4f
largefiles: rename match_ to matchmod import in lfcommands
liscju <piotr.listkiewicz@gmail.com>
parents:
29308
diff
changeset
|
116 matcher = matchmod.match(rsrc.root, '', list(pats)) |
15168 | 117 else: |
118 matcher = None | |
119 | |
120 lfiletohash = {} | |
121 for ctx in ctxs: | |
122 ui.progress(_('converting revisions'), ctx.rev(), | |
28464
6e34690230c0
largefiles: use revisions as a ui.progress unit
Anton Shestakov <av6@dwimlabs.net>
parents:
28463
diff
changeset
|
123 unit=_('revisions'), total=rsrc['tip'].rev()) |
15168 | 124 _lfconvert_addchangeset(rsrc, rdst, ctx, revmap, |
125 lfiles, normalfiles, matcher, size, lfiletohash) | |
126 ui.progress(_('converting revisions'), None) | |
127 | |
28559
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
128 if rdst.wvfs.exists(lfutil.shortname): |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
129 rdst.wvfs.rmtree(lfutil.shortname) |
15168 | 130 |
131 for f in lfiletohash.keys(): | |
28559
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
132 if rdst.wvfs.isfile(f): |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
133 rdst.wvfs.unlink(f) |
15168 | 134 try: |
28559
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
135 rdst.wvfs.removedirs(rdst.wvfs.dirname(f)) |
15171
547da6115d1d
largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents:
15170
diff
changeset
|
136 except OSError: |
15168 | 137 pass |
138 | |
15303
07811b3b119b
largefiles: include 'largefiles' in converted repository requirements
Eli Carter <eli.carter@tektronix.com>
parents:
15255
diff
changeset
|
139 # If there were any files converted to largefiles, add largefiles |
07811b3b119b
largefiles: include 'largefiles' in converted repository requirements
Eli Carter <eli.carter@tektronix.com>
parents:
15255
diff
changeset
|
140 # to the destination repository's requirements. |
07811b3b119b
largefiles: include 'largefiles' in converted repository requirements
Eli Carter <eli.carter@tektronix.com>
parents:
15255
diff
changeset
|
141 if lfiles: |
07811b3b119b
largefiles: include 'largefiles' in converted repository requirements
Eli Carter <eli.carter@tektronix.com>
parents:
15255
diff
changeset
|
142 rdst.requirements.add('largefiles') |
07811b3b119b
largefiles: include 'largefiles' in converted repository requirements
Eli Carter <eli.carter@tektronix.com>
parents:
15255
diff
changeset
|
143 rdst._writerequirements() |
15168 | 144 else: |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
145 class lfsource(filemap.filemap_source): |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
146 def __init__(self, ui, source): |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
147 super(lfsource, self).__init__(ui, source, None) |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
148 self.filemapper.rename[lfutil.shortname] = '.' |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
149 |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
150 def getfile(self, name, rev): |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
151 realname, realrev = rev |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
152 f = super(lfsource, self).getfile(name, rev) |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
153 |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
154 if (not realname.startswith(lfutil.shortnameslash) |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
155 or f[0] is None): |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
156 return f |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
157 |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
158 # Substitute in the largefile data for the hash |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
159 hash = f[0].strip() |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
160 path = lfutil.findfile(rsrc, hash) |
15168 | 161 |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
162 if path is None: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
163 raise error.Abort(_("missing largefile for '%s' in %s") |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
164 % (realname, realrev)) |
27774
8ceaaf63ca80
largefiles: use util.readfile in lfconvert
Bryan O'Sullivan <bryano@fb.com>
parents:
27651
diff
changeset
|
165 return util.readfile(path), f[1] |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
166 |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
167 class converter(convcmd.converter): |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
168 def __init__(self, ui, source, dest, revmapfile, opts): |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
169 src = lfsource(ui, source) |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
170 |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
171 super(converter, self).__init__(ui, src, dest, revmapfile, |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
172 opts) |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
173 |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
174 found, missing = downloadlfiles(ui, rsrc) |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
175 if missing != 0: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
176 raise error.Abort(_("all largefiles must be present locally")) |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
177 |
25560
2b2108c35bfc
largefiles: restore the original converter class after lfconvert --to-normal
Matt Harbison <matt_harbison@yahoo.com>
parents:
25508
diff
changeset
|
178 orig = convcmd.converter |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
179 convcmd.converter = converter |
25560
2b2108c35bfc
largefiles: restore the original converter class after lfconvert --to-normal
Matt Harbison <matt_harbison@yahoo.com>
parents:
25508
diff
changeset
|
180 |
2b2108c35bfc
largefiles: restore the original converter class after lfconvert --to-normal
Matt Harbison <matt_harbison@yahoo.com>
parents:
25508
diff
changeset
|
181 try: |
35179
4abfe4169259
largefiles: explicitly set the source and sink types to 'hg' for lfconvert
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
182 convcmd.convert(ui, src, dest, source_type='hg', dest_type='hg') |
25560
2b2108c35bfc
largefiles: restore the original converter class after lfconvert --to-normal
Matt Harbison <matt_harbison@yahoo.com>
parents:
25508
diff
changeset
|
183 finally: |
2b2108c35bfc
largefiles: restore the original converter class after lfconvert --to-normal
Matt Harbison <matt_harbison@yahoo.com>
parents:
25508
diff
changeset
|
184 convcmd.converter = orig |
15171
547da6115d1d
largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents:
15170
diff
changeset
|
185 success = True |
15168 | 186 finally: |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
187 if tolfile: |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
188 rdst.dirstate.clear() |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
189 release(dstlock, dstwlock) |
15171
547da6115d1d
largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents:
15170
diff
changeset
|
190 if not success: |
547da6115d1d
largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents:
15170
diff
changeset
|
191 # we failed, remove the new directory |
547da6115d1d
largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents:
15170
diff
changeset
|
192 shutil.rmtree(rdst.root) |
15168 | 193 |
194 def _lfconvert_addchangeset(rsrc, rdst, ctx, revmap, lfiles, normalfiles, | |
195 matcher, size, lfiletohash): | |
196 # Convert src parents to dst parents | |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
197 parents = _convertparents(ctx, revmap) |
15168 | 198 |
199 # Generate list of changed files | |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
200 files = _getchangedfiles(ctx, parents) |
15168 | 201 |
202 dstfiles = [] | |
203 for f in files: | |
204 if f not in lfiles and f not in normalfiles: | |
205 islfile = _islfile(f, ctx, matcher, size) | |
206 # If this file was renamed or copied then copy | |
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17299
diff
changeset
|
207 # the largefile-ness of its predecessor |
15168 | 208 if f in ctx.manifest(): |
209 fctx = ctx.filectx(f) | |
210 renamed = fctx.renamed() | |
211 renamedlfile = renamed and renamed[0] in lfiles | |
212 islfile |= renamedlfile | |
213 if 'l' in fctx.flags(): | |
214 if renamedlfile: | |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
215 raise error.Abort( |
15380
a53888685a6c
largefiles: fix uppercase in abort message
Martin Geisler <mg@aragost.com>
parents:
15371
diff
changeset
|
216 _('renamed/copied largefile %s becomes symlink') |
15170
c1a4a3220711
largefiles: fix over-long lines
Matt Mackall <mpm@selenic.com>
parents:
15168
diff
changeset
|
217 % f) |
15168 | 218 islfile = False |
219 if islfile: | |
220 lfiles.add(f) | |
221 else: | |
222 normalfiles.add(f) | |
223 | |
224 if f in lfiles: | |
31618
8228bc8fed8c
largefiles: avoid redundant standin() invocations
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31613
diff
changeset
|
225 fstandin = lfutil.standin(f) |
8228bc8fed8c
largefiles: avoid redundant standin() invocations
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31613
diff
changeset
|
226 dstfiles.append(fstandin) |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
227 # largefile in manifest if it has not been removed/renamed |
15168 | 228 if f in ctx.manifest(): |
15808
62098aeb1e15
largefiles: don't reference uninitialized variable (issue3092)
Levi Bard <levi@unity3d.com>
parents:
15793
diff
changeset
|
229 fctx = ctx.filectx(f) |
62098aeb1e15
largefiles: don't reference uninitialized variable (issue3092)
Levi Bard <levi@unity3d.com>
parents:
15793
diff
changeset
|
230 if 'l' in fctx.flags(): |
62098aeb1e15
largefiles: don't reference uninitialized variable (issue3092)
Levi Bard <levi@unity3d.com>
parents:
15793
diff
changeset
|
231 renamed = fctx.renamed() |
15168 | 232 if renamed and renamed[0] in lfiles: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
233 raise error.Abort(_('largefile %s becomes symlink') % f) |
15168 | 234 |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
235 # largefile was modified, update standins |
29341
0d83ad967bf8
cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents:
29317
diff
changeset
|
236 m = hashlib.sha1('') |
15168 | 237 m.update(ctx[f].data()) |
238 hash = m.hexdigest() | |
239 if f not in lfiletohash or lfiletohash[f] != hash: | |
19089
0509ae083ec1
largefiles: use repo.wwrite for writing standins (issue3909)
Mads Kiilerich <madski@unity3d.com>
parents:
18976
diff
changeset
|
240 rdst.wwrite(f, ctx[f].data(), ctx[f].flags()) |
15168 | 241 executable = 'x' in ctx[f].flags() |
31618
8228bc8fed8c
largefiles: avoid redundant standin() invocations
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31613
diff
changeset
|
242 lfutil.writestandin(rdst, fstandin, hash, |
15168 | 243 executable) |
244 lfiletohash[f] = hash | |
245 else: | |
246 # normal file | |
247 dstfiles.append(f) | |
248 | |
249 def getfilectx(repo, memctx, f): | |
31613
5c1d3f1b8f44
largefiles: omit redundant isstandin() before splitstandin()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31612
diff
changeset
|
250 srcfname = lfutil.splitstandin(f) |
5c1d3f1b8f44
largefiles: omit redundant isstandin() before splitstandin()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31612
diff
changeset
|
251 if srcfname is not None: |
15168 | 252 # if the file isn't in the manifest then it was removed |
31612
c93cdfa131a8
misc: update descriptions about removed file for filectxfn
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30269
diff
changeset
|
253 # or renamed, return None to indicate this |
15168 | 254 try: |
255 fctx = ctx.filectx(srcfname) | |
256 except error.LookupError: | |
22296
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
22197
diff
changeset
|
257 return None |
15168 | 258 renamed = fctx.renamed() |
259 if renamed: | |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
260 # standin is always a largefile because largefile-ness |
15168 | 261 # doesn't change after rename or copy |
262 renamed = lfutil.standin(renamed[0]) | |
263 | |
21689
503bb3af70fe
memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents:
21242
diff
changeset
|
264 return context.memfilectx(repo, f, lfiletohash[srcfname] + '\n', |
503bb3af70fe
memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents:
21242
diff
changeset
|
265 'l' in fctx.flags(), 'x' in fctx.flags(), |
503bb3af70fe
memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents:
21242
diff
changeset
|
266 renamed) |
15168 | 267 else: |
21689
503bb3af70fe
memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents:
21242
diff
changeset
|
268 return _getnormalcontext(repo, ctx, f, revmap) |
15168 | 269 |
270 # Commit | |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
271 _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
272 |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
273 def _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap): |
15168 | 274 mctx = context.memctx(rdst, parents, ctx.description(), dstfiles, |
275 getfilectx, ctx.user(), ctx.date(), ctx.extra()) | |
276 ret = rdst.commitctx(mctx) | |
23276
4be754832829
largefiles: move "copyalltostore" invocation into "markcommitted"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23189
diff
changeset
|
277 lfutil.copyalltostore(rdst, ret) |
16551
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16439
diff
changeset
|
278 rdst.setparents(ret) |
15168 | 279 revmap[ctx.node()] = rdst.changelog.tip() |
280 | |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
281 # Generate list of changed files |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
282 def _getchangedfiles(ctx, parents): |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
283 files = set(ctx.files()) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
284 if node.nullid not in parents: |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
285 mc = ctx.manifest() |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
286 mp1 = ctx.parents()[0].manifest() |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
287 mp2 = ctx.parents()[1].manifest() |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
288 files |= (set(mp1) | set(mp2)) - set(mc) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
289 for f in mc: |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
290 if mc[f] != mp1.get(f, None) or mc[f] != mp2.get(f, None): |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
291 files.add(f) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
292 return files |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
293 |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
294 # Convert src parents to dst parents |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
295 def _convertparents(ctx, revmap): |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
296 parents = [] |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
297 for p in ctx.parents(): |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
298 parents.append(revmap[p.node()]) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
299 while len(parents) < 2: |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
300 parents.append(node.nullid) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
301 return parents |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
302 |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
303 # Get memfilectx for a normal file |
21689
503bb3af70fe
memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents:
21242
diff
changeset
|
304 def _getnormalcontext(repo, ctx, f, revmap): |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
305 try: |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
306 fctx = ctx.filectx(f) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
307 except error.LookupError: |
22296
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
22197
diff
changeset
|
308 return None |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
309 renamed = fctx.renamed() |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
310 if renamed: |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
311 renamed = renamed[0] |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
312 |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
313 data = fctx.data() |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
314 if f == '.hgtags': |
21689
503bb3af70fe
memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents:
21242
diff
changeset
|
315 data = _converttags (repo.ui, revmap, data) |
503bb3af70fe
memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents:
21242
diff
changeset
|
316 return context.memfilectx(repo, f, data, 'l' in fctx.flags(), |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
317 'x' in fctx.flags(), renamed) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
318 |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
319 # Remap tag data using a revision map |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
320 def _converttags(ui, revmap, data): |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
321 newdata = [] |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
322 for line in data.splitlines(): |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
323 try: |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
324 id, name = line.split(' ', 1) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
325 except ValueError: |
20868
5db105f216c3
i18n: fix "% inside _()" problems
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20063
diff
changeset
|
326 ui.warn(_('skipping incorrectly formatted tag %s\n') |
5db105f216c3
i18n: fix "% inside _()" problems
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20063
diff
changeset
|
327 % line) |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
328 continue |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
329 try: |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
330 newid = node.bin(id) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
331 except TypeError: |
20868
5db105f216c3
i18n: fix "% inside _()" problems
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20063
diff
changeset
|
332 ui.warn(_('skipping incorrectly formatted id %s\n') |
5db105f216c3
i18n: fix "% inside _()" problems
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20063
diff
changeset
|
333 % id) |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
334 continue |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
335 try: |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
336 newdata.append('%s %s\n' % (node.hex(revmap[newid]), |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
337 name)) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
338 except KeyError: |
16231
ce292f1379ba
i18n: fix all remaining uses of % inside _()
Matt Mackall <mpm@selenic.com>
parents:
15909
diff
changeset
|
339 ui.warn(_('no mapping for id %s\n') % id) |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
340 continue |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
341 return ''.join(newdata) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
342 |
15168 | 343 def _islfile(file, ctx, matcher, size): |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15230
diff
changeset
|
344 '''Return true if file should be considered a largefile, i.e. |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15230
diff
changeset
|
345 matcher matches it or it is larger than size.''' |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15230
diff
changeset
|
346 # never store special .hg* files as largefiles |
15168 | 347 if file == '.hgtags' or file == '.hgignore' or file == '.hgsigs': |
348 return False | |
349 if matcher and matcher(file): | |
350 return True | |
351 try: | |
352 return ctx.filectx(file).size() >= size * 1024 * 1024 | |
353 except error.LookupError: | |
354 return False | |
355 | |
356 def uploadlfiles(ui, rsrc, rdst, files): | |
357 '''upload largefiles to the central store''' | |
358 | |
15317
41f371150ccb
largefiles: make the store primary, and the user cache secondary
Benjamin Pollack <benjamin@bitquabit.com>
parents:
15313
diff
changeset
|
359 if not files: |
15168 | 360 return |
361 | |
29355
85868ecf2c0d
largefiles: make storefactory._openstore public
liscju <piotr.listkiewicz@gmail.com>
parents:
29341
diff
changeset
|
362 store = storefactory.openstore(rsrc, rdst, put=True) |
15168 | 363 |
364 at = 0 | |
17127
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16727
diff
changeset
|
365 ui.debug("sending statlfile command for %d largefiles\n" % len(files)) |
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16727
diff
changeset
|
366 retval = store.exists(files) |
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16727
diff
changeset
|
367 files = filter(lambda h: not retval[h], files) |
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16727
diff
changeset
|
368 ui.debug("%d largefiles need to be uploaded\n" % len(files)) |
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16727
diff
changeset
|
369 |
15168 | 370 for hash in files: |
28463
19b4a2087dfc
largefiles: specify unit for ui.progress when operating on files
Anton Shestakov <av6@dwimlabs.net>
parents:
27820
diff
changeset
|
371 ui.progress(_('uploading largefiles'), at, unit=_('files'), |
15170
c1a4a3220711
largefiles: fix over-long lines
Matt Mackall <mpm@selenic.com>
parents:
15168
diff
changeset
|
372 total=len(files)) |
15168 | 373 source = lfutil.findfile(rsrc, hash) |
374 if not source: | |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
375 raise error.Abort(_('largefile %s missing from store' |
15253
67d010779907
largefiles: improve error reporting
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
376 ' (needs to be uploaded)') % hash) |
15168 | 377 # XXX check for errors here |
378 store.put(source, hash) | |
379 at += 1 | |
15173
3d27a8ff895f
largefiles: mark a string for translation
Matt Mackall <mpm@selenic.com>
parents:
15172
diff
changeset
|
380 ui.progress(_('uploading largefiles'), None) |
15168 | 381 |
382 def verifylfiles(ui, repo, all=False, contents=False): | |
18574
4db9e31ae605
largefiles: docstrings for verify methods
Mads Kiilerich <mads@kiilerich.com>
parents:
18294
diff
changeset
|
383 '''Verify that every largefile revision in the current changeset |
15168 | 384 exists in the central store. With --contents, also verify that |
18574
4db9e31ae605
largefiles: docstrings for verify methods
Mads Kiilerich <mads@kiilerich.com>
parents:
18294
diff
changeset
|
385 the contents of each local largefile file revision are correct (SHA-1 hash |
15168 | 386 matches the revision ID). With --all, check every changeset in |
387 this repository.''' | |
388 if all: | |
25508
b8fd605b0c88
largefiles: ignore hidden changesets with 'verify --large --lfa'
Matt Harbison <matt_harbison@yahoo.com>
parents:
25326
diff
changeset
|
389 revs = repo.revs('all()') |
15168 | 390 else: |
391 revs = ['.'] | |
392 | |
29355
85868ecf2c0d
largefiles: make storefactory._openstore public
liscju <piotr.listkiewicz@gmail.com>
parents:
29341
diff
changeset
|
393 store = storefactory.openstore(repo) |
15168 | 394 return store.verify(revs, contents=contents) |
395 | |
16700
28001e8a5149
largefiles: optimize performance when updating (issue3440)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16691
diff
changeset
|
396 def cachelfiles(ui, repo, node, filelist=None): |
15168 | 397 '''cachelfiles ensures that all largefiles needed by the specified revision |
398 are present in the repository's largefile cache. | |
399 | |
400 returns a tuple (cached, missing). cached is the list of files downloaded | |
401 by this operation; missing is the list of files that were needed but could | |
402 not be found.''' | |
403 lfiles = lfutil.listlfiles(repo, node) | |
16700
28001e8a5149
largefiles: optimize performance when updating (issue3440)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16691
diff
changeset
|
404 if filelist: |
28001e8a5149
largefiles: optimize performance when updating (issue3440)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16691
diff
changeset
|
405 lfiles = set(lfiles) & set(filelist) |
15168 | 406 toget = [] |
407 | |
31654
1af4a1641bdb
largefiles: avoid redundant changectx looking up at each repetitions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31618
diff
changeset
|
408 ctx = repo[node] |
15168 | 409 for lfile in lfiles: |
18728
1e636f7b1cfe
largefiles: simplify cachelfiles - don't spend a lot of time checking hashes
Mads Kiilerich <madski@unity3d.com>
parents:
18727
diff
changeset
|
410 try: |
31740
a40e979b9d97
largefiles: use readasstandin() to read hex hash directly from filectx
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31735
diff
changeset
|
411 expectedhash = lfutil.readasstandin(ctx[lfutil.standin(lfile)]) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25560
diff
changeset
|
412 except IOError as err: |
18728
1e636f7b1cfe
largefiles: simplify cachelfiles - don't spend a lot of time checking hashes
Mads Kiilerich <madski@unity3d.com>
parents:
18727
diff
changeset
|
413 if err.errno == errno.ENOENT: |
1e636f7b1cfe
largefiles: simplify cachelfiles - don't spend a lot of time checking hashes
Mads Kiilerich <madski@unity3d.com>
parents:
18727
diff
changeset
|
414 continue # node must be None and standin wasn't found in wctx |
1e636f7b1cfe
largefiles: simplify cachelfiles - don't spend a lot of time checking hashes
Mads Kiilerich <madski@unity3d.com>
parents:
18727
diff
changeset
|
415 raise |
1e636f7b1cfe
largefiles: simplify cachelfiles - don't spend a lot of time checking hashes
Mads Kiilerich <madski@unity3d.com>
parents:
18727
diff
changeset
|
416 if not lfutil.findfile(repo, expectedhash): |
15168 | 417 toget.append((lfile, expectedhash)) |
418 | |
419 if toget: | |
29355
85868ecf2c0d
largefiles: make storefactory._openstore public
liscju <piotr.listkiewicz@gmail.com>
parents:
29341
diff
changeset
|
420 store = storefactory.openstore(repo) |
15168 | 421 ret = store.get(toget) |
422 return ret | |
423 | |
424 return ([], []) | |
425 | |
16691
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
426 def downloadlfiles(ui, repo, rev=None): |
34083
08346a8fa65f
cleanup: rename "matchfn" to "match" where obviously a matcher
Martin von Zweigbergk <martinvonz@google.com>
parents:
32375
diff
changeset
|
427 match = scmutil.match(repo[None], [repo.wjoin(lfutil.shortname)], {}) |
16691
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
428 def prepare(ctx, fns): |
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
429 pass |
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
430 totalsuccess = 0 |
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
431 totalmissing = 0 |
18722
f0aa8bbffe60
largefiles: fix download of largefiles from an empty list of changesets
Mads Kiilerich <madski@unity3d.com>
parents:
18294
diff
changeset
|
432 if rev != []: # walkchangerevs on empty list would return all revs |
34083
08346a8fa65f
cleanup: rename "matchfn" to "match" where obviously a matcher
Martin von Zweigbergk <martinvonz@google.com>
parents:
32375
diff
changeset
|
433 for ctx in cmdutil.walkchangerevs(repo, match, {'rev' : rev}, |
18722
f0aa8bbffe60
largefiles: fix download of largefiles from an empty list of changesets
Mads Kiilerich <madski@unity3d.com>
parents:
18294
diff
changeset
|
434 prepare): |
f0aa8bbffe60
largefiles: fix download of largefiles from an empty list of changesets
Mads Kiilerich <madski@unity3d.com>
parents:
18294
diff
changeset
|
435 success, missing = cachelfiles(ui, repo, ctx.node()) |
f0aa8bbffe60
largefiles: fix download of largefiles from an empty list of changesets
Mads Kiilerich <madski@unity3d.com>
parents:
18294
diff
changeset
|
436 totalsuccess += len(success) |
f0aa8bbffe60
largefiles: fix download of largefiles from an empty list of changesets
Mads Kiilerich <madski@unity3d.com>
parents:
18294
diff
changeset
|
437 totalmissing += len(missing) |
16691
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
438 ui.status(_("%d additional largefiles cached\n") % totalsuccess) |
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
439 if totalmissing > 0: |
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
440 ui.status(_("%d largefiles failed to download\n") % totalmissing) |
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
441 return totalsuccess, totalmissing |
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
442 |
23189
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
443 def updatelfiles(ui, repo, filelist=None, printmessage=None, |
24788
b8c3a0994b37
largefiles: always consider updatelfiles 'checked' parameter set
Mads Kiilerich <madski@unity3d.com>
parents:
24180
diff
changeset
|
444 normallookup=False): |
23189
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
445 '''Update largefiles according to standins in the working directory |
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
446 |
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
447 If ``printmessage`` is other than ``None``, it means "print (or |
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
448 ignore, for false) message forcibly". |
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
449 ''' |
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
450 statuswriter = lfutil.getstatuswriter(ui, repo, printmessage) |
27820
d2e9cc9edc08
with: use context manager for wlock in updatelfiles
Bryan O'Sullivan <bryano@fb.com>
parents:
27774
diff
changeset
|
451 with repo.wlock(): |
15168 | 452 lfdirstate = lfutil.openlfdirstate(ui, repo) |
453 lfiles = set(lfutil.listlfiles(repo)) | set(lfdirstate) | |
454 | |
455 if filelist is not None: | |
22197
f72d73937853
largefiles: update lfdirstate for unchanged largefiles during linear merging
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22095
diff
changeset
|
456 filelist = set(filelist) |
15168 | 457 lfiles = [f for f in lfiles if f in filelist] |
458 | |
20063
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
459 update = {} |
35168
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
460 dropped = set() |
15168 | 461 updated, removed = 0, 0 |
28559
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
462 wvfs = repo.wvfs |
31654
1af4a1641bdb
largefiles: avoid redundant changectx looking up at each repetitions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31618
diff
changeset
|
463 wctx = repo[None] |
20062
452f68738f69
largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
20061
diff
changeset
|
464 for lfile in lfiles: |
28559
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
465 rellfile = lfile |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
466 rellfileorig = os.path.relpath( |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
467 scmutil.origpath(ui, repo, wvfs.join(rellfile)), |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
468 start=repo.root) |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
469 relstandin = lfutil.standin(lfile) |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
470 relstandinorig = os.path.relpath( |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
471 scmutil.origpath(ui, repo, wvfs.join(relstandin)), |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
472 start=repo.root) |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
473 if wvfs.exists(relstandin): |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
474 if (wvfs.exists(relstandinorig) and |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
475 wvfs.exists(rellfile)): |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
476 shutil.copyfile(wvfs.join(rellfile), |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
477 wvfs.join(rellfileorig)) |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
478 wvfs.unlinkpath(relstandinorig) |
31735
3e37b479ce2f
largefiles: replace readstandin() by readasstandin()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31654
diff
changeset
|
479 expecthash = lfutil.readasstandin(wctx[relstandin]) |
24788
b8c3a0994b37
largefiles: always consider updatelfiles 'checked' parameter set
Mads Kiilerich <madski@unity3d.com>
parents:
24180
diff
changeset
|
480 if expecthash != '': |
31654
1af4a1641bdb
largefiles: avoid redundant changectx looking up at each repetitions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31618
diff
changeset
|
481 if lfile not in wctx: # not switched to normal file |
35168
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
482 if repo.dirstate[relstandin] != '?': |
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
483 wvfs.unlinkpath(rellfile, ignoremissing=True) |
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
484 else: |
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
485 dropped.add(rellfile) |
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
486 |
23139
e53f6b72a0e4
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
22296
diff
changeset
|
487 # use normallookup() to allocate an entry in largefiles |
24180
d8e0c591781c
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
23893
diff
changeset
|
488 # dirstate to prevent lfilesrepo.status() from reporting |
d8e0c591781c
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
23893
diff
changeset
|
489 # missing files as removed. |
20063
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
490 lfdirstate.normallookup(lfile) |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
491 update[lfile] = expecthash |
20062
452f68738f69
largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
20061
diff
changeset
|
492 else: |
452f68738f69
largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
20061
diff
changeset
|
493 # Remove lfiles for which the standin is deleted, unless the |
452f68738f69
largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
20061
diff
changeset
|
494 # lfile is added to the repository again. This happens when a |
452f68738f69
largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
20061
diff
changeset
|
495 # largefile is converted back to a normal file: the standin |
452f68738f69
largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
20061
diff
changeset
|
496 # disappears, but a new (normal) file appears as the lfile. |
28559
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
497 if (wvfs.exists(rellfile) and |
31654
1af4a1641bdb
largefiles: avoid redundant changectx looking up at each repetitions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31618
diff
changeset
|
498 repo.dirstate.normalize(lfile) not in wctx): |
28559
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
499 wvfs.unlinkpath(rellfile) |
20062
452f68738f69
largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
20061
diff
changeset
|
500 removed += 1 |
20063
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
501 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
502 # largefile processing might be slow and be interrupted - be prepared |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
503 lfdirstate.write() |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
504 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
505 if lfiles: |
35168
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
506 lfiles = [f for f in lfiles if f not in dropped] |
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
507 |
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
508 for f in dropped: |
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
509 repo.wvfs.unlinkpath(lfutil.standin(f)) |
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
510 |
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
511 # This needs to happen for dropped files, otherwise they stay in |
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
512 # the M state. |
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
513 lfutil.synclfdirstate(repo, lfdirstate, f, normallookup) |
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
514 |
23189
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
515 statuswriter(_('getting changed largefiles\n')) |
20063
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
516 cachelfiles(ui, repo, None, lfiles) |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
517 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
518 for lfile in lfiles: |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
519 update1 = 0 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
520 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
521 expecthash = update.get(lfile) |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
522 if expecthash: |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
523 if not lfutil.copyfromcache(repo, expecthash, lfile): |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
524 # failed ... but already removed and set to normallookup |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
525 continue |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
526 # Synchronize largefile dirstate to the last modified |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
527 # time of the file |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
528 lfdirstate.normal(lfile) |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
529 update1 = 1 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
530 |
30269
d71db0e3b7b9
largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents:
30141
diff
changeset
|
531 # copy the exec mode of largefile standin from the repository's |
20063
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
532 # dirstate to its state in the lfdirstate. |
28559
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
533 rellfile = lfile |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
534 relstandin = lfutil.standin(lfile) |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
535 if wvfs.exists(relstandin): |
30269
d71db0e3b7b9
largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents:
30141
diff
changeset
|
536 # exec is decided by the users permissions using mask 0o100 |
30141
c01acee367ec
largefiles: when setting/clearing x bit on largefiles, don't change other bits
Mads Kiilerich <madski@unity3d.com>
parents:
29355
diff
changeset
|
537 standinexec = wvfs.stat(relstandin).st_mode & 0o100 |
30269
d71db0e3b7b9
largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents:
30141
diff
changeset
|
538 st = wvfs.stat(rellfile) |
d71db0e3b7b9
largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents:
30141
diff
changeset
|
539 mode = st.st_mode |
d71db0e3b7b9
largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents:
30141
diff
changeset
|
540 if standinexec != mode & 0o100: |
d71db0e3b7b9
largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents:
30141
diff
changeset
|
541 # first remove all X bits, then shift all R bits to X |
d71db0e3b7b9
largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents:
30141
diff
changeset
|
542 mode &= ~0o111 |
30141
c01acee367ec
largefiles: when setting/clearing x bit on largefiles, don't change other bits
Mads Kiilerich <madski@unity3d.com>
parents:
29355
diff
changeset
|
543 if standinexec: |
30269
d71db0e3b7b9
largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents:
30141
diff
changeset
|
544 mode |= (mode >> 2) & 0o111 & ~util.umask |
d71db0e3b7b9
largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents:
30141
diff
changeset
|
545 wvfs.chmod(rellfile, mode) |
20063
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
546 update1 = 1 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
547 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
548 updated += update1 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
549 |
22095
cb62d77c7a01
largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21934
diff
changeset
|
550 lfutil.synclfdirstate(repo, lfdirstate, lfile, normallookup) |
15168 | 551 |
552 lfdirstate.write() | |
23189
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
553 if lfiles: |
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
554 statuswriter(_('%d largefiles updated, %d removed\n') % (updated, |
15168 | 555 removed)) |
556 | |
21242
4c94229c51fb
largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21088
diff
changeset
|
557 @command('lfpull', |
4c94229c51fb
largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21088
diff
changeset
|
558 [('r', 'rev', [], _('pull largefiles for these revisions')) |
32375
04baab18d60a
commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32337
diff
changeset
|
559 ] + cmdutil.remoteopts, |
21242
4c94229c51fb
largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21088
diff
changeset
|
560 _('-r REV... [-e CMD] [--remotecmd CMD] [SOURCE]')) |
18976
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
561 def lfpull(ui, repo, source="default", **opts): |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
562 """pull largefiles for the specified revisions from the specified source |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
563 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
564 Pull largefiles that are referenced from local changesets but missing |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
565 locally, pulling from a remote repository to the local cache. |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
566 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
567 If SOURCE is omitted, the 'default' path will be used. |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
568 See :hg:`help urls` for more information. |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
569 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
570 .. container:: verbose |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
571 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
572 Some examples: |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
573 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
574 - pull largefiles for all branch heads:: |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
575 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
576 hg lfpull -r "head() and not closed()" |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
577 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
578 - pull largefiles on the default branch:: |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
579 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
580 hg lfpull -r "branch(default)" |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
581 """ |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
582 repo.lfpullsource = source |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
583 |
35348
576ba8194fa8
py3: handle keyword arguments correctly in hgext/largefiles/
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35186
diff
changeset
|
584 revs = opts.get(r'rev', []) |
18976
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
585 if not revs: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
586 raise error.Abort(_('no revisions specified')) |
18976
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
587 revs = scmutil.revrange(repo, revs) |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
588 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
589 numcached = 0 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
590 for rev in revs: |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
591 ui.note(_('pulling largefiles for revision %s\n') % rev) |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
592 (cached, missing) = cachelfiles(ui, repo, rev) |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
593 numcached += len(cached) |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
594 ui.status(_("%d largefiles cached\n") % numcached) |