Mercurial > hg
annotate hgext/largefiles/lfcommands.py @ 49961:7a8bfc05b691
dirstate: rename parentchange to changing_parents
Since the new argument breaks the API anyway, we can rename it to a better name.
The previous name `parentchange` might be seen as something active, a function
that would directly change the parents, however this is just a context manager
to frame the operation that will change the parents and adjust the
dirstate content accordingly.
In addition, the future sister method that will be about changes to tracking and
files would have a hard time fitting in the same naming scheme in a clear way.
The new naming uses a clear prefix will make it more distinct from other
dirstate methods and easier to extend with other similar contexts.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 25 Jan 2023 19:12:31 +0100 |
parents | c166b212bdee |
children | 1a2360f7bb35 |
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.''' |
15168 | 10 |
49248
63fd0282ad40
node: stop converting binascii.Error to TypeError in bin()
Manuel Jacob <me@manueljacob.de>
parents:
48875
diff
changeset
|
11 import binascii |
29308
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
12 import os |
15168 | 13 import shutil |
14 | |
15 from mercurial.i18n import _ | |
46113
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
16 from mercurial.node import ( |
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
17 bin, |
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
18 hex, |
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
19 ) |
15168 | 20 |
29308
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
21 from mercurial import ( |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
22 cmdutil, |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
23 context, |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
24 error, |
41061
98681293c890
largefiles: port commands to exthelper
Matt Harbison <matt_harbison@yahoo.com>
parents:
40675
diff
changeset
|
25 exthelper, |
29308
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
26 hg, |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
27 lock, |
48116
5ced12cfa41b
errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents:
48106
diff
changeset
|
28 logcmdutil, |
29317
5ec25534ef4f
largefiles: rename match_ to matchmod import in lfcommands
liscju <piotr.listkiewicz@gmail.com>
parents:
29308
diff
changeset
|
29 match as matchmod, |
35348
576ba8194fa8
py3: handle keyword arguments correctly in hgext/largefiles/
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35186
diff
changeset
|
30 pycompat, |
29308
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
31 scmutil, |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
32 util, |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
33 ) |
44062
2d49482d0dd4
hgext: replace references to hashlib.sha1 with hashutil.sha1
Augie Fackler <augie@google.com>
parents:
43506
diff
changeset
|
34 from mercurial.utils import hashutil |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
35 |
29308
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
36 from ..convert import ( |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
37 convcmd, |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
38 filemap, |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
39 ) |
8c378a7d2aa6
py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
29305
diff
changeset
|
40 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
41 from . import lfutil, storefactory |
29308
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 | |
41061
98681293c890
largefiles: port commands to exthelper
Matt Harbison <matt_harbison@yahoo.com>
parents:
40675
diff
changeset
|
47 eh = exthelper.exthelper() |
21242
4c94229c51fb
largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21088
diff
changeset
|
48 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
49 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
50 @eh.command( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
51 b'lfconvert', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
52 [ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
53 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
54 b's', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
55 b'size', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
56 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
57 _(b'minimum size (MB) for files to be converted as largefiles'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
58 b'SIZE', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
59 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
60 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
61 b'', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
62 b'to-normal', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
63 False, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
64 _(b'convert from a largefiles repo to a normal repo'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
65 ), |
21242
4c94229c51fb
largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21088
diff
changeset
|
66 ], |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
67 _(b'hg lfconvert SOURCE DEST [FILE ...]'), |
21785
a730b002c5db
largefiles: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21770
diff
changeset
|
68 norepo=True, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
69 inferrepo=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
70 ) |
15168 | 71 def lfconvert(ui, src, dest, *pats, **opts): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45455
diff
changeset
|
72 """convert a normal repository to a largefiles repository |
15168 | 73 |
15230 | 74 Convert repository SOURCE to a new repository DEST, identical to |
75 SOURCE except that certain files will be converted as largefiles: | |
76 specifically, any file that matches any PATTERN *or* whose size is | |
77 above the minimum size threshold is converted as a largefile. The | |
78 size used to determine whether or not to track a file as a | |
79 largefile is the size of the first version of the file. The | |
80 minimum size can be specified either with --size or in | |
81 configuration as ``largefiles.size``. | |
82 | |
83 After running this command you will need to make sure that | |
84 largefiles is enabled anywhere you intend to push the new | |
85 repository. | |
86 | |
15332
0db47b8d025f
largefiles: rename lfconvert --tonormal option to --to-normal
Greg Ward <greg@gerg.ca>
parents:
15317
diff
changeset
|
87 Use --to-normal to convert largefiles back to normal files; after |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45455
diff
changeset
|
88 this, the DEST repository can be used without largefiles at all.""" |
15168 | 89 |
35348
576ba8194fa8
py3: handle keyword arguments correctly in hgext/largefiles/
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35186
diff
changeset
|
90 opts = pycompat.byteskwargs(opts) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
91 if opts[b'to_normal']: |
15168 | 92 tolfile = False |
93 else: | |
94 tolfile = True | |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
95 size = lfutil.getminsize(ui, True, opts.get(b'size'), default=None) |
15340
0e58513cc59a
largefiles: rearrange how lfconvert detects non-local repos
Greg Ward <greg@gerg.ca>
parents:
15339
diff
changeset
|
96 |
0e58513cc59a
largefiles: rearrange how lfconvert detects non-local repos
Greg Ward <greg@gerg.ca>
parents:
15339
diff
changeset
|
97 if not hg.islocal(src): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
98 raise error.Abort(_(b'%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
|
99 if not hg.islocal(dest): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
100 raise error.Abort(_(b'%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
|
101 |
15339
be1377d19018
largefiles: test lfconvert error handling; remove redundant code
Greg Ward <greg@gerg.ca>
parents:
15332
diff
changeset
|
102 rsrc = hg.repository(ui, src) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
103 ui.status(_(b'initializing destination %s\n') % dest) |
15339
be1377d19018
largefiles: test lfconvert error handling; remove redundant code
Greg Ward <greg@gerg.ca>
parents:
15332
diff
changeset
|
104 rdst = hg.repository(ui, dest, create=True) |
15168 | 105 |
15171
547da6115d1d
largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents:
15170
diff
changeset
|
106 success = False |
16717
1eede2ea2041
largefiles: use wlock for lfconvert (issue3444)
Mads Kiilerich <mads@kiilerich.com>
parents:
16551
diff
changeset
|
107 dstwlock = dstlock = None |
15168 | 108 try: |
109 # 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
|
110 # is to simply walk the changelog, using changelog.nodesbetween(). |
15168 | 111 # Take a look at mercurial/revlog.py:639 for more details. |
112 # Use a generator instead of a list to decrease memory usage | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
113 ctxs = ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
114 rsrc[ctx] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
115 for ctx in rsrc.changelog.nodesbetween(None, rsrc.heads())[0] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
116 ) |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46113
diff
changeset
|
117 revmap = {rsrc.nullid: rdst.nullid} |
15168 | 118 if tolfile: |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
119 # 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
|
120 # 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
|
121 # 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
|
122 dstwlock = rdst.wlock() |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
123 dstlock = rdst.lock() |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
124 |
15168 | 125 lfiles = set() |
126 normalfiles = set() | |
127 if not pats: | |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
128 pats = ui.configlist(lfutil.longname, b'patterns') |
15168 | 129 if pats: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
130 matcher = matchmod.match(rsrc.root, b'', list(pats)) |
15168 | 131 else: |
132 matcher = None | |
133 | |
134 lfiletohash = {} | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
135 with ui.makeprogress( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
136 _(b'converting revisions'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
137 unit=_(b'revisions'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
138 total=rsrc[b'tip'].rev(), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
139 ) as progress: |
39390
a65ad9b22a00
largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents:
38407
diff
changeset
|
140 for ctx in ctxs: |
a65ad9b22a00
largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents:
38407
diff
changeset
|
141 progress.update(ctx.rev()) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
142 _lfconvert_addchangeset( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
143 rsrc, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
144 rdst, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
145 ctx, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
146 revmap, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
147 lfiles, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
148 normalfiles, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
149 matcher, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
150 size, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
151 lfiletohash, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
152 ) |
15168 | 153 |
28559
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
154 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
|
155 rdst.wvfs.rmtree(lfutil.shortname) |
15168 | 156 |
157 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
|
158 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
|
159 rdst.wvfs.unlink(f) |
15168 | 160 try: |
28559
30863ca01c6b
largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents:
28464
diff
changeset
|
161 rdst.wvfs.removedirs(rdst.wvfs.dirname(f)) |
15171
547da6115d1d
largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents:
15170
diff
changeset
|
162 except OSError: |
15168 | 163 pass |
164 | |
15303
07811b3b119b
largefiles: include 'largefiles' in converted repository requirements
Eli Carter <eli.carter@tektronix.com>
parents:
15255
diff
changeset
|
165 # 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
|
166 # to the destination repository's requirements. |
07811b3b119b
largefiles: include 'largefiles' in converted repository requirements
Eli Carter <eli.carter@tektronix.com>
parents:
15255
diff
changeset
|
167 if lfiles: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
168 rdst.requirements.add(b'largefiles') |
45106
a03c177a4679
scmutil: add writereporequirements() and route requires writing through it
Pulkit Goyal <7895pulkit@gmail.com>
parents:
44062
diff
changeset
|
169 scmutil.writereporequirements(rdst) |
15168 | 170 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
171 |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
172 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
|
173 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
|
174 super(lfsource, self).__init__(ui, source, None) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
175 self.filemapper.rename[lfutil.shortname] = b'.' |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
176 |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
177 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
|
178 realname, realrev = rev |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
179 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
|
180 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
181 if ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
182 not realname.startswith(lfutil.shortnameslash) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
183 or f[0] is None |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
184 ): |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
185 return f |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
186 |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
187 # 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
|
188 hash = f[0].strip() |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
189 path = lfutil.findfile(rsrc, hash) |
15168 | 190 |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
191 if path is None: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
192 raise error.Abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
193 _(b"missing largefile for '%s' in %s") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
194 % (realname, realrev) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
195 ) |
27774
8ceaaf63ca80
largefiles: use util.readfile in lfconvert
Bryan O'Sullivan <bryano@fb.com>
parents:
27651
diff
changeset
|
196 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
|
197 |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
198 class converter(convcmd.converter): |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
199 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
|
200 src = lfsource(ui, source) |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
201 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
202 super(converter, self).__init__( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
203 ui, src, dest, revmapfile, opts |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
204 ) |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
205 |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
206 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
|
207 if missing != 0: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
208 raise error.Abort(_(b"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
|
209 |
25560
2b2108c35bfc
largefiles: restore the original converter class after lfconvert --to-normal
Matt Harbison <matt_harbison@yahoo.com>
parents:
25508
diff
changeset
|
210 orig = convcmd.converter |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
211 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
|
212 |
2b2108c35bfc
largefiles: restore the original converter class after lfconvert --to-normal
Matt Harbison <matt_harbison@yahoo.com>
parents:
25508
diff
changeset
|
213 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
214 convcmd.convert( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
215 ui, src, dest, source_type=b'hg', dest_type=b'hg' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
216 ) |
25560
2b2108c35bfc
largefiles: restore the original converter class after lfconvert --to-normal
Matt Harbison <matt_harbison@yahoo.com>
parents:
25508
diff
changeset
|
217 finally: |
2b2108c35bfc
largefiles: restore the original converter class after lfconvert --to-normal
Matt Harbison <matt_harbison@yahoo.com>
parents:
25508
diff
changeset
|
218 convcmd.converter = orig |
15171
547da6115d1d
largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents:
15170
diff
changeset
|
219 success = True |
15168 | 220 finally: |
25325
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
221 if tolfile: |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
222 rdst.dirstate.clear() |
fcd2f9b06629
largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24788
diff
changeset
|
223 release(dstlock, dstwlock) |
15171
547da6115d1d
largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents:
15170
diff
changeset
|
224 if not success: |
547da6115d1d
largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents:
15170
diff
changeset
|
225 # we failed, remove the new directory |
547da6115d1d
largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents:
15170
diff
changeset
|
226 shutil.rmtree(rdst.root) |
15168 | 227 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
228 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
229 def _lfconvert_addchangeset( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
230 rsrc, rdst, ctx, revmap, lfiles, normalfiles, matcher, size, lfiletohash |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
231 ): |
15168 | 232 # Convert src parents to dst parents |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
233 parents = _convertparents(ctx, revmap) |
15168 | 234 |
235 # Generate list of changed files | |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
236 files = _getchangedfiles(ctx, parents) |
15168 | 237 |
238 dstfiles = [] | |
239 for f in files: | |
240 if f not in lfiles and f not in normalfiles: | |
241 islfile = _islfile(f, ctx, matcher, size) | |
242 # If this file was renamed or copied then copy | |
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17299
diff
changeset
|
243 # the largefile-ness of its predecessor |
15168 | 244 if f in ctx.manifest(): |
245 fctx = ctx.filectx(f) | |
41775
a86e22007b54
largefiles: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents:
41598
diff
changeset
|
246 renamed = fctx.copysource() |
39710
7375a9ab0149
filectx: fix return of renamed
Sean Farley <sean@farley.io>
parents:
39390
diff
changeset
|
247 if renamed is None: |
7375a9ab0149
filectx: fix return of renamed
Sean Farley <sean@farley.io>
parents:
39390
diff
changeset
|
248 # the code below assumes renamed to be a boolean or a list |
7375a9ab0149
filectx: fix return of renamed
Sean Farley <sean@farley.io>
parents:
39390
diff
changeset
|
249 # and won't quite work with the value None |
7375a9ab0149
filectx: fix return of renamed
Sean Farley <sean@farley.io>
parents:
39390
diff
changeset
|
250 renamed = False |
41775
a86e22007b54
largefiles: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents:
41598
diff
changeset
|
251 renamedlfile = renamed and renamed in lfiles |
15168 | 252 islfile |= renamedlfile |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
253 if b'l' in fctx.flags(): |
15168 | 254 if renamedlfile: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
255 raise error.Abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
256 _(b'renamed/copied largefile %s becomes symlink') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
257 % f |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
258 ) |
15168 | 259 islfile = False |
260 if islfile: | |
261 lfiles.add(f) | |
262 else: | |
263 normalfiles.add(f) | |
264 | |
265 if f in lfiles: | |
31618
8228bc8fed8c
largefiles: avoid redundant standin() invocations
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31613
diff
changeset
|
266 fstandin = lfutil.standin(f) |
8228bc8fed8c
largefiles: avoid redundant standin() invocations
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31613
diff
changeset
|
267 dstfiles.append(fstandin) |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
268 # largefile in manifest if it has not been removed/renamed |
15168 | 269 if f in ctx.manifest(): |
15808
62098aeb1e15
largefiles: don't reference uninitialized variable (issue3092)
Levi Bard <levi@unity3d.com>
parents:
15793
diff
changeset
|
270 fctx = ctx.filectx(f) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
271 if b'l' in fctx.flags(): |
41775
a86e22007b54
largefiles: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents:
41598
diff
changeset
|
272 renamed = fctx.copysource() |
a86e22007b54
largefiles: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents:
41598
diff
changeset
|
273 if renamed and renamed in lfiles: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
274 raise error.Abort( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
275 _(b'largefile %s becomes symlink') % f |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
276 ) |
15168 | 277 |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
278 # largefile was modified, update standins |
44062
2d49482d0dd4
hgext: replace references to hashlib.sha1 with hashutil.sha1
Augie Fackler <augie@google.com>
parents:
43506
diff
changeset
|
279 m = hashutil.sha1(b'') |
15168 | 280 m.update(ctx[f].data()) |
46113
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
281 hash = hex(m.digest()) |
15168 | 282 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
|
283 rdst.wwrite(f, ctx[f].data(), ctx[f].flags()) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
284 executable = b'x' in ctx[f].flags() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
285 lfutil.writestandin(rdst, fstandin, hash, executable) |
15168 | 286 lfiletohash[f] = hash |
287 else: | |
288 # normal file | |
289 dstfiles.append(f) | |
290 | |
291 def getfilectx(repo, memctx, f): | |
31613
5c1d3f1b8f44
largefiles: omit redundant isstandin() before splitstandin()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31612
diff
changeset
|
292 srcfname = lfutil.splitstandin(f) |
5c1d3f1b8f44
largefiles: omit redundant isstandin() before splitstandin()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31612
diff
changeset
|
293 if srcfname is not None: |
15168 | 294 # 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
|
295 # or renamed, return None to indicate this |
15168 | 296 try: |
297 fctx = ctx.filectx(srcfname) | |
298 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
|
299 return None |
41775
a86e22007b54
largefiles: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents:
41598
diff
changeset
|
300 renamed = fctx.copysource() |
15168 | 301 if renamed: |
15254
dd03d3a9f888
largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents:
15253
diff
changeset
|
302 # standin is always a largefile because largefile-ness |
15168 | 303 # doesn't change after rename or copy |
41775
a86e22007b54
largefiles: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents:
41598
diff
changeset
|
304 renamed = lfutil.standin(renamed) |
15168 | 305 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
306 return context.memfilectx( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
307 repo, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
308 memctx, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
309 f, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
310 lfiletohash[srcfname] + b'\n', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
311 b'l' in fctx.flags(), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
312 b'x' in fctx.flags(), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
313 renamed, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
314 ) |
15168 | 315 else: |
21689
503bb3af70fe
memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents:
21242
diff
changeset
|
316 return _getnormalcontext(repo, ctx, f, revmap) |
15168 | 317 |
318 # Commit | |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
319 _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
320 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
321 |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
322 def _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
323 mctx = context.memctx( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
324 rdst, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
325 parents, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
326 ctx.description(), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
327 dstfiles, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
328 getfilectx, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
329 ctx.user(), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
330 ctx.date(), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
331 ctx.extra(), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
332 ) |
15168 | 333 ret = rdst.commitctx(mctx) |
23276
4be754832829
largefiles: move "copyalltostore" invocation into "markcommitted"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23189
diff
changeset
|
334 lfutil.copyalltostore(rdst, ret) |
16551
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16439
diff
changeset
|
335 rdst.setparents(ret) |
15168 | 336 revmap[ctx.node()] = rdst.changelog.tip() |
337 | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
338 |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
339 # Generate list of changed files |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
340 def _getchangedfiles(ctx, parents): |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
341 files = set(ctx.files()) |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46113
diff
changeset
|
342 if ctx.repo().nullid not in parents: |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
343 mc = ctx.manifest() |
41400
4a409c19831f
largefiles: avoid walking full manifest
Martin von Zweigbergk <martinvonz@google.com>
parents:
41397
diff
changeset
|
344 for pctx in ctx.parents(): |
4a409c19831f
largefiles: avoid walking full manifest
Martin von Zweigbergk <martinvonz@google.com>
parents:
41397
diff
changeset
|
345 for fn in pctx.manifest().diff(mc): |
4a409c19831f
largefiles: avoid walking full manifest
Martin von Zweigbergk <martinvonz@google.com>
parents:
41397
diff
changeset
|
346 files.add(fn) |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
347 return files |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
348 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
349 |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
350 # Convert src parents to dst parents |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
351 def _convertparents(ctx, revmap): |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
352 parents = [] |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
353 for p in ctx.parents(): |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
354 parents.append(revmap[p.node()]) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
355 while len(parents) < 2: |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46113
diff
changeset
|
356 parents.append(ctx.repo().nullid) |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
357 return parents |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
358 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
359 |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
360 # 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
|
361 def _getnormalcontext(repo, ctx, f, revmap): |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
362 try: |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
363 fctx = ctx.filectx(f) |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
364 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
|
365 return None |
41775
a86e22007b54
largefiles: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents:
41598
diff
changeset
|
366 renamed = fctx.copysource() |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
367 |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
368 data = fctx.data() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
369 if f == b'.hgtags': |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
370 data = _converttags(repo.ui, revmap, data) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
371 return context.memfilectx( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
372 repo, ctx, f, data, b'l' in fctx.flags(), b'x' in fctx.flags(), renamed |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
373 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
374 |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
375 |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
376 # Remap tag data using a revision map |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
377 def _converttags(ui, revmap, data): |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
378 newdata = [] |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
379 for line in data.splitlines(): |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
380 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
381 id, name = line.split(b' ', 1) |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
382 except ValueError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
383 ui.warn(_(b'skipping incorrectly formatted tag %s\n') % line) |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
384 continue |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
385 try: |
46113
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
386 newid = bin(id) |
49248
63fd0282ad40
node: stop converting binascii.Error to TypeError in bin()
Manuel Jacob <me@manueljacob.de>
parents:
48875
diff
changeset
|
387 except binascii.Error: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
388 ui.warn(_(b'skipping incorrectly formatted id %s\n') % id) |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
389 continue |
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
390 try: |
46113
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
391 newdata.append(b'%s %s\n' % (hex(revmap[newid]), name)) |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
392 except KeyError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
393 ui.warn(_(b'no mapping for id %s\n') % id) |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
394 continue |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
395 return b''.join(newdata) |
15811
b9886dde3649
largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents:
15809
diff
changeset
|
396 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
397 |
15168 | 398 def _islfile(file, ctx, matcher, size): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45455
diff
changeset
|
399 """Return true if file should be considered a largefile, i.e. |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45455
diff
changeset
|
400 matcher matches it or it is larger than size.""" |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15230
diff
changeset
|
401 # never store special .hg* files as largefiles |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
402 if file == b'.hgtags' or file == b'.hgignore' or file == b'.hgsigs': |
15168 | 403 return False |
404 if matcher and matcher(file): | |
405 return True | |
406 try: | |
407 return ctx.filectx(file).size() >= size * 1024 * 1024 | |
408 except error.LookupError: | |
409 return False | |
410 | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
411 |
15168 | 412 def uploadlfiles(ui, rsrc, rdst, files): |
413 '''upload largefiles to the central store''' | |
414 | |
15317
41f371150ccb
largefiles: make the store primary, and the user cache secondary
Benjamin Pollack <benjamin@bitquabit.com>
parents:
15313
diff
changeset
|
415 if not files: |
15168 | 416 return |
417 | |
29355
85868ecf2c0d
largefiles: make storefactory._openstore public
liscju <piotr.listkiewicz@gmail.com>
parents:
29341
diff
changeset
|
418 store = storefactory.openstore(rsrc, rdst, put=True) |
15168 | 419 |
420 at = 0 | |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
421 ui.debug(b"sending statlfile command for %d largefiles\n" % len(files)) |
17127
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16727
diff
changeset
|
422 retval = store.exists(files) |
36311
b9da10f310f4
largfiles: replace filter() with listcomp when result needs to be a list
Augie Fackler <augie@google.com>
parents:
35563
diff
changeset
|
423 files = [h for h in files if not retval[h]] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
424 ui.debug(b"%d largefiles need to be uploaded\n" % len(files)) |
17127
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16727
diff
changeset
|
425 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
426 with ui.makeprogress( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
427 _(b'uploading largefiles'), unit=_(b'files'), total=len(files) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
428 ) as progress: |
39390
a65ad9b22a00
largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents:
38407
diff
changeset
|
429 for hash in files: |
a65ad9b22a00
largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents:
38407
diff
changeset
|
430 progress.update(at) |
a65ad9b22a00
largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents:
38407
diff
changeset
|
431 source = lfutil.findfile(rsrc, hash) |
a65ad9b22a00
largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents:
38407
diff
changeset
|
432 if not source: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
433 raise error.Abort( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
434 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
435 b'largefile %s missing from store' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
436 b' (needs to be uploaded)' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
437 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
438 % hash |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
439 ) |
39390
a65ad9b22a00
largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents:
38407
diff
changeset
|
440 # XXX check for errors here |
a65ad9b22a00
largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents:
38407
diff
changeset
|
441 store.put(source, hash) |
a65ad9b22a00
largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents:
38407
diff
changeset
|
442 at += 1 |
15168 | 443 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
444 |
15168 | 445 def verifylfiles(ui, repo, all=False, contents=False): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45455
diff
changeset
|
446 """Verify that every largefile revision in the current changeset |
15168 | 447 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
|
448 the contents of each local largefile file revision are correct (SHA-1 hash |
15168 | 449 matches the revision ID). With --all, check every changeset in |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45455
diff
changeset
|
450 this repository.""" |
15168 | 451 if all: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
452 revs = repo.revs(b'all()') |
15168 | 453 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
454 revs = [b'.'] |
15168 | 455 |
29355
85868ecf2c0d
largefiles: make storefactory._openstore public
liscju <piotr.listkiewicz@gmail.com>
parents:
29341
diff
changeset
|
456 store = storefactory.openstore(repo) |
15168 | 457 return store.verify(revs, contents=contents) |
458 | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
459 |
16700
28001e8a5149
largefiles: optimize performance when updating (issue3440)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16691
diff
changeset
|
460 def cachelfiles(ui, repo, node, filelist=None): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45455
diff
changeset
|
461 """cachelfiles ensures that all largefiles needed by the specified revision |
15168 | 462 are present in the repository's largefile cache. |
463 | |
464 returns a tuple (cached, missing). cached is the list of files downloaded | |
465 by this operation; missing is the list of files that were needed but could | |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45455
diff
changeset
|
466 not be found.""" |
15168 | 467 lfiles = lfutil.listlfiles(repo, node) |
16700
28001e8a5149
largefiles: optimize performance when updating (issue3440)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16691
diff
changeset
|
468 if filelist: |
28001e8a5149
largefiles: optimize performance when updating (issue3440)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16691
diff
changeset
|
469 lfiles = set(lfiles) & set(filelist) |
15168 | 470 toget = [] |
471 | |
31654
1af4a1641bdb
largefiles: avoid redundant changectx looking up at each repetitions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31618
diff
changeset
|
472 ctx = repo[node] |
15168 | 473 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
|
474 try: |
31740
a40e979b9d97
largefiles: use readasstandin() to read hex hash directly from filectx
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31735
diff
changeset
|
475 expectedhash = lfutil.readasstandin(ctx[lfutil.standin(lfile)]) |
49306
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
49248
diff
changeset
|
476 except FileNotFoundError: |
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
49248
diff
changeset
|
477 continue # node must be None and standin wasn't found in wctx |
18728
1e636f7b1cfe
largefiles: simplify cachelfiles - don't spend a lot of time checking hashes
Mads Kiilerich <madski@unity3d.com>
parents:
18727
diff
changeset
|
478 if not lfutil.findfile(repo, expectedhash): |
15168 | 479 toget.append((lfile, expectedhash)) |
480 | |
481 if toget: | |
29355
85868ecf2c0d
largefiles: make storefactory._openstore public
liscju <piotr.listkiewicz@gmail.com>
parents:
29341
diff
changeset
|
482 store = storefactory.openstore(repo) |
15168 | 483 ret = store.get(toget) |
484 return ret | |
485 | |
486 return ([], []) | |
487 | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
488 |
45453
39ddb1121c4e
largefiles: remove unused 'rev' parameter from downloadlfiles()
Yuya Nishihara <yuya@tcha.org>
parents:
45106
diff
changeset
|
489 def downloadlfiles(ui, repo): |
45454
ac7b9ed0a245
largefiles: replace use of walkchangerevs() with simple revset query
Yuya Nishihara <yuya@tcha.org>
parents:
45453
diff
changeset
|
490 tonode = repo.changelog.node |
16691
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
491 totalsuccess = 0 |
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
492 totalmissing = 0 |
45455
b0d45612c552
largefiles: walk history in ascending order while downloading all lfiles
Yuya Nishihara <yuya@tcha.org>
parents:
45454
diff
changeset
|
493 for rev in repo.revs(b'file(%s)', b'path:' + lfutil.shortname): |
45454
ac7b9ed0a245
largefiles: replace use of walkchangerevs() with simple revset query
Yuya Nishihara <yuya@tcha.org>
parents:
45453
diff
changeset
|
494 success, missing = cachelfiles(ui, repo, tonode(rev)) |
45453
39ddb1121c4e
largefiles: remove unused 'rev' parameter from downloadlfiles()
Yuya Nishihara <yuya@tcha.org>
parents:
45106
diff
changeset
|
495 totalsuccess += len(success) |
39ddb1121c4e
largefiles: remove unused 'rev' parameter from downloadlfiles()
Yuya Nishihara <yuya@tcha.org>
parents:
45106
diff
changeset
|
496 totalmissing += len(missing) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
497 ui.status(_(b"%d additional largefiles cached\n") % totalsuccess) |
16691
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
498 if totalmissing > 0: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
499 ui.status(_(b"%d largefiles failed to download\n") % totalmissing) |
16691
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
500 return totalsuccess, totalmissing |
7d6a660ca151
largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents:
16687
diff
changeset
|
501 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
502 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
503 def updatelfiles( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
504 ui, repo, filelist=None, printmessage=None, normallookup=False |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
505 ): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45455
diff
changeset
|
506 """Update largefiles according to standins in the working directory |
23189
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
507 |
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
508 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
|
509 ignore, for false) message forcibly". |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45455
diff
changeset
|
510 """ |
23189
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
511 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
|
512 with repo.wlock(): |
15168 | 513 lfdirstate = lfutil.openlfdirstate(ui, repo) |
514 lfiles = set(lfutil.listlfiles(repo)) | set(lfdirstate) | |
515 | |
516 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
|
517 filelist = set(filelist) |
15168 | 518 lfiles = [f for f in lfiles if f in filelist] |
519 | |
49961
7a8bfc05b691
dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49960
diff
changeset
|
520 with lfdirstate.changing_parents(repo): |
47651
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
521 update = {} |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
522 dropped = set() |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
523 updated, removed = 0, 0 |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
524 wvfs = repo.wvfs |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
525 wctx = repo[None] |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
526 for lfile in lfiles: |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
527 lfileorig = os.path.relpath( |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
528 scmutil.backuppath(ui, repo, lfile), start=repo.root |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
529 ) |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
530 standin = lfutil.standin(lfile) |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
531 standinorig = os.path.relpath( |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
532 scmutil.backuppath(ui, repo, standin), start=repo.root |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
533 ) |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
534 if wvfs.exists(standin): |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
535 if wvfs.exists(standinorig) and wvfs.exists(lfile): |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
536 shutil.copyfile(wvfs.join(lfile), wvfs.join(lfileorig)) |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
537 wvfs.unlinkpath(standinorig) |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
538 expecthash = lfutil.readasstandin(wctx[standin]) |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
539 if expecthash != b'': |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
540 if lfile not in wctx: # not switched to normal file |
48106
82e142b9ad18
dirstate-item: use item's property instead of `state` in largefile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48001
diff
changeset
|
541 if repo.dirstate.get_entry(standin).any_tracked: |
47651
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
542 wvfs.unlinkpath(lfile, ignoremissing=True) |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
543 else: |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
544 dropped.add(lfile) |
35168
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
545 |
47651
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
546 # use normallookup() to allocate an entry in largefiles |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
547 # dirstate to prevent lfilesrepo.status() from reporting |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
548 # missing files as removed. |
47722
47dce5a99eab
largefile: use `update_file` instead of `normallookup` in `updatelfiles`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47713
diff
changeset
|
549 lfdirstate.update_file( |
47dce5a99eab
largefile: use `update_file` instead of `normallookup` in `updatelfiles`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47713
diff
changeset
|
550 lfile, |
47dce5a99eab
largefile: use `update_file` instead of `normallookup` in `updatelfiles`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47713
diff
changeset
|
551 p1_tracked=True, |
47dce5a99eab
largefile: use `update_file` instead of `normallookup` in `updatelfiles`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47713
diff
changeset
|
552 wc_tracked=True, |
47dce5a99eab
largefile: use `update_file` instead of `normallookup` in `updatelfiles`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47713
diff
changeset
|
553 possibly_dirty=True, |
47dce5a99eab
largefile: use `update_file` instead of `normallookup` in `updatelfiles`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47713
diff
changeset
|
554 ) |
47651
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
555 update[lfile] = expecthash |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
556 else: |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
557 # Remove lfiles for which the standin is deleted, unless the |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
558 # lfile is added to the repository again. This happens when a |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
559 # largefile is converted back to a normal file: the standin |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
560 # disappears, but a new (normal) file appears as the lfile. |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
561 if ( |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
562 wvfs.exists(lfile) |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
563 and repo.dirstate.normalize(lfile) not in wctx |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
564 ): |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
565 wvfs.unlinkpath(lfile) |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
566 removed += 1 |
20063
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
567 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
568 # largefile processing might be slow and be interrupted - be prepared |
48168
df3021c1f093
largefiles: pass current transaction to `lfdirstate.write()`
Pulkit Goyal <7895pulkit@gmail.com>
parents:
48116
diff
changeset
|
569 lfdirstate.write(repo.currenttransaction()) |
20063
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
570 |
47658
f0cf560475a3
largefiles: replace use of synclfdirstate with drop
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47651
diff
changeset
|
571 if lfiles: |
f0cf560475a3
largefiles: replace use of synclfdirstate with drop
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47651
diff
changeset
|
572 lfiles = [f for f in lfiles if f not in dropped] |
35168
b175e54c1103
largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents:
34756
diff
changeset
|
573 |
47658
f0cf560475a3
largefiles: replace use of synclfdirstate with drop
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47651
diff
changeset
|
574 for f in dropped: |
f0cf560475a3
largefiles: replace use of synclfdirstate with drop
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47651
diff
changeset
|
575 repo.wvfs.unlinkpath(lfutil.standin(f)) |
f0cf560475a3
largefiles: replace use of synclfdirstate with drop
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47651
diff
changeset
|
576 # This needs to happen for dropped files, otherwise they stay in |
f0cf560475a3
largefiles: replace use of synclfdirstate with drop
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47651
diff
changeset
|
577 # the M state. |
48001
af84aa1a66f1
dirstate: use `reset_state` instead of `dropfile` in largefile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47988
diff
changeset
|
578 lfdirstate._map.reset_state(f) |
20063
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
579 |
47658
f0cf560475a3
largefiles: replace use of synclfdirstate with drop
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47651
diff
changeset
|
580 statuswriter(_(b'getting changed largefiles\n')) |
f0cf560475a3
largefiles: replace use of synclfdirstate with drop
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47651
diff
changeset
|
581 cachelfiles(ui, repo, None, lfiles) |
47651
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
582 |
49961
7a8bfc05b691
dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49960
diff
changeset
|
583 with lfdirstate.changing_parents(repo): |
47651
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
584 for lfile in lfiles: |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
585 update1 = 0 |
20063
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
586 |
47651
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
587 expecthash = update.get(lfile) |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
588 if expecthash: |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
589 if not lfutil.copyfromcache(repo, expecthash, lfile): |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
590 # failed ... but already removed and set to normallookup |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
591 continue |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
592 # Synchronize largefile dirstate to the last modified |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
593 # time of the file |
47713
04d4c01e83fa
largefile: use `update_file` instead of `normal` in `updatelfiles`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47658
diff
changeset
|
594 lfdirstate.update_file( |
04d4c01e83fa
largefile: use `update_file` instead of `normal` in `updatelfiles`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47658
diff
changeset
|
595 lfile, p1_tracked=True, wc_tracked=True |
04d4c01e83fa
largefile: use `update_file` instead of `normal` in `updatelfiles`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47658
diff
changeset
|
596 ) |
20063
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
597 update1 = 1 |
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
598 |
47651
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
599 # copy the exec mode of largefile standin from the repository's |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
600 # dirstate to its state in the lfdirstate. |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
601 standin = lfutil.standin(lfile) |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
602 if wvfs.exists(standin): |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
603 # exec is decided by the users permissions using mask 0o100 |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
604 standinexec = wvfs.stat(standin).st_mode & 0o100 |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
605 st = wvfs.stat(lfile) |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
606 mode = st.st_mode |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
607 if standinexec != mode & 0o100: |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
608 # first remove all X bits, then shift all R bits to X |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
609 mode &= ~0o111 |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
610 if standinexec: |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
611 mode |= (mode >> 2) & 0o111 & ~util.umask |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
612 wvfs.chmod(lfile, mode) |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
613 update1 = 1 |
20063
8a021cd38719
largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents:
20062
diff
changeset
|
614 |
47651
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
615 updated += update1 |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
616 |
40811cc7fa56
largefile: consider `updatelfiles` as a `parentchange`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
617 lfutil.synclfdirstate(repo, lfdirstate, lfile, normallookup) |
15168 | 618 |
48168
df3021c1f093
largefiles: pass current transaction to `lfdirstate.write()`
Pulkit Goyal <7895pulkit@gmail.com>
parents:
48116
diff
changeset
|
619 lfdirstate.write(repo.currenttransaction()) |
23189
fb139f5553d6
largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
620 if lfiles: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
621 statuswriter( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
622 _(b'%d largefiles updated, %d removed\n') % (updated, removed) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
623 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
624 |
15168 | 625 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
626 @eh.command( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
627 b'lfpull', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
628 [(b'r', b'rev', [], _(b'pull largefiles for these revisions'))] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
629 + cmdutil.remoteopts, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
630 _(b'-r REV... [-e CMD] [--remotecmd CMD] [SOURCE]'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
631 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
632 def lfpull(ui, repo, source=b"default", **opts): |
18976
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
633 """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
|
634 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
635 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
|
636 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
|
637 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
638 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
|
639 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
|
640 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
641 .. container:: verbose |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
642 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
643 Some examples: |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
644 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
645 - pull largefiles for all branch heads:: |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
646 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
647 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
|
648 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
649 - pull largefiles on the default branch:: |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
650 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
651 hg lfpull -r "branch(default)" |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
652 """ |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
653 repo.lfpullsource = source |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
654 |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43077
diff
changeset
|
655 revs = opts.get('rev', []) |
18976
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
656 if not revs: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
657 raise error.Abort(_(b'no revisions specified')) |
48116
5ced12cfa41b
errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents:
48106
diff
changeset
|
658 revs = logcmdutil.revrange(repo, revs) |
18976
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
659 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
660 numcached = 0 |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
661 for rev in revs: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
662 ui.note(_(b'pulling largefiles for revision %d\n') % rev) |
18976
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
663 (cached, missing) = cachelfiles(ui, repo, rev) |
6734951e2d24
largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents:
18974
diff
changeset
|
664 numcached += len(cached) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
665 ui.status(_(b"%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
|
666 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41775
diff
changeset
|
667 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
668 @eh.command(b'debuglfput', [] + cmdutil.remoteopts, _(b'FILE')) |
35563
4aa6ed598323
largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net>
parents:
35400
diff
changeset
|
669 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
|
670 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
|
671 storefactory.openstore(repo).put(filepath, hash) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
672 ui.write(b'%s\n' % hash) |
35563
4aa6ed598323
largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net>
parents:
35400
diff
changeset
|
673 return 0 |