mirror of
https://github.com/facebook/sapling.git
synced 2024-10-11 17:27:53 +03:00
4532efb04d
Summary: This makes it possible to reuse part of them - like uploading blobs for given revisions without going through prepush hook. `pointer.tostoreids()` was changed to `pointer.tostoreid()` to simplify things a bit. Unnecessary remoterepo assignment was removed. Test Plan: `arc unit` Reviewers: #mercurial, davidsp, rmcelroy Reviewed By: rmcelroy Subscribers: rmcelroy, mjpieters Differential Revision: https://phabricator.intern.facebook.com/D5009560 Signature: t1:5009560:1494230285:6469a2701baa8cfa4511a08149a37fc429733343
106 lines
2.8 KiB
Python
106 lines
2.8 KiB
Python
# coding=UTF-8
|
|
from __future__ import absolute_import
|
|
|
|
import re
|
|
|
|
from mercurial import (
|
|
error,
|
|
)
|
|
from mercurial.i18n import _
|
|
|
|
from .blobstore import StoreID
|
|
|
|
class PointerDeserializationError(error.RevlogError):
|
|
def __init__(self):
|
|
message = _('invalid lfs pointer format detected')
|
|
super(PointerDeserializationError, self).__init__(message)
|
|
|
|
class BasePointer(object):
|
|
|
|
def __init__(self, extrameta=None):
|
|
self.__metadata = dict()
|
|
if extrameta:
|
|
self.__metadata.update(extrameta)
|
|
|
|
def __str__(self):
|
|
return self.serialize()
|
|
|
|
def __getitem__(self, key):
|
|
return self.__metadata.get(key)
|
|
|
|
def __setitem__(self, key, value):
|
|
self.__metadata[key] = value
|
|
|
|
def __contains__(self, key):
|
|
return key in self.__metadata
|
|
|
|
def _transformkv(self, key, value):
|
|
return '%s %s\n' % (key, value)
|
|
|
|
def keys(self):
|
|
return self.__metadata.keys()
|
|
|
|
def serialize(self):
|
|
matcher = re.compile('[a-z0-9\-\.]+')
|
|
text = 'version ' + self.VERSION
|
|
keys = sorted(self.__metadata.keys())
|
|
for key in keys:
|
|
if key == 'version':
|
|
continue
|
|
assert matcher.match(key)
|
|
text = text + self._transformkv(key, self.__metadata[key])
|
|
return text
|
|
|
|
class GithubPointer(BasePointer):
|
|
|
|
VERSION = 'https://git-lfs.github.com/spec/v1\n'
|
|
|
|
def __init__(self, oid, hashalgo, size, extrameta=None):
|
|
super(GithubPointer, self).__init__(extrameta)
|
|
self['oid'] = oid
|
|
self['hashalgo'] = hashalgo
|
|
self['size'] = size
|
|
|
|
def _transformkv(self, key, value):
|
|
if key == 'hashalgo':
|
|
return ''
|
|
elif key == 'oid':
|
|
return 'oid %s:%s\n' % (self['hashalgo'], value)
|
|
return '%s %s\n' % (key, value)
|
|
|
|
@staticmethod
|
|
def deserialize(text):
|
|
metadata = dict()
|
|
for line in text.splitlines()[1:]:
|
|
if len(line) == 0:
|
|
continue
|
|
key, value = line.split(' ', 1)
|
|
if key == 'oid':
|
|
hashalgo, oid = value.split(':', 1)
|
|
metadata['oid'] = str(oid)
|
|
metadata['hashalgo'] = hashalgo
|
|
else:
|
|
metadata[key] = value
|
|
assert 'oid' in metadata
|
|
assert 'size' in metadata
|
|
return GithubPointer(
|
|
oid=metadata['oid'],
|
|
hashalgo=metadata['hashalgo'],
|
|
size=metadata['size'],
|
|
extrameta=metadata)
|
|
|
|
def tostoreid(self):
|
|
return StoreID(self['oid'], self['size'])
|
|
|
|
def deserialize(text):
|
|
pointerformats = [
|
|
GithubPointer,
|
|
]
|
|
|
|
for cls in pointerformats:
|
|
if text.startswith('version %s' % cls.VERSION):
|
|
obj = cls.deserialize(text)
|
|
return obj
|
|
|
|
raise PointerDeserializationError()
|