##// END OF EJS Templates
lfs: prefetch lfs blobs when applying merge updates...
Matt Harbison -
r35940:0b79f99f default
parent child Browse files
Show More
@@ -137,6 +137,7 b' from mercurial import ('
137 137 fileset,
138 138 hg,
139 139 localrepo,
140 merge,
140 141 minifileset,
141 142 node,
142 143 pycompat,
@@ -331,6 +332,8 b' def extsetup(ui):'
331 332 wrapfunction(hg, 'clone', wrapper.hgclone)
332 333 wrapfunction(hg, 'postshare', wrapper.hgpostshare)
333 334
335 wrapfunction(merge, 'applyupdates', wrapper.mergemodapplyupdates)
336
334 337 # Make bundle choose changegroup3 instead of changegroup2. This affects
335 338 # "hg bundle" command. Note: it does not cover all bundle formats like
336 339 # "packed1". Using "packed1" with lfs will likely cause trouble.
@@ -249,6 +249,42 b' def hgpostshare(orig, sourcerepo, destre'
249 249 if 'lfs' in destrepo.requirements:
250 250 destrepo.vfs.append('hgrc', util.tonativeeol('\n[extensions]\nlfs=\n'))
251 251
252 def _prefetchfiles(repo, ctx, files):
253 """Ensure that required LFS blobs are present, fetching them as a group if
254 needed.
255
256 This is centralized logic for various prefetch hooks."""
257 pointers = []
258 localstore = repo.svfs.lfslocalblobstore
259
260 for f in files:
261 p = pointerfromctx(ctx, f)
262 if p and not localstore.has(p.oid()):
263 p.filename = f
264 pointers.append(p)
265
266 if pointers:
267 repo.svfs.lfsremoteblobstore.readbatch(pointers, localstore)
268
269 def mergemodapplyupdates(orig, repo, actions, wctx, mctx, overwrite,
270 labels=None):
271 """Ensure that the required LFS blobs are present before applying updates,
272 fetching them as a group if needed.
273
274 This has the effect of ensuring all necessary LFS blobs are present before
275 making working directory changes during an update (including after clone and
276 share) or merge."""
277
278 # Skipping 'a', 'am', 'f', 'r', 'dm', 'e', 'k', 'p' and 'pr', because they
279 # don't touch mctx. 'cd' is skipped, because changed/deleted never resolves
280 # to something from the remote side.
281 oplist = [actions[a] for a in 'g dc dg m'.split()]
282
283 _prefetchfiles(repo, mctx,
284 [f for sublist in oplist for f, args, msg in sublist])
285
286 return orig(repo, actions, wctx, mctx, overwrite, labels)
287
252 288 def _canskipupload(repo):
253 289 # if remotestore is a null store, upload is a no-op and can be skipped
254 290 return isinstance(repo.svfs.lfsremoteblobstore, blobstore._nullremote)
@@ -66,10 +66,10 b' Clear the cache to force a download'
66 66 $ cd ../repo2
67 67 $ hg update tip -v
68 68 resolving manifests
69 getting a
70 69 lfs: downloading 31cf46fbc4ecd458a0943c5b4881f1f5a6dd36c53d6167d5b69ac45149b38e5b (12 bytes)
71 70 lfs: adding 31cf46fbc4ecd458a0943c5b4881f1f5a6dd36c53d6167d5b69ac45149b38e5b to the usercache
72 71 lfs: processed: 31cf46fbc4ecd458a0943c5b4881f1f5a6dd36c53d6167d5b69ac45149b38e5b
72 getting a
73 73 lfs: found 31cf46fbc4ecd458a0943c5b4881f1f5a6dd36c53d6167d5b69ac45149b38e5b in the local lfs store
74 74 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
75 75
@@ -99,17 +99,18 b' Clear the cache to force a download'
99 99 $ rm -rf `hg config lfs.usercache`
100 100 $ hg --repo ../repo1 update tip -v
101 101 resolving manifests
102 getting b
103 lfs: found 31cf46fbc4ecd458a0943c5b4881f1f5a6dd36c53d6167d5b69ac45149b38e5b in the local lfs store
104 getting c
102 lfs: need to transfer 2 objects (39 bytes)
103 lfs: downloading 37a65ab78d5ecda767e8622c248b5dbff1e68b1678ab0e730d5eb8601ec8ad19 (20 bytes)
104 lfs: adding 37a65ab78d5ecda767e8622c248b5dbff1e68b1678ab0e730d5eb8601ec8ad19 to the usercache
105 lfs: processed: 37a65ab78d5ecda767e8622c248b5dbff1e68b1678ab0e730d5eb8601ec8ad19
105 106 lfs: downloading d11e1a642b60813aee592094109b406089b8dff4cb157157f753418ec7857998 (19 bytes)
106 107 lfs: adding d11e1a642b60813aee592094109b406089b8dff4cb157157f753418ec7857998 to the usercache
107 108 lfs: processed: d11e1a642b60813aee592094109b406089b8dff4cb157157f753418ec7857998
109 getting b
110 lfs: found 31cf46fbc4ecd458a0943c5b4881f1f5a6dd36c53d6167d5b69ac45149b38e5b in the local lfs store
111 getting c
108 112 lfs: found d11e1a642b60813aee592094109b406089b8dff4cb157157f753418ec7857998 in the local lfs store
109 113 getting d
110 lfs: downloading 37a65ab78d5ecda767e8622c248b5dbff1e68b1678ab0e730d5eb8601ec8ad19 (20 bytes)
111 lfs: adding 37a65ab78d5ecda767e8622c248b5dbff1e68b1678ab0e730d5eb8601ec8ad19 to the usercache
112 lfs: processed: 37a65ab78d5ecda767e8622c248b5dbff1e68b1678ab0e730d5eb8601ec8ad19
113 114 lfs: found 37a65ab78d5ecda767e8622c248b5dbff1e68b1678ab0e730d5eb8601ec8ad19 in the local lfs store
114 115 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
115 116
@@ -123,11 +124,6 b' Test a corrupt file download, but clear '
123 124
124 125 $ hg --repo ../repo1 update -C tip -v
125 126 resolving manifests
126 getting a
127 lfs: found 31cf46fbc4ecd458a0943c5b4881f1f5a6dd36c53d6167d5b69ac45149b38e5b in the local lfs store
128 getting b
129 lfs: found 31cf46fbc4ecd458a0943c5b4881f1f5a6dd36c53d6167d5b69ac45149b38e5b in the local lfs store
130 getting c
131 127 lfs: downloading d11e1a642b60813aee592094109b406089b8dff4cb157157f753418ec7857998 (19 bytes)
132 128 abort: corrupt remote lfs object: d11e1a642b60813aee592094109b406089b8dff4cb157157f753418ec7857998
133 129 [255]
@@ -760,7 +760,6 b' Damaging a file required by the update d'
760 760 $ hg --config lfs.usercache=emptycache clone -v repo5 fromcorrupt2
761 761 updating to branch default
762 762 resolving manifests
763 getting l
764 763 abort: corrupt remote lfs object: 22f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b
765 764 [255]
766 765
General Comments 0
You need to be logged in to leave comments. Login now