Mercurial > public > mercurial-scm > hg-stable
annotate hgext/lfs/wrapper.py @ 42791:f972f43badb3
rawdata: update callers in lfs' wrapper
We update callers incrementally because this help bisecting failures. This was
useful during development, so we expect it might be useful again in the future.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 07 Aug 2019 20:10:32 +0200 |
parents | c9e1104e6272 |
children | 268662aac075 |
rev | line source |
---|---|
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
1 # wrapper.py - methods wrapping core mercurial logic |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
2 # |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
3 # Copyright 2017 Facebook, Inc. |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
4 # |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
6 # GNU General Public License version 2 or any later version. |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
7 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
8 from __future__ import absolute_import |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
9 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
10 import hashlib |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
11 |
35122
b8e5fb8d2389
lfs: quiesce check-module-import warnings
Matt Harbison <matt_harbison@yahoo.com>
parents:
35121
diff
changeset
|
12 from mercurial.i18n import _ |
36633
f6b9f9ddd0de
lfs: convert hexdigest to bytes using sysbytes
Augie Fackler <augie@google.com>
parents:
36632
diff
changeset
|
13 from mercurial.node import bin, hex, nullid, short |
35122
b8e5fb8d2389
lfs: quiesce check-module-import warnings
Matt Harbison <matt_harbison@yahoo.com>
parents:
35121
diff
changeset
|
14 |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
15 from mercurial import ( |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
16 bundle2, |
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
17 changegroup, |
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
18 cmdutil, |
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
19 context, |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
20 error, |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
21 exchange, |
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
22 exthelper, |
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
23 localrepo, |
39856
1f7b3b980af8
lfs: add repository feature denoting the use of LFS
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39854
diff
changeset
|
24 repository, |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
25 revlog, |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
26 scmutil, |
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
27 upgrade, |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
28 util, |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
29 vfs as vfsmod, |
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
30 wireprotov1server, |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
31 ) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
32 |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36633
diff
changeset
|
33 from mercurial.utils import ( |
39883
3e896b51aa5d
storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39861
diff
changeset
|
34 storageutil, |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36633
diff
changeset
|
35 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36633
diff
changeset
|
36 ) |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36633
diff
changeset
|
37 |
35372
b0ba1539af01
lfs: restore the local blob store after a repo upgrade
Matt Harbison <matt_harbison@yahoo.com>
parents:
35355
diff
changeset
|
38 from ..largefiles import lfutil |
b0ba1539af01
lfs: restore the local blob store after a repo upgrade
Matt Harbison <matt_harbison@yahoo.com>
parents:
35355
diff
changeset
|
39 |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
40 from . import ( |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
41 blobstore, |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
42 pointer, |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
43 ) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
44 |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
45 eh = exthelper.exthelper() |
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
46 |
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
47 @eh.wrapfunction(localrepo, 'makefilestorage') |
39856
1f7b3b980af8
lfs: add repository feature denoting the use of LFS
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39854
diff
changeset
|
48 def localrepomakefilestorage(orig, requirements, features, **kwargs): |
1f7b3b980af8
lfs: add repository feature denoting the use of LFS
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39854
diff
changeset
|
49 if b'lfs' in requirements: |
1f7b3b980af8
lfs: add repository feature denoting the use of LFS
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39854
diff
changeset
|
50 features.add(repository.REPO_FEATURE_LFS) |
1f7b3b980af8
lfs: add repository feature denoting the use of LFS
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39854
diff
changeset
|
51 |
1f7b3b980af8
lfs: add repository feature denoting the use of LFS
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39854
diff
changeset
|
52 return orig(requirements=requirements, features=features, **kwargs) |
1f7b3b980af8
lfs: add repository feature denoting the use of LFS
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39854
diff
changeset
|
53 |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
54 @eh.wrapfunction(changegroup, 'allsupportedversions') |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
55 def allsupportedversions(orig, ui): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
56 versions = orig(ui) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
57 versions.add('03') |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
58 return versions |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
59 |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
60 @eh.wrapfunction(wireprotov1server, '_capabilities') |
35510
fa865878a849
lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
61 def _capabilities(orig, repo, proto): |
fa865878a849
lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
62 '''Wrap server command to announce lfs server capability''' |
fa865878a849
lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
63 caps = orig(repo, proto) |
37851
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
64 if util.safehasattr(repo.svfs, 'lfslocalblobstore'): |
40324
6637b079ae45
lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
39950
diff
changeset
|
65 # Advertise a slightly different capability when lfs is *required*, so |
6637b079ae45
lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
39950
diff
changeset
|
66 # that the client knows it MUST load the extension. If lfs is not |
6637b079ae45
lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
39950
diff
changeset
|
67 # required on the server, there's no reason to autoload the extension |
6637b079ae45
lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
39950
diff
changeset
|
68 # on the client. |
6637b079ae45
lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
39950
diff
changeset
|
69 if b'lfs' in repo.requirements: |
6637b079ae45
lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
39950
diff
changeset
|
70 caps.append('lfs-serve') |
6637b079ae45
lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
39950
diff
changeset
|
71 |
37851
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
72 caps.append('lfs') |
35510
fa865878a849
lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
73 return caps |
fa865878a849
lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
74 |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
75 def bypasscheckhash(self, text): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
76 return False |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
77 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
78 def readfromstore(self, text): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
79 """Read filelog content from local blobstore transform for flagprocessor. |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
80 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
81 Default tranform for flagprocessor, returning contents from blobstore. |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
82 Returns a 2-typle (text, validatehash) where validatehash is True as the |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
83 contents of the blobstore should be checked using checkhash. |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
84 """ |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
85 p = pointer.deserialize(text) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
86 oid = p.oid() |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
87 store = self.opener.lfslocalblobstore |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
88 if not store.has(oid): |
35568
ebf14075a5c1
lfs: improve the error message for a missing remote blob
Matt Harbison <matt_harbison@yahoo.com>
parents:
35553
diff
changeset
|
89 p.filename = self.filename |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
90 self.opener.lfsremoteblobstore.readbatch([p], store) |
35480
417e8e040102
lfs: verify lfs object content when transferring to and from the remote store
Matt Harbison <matt_harbison@yahoo.com>
parents:
35477
diff
changeset
|
91 |
417e8e040102
lfs: verify lfs object content when transferring to and from the remote store
Matt Harbison <matt_harbison@yahoo.com>
parents:
35477
diff
changeset
|
92 # The caller will validate the content |
417e8e040102
lfs: verify lfs object content when transferring to and from the remote store
Matt Harbison <matt_harbison@yahoo.com>
parents:
35477
diff
changeset
|
93 text = store.read(oid, verify=False) |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
94 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
95 # pack hg filelog metadata |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
96 hgmeta = {} |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
97 for k in p.keys(): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
98 if k.startswith('x-hg-'): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
99 name = k[len('x-hg-'):] |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
100 hgmeta[name] = p[k] |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
101 if hgmeta or text.startswith('\1\n'): |
39883
3e896b51aa5d
storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39861
diff
changeset
|
102 text = storageutil.packmeta(hgmeta, text) |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
103 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
104 return (text, True) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
105 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
106 def writetostore(self, text): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
107 # hg filelog metadata (includes rename, etc) |
39883
3e896b51aa5d
storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39861
diff
changeset
|
108 hgmeta, offset = storageutil.parsemeta(text) |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
109 if offset and offset > 0: |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
110 # lfs blob does not contain hg filelog metadata |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
111 text = text[offset:] |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
112 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
113 # git-lfs only supports sha256 |
36633
f6b9f9ddd0de
lfs: convert hexdigest to bytes using sysbytes
Augie Fackler <augie@google.com>
parents:
36632
diff
changeset
|
114 oid = hex(hashlib.sha256(text).digest()) |
35553
a77418095530
lfs: remove the verification option when writing to the local store
Matt Harbison <matt_harbison@yahoo.com>
parents:
35510
diff
changeset
|
115 self.opener.lfslocalblobstore.write(oid, text) |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
116 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
117 # replace contents with metadata |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
118 longoid = 'sha256:%s' % oid |
36632
dcb6fbaa43a8
lfs: use %d to encode int, not str()
Augie Fackler <augie@google.com>
parents:
36180
diff
changeset
|
119 metadata = pointer.gitlfspointer(oid=longoid, size='%d' % len(text)) |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
120 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
121 # by default, we expect the content to be binary. however, LFS could also |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
122 # be used for non-binary content. add a special entry for non-binary data. |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
123 # this will be used by filectx.isbinary(). |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36633
diff
changeset
|
124 if not stringutil.binary(text): |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
125 # not hg filelog metadata (affecting commit hash), no "x-hg-" prefix |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
126 metadata['x-is-binary'] = '0' |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
127 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
128 # translate hg filelog metadata to lfs metadata with "x-hg-" prefix |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
129 if hgmeta is not None: |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
130 for k, v in hgmeta.iteritems(): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
131 metadata['x-hg-%s' % k] = v |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
132 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
133 rawtext = metadata.serialize() |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
134 return (rawtext, False) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
135 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
136 def _islfs(rlog, node=None, rev=None): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
137 if rev is None: |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
138 if node is None: |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
139 # both None - likely working copy content where node is not ready |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
140 return False |
39860
62a532045e71
lfs: access revlog directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39858
diff
changeset
|
141 rev = rlog._revlog.rev(node) |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
142 else: |
39860
62a532045e71
lfs: access revlog directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39858
diff
changeset
|
143 node = rlog._revlog.node(rev) |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
144 if node == nullid: |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
145 return False |
39860
62a532045e71
lfs: access revlog directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39858
diff
changeset
|
146 flags = rlog._revlog.flags(rev) |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
147 return bool(flags & revlog.REVIDX_EXTSTORED) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
148 |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
149 # Wrapping may also be applied by remotefilelog |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
150 def filelogaddrevision(orig, self, text, transaction, link, p1, p2, |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
151 cachedelta=None, node=None, |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
152 flags=revlog.REVIDX_DEFAULT_FLAGS, **kwds): |
37851
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
153 # The matcher isn't available if reposetup() wasn't called. |
39860
62a532045e71
lfs: access revlog directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39858
diff
changeset
|
154 lfstrack = self._revlog.opener.options.get('lfstrack') |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
155 |
37851
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
156 if lfstrack: |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
157 textlen = len(text) |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
158 # exclude hg rename meta from file size |
39883
3e896b51aa5d
storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39861
diff
changeset
|
159 meta, offset = storageutil.parsemeta(text) |
37851
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
160 if offset: |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
161 textlen -= offset |
35648
588d02d9208a
lfs: always exclude '.hg*' text files
Matt Harbison <matt_harbison@yahoo.com>
parents:
35624
diff
changeset
|
162 |
39861
96838b620b9c
filelog: store filename directly on revlog instance
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39860
diff
changeset
|
163 if lfstrack(self._revlog.filename, textlen): |
37851
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
164 flags |= revlog.REVIDX_EXTSTORED |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
165 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
166 return orig(self, text, transaction, link, p1, p2, cachedelta=cachedelta, |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
167 node=node, flags=flags, **kwds) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
168 |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
169 # Wrapping may also be applied by remotefilelog |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
170 def filelogrenamed(orig, self, node): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
171 if _islfs(self, node): |
42791
f972f43badb3
rawdata: update callers in lfs' wrapper
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41279
diff
changeset
|
172 rawtext = self._revlog.rawdata(node) |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
173 if not rawtext: |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
174 return False |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
175 metadata = pointer.deserialize(rawtext) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
176 if 'x-hg-copy' in metadata and 'x-hg-copyrev' in metadata: |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
177 return metadata['x-hg-copy'], bin(metadata['x-hg-copyrev']) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
178 else: |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
179 return False |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
180 return orig(self, node) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
181 |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
182 # Wrapping may also be applied by remotefilelog |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
183 def filelogsize(orig, self, rev): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
184 if _islfs(self, rev=rev): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
185 # fast path: use lfs metadata to answer size |
42791
f972f43badb3
rawdata: update callers in lfs' wrapper
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
41279
diff
changeset
|
186 rawtext = self._revlog.rawdata(rev) |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
187 metadata = pointer.deserialize(rawtext) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
188 return int(metadata['size']) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
189 return orig(self, rev) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
190 |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
191 @eh.wrapfunction(context.basefilectx, 'cmp') |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
192 def filectxcmp(orig, self, fctx): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
193 """returns True if text is different than fctx""" |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
194 # some fctx (ex. hg-git) is not based on basefilectx and do not have islfs |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
195 if self.islfs() and getattr(fctx, 'islfs', lambda: False)(): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
196 # fast path: check LFS oid |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
197 p1 = pointer.deserialize(self.rawdata()) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
198 p2 = pointer.deserialize(fctx.rawdata()) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
199 return p1.oid() != p2.oid() |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
200 return orig(self, fctx) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
201 |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
202 @eh.wrapfunction(context.basefilectx, 'isbinary') |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
203 def filectxisbinary(orig, self): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
204 if self.islfs(): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
205 # fast path: use lfs metadata to answer isbinary |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
206 metadata = pointer.deserialize(self.rawdata()) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
207 # if lfs metadata says nothing, assume it's binary by default |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
208 return bool(int(metadata.get('x-is-binary', 1))) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
209 return orig(self) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
210 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
211 def filectxislfs(self): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
212 return _islfs(self.filelog(), self.filenode()) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
213 |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
214 @eh.wrapfunction(cmdutil, '_updatecatformatter') |
35663
a985834961f7
lfs: allow the pointer file to be viewed with `hg cat -T '{rawdata}'`
Matt Harbison <matt_harbison@yahoo.com>
parents:
35648
diff
changeset
|
215 def _updatecatformatter(orig, fm, ctx, matcher, path, decode): |
a985834961f7
lfs: allow the pointer file to be viewed with `hg cat -T '{rawdata}'`
Matt Harbison <matt_harbison@yahoo.com>
parents:
35648
diff
changeset
|
216 orig(fm, ctx, matcher, path, decode) |
a985834961f7
lfs: allow the pointer file to be viewed with `hg cat -T '{rawdata}'`
Matt Harbison <matt_harbison@yahoo.com>
parents:
35648
diff
changeset
|
217 fm.data(rawdata=ctx[path].rawdata()) |
a985834961f7
lfs: allow the pointer file to be viewed with `hg cat -T '{rawdata}'`
Matt Harbison <matt_harbison@yahoo.com>
parents:
35648
diff
changeset
|
218 |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
219 @eh.wrapfunction(scmutil, 'wrapconvertsink') |
35189
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
220 def convertsink(orig, sink): |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
221 sink = orig(sink) |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
222 if sink.repotype == 'hg': |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
223 class lfssink(sink.__class__): |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
224 def putcommit(self, files, copies, parents, commit, source, revmap, |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
225 full, cleanp2): |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
226 pc = super(lfssink, self).putcommit |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
227 node = pc(files, copies, parents, commit, source, revmap, full, |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
228 cleanp2) |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
229 |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
230 if 'lfs' not in self.repo.requirements: |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
231 ctx = self.repo[node] |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
232 |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
233 # The file list may contain removed files, so check for |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
234 # membership before assuming it is in the context. |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
235 if any(f in ctx and ctx[f].islfs() for f, n in files): |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
236 self.repo.requirements.add('lfs') |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
237 self.repo._writerequirements() |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
238 |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
239 return node |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
240 |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
241 sink.__class__ = lfssink |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
242 |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
243 return sink |
f8f939a2926c
lfs: add a repo requirement for this extension when converting to lfs
Matt Harbison <matt_harbison@yahoo.com>
parents:
35122
diff
changeset
|
244 |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
245 # bundlerepo uses "vfsmod.readonlyvfs(othervfs)", we need to make sure lfs |
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
246 # options and blob stores are passed from othervfs to the new readonlyvfs. |
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
247 @eh.wrapfunction(vfsmod.readonlyvfs, '__init__') |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
248 def vfsinit(orig, self, othervfs): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
249 orig(self, othervfs) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
250 # copy lfs related options |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
251 for k, v in othervfs.options.items(): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
252 if k.startswith('lfs'): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
253 self.options[k] = v |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
254 # also copy lfs blobstores. note: this can run before reposetup, so lfs |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
255 # blobstore attributes are not always ready at this time. |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
256 for name in ['lfslocalblobstore', 'lfsremoteblobstore']: |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
257 if util.safehasattr(othervfs, name): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
258 setattr(self, name, getattr(othervfs, name)) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
259 |
37762
7269b87f817c
scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents:
37564
diff
changeset
|
260 def _prefetchfiles(repo, revs, match): |
35962
0b79f99fd7b0
lfs: prefetch lfs blobs when applying merge updates
Matt Harbison <matt_harbison@yahoo.com>
parents:
35961
diff
changeset
|
261 """Ensure that required LFS blobs are present, fetching them as a group if |
36180
60dd840a7fdb
merge: invoke scmutil.fileprefetchhooks() prior to applying updates
Matt Harbison <matt_harbison@yahoo.com>
parents:
36176
diff
changeset
|
262 needed.""" |
37851
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
263 if not util.safehasattr(repo.svfs, 'lfslocalblobstore'): |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
264 return |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
265 |
35962
0b79f99fd7b0
lfs: prefetch lfs blobs when applying merge updates
Matt Harbison <matt_harbison@yahoo.com>
parents:
35961
diff
changeset
|
266 pointers = [] |
37762
7269b87f817c
scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents:
37564
diff
changeset
|
267 oids = set() |
35962
0b79f99fd7b0
lfs: prefetch lfs blobs when applying merge updates
Matt Harbison <matt_harbison@yahoo.com>
parents:
35961
diff
changeset
|
268 localstore = repo.svfs.lfslocalblobstore |
0b79f99fd7b0
lfs: prefetch lfs blobs when applying merge updates
Matt Harbison <matt_harbison@yahoo.com>
parents:
35961
diff
changeset
|
269 |
37762
7269b87f817c
scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents:
37564
diff
changeset
|
270 for rev in revs: |
7269b87f817c
scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents:
37564
diff
changeset
|
271 ctx = repo[rev] |
7269b87f817c
scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents:
37564
diff
changeset
|
272 for f in ctx.walk(match): |
7269b87f817c
scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents:
37564
diff
changeset
|
273 p = pointerfromctx(ctx, f) |
7269b87f817c
scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents:
37564
diff
changeset
|
274 if p and p.oid() not in oids and not localstore.has(p.oid()): |
7269b87f817c
scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents:
37564
diff
changeset
|
275 p.filename = f |
7269b87f817c
scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents:
37564
diff
changeset
|
276 pointers.append(p) |
7269b87f817c
scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents:
37564
diff
changeset
|
277 oids.add(p.oid()) |
35962
0b79f99fd7b0
lfs: prefetch lfs blobs when applying merge updates
Matt Harbison <matt_harbison@yahoo.com>
parents:
35961
diff
changeset
|
278 |
0b79f99fd7b0
lfs: prefetch lfs blobs when applying merge updates
Matt Harbison <matt_harbison@yahoo.com>
parents:
35961
diff
changeset
|
279 if pointers: |
37518
092eff6833a7
lfs: infer the blob store URL from paths.default
Matt Harbison <matt_harbison@yahoo.com>
parents:
37442
diff
changeset
|
280 # Recalculating the repo store here allows 'paths.default' that is set |
092eff6833a7
lfs: infer the blob store URL from paths.default
Matt Harbison <matt_harbison@yahoo.com>
parents:
37442
diff
changeset
|
281 # on the repo by a clone command to be used for the update. |
092eff6833a7
lfs: infer the blob store URL from paths.default
Matt Harbison <matt_harbison@yahoo.com>
parents:
37442
diff
changeset
|
282 blobstore.remote(repo).readbatch(pointers, localstore) |
35962
0b79f99fd7b0
lfs: prefetch lfs blobs when applying merge updates
Matt Harbison <matt_harbison@yahoo.com>
parents:
35961
diff
changeset
|
283 |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
284 def _canskipupload(repo): |
37851
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
285 # Skip if this hasn't been passed to reposetup() |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
286 if not util.safehasattr(repo.svfs, 'lfsremoteblobstore'): |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
287 return True |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
288 |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
289 # if remotestore is a null store, upload is a no-op and can be skipped |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
290 return isinstance(repo.svfs.lfsremoteblobstore, blobstore._nullremote) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
291 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
292 def candownload(repo): |
37851
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
293 # Skip if this hasn't been passed to reposetup() |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
294 if not util.safehasattr(repo.svfs, 'lfsremoteblobstore'): |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
295 return False |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
296 |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
297 # if remotestore is a null store, downloads will lead to nothing |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
298 return not isinstance(repo.svfs.lfsremoteblobstore, blobstore._nullremote) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
299 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
300 def uploadblobsfromrevs(repo, revs): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
301 '''upload lfs blobs introduced by revs |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
302 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
303 Note: also used by other extensions e. g. infinitepush. avoid renaming. |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
304 ''' |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
305 if _canskipupload(repo): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
306 return |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
307 pointers = extractpointers(repo, revs) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
308 uploadblobs(repo, pointers) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
309 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
310 def prepush(pushop): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
311 """Prepush hook. |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
312 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
313 Read through the revisions to push, looking for filelog entries that can be |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
314 deserialized into metadata so that we can block the push on their upload to |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
315 the remote blobstore. |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
316 """ |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
317 return uploadblobsfromrevs(pushop.repo, pushop.outgoing.missing) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
318 |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
319 @eh.wrapfunction(exchange, 'push') |
35510
fa865878a849
lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
320 def push(orig, repo, remote, *args, **kwargs): |
37564
31a4ea773369
lfs: infer the blob store URL from an explicit push dest or default-push
Matt Harbison <matt_harbison@yahoo.com>
parents:
37518
diff
changeset
|
321 """bail on push if the extension isn't enabled on remote when needed, and |
31a4ea773369
lfs: infer the blob store URL from an explicit push dest or default-push
Matt Harbison <matt_harbison@yahoo.com>
parents:
37518
diff
changeset
|
322 update the remote store based on the destination path.""" |
35510
fa865878a849
lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
323 if 'lfs' in repo.requirements: |
fa865878a849
lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
324 # If the remote peer is for a local repo, the requirement tests in the |
fa865878a849
lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
325 # base class method enforce lfs support. Otherwise, some revisions in |
fa865878a849
lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
326 # this repo use lfs, and the remote repo needs the extension loaded. |
fa865878a849
lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
327 if not remote.local() and not remote.capable('lfs'): |
fa865878a849
lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
328 # This is a copy of the message in exchange.push() when requirements |
fa865878a849
lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
329 # are missing between local repos. |
fa865878a849
lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
330 m = _("required features are not supported in the destination: %s") |
fa865878a849
lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
331 raise error.Abort(m % 'lfs', |
fa865878a849
lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
332 hint=_('enable the lfs extension on the server')) |
37564
31a4ea773369
lfs: infer the blob store URL from an explicit push dest or default-push
Matt Harbison <matt_harbison@yahoo.com>
parents:
37518
diff
changeset
|
333 |
31a4ea773369
lfs: infer the blob store URL from an explicit push dest or default-push
Matt Harbison <matt_harbison@yahoo.com>
parents:
37518
diff
changeset
|
334 # Repositories where this extension is disabled won't have the field. |
31a4ea773369
lfs: infer the blob store URL from an explicit push dest or default-push
Matt Harbison <matt_harbison@yahoo.com>
parents:
37518
diff
changeset
|
335 # But if there's a requirement, then the extension must be loaded AND |
31a4ea773369
lfs: infer the blob store URL from an explicit push dest or default-push
Matt Harbison <matt_harbison@yahoo.com>
parents:
37518
diff
changeset
|
336 # there may be blobs to push. |
31a4ea773369
lfs: infer the blob store URL from an explicit push dest or default-push
Matt Harbison <matt_harbison@yahoo.com>
parents:
37518
diff
changeset
|
337 remotestore = repo.svfs.lfsremoteblobstore |
31a4ea773369
lfs: infer the blob store URL from an explicit push dest or default-push
Matt Harbison <matt_harbison@yahoo.com>
parents:
37518
diff
changeset
|
338 try: |
31a4ea773369
lfs: infer the blob store URL from an explicit push dest or default-push
Matt Harbison <matt_harbison@yahoo.com>
parents:
37518
diff
changeset
|
339 repo.svfs.lfsremoteblobstore = blobstore.remote(repo, remote.url()) |
31a4ea773369
lfs: infer the blob store URL from an explicit push dest or default-push
Matt Harbison <matt_harbison@yahoo.com>
parents:
37518
diff
changeset
|
340 return orig(repo, remote, *args, **kwargs) |
31a4ea773369
lfs: infer the blob store URL from an explicit push dest or default-push
Matt Harbison <matt_harbison@yahoo.com>
parents:
37518
diff
changeset
|
341 finally: |
31a4ea773369
lfs: infer the blob store URL from an explicit push dest or default-push
Matt Harbison <matt_harbison@yahoo.com>
parents:
37518
diff
changeset
|
342 repo.svfs.lfsremoteblobstore = remotestore |
31a4ea773369
lfs: infer the blob store URL from an explicit push dest or default-push
Matt Harbison <matt_harbison@yahoo.com>
parents:
37518
diff
changeset
|
343 else: |
31a4ea773369
lfs: infer the blob store URL from an explicit push dest or default-push
Matt Harbison <matt_harbison@yahoo.com>
parents:
37518
diff
changeset
|
344 return orig(repo, remote, *args, **kwargs) |
35510
fa865878a849
lfs: show a friendly message when pushing lfs to a server without lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
345 |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
346 # when writing a bundle via "hg bundle" command, upload related LFS blobs |
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
347 @eh.wrapfunction(bundle2, 'writenewbundle') |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
348 def writenewbundle(orig, ui, repo, source, filename, bundletype, outgoing, |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
349 *args, **kwargs): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
350 """upload LFS blobs added by outgoing revisions on 'hg bundle'""" |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
351 uploadblobsfromrevs(repo, outgoing.missing) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
352 return orig(ui, repo, source, filename, bundletype, outgoing, *args, |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
353 **kwargs) |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
354 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
355 def extractpointers(repo, revs): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
356 """return a list of lfs pointers added by given revs""" |
35482
5a73a0446afd
lfs: use ui.note() and ui.debug() instead of ui.write() and their flags
Matt Harbison <matt_harbison@yahoo.com>
parents:
35480
diff
changeset
|
357 repo.ui.debug('lfs: computing set of blobs to upload\n') |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
358 pointers = {} |
39297
37e56607cbb9
lfs: add a progress bar when searching for blobs to upload
Matt Harbison <matt_harbison@yahoo.com>
parents:
37851
diff
changeset
|
359 |
39416
b26350d9d7b5
lfs: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents:
39297
diff
changeset
|
360 makeprogress = repo.ui.makeprogress |
b26350d9d7b5
lfs: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents:
39297
diff
changeset
|
361 with makeprogress(_('lfs search'), _('changesets'), len(revs)) as progress: |
39297
37e56607cbb9
lfs: add a progress bar when searching for blobs to upload
Matt Harbison <matt_harbison@yahoo.com>
parents:
37851
diff
changeset
|
362 for r in revs: |
37e56607cbb9
lfs: add a progress bar when searching for blobs to upload
Matt Harbison <matt_harbison@yahoo.com>
parents:
37851
diff
changeset
|
363 ctx = repo[r] |
37e56607cbb9
lfs: add a progress bar when searching for blobs to upload
Matt Harbison <matt_harbison@yahoo.com>
parents:
37851
diff
changeset
|
364 for p in pointersfromctx(ctx).values(): |
37e56607cbb9
lfs: add a progress bar when searching for blobs to upload
Matt Harbison <matt_harbison@yahoo.com>
parents:
37851
diff
changeset
|
365 pointers[p.oid()] = p |
37e56607cbb9
lfs: add a progress bar when searching for blobs to upload
Matt Harbison <matt_harbison@yahoo.com>
parents:
37851
diff
changeset
|
366 progress.increment() |
39950
e1f97179a3f5
lfs: explicitly name a key when sorting blob pointers
Matt Harbison <matt_harbison@yahoo.com>
parents:
39883
diff
changeset
|
367 return sorted(pointers.values(), key=lambda p: p.oid()) |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
368 |
36037
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
369 def pointerfromctx(ctx, f, removed=False): |
35961
47e737d27e01
lfs: factor out a method for extracting the pointer of a single file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35799
diff
changeset
|
370 """return a pointer for the named file from the given changectx, or None if |
36037
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
371 the file isn't LFS. |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
372 |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
373 Optionally, the pointer for a file deleted from the context can be returned. |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
374 Since no such pointer is actually stored, and to distinguish from a non LFS |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
375 file, this pointer is represented by an empty dict. |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
376 """ |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
377 _ctx = ctx |
35961
47e737d27e01
lfs: factor out a method for extracting the pointer of a single file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35799
diff
changeset
|
378 if f not in ctx: |
36037
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
379 if not removed: |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
380 return None |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
381 if f in ctx.p1(): |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
382 _ctx = ctx.p1() |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
383 elif f in ctx.p2(): |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
384 _ctx = ctx.p2() |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
385 else: |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
386 return None |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
387 fctx = _ctx[f] |
35961
47e737d27e01
lfs: factor out a method for extracting the pointer of a single file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35799
diff
changeset
|
388 if not _islfs(fctx.filelog(), fctx.filenode()): |
47e737d27e01
lfs: factor out a method for extracting the pointer of a single file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35799
diff
changeset
|
389 return None |
47e737d27e01
lfs: factor out a method for extracting the pointer of a single file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35799
diff
changeset
|
390 try: |
36037
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
391 p = pointer.deserialize(fctx.rawdata()) |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
392 if ctx == _ctx: |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
393 return p |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
394 return {} |
35961
47e737d27e01
lfs: factor out a method for extracting the pointer of a single file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35799
diff
changeset
|
395 except pointer.InvalidPointer as ex: |
47e737d27e01
lfs: factor out a method for extracting the pointer of a single file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35799
diff
changeset
|
396 raise error.Abort(_('lfs: corrupted pointer (%s@%s): %s\n') |
36037
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
397 % (f, short(_ctx.node()), ex)) |
35961
47e737d27e01
lfs: factor out a method for extracting the pointer of a single file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35799
diff
changeset
|
398 |
36037
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
399 def pointersfromctx(ctx, removed=False): |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
400 """return a dict {path: pointer} for given single changectx. |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
401 |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
402 If ``removed`` == True and the LFS file was removed from ``ctx``, the value |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
403 stored for the path is an empty dict. |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
404 """ |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
405 result = {} |
40386
4a81d82474e9
lfs: consult the narrow matcher when extracting pointers from ctx (issue5794)
Matt Harbison <matt_harbison@yahoo.com>
parents:
40368
diff
changeset
|
406 m = ctx.repo().narrowmatch() |
4a81d82474e9
lfs: consult the narrow matcher when extracting pointers from ctx (issue5794)
Matt Harbison <matt_harbison@yahoo.com>
parents:
40368
diff
changeset
|
407 |
4a81d82474e9
lfs: consult the narrow matcher when extracting pointers from ctx (issue5794)
Matt Harbison <matt_harbison@yahoo.com>
parents:
40368
diff
changeset
|
408 # TODO: consider manifest.fastread() instead |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
409 for f in ctx.files(): |
40386
4a81d82474e9
lfs: consult the narrow matcher when extracting pointers from ctx (issue5794)
Matt Harbison <matt_harbison@yahoo.com>
parents:
40368
diff
changeset
|
410 if not m(f): |
4a81d82474e9
lfs: consult the narrow matcher when extracting pointers from ctx (issue5794)
Matt Harbison <matt_harbison@yahoo.com>
parents:
40368
diff
changeset
|
411 continue |
36037
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
412 p = pointerfromctx(ctx, f, removed=removed) |
dce43aaaf209
lfs: allow a pointer to be extracted from a context that removes the file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35964
diff
changeset
|
413 if p is not None: |
35961
47e737d27e01
lfs: factor out a method for extracting the pointer of a single file
Matt Harbison <matt_harbison@yahoo.com>
parents:
35799
diff
changeset
|
414 result[f] = p |
35121
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
415 return result |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
416 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
417 def uploadblobs(repo, pointers): |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
418 """upload given pointers from local blobstore""" |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
419 if not pointers: |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
420 return |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
421 |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
422 remoteblob = repo.svfs.lfsremoteblobstore |
66c5a8cf2868
lfs: import the Facebook git-lfs client extension
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
423 remoteblob.writebatch(pointers, repo.svfs.lfslocalblobstore) |
35355
9eb19b13e92a
lfs: allow to run 'debugupgraderepo' on repo with largefiles
Boris Feld <boris.feld@octobus.net>
parents:
35225
diff
changeset
|
424 |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
425 @eh.wrapfunction(upgrade, '_finishdatamigration') |
35372
b0ba1539af01
lfs: restore the local blob store after a repo upgrade
Matt Harbison <matt_harbison@yahoo.com>
parents:
35355
diff
changeset
|
426 def upgradefinishdatamigration(orig, ui, srcrepo, dstrepo, requirements): |
b0ba1539af01
lfs: restore the local blob store after a repo upgrade
Matt Harbison <matt_harbison@yahoo.com>
parents:
35355
diff
changeset
|
427 orig(ui, srcrepo, dstrepo, requirements) |
b0ba1539af01
lfs: restore the local blob store after a repo upgrade
Matt Harbison <matt_harbison@yahoo.com>
parents:
35355
diff
changeset
|
428 |
37851
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
429 # Skip if this hasn't been passed to reposetup() |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
430 if (util.safehasattr(srcrepo.svfs, 'lfslocalblobstore') and |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
431 util.safehasattr(dstrepo.svfs, 'lfslocalblobstore')): |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
432 srclfsvfs = srcrepo.svfs.lfslocalblobstore.vfs |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
433 dstlfsvfs = dstrepo.svfs.lfslocalblobstore.vfs |
35372
b0ba1539af01
lfs: restore the local blob store after a repo upgrade
Matt Harbison <matt_harbison@yahoo.com>
parents:
35355
diff
changeset
|
434 |
37851
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
435 for dirpath, dirs, files in srclfsvfs.walk(): |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
436 for oid in files: |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
437 ui.write(_('copying lfs blob %s\n') % oid) |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37762
diff
changeset
|
438 lfutil.link(srclfsvfs.join(oid), dstlfsvfs.join(oid)) |
35372
b0ba1539af01
lfs: restore the local blob store after a repo upgrade
Matt Harbison <matt_harbison@yahoo.com>
parents:
35355
diff
changeset
|
439 |
41051
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
440 @eh.wrapfunction(upgrade, 'preservedrequirements') |
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
40386
diff
changeset
|
441 @eh.wrapfunction(upgrade, 'supporteddestrequirements') |
35355
9eb19b13e92a
lfs: allow to run 'debugupgraderepo' on repo with largefiles
Boris Feld <boris.feld@octobus.net>
parents:
35225
diff
changeset
|
442 def upgraderequirements(orig, repo): |
9eb19b13e92a
lfs: allow to run 'debugupgraderepo' on repo with largefiles
Boris Feld <boris.feld@octobus.net>
parents:
35225
diff
changeset
|
443 reqs = orig(repo) |
9eb19b13e92a
lfs: allow to run 'debugupgraderepo' on repo with largefiles
Boris Feld <boris.feld@octobus.net>
parents:
35225
diff
changeset
|
444 if 'lfs' in repo.requirements: |
9eb19b13e92a
lfs: allow to run 'debugupgraderepo' on repo with largefiles
Boris Feld <boris.feld@octobus.net>
parents:
35225
diff
changeset
|
445 reqs.add('lfs') |
9eb19b13e92a
lfs: allow to run 'debugupgraderepo' on repo with largefiles
Boris Feld <boris.feld@octobus.net>
parents:
35225
diff
changeset
|
446 return reqs |