hgext/lfs/wrapper.py
changeset 50786 dde4b55a0785
parent 48913 f254fc73d956
child 50803 609a3b8058c3
equal deleted inserted replaced
50785:bf92386f76fd 50786:dde4b55a0785
    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