51 ) |
51 ) |
52 |
52 |
53 eh = exthelper.exthelper() |
53 eh = exthelper.exthelper() |
54 |
54 |
55 |
55 |
56 @eh.wrapfunction(localrepo, b'makefilestorage') |
56 @eh.wrapfunction(localrepo, 'makefilestorage') |
57 def localrepomakefilestorage(orig, requirements, features, **kwargs): |
57 def localrepomakefilestorage(orig, requirements, features, **kwargs): |
58 if b'lfs' in requirements: |
58 if b'lfs' in requirements: |
59 features.add(repository.REPO_FEATURE_LFS) |
59 features.add(repository.REPO_FEATURE_LFS) |
60 |
60 |
61 return orig(requirements=requirements, features=features, **kwargs) |
61 return orig(requirements=requirements, features=features, **kwargs) |
62 |
62 |
63 |
63 |
64 @eh.wrapfunction(changegroup, b'allsupportedversions') |
64 @eh.wrapfunction(changegroup, 'allsupportedversions') |
65 def allsupportedversions(orig, ui): |
65 def allsupportedversions(orig, ui): |
66 versions = orig(ui) |
66 versions = orig(ui) |
67 versions.add(b'03') |
67 versions.add(b'03') |
68 return versions |
68 return versions |
69 |
69 |
70 |
70 |
71 @eh.wrapfunction(wireprotov1server, b'_capabilities') |
71 @eh.wrapfunction(wireprotov1server, '_capabilities') |
72 def _capabilities(orig, repo, proto): |
72 def _capabilities(orig, repo, proto): |
73 '''Wrap server command to announce lfs server capability''' |
73 '''Wrap server command to announce lfs server capability''' |
74 caps = orig(repo, proto) |
74 caps = orig(repo, proto) |
75 if util.safehasattr(repo.svfs, b'lfslocalblobstore'): |
75 if util.safehasattr(repo.svfs, b'lfslocalblobstore'): |
76 # Advertise a slightly different capability when lfs is *required*, so |
76 # Advertise a slightly different capability when lfs is *required*, so |
225 metadata = pointer.deserialize(rawtext) |
225 metadata = pointer.deserialize(rawtext) |
226 return int(metadata[b'size']) |
226 return int(metadata[b'size']) |
227 return orig(self, rev) |
227 return orig(self, rev) |
228 |
228 |
229 |
229 |
230 @eh.wrapfunction(revlog, b'_verify_revision') |
230 @eh.wrapfunction(revlog, '_verify_revision') |
231 def _verify_revision(orig, rl, skipflags, state, node): |
231 def _verify_revision(orig, rl, skipflags, state, node): |
232 if _islfs(rl, node=node): |
232 if _islfs(rl, node=node): |
233 rawtext = rl.rawdata(node) |
233 rawtext = rl.rawdata(node) |
234 metadata = pointer.deserialize(rawtext) |
234 metadata = pointer.deserialize(rawtext) |
235 |
235 |
244 state[b'safe_renamed'].add(node) |
244 state[b'safe_renamed'].add(node) |
245 |
245 |
246 orig(rl, skipflags, state, node) |
246 orig(rl, skipflags, state, node) |
247 |
247 |
248 |
248 |
249 @eh.wrapfunction(context.basefilectx, b'cmp') |
249 @eh.wrapfunction(context.basefilectx, 'cmp') |
250 def filectxcmp(orig, self, fctx): |
250 def filectxcmp(orig, self, fctx): |
251 """returns True if text is different than fctx""" |
251 """returns True if text is different than fctx""" |
252 # some fctx (ex. hg-git) is not based on basefilectx and do not have islfs |
252 # some fctx (ex. hg-git) is not based on basefilectx and do not have islfs |
253 if self.islfs() and getattr(fctx, 'islfs', lambda: False)(): |
253 if self.islfs() and getattr(fctx, 'islfs', lambda: False)(): |
254 # fast path: check LFS oid |
254 # fast path: check LFS oid |
256 p2 = pointer.deserialize(fctx.rawdata()) |
256 p2 = pointer.deserialize(fctx.rawdata()) |
257 return p1.oid() != p2.oid() |
257 return p1.oid() != p2.oid() |
258 return orig(self, fctx) |
258 return orig(self, fctx) |
259 |
259 |
260 |
260 |
261 @eh.wrapfunction(context.basefilectx, b'isbinary') |
261 @eh.wrapfunction(context.basefilectx, 'isbinary') |
262 def filectxisbinary(orig, self): |
262 def filectxisbinary(orig, self): |
263 if self.islfs(): |
263 if self.islfs(): |
264 # fast path: use lfs metadata to answer isbinary |
264 # fast path: use lfs metadata to answer isbinary |
265 metadata = pointer.deserialize(self.rawdata()) |
265 metadata = pointer.deserialize(self.rawdata()) |
266 # if lfs metadata says nothing, assume it's binary by default |
266 # if lfs metadata says nothing, assume it's binary by default |
270 |
270 |
271 def filectxislfs(self): |
271 def filectxislfs(self): |
272 return _islfs(self.filelog()._revlog, self.filenode()) |
272 return _islfs(self.filelog()._revlog, self.filenode()) |
273 |
273 |
274 |
274 |
275 @eh.wrapfunction(cmdutil, b'_updatecatformatter') |
275 @eh.wrapfunction(cmdutil, '_updatecatformatter') |
276 def _updatecatformatter(orig, fm, ctx, matcher, path, decode): |
276 def _updatecatformatter(orig, fm, ctx, matcher, path, decode): |
277 orig(fm, ctx, matcher, path, decode) |
277 orig(fm, ctx, matcher, path, decode) |
278 fm.data(rawdata=ctx[path].rawdata()) |
278 fm.data(rawdata=ctx[path].rawdata()) |
279 |
279 |
280 |
280 |
281 @eh.wrapfunction(scmutil, b'wrapconvertsink') |
281 @eh.wrapfunction(scmutil, 'wrapconvertsink') |
282 def convertsink(orig, sink): |
282 def convertsink(orig, sink): |
283 sink = orig(sink) |
283 sink = orig(sink) |
284 if sink.repotype == b'hg': |
284 if sink.repotype == b'hg': |
285 |
285 |
286 class lfssink(sink.__class__): |
286 class lfssink(sink.__class__): |
323 return sink |
323 return sink |
324 |
324 |
325 |
325 |
326 # bundlerepo uses "vfsmod.readonlyvfs(othervfs)", we need to make sure lfs |
326 # bundlerepo uses "vfsmod.readonlyvfs(othervfs)", we need to make sure lfs |
327 # options and blob stores are passed from othervfs to the new readonlyvfs. |
327 # options and blob stores are passed from othervfs to the new readonlyvfs. |
328 @eh.wrapfunction(vfsmod.readonlyvfs, b'__init__') |
328 @eh.wrapfunction(vfsmod.readonlyvfs, '__init__') |
329 def vfsinit(orig, self, othervfs): |
329 def vfsinit(orig, self, othervfs): |
330 orig(self, othervfs) |
330 orig(self, othervfs) |
331 # copy lfs related options |
331 # copy lfs related options |
332 for k, v in othervfs.options.items(): |
332 for k, v in othervfs.options.items(): |
333 if k.startswith(b'lfs'): |
333 if k.startswith(b'lfs'): |
401 the remote blobstore. |
401 the remote blobstore. |
402 """ |
402 """ |
403 return uploadblobsfromrevs(pushop.repo, pushop.outgoing.missing) |
403 return uploadblobsfromrevs(pushop.repo, pushop.outgoing.missing) |
404 |
404 |
405 |
405 |
406 @eh.wrapfunction(exchange, b'push') |
406 @eh.wrapfunction(exchange, 'push') |
407 def push(orig, repo, remote, *args, **kwargs): |
407 def push(orig, repo, remote, *args, **kwargs): |
408 """bail on push if the extension isn't enabled on remote when needed, and |
408 """bail on push if the extension isn't enabled on remote when needed, and |
409 update the remote store based on the destination path.""" |
409 update the remote store based on the destination path.""" |
410 if b'lfs' in repo.requirements: |
410 if b'lfs' in repo.requirements: |
411 # If the remote peer is for a local repo, the requirement tests in the |
411 # If the remote peer is for a local repo, the requirement tests in the |
431 else: |
431 else: |
432 return orig(repo, remote, *args, **kwargs) |
432 return orig(repo, remote, *args, **kwargs) |
433 |
433 |
434 |
434 |
435 # when writing a bundle via "hg bundle" command, upload related LFS blobs |
435 # when writing a bundle via "hg bundle" command, upload related LFS blobs |
436 @eh.wrapfunction(bundle2, b'writenewbundle') |
436 @eh.wrapfunction(bundle2, 'writenewbundle') |
437 def writenewbundle( |
437 def writenewbundle( |
438 orig, ui, repo, source, filename, bundletype, outgoing, *args, **kwargs |
438 orig, ui, repo, source, filename, bundletype, outgoing, *args, **kwargs |
439 ): |
439 ): |
440 """upload LFS blobs added by outgoing revisions on 'hg bundle'""" |
440 """upload LFS blobs added by outgoing revisions on 'hg bundle'""" |
441 uploadblobsfromrevs(repo, outgoing.missing) |
441 uploadblobsfromrevs(repo, outgoing.missing) |
520 |
520 |
521 remoteblob = repo.svfs.lfsremoteblobstore |
521 remoteblob = repo.svfs.lfsremoteblobstore |
522 remoteblob.writebatch(pointers, repo.svfs.lfslocalblobstore) |
522 remoteblob.writebatch(pointers, repo.svfs.lfslocalblobstore) |
523 |
523 |
524 |
524 |
525 @eh.wrapfunction(upgrade_engine, b'finishdatamigration') |
525 @eh.wrapfunction(upgrade_engine, 'finishdatamigration') |
526 def upgradefinishdatamigration(orig, ui, srcrepo, dstrepo, requirements): |
526 def upgradefinishdatamigration(orig, ui, srcrepo, dstrepo, requirements): |
527 orig(ui, srcrepo, dstrepo, requirements) |
527 orig(ui, srcrepo, dstrepo, requirements) |
528 |
528 |
529 # Skip if this hasn't been passed to reposetup() |
529 # Skip if this hasn't been passed to reposetup() |
530 if util.safehasattr( |
530 if util.safehasattr( |
537 for oid in files: |
537 for oid in files: |
538 ui.write(_(b'copying lfs blob %s\n') % oid) |
538 ui.write(_(b'copying lfs blob %s\n') % oid) |
539 lfutil.link(srclfsvfs.join(oid), dstlfsvfs.join(oid)) |
539 lfutil.link(srclfsvfs.join(oid), dstlfsvfs.join(oid)) |
540 |
540 |
541 |
541 |
542 @eh.wrapfunction(upgrade_actions, b'preservedrequirements') |
542 @eh.wrapfunction(upgrade_actions, 'preservedrequirements') |
543 @eh.wrapfunction(upgrade_actions, b'supporteddestrequirements') |
543 @eh.wrapfunction(upgrade_actions, 'supporteddestrequirements') |
544 def upgraderequirements(orig, repo): |
544 def upgraderequirements(orig, repo): |
545 reqs = orig(repo) |
545 reqs = orig(repo) |
546 if b'lfs' in repo.requirements: |
546 if b'lfs' in repo.requirements: |
547 reqs.add(b'lfs') |
547 reqs.add(b'lfs') |
548 return reqs |
548 return reqs |