##// END OF EJS Templates
lfs: add missing b prefixes on some regular expressions...
Augie Fackler -
r36618:95bd9e39 default
parent child Browse files
Show More
@@ -1,73 +1,73 b''
1 # pointer.py - Git-LFS pointer serialization
1 # pointer.py - Git-LFS pointer serialization
2 #
2 #
3 # Copyright 2017 Facebook, Inc.
3 # Copyright 2017 Facebook, Inc.
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8 from __future__ import absolute_import
8 from __future__ import absolute_import
9
9
10 import re
10 import re
11
11
12 from mercurial.i18n import _
12 from mercurial.i18n import _
13
13
14 from mercurial import (
14 from mercurial import (
15 error,
15 error,
16 )
16 )
17
17
18 class InvalidPointer(error.RevlogError):
18 class InvalidPointer(error.RevlogError):
19 pass
19 pass
20
20
21 class gitlfspointer(dict):
21 class gitlfspointer(dict):
22 VERSION = 'https://git-lfs.github.com/spec/v1'
22 VERSION = 'https://git-lfs.github.com/spec/v1'
23
23
24 def __init__(self, *args, **kwargs):
24 def __init__(self, *args, **kwargs):
25 self['version'] = self.VERSION
25 self['version'] = self.VERSION
26 super(gitlfspointer, self).__init__(*args, **kwargs)
26 super(gitlfspointer, self).__init__(*args, **kwargs)
27
27
28 @classmethod
28 @classmethod
29 def deserialize(cls, text):
29 def deserialize(cls, text):
30 try:
30 try:
31 return cls(l.split(' ', 1) for l in text.splitlines()).validate()
31 return cls(l.split(' ', 1) for l in text.splitlines()).validate()
32 except ValueError: # l.split returns 1 item instead of 2
32 except ValueError: # l.split returns 1 item instead of 2
33 raise InvalidPointer(_('cannot parse git-lfs text: %r') % text)
33 raise InvalidPointer(_('cannot parse git-lfs text: %r') % text)
34
34
35 def serialize(self):
35 def serialize(self):
36 sortkeyfunc = lambda x: (x[0] != 'version', x)
36 sortkeyfunc = lambda x: (x[0] != 'version', x)
37 items = sorted(self.validate().iteritems(), key=sortkeyfunc)
37 items = sorted(self.validate().iteritems(), key=sortkeyfunc)
38 return ''.join('%s %s\n' % (k, v) for k, v in items)
38 return ''.join('%s %s\n' % (k, v) for k, v in items)
39
39
40 def oid(self):
40 def oid(self):
41 return self['oid'].split(':')[-1]
41 return self['oid'].split(':')[-1]
42
42
43 def size(self):
43 def size(self):
44 return int(self['size'])
44 return int(self['size'])
45
45
46 # regular expressions used by _validate
46 # regular expressions used by _validate
47 # see https://github.com/git-lfs/git-lfs/blob/master/docs/spec.md
47 # see https://github.com/git-lfs/git-lfs/blob/master/docs/spec.md
48 _keyre = re.compile(r'\A[a-z0-9.-]+\Z')
48 _keyre = re.compile(br'\A[a-z0-9.-]+\Z')
49 _valuere = re.compile(r'\A[^\n]*\Z')
49 _valuere = re.compile(br'\A[^\n]*\Z')
50 _requiredre = {
50 _requiredre = {
51 'size': re.compile(r'\A[0-9]+\Z'),
51 'size': re.compile(br'\A[0-9]+\Z'),
52 'oid': re.compile(r'\Asha256:[0-9a-f]{64}\Z'),
52 'oid': re.compile(br'\Asha256:[0-9a-f]{64}\Z'),
53 'version': re.compile(r'\A%s\Z' % re.escape(VERSION)),
53 'version': re.compile(br'\A%s\Z' % re.escape(VERSION)),
54 }
54 }
55
55
56 def validate(self):
56 def validate(self):
57 """raise InvalidPointer on error. return self if there is no error"""
57 """raise InvalidPointer on error. return self if there is no error"""
58 requiredcount = 0
58 requiredcount = 0
59 for k, v in self.iteritems():
59 for k, v in self.iteritems():
60 if k in self._requiredre:
60 if k in self._requiredre:
61 if not self._requiredre[k].match(v):
61 if not self._requiredre[k].match(v):
62 raise InvalidPointer(_('unexpected value: %s=%r') % (k, v))
62 raise InvalidPointer(_('unexpected value: %s=%r') % (k, v))
63 requiredcount += 1
63 requiredcount += 1
64 elif not self._keyre.match(k):
64 elif not self._keyre.match(k):
65 raise InvalidPointer(_('unexpected key: %s') % k)
65 raise InvalidPointer(_('unexpected key: %s') % k)
66 if not self._valuere.match(v):
66 if not self._valuere.match(v):
67 raise InvalidPointer(_('unexpected value: %s=%r') % (k, v))
67 raise InvalidPointer(_('unexpected value: %s=%r') % (k, v))
68 if len(self._requiredre) != requiredcount:
68 if len(self._requiredre) != requiredcount:
69 miss = sorted(set(self._requiredre.keys()).difference(self.keys()))
69 miss = sorted(set(self._requiredre.keys()).difference(self.keys()))
70 raise InvalidPointer(_('missed keys: %s') % ', '.join(miss))
70 raise InvalidPointer(_('missed keys: %s') % ', '.join(miss))
71 return self
71 return self
72
72
73 deserialize = gitlfspointer.deserialize
73 deserialize = gitlfspointer.deserialize
General Comments 0
You need to be logged in to leave comments. Login now