Mercurial > hg
annotate hgext/largefiles/lfcommands.py @ 35710:5cd60b0587a8
evolution: make reporting of new unstable changesets optional
This makes it possible to turn off the reporting of unstable
changesets (e.g. "1 new orphan changesets"), just in case it's too
slow for some users. Anyone who's been using the evolve extension has
already been accepting the cost of the reporting, so this is just for
the few users who have turned on obsmarkers but not been using the
evolve extension (as I believe Facebook has).
Differential Revision: https://phab.mercurial-scm.org/D1868
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Sun, 14 Jan 2018 00:02:40 -0800 |
parents | 4aa6ed598323 |
children | b9da10f310f4 |
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 | |
35400
8a0cac20a1ad
memfilectx: make changectx argument mandatory in constructor (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
35348
diff
changeset
|
264 return context.memfilectx(repo, memctx, f, |
8a0cac20a1ad
memfilectx: make changectx argument mandatory in constructor (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
35348
diff
changeset
|
265 lfiletohash[srcfname] + '\n', |
21689
503bb3af70fe
memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents:
21242
diff
changeset
|
266 '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
|
267 renamed) |
15168 | 268 else: |
21689
503bb3af70fe
memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents:
21242
diff
changeset
|
269 return _getnormalcontext(repo, ctx, f, revmap) |
15168 | 270 |
271 # Commit | |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
272 _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
273 |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
274 def _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap): |
15168 | 275 mctx = context.memctx(rdst, parents, ctx.description(), dstfiles, |
276 getfilectx, ctx.user(), ctx.date(), ctx.extra()) | |
277 ret = rdst.commitctx(mctx) | |
23276
4be754832829
largefiles: move "copyalltostore" invocation into "markcommitted"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23189
diff
changeset
|
278 lfutil.copyalltostore(rdst, ret) |
16551
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16439
diff
changeset
|
279 rdst.setparents(ret) |
15168 | 280 revmap[ctx.node()] = rdst.changelog.tip() |
281 | |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
282 # Generate list of changed files |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
283 def _getchangedfiles(ctx, parents): |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
284 files = set(ctx.files()) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
285 if node.nullid not in parents: |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
286 mc = ctx.manifest() |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
287 mp1 = ctx.parents()[0].manifest() |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
288 mp2 = ctx.parents()[1].manifest() |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
289 files |= (set(mp1) | set(mp2)) - set(mc) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
290 for f in mc: |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
291 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
|
292 files.add(f) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
293 return files |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
294 |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
295 # Convert src parents to dst parents |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
296 def _convertparents(ctx, revmap): |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
297 parents = [] |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
298 for p in ctx.parents(): |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
299 parents.append(revmap[p.node()]) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
300 while len(parents) < 2: |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
301 parents.append(node.nullid) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
302 return parents |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
303 |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
304 # 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
|
305 def _getnormalcontext(repo, ctx, f, revmap): |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
306 try: |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
307 fctx = ctx.filectx(f) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
308 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
|
309 return None |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
310 renamed = fctx.renamed() |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
311 if renamed: |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
312 renamed = renamed[0] |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
313 |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
314 data = fctx.data() |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
315 if f == '.hgtags': |
21689
503bb3af70fe
memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents:
21242
diff
changeset
|
316 data = _converttags (repo.ui, revmap, data) |
35400
8a0cac20a1ad
memfilectx: make changectx argument mandatory in constructor (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
35348
diff
changeset
|
317 return context.memfilectx(repo, ctx, f, data, 'l' in fctx.flags(), |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
318 'x' in fctx.flags(), renamed) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
319 |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
320 # Remap tag data using a revision map |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
321 def _converttags(ui, revmap, data): |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
322 newdata = [] |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
323 for line in data.splitlines(): |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
324 try: |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
325 id, name = line.split(' ', 1) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
326 except ValueError: |
20868
5db105f216c3
i18n: fix "% inside _()" problems
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20063
diff
changeset
|
327 ui.warn(_('skipping incorrectly formatted tag %s\n') |
5db105f216c3
i18n: fix "% inside _()" problems
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20063
diff
changeset
|
328 % line) |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
329 continue |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
330 try: |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
331 newid = node.bin(id) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
332 except TypeError: |
20868
5db105f216c3
i18n: fix "% inside _()" problems
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20063
diff
changeset
|
333 ui.warn(_('skipping incorrectly formatted id %s\n') |
5db105f216c3
i18n: fix "% inside _()" problems
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20063
diff
changeset
|
334 % id) |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
335 continue |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
336 try: |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
337 newdata.append('%s %s\n' % (node.hex(revmap[newid]), |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
338 name)) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
339 except KeyError: |
16231
ce292f1379ba
i18n: fix all remaining uses of % inside _()
Matt Mackall <mpm@selenic.com>
parents:
15909
diff
changeset
|
340 ui.warn(_('no mapping for id %s\n') % id) |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
341 continue |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
342 return ''.join(newdata) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
343 |
15168 | 344 def _islfile(file, ctx, matcher, size): |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15230
diff
changeset
|
345 '''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
|
346 matcher matches it or it is larger than size.''' |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15230
diff
changeset
|
347 # never store special .hg* files as largefiles |
15168 | 348 if file == '.hgtags' or file == '.hgignore' or file == '.hgsigs': |
349 return False | |
350 if matcher and matcher(file): | |
351 return True | |
352 try: | |
353 return ctx.filectx(file).size() >= size * 1024 * 1024 | |
354 except error.LookupError: | |
355 return False | |
356 | |
357 def uploadlfiles(ui, rsrc, rdst, files): | |
358 '''upload largefiles to the central store''' | |
359 | |
15317
41f371150ccb
largefiles: make the store primary, and the user cache secondary
Benjamin Pollack <benjamin@bitquabit.com>
parents:
15313
diff
changeset
|
360 if not files: |
15168 | 361 return |
362 | |
29355
85868ecf2c0d
largefiles: make storefactory._openstore public
liscju <piotr.listkiewicz@gmail.com>
parents:
29341
diff
changeset
|
363 store = storefactory.openstore(rsrc, rdst, put=True) |
15168 | 364 |
365 at = 0 | |
17127
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16727
diff
changeset
|
366 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
|
367 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
|
368 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
|
369 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
|
370 |
15168 | 371 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
|
372 ui.progress(_('uploading largefiles'), at, unit=_('files'), |
15170
c1a4a3220711
largefiles: fix over-long lines
Matt Mackall <mpm@selenic.com>
parents:
15168
diff
changeset
|
373 total=len(files)) |
15168 | 374 source = lfutil.findfile(rsrc, hash) |
375 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
|
376 raise error.Abort(_('largefile %s missing from store' |
15253
67d010779907
largefiles: improve error reporting
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
377 ' (needs to be uploaded)') % hash) |
15168 | 378 # XXX check for errors here |
379 store.put(source, hash) | |
380 at += 1 | |
15173
3d27a8ff895f
largefiles: mark a string for translation
Matt Mackall <mpm@selenic.com>
parents:
15172
diff
changeset
|
381 ui.progress(_('uploading largefiles'), None) |
15168 | 382 |
383 def verifylfiles(ui, repo, all=False, contents=False): | |
18574
4db9e31ae605
largefiles: docstrings for verify methods
Mads Kiilerich <mads@kiilerich.com>
parents:
18294
diff
changeset
|
384 '''Verify that every largefile revision in the current changeset |
15168 | 385 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
|
386 the contents of each local largefile file revision are correct (SHA-1 hash |
15168 | 387 matches the revision ID). With --all, check every changeset in |
388 this repository.''' | |
389 if all: | |
25508
b8fd605b0c88
largefiles: ignore hidden changesets with 'verify --large --lfa'
Matt Harbison <matt_harbison@yahoo.com>
parents:
25326
diff
changeset
|
390 revs = repo.revs('all()') |
15168 | 391 else: |
392 revs = ['.'] | |
393 | |
29355
85868ecf2c0d
largefiles: make storefactory._openstore public
liscju <piotr.listkiewicz@gmail.com>
parents:
29341
diff
changeset
|
394 store = storefactory.openstore(repo) |
15168 | 395 return store.verify(revs, contents=contents) |
396 | |
16700
28001e8a5149
largefiles: optimize performance when updating (issue3440)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16691
diff
changeset
|
397 def cachelfiles(ui, repo, node, filelist=None): |
15168 | 398 '''cachelfiles ensures that all largefiles needed by the specified revision |
399 are present in the repository's largefile cache. | |
400 | |
401 returns a tuple (cached, missing). cached is the list of files downloaded | |
402 by this operation; missing is the list of files that were needed but could | |
403 not be found.''' | |
404 lfiles = lfutil.listlfiles(repo, node) | |
16700
28001e8a5149
largefiles: optimize performance when updating (issue3440)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16691
diff
changeset
|
405 if filelist: |
28001e8a5149
largefiles: optimize performance when updating (issue3440)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16691
diff
changeset
|
406 lfiles = set(lfiles) & set(filelist) |
15168 | 407 toget = [] |
408 | |
31654
1af4a1641bdb
largefiles: avoid redundant changectx looking up at each repetitions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31618
diff
changeset
|
409 ctx = repo[node] |
15168 | 410 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
|
411 try: |
31740
a40e979b9d97
largefiles: use readasstandin() to read hex hash directly from filectx
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31735
diff
changeset
|
412 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
|
413 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
|
414 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
|
415 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
|
416 raise |
1e636f7b1cfe
largefiles: simplify cachelfiles - don't spend a lot of time checking hashes
Mads Kiilerich <madski@unity3d.com>
parents:
18727
diff
changeset
|
417 if not lfutil.findfile(repo, expectedhash): |
15168 | 418 toget.append((lfile, expectedhash)) |
419 | |
420 if toget: | |
29355
85868ecf2c0d
largefiles: make storefactory._openstore public
liscju <piotr.listkiewicz@gmail.com>
parents:
29341
diff
changeset
|
421 store = storefactory.openstore(repo) |
15168 | 422 ret = store.get(toget) |
423 return ret | |
424 | |
425 return ([], []) | |
426 | |
16691
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
427 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
|
428 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
|
429 def prepare(ctx, fns): |
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
430 pass |
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
431 totalsuccess = 0 |
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
432 totalmissing = 0 |
18722
f0aa8bbffe60
largefiles: fix download of largefiles from an empty list of changesets
Mads Kiilerich <madski@unity3d.com>
parents:
18294
diff
changeset
|
433 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
|
434 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
|
435 prepare): |
f0aa8bbffe60
largefiles: fix download of largefiles from an empty list of changesets
Mads Kiilerich <madski@unity3d.com>
parents:
18294
diff
changeset
|
436 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
|
437 totalsuccess += len(success) |
f0aa8bbffe60
largefiles: fix download of largefiles from an empty list of changesets
Mads Kiilerich <madski@unity3d.com>
parents:
18294
diff
changeset
|
438 totalmissing += len(missing) |
16691
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
439 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
|
440 if totalmissing > 0: |
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
441 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
|
442 return totalsuccess, totalmissing |
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
443 |
23189
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
444 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
|
445 normallookup=False): |
23189
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
446 '''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
|
447 |
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
448 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
|
449 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
|
450 ''' |
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
451 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
|
452 with repo.wlock(): |
15168 | 453 lfdirstate = lfutil.openlfdirstate(ui, repo) |
454 lfiles = set(lfutil.listlfiles(repo)) | set(lfdirstate) | |
455 | |
456 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
|
457 filelist = set(filelist) |
15168 | 458 lfiles = [f for f in lfiles if f in filelist] |
459 | |
20063
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
460 update = {} |
35168
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
461 dropped = set() |
15168 | 462 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
|
463 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
|
464 wctx = repo[None] |
20062
452f68738f69
largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
20061
diff
changeset
|
465 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
|
466 rellfile = lfile |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
467 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
|
468 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
|
469 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
|
470 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
|
471 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
|
472 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
|
473 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
|
474 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
|
475 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
|
476 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
|
477 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
|
478 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
|
479 wvfs.unlinkpath(relstandinorig) |
31735
3e37b479ce2f
largefiles: replace readstandin() by readasstandin()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31654
diff
changeset
|
480 expecthash = lfutil.readasstandin(wctx[relstandin]) |
24788
b8c3a0994b37
largefiles: always consider updatelfiles 'checked' parameter set
Mads Kiilerich <madski@unity3d.com>
parents:
24180
diff
changeset
|
481 if expecthash != '': |
31654
1af4a1641bdb
largefiles: avoid redundant changectx looking up at each repetitions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31618
diff
changeset
|
482 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
|
483 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
|
484 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
|
485 else: |
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
486 dropped.add(rellfile) |
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
487 |
23139
e53f6b72a0e4
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
22296
diff
changeset
|
488 # 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
|
489 # 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
|
490 # missing files as removed. |
20063
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
491 lfdirstate.normallookup(lfile) |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
492 update[lfile] = expecthash |
20062
452f68738f69
largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
20061
diff
changeset
|
493 else: |
452f68738f69
largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
20061
diff
changeset
|
494 # 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
|
495 # 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
|
496 # 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
|
497 # 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
|
498 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
|
499 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
|
500 wvfs.unlinkpath(rellfile) |
20062
452f68738f69
largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents:
20061
diff
changeset
|
501 removed += 1 |
20063
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
502 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
503 # 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
|
504 lfdirstate.write() |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
505 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
506 if lfiles: |
35168
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
507 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
|
508 |
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
509 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
|
510 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
|
511 |
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
512 # 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
|
513 # the M state. |
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
514 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
|
515 |
23189
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
516 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
|
517 cachelfiles(ui, repo, None, lfiles) |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
518 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
519 for lfile in lfiles: |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
520 update1 = 0 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
521 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
522 expecthash = update.get(lfile) |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
523 if expecthash: |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
524 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
|
525 # 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
|
526 continue |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
527 # 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
|
528 # time of the file |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
529 lfdirstate.normal(lfile) |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
530 update1 = 1 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
531 |
30269
d71db0e3b7b9
largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents:
30141
diff
changeset
|
532 # 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
|
533 # 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
|
534 rellfile = lfile |
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
535 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
|
536 if wvfs.exists(relstandin): |
30269
d71db0e3b7b9
largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents:
30141
diff
changeset
|
537 # 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
|
538 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
|
539 st = wvfs.stat(rellfile) |
d71db0e3b7b9
largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents:
30141
diff
changeset
|
540 mode = st.st_mode |
d71db0e3b7b9
largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents:
30141
diff
changeset
|
541 if standinexec != mode & 0o100: |
d71db0e3b7b9
largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents:
30141
diff
changeset
|
542 # 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
|
543 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
|
544 if standinexec: |
30269
d71db0e3b7b9
largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents:
30141
diff
changeset
|
545 mode |= (mode >> 2) & 0o111 & ~util.umask |
d71db0e3b7b9
largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents:
30141
diff
changeset
|
546 wvfs.chmod(rellfile, mode) |
20063
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
547 update1 = 1 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
548 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
549 updated += update1 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
550 |
22095
cb62d77c7a01
largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21934
diff
changeset
|
551 lfutil.synclfdirstate(repo, lfdirstate, lfile, normallookup) |
15168 | 552 |
553 lfdirstate.write() | |
23189
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
554 if lfiles: |
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
555 statuswriter(_('%d largefiles updated, %d removed\n') % (updated, |
15168 | 556 removed)) |
557 | |
21242
4c94229c51fb
largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21088
diff
changeset
|
558 @command('lfpull', |
4c94229c51fb
largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21088
diff
changeset
|
559 [('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
|
560 ] + cmdutil.remoteopts, |
21242
4c94229c51fb
largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21088
diff
changeset
|
561 _('-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
|
562 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
|
563 """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
|
564 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
565 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
|
566 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
|
567 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
568 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
|
569 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
|
570 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
571 .. container:: verbose |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
572 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
573 Some examples: |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
574 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
575 - pull largefiles for all branch heads:: |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
576 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
577 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
|
578 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
579 - pull largefiles on the default branch:: |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
580 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
581 hg lfpull -r "branch(default)" |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
582 """ |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
583 repo.lfpullsource = source |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
584 |
35348
576ba8194fa8
py3: handle keyword arguments correctly in hgext/largefiles/
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35186
diff
changeset
|
585 revs = opts.get(r'rev', []) |
18976
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
586 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
|
587 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
|
588 revs = scmutil.revrange(repo, revs) |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
589 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
590 numcached = 0 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
591 for rev in revs: |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
592 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
|
593 (cached, missing) = cachelfiles(ui, repo, rev) |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
594 numcached += len(cached) |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
595 ui.status(_("%d largefiles cached\n") % numcached) |
35563
4aa6ed598323
largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net>
parents:
35400
diff
changeset
|
596 |
4aa6ed598323
largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net>
parents:
35400
diff
changeset
|
597 @command('debuglfput', |
4aa6ed598323
largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net>
parents:
35400
diff
changeset
|
598 [] + cmdutil.remoteopts, |
4aa6ed598323
largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net>
parents:
35400
diff
changeset
|
599 _('FILE')) |
4aa6ed598323
largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net>
parents:
35400
diff
changeset
|
600 def debuglfput(ui, repo, filepath, **kwargs): |
4aa6ed598323
largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net>
parents:
35400
diff
changeset
|
601 hash = lfutil.hashfile(filepath) |
4aa6ed598323
largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net>
parents:
35400
diff
changeset
|
602 storefactory.openstore(repo).put(filepath, hash) |
4aa6ed598323
largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net>
parents:
35400
diff
changeset
|
603 ui.write('%s\n' % hash) |
4aa6ed598323
largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net>
parents:
35400
diff
changeset
|
604 return 0 |