|
@@ -200,6 +200,7 @@ class Manifest:
|
|
self.repository = repository
|
|
self.repository = repository
|
|
self.item_keys = frozenset(item_keys) if item_keys is not None else ITEM_KEYS
|
|
self.item_keys = frozenset(item_keys) if item_keys is not None else ITEM_KEYS
|
|
self.tam_verified = False
|
|
self.tam_verified = False
|
|
|
|
+ self.timestamp = None
|
|
|
|
|
|
@property
|
|
@property
|
|
def id_str(self):
|
|
def id_str(self):
|
|
@@ -245,7 +246,13 @@ class Manifest:
|
|
from .item import ManifestItem
|
|
from .item import ManifestItem
|
|
if self.key.tam_required:
|
|
if self.key.tam_required:
|
|
self.config[b'tam_required'] = True
|
|
self.config[b'tam_required'] = True
|
|
- self.timestamp = datetime.utcnow().isoformat()
|
|
|
|
|
|
+ # self.timestamp needs to be strictly monotonically increasing. Clocks often are not set correctly
|
|
|
|
+ if self.timestamp is None:
|
|
|
|
+ self.timestamp = datetime.utcnow().isoformat()
|
|
|
|
+ else:
|
|
|
|
+ prev_ts = datetime.strptime(self.timestamp, "%Y-%m-%dT%H:%M:%S.%f")
|
|
|
|
+ incremented = (prev_ts + timedelta(microseconds=1)).isoformat()
|
|
|
|
+ self.timestamp = max(incremented, datetime.utcnow().isoformat())
|
|
manifest = ManifestItem(
|
|
manifest = ManifestItem(
|
|
version=1,
|
|
version=1,
|
|
archives=StableDict(self.archives.get_raw_dict()),
|
|
archives=StableDict(self.archives.get_raw_dict()),
|