Another huge batch of registry v2 changes
Add patch support and resumeable sha Implement all actual registry methods Add a simple database generation option
This commit is contained in:
parent
5ba3521e67
commit
e1b3e9e6ae
29 changed files with 1095 additions and 430 deletions
|
@ -2,33 +2,61 @@ import re
|
|||
import os.path
|
||||
import hashlib
|
||||
|
||||
from collections import namedtuple
|
||||
|
||||
|
||||
Digest = namedtuple('Digest', ['is_tarsum', 'tarsum_version', 'hash_alg', 'hash_bytes'])
|
||||
|
||||
|
||||
DIGEST_PATTERN = r'(tarsum\.(v[\w]+)\+)?([\w]+):([0-9a-f]+)'
|
||||
DIGEST_REGEX = re.compile(DIGEST_PATTERN)
|
||||
|
||||
|
||||
class InvalidDigestException(RuntimeError):
|
||||
pass
|
||||
|
||||
|
||||
def parse_digest(digest):
|
||||
""" Returns the digest parsed out to its components. """
|
||||
match = DIGEST_REGEX.match(digest)
|
||||
if match is None or match.end() != len(digest):
|
||||
raise InvalidDigestException('Not a valid digest: %s', digest)
|
||||
class Digest(object):
|
||||
DIGEST_REGEX = re.compile(DIGEST_PATTERN)
|
||||
|
||||
is_tarsum = match.group(1) is not None
|
||||
return Digest(is_tarsum, match.group(2), match.group(3), match.group(4))
|
||||
def __init__(self, hash_alg, hash_bytes, is_tarsum=False, tarsum_version=None):
|
||||
self._hash_alg = hash_alg
|
||||
self._hash_bytes = hash_bytes
|
||||
self._is_tarsum = is_tarsum
|
||||
self._tarsum_version = tarsum_version
|
||||
|
||||
def __str__(self):
|
||||
if self._is_tarsum:
|
||||
return 'tarsum.{0}+{1}:{2}'.format(self._tarsum_version, self._hash_alg, self._hash_bytes)
|
||||
return '{0}:{1}'.format(self._hash_alg, self._hash_bytes)
|
||||
|
||||
def __eq__(self, rhs):
|
||||
return isinstance(rhs, Digest) and str(self) == str(rhs)
|
||||
|
||||
@staticmethod
|
||||
def parse_digest(digest):
|
||||
""" Returns the digest parsed out to its components. """
|
||||
match = Digest.DIGEST_REGEX.match(digest)
|
||||
if match is None or match.end() != len(digest):
|
||||
raise InvalidDigestException('Not a valid digest: %s', digest)
|
||||
|
||||
is_tarsum = match.group(1) is not None
|
||||
return Digest(match.group(3), match.group(4), is_tarsum, match.group(2))
|
||||
|
||||
@property
|
||||
def is_tarsum(self):
|
||||
return self._is_tarsum
|
||||
|
||||
@property
|
||||
def tarsum_version(self):
|
||||
return self._tarsum_version
|
||||
|
||||
@property
|
||||
def hash_alg(self):
|
||||
return self._hash_alg
|
||||
|
||||
@property
|
||||
def hash_bytes(self):
|
||||
return self._hash_bytes
|
||||
|
||||
|
||||
def content_path(digest):
|
||||
""" Returns a relative path to the parsed digest. """
|
||||
parsed = parse_digest(digest)
|
||||
parsed = Digest.parse_digest(digest)
|
||||
components = []
|
||||
|
||||
if parsed.is_tarsum:
|
||||
|
@ -58,7 +86,11 @@ def sha256_digest_from_generator(content_generator):
|
|||
return 'sha256:{0}'.format(digest.hexdigest())
|
||||
|
||||
|
||||
def sha256_digest_from_hashlib(sha256_hash_obj):
|
||||
return 'sha256:{0}'.format(sha256_hash_obj.hexdigest())
|
||||
|
||||
|
||||
def digests_equal(lhs_digest_string, rhs_digest_string):
|
||||
""" Parse and compare the two digests, returns True if the digests are equal, False otherwise.
|
||||
"""
|
||||
return parse_digest(lhs_digest_string) == parse_digest(rhs_digest_string)
|
||||
return Digest.parse_digest(lhs_digest_string) == Digest.parse_digest(rhs_digest_string)
|
||||
|
|
Reference in a new issue