build.run: add BuildPlan.digest(), useful for caching.
This commit is contained in:
parent
7fc1058ed2
commit
9350620f89
|
@ -6,6 +6,7 @@ import sys
|
||||||
import subprocess
|
import subprocess
|
||||||
import tempfile
|
import tempfile
|
||||||
import zipfile
|
import zipfile
|
||||||
|
import hashlib
|
||||||
|
|
||||||
|
|
||||||
__all__ = ["BuildPlan", "BuildProducts", "LocalBuildProducts"]
|
__all__ = ["BuildPlan", "BuildProducts", "LocalBuildProducts"]
|
||||||
|
@ -32,6 +33,21 @@ class BuildPlan:
|
||||||
assert isinstance(filename, str) and filename not in self.files
|
assert isinstance(filename, str) and filename not in self.files
|
||||||
self.files[filename] = content
|
self.files[filename] = content
|
||||||
|
|
||||||
|
def digest(self, size=64):
|
||||||
|
"""
|
||||||
|
Compute a `digest`, a short byte sequence deterministically and uniquely identifying
|
||||||
|
this build plan.
|
||||||
|
"""
|
||||||
|
hasher = hashlib.blake2b(digest_size=size)
|
||||||
|
for filename in sorted(self.files):
|
||||||
|
hasher.update(filename.encode("utf-8"))
|
||||||
|
content = self.files[filename]
|
||||||
|
if isinstance(content, str):
|
||||||
|
content = content.encode("utf-8")
|
||||||
|
hasher.update(content)
|
||||||
|
hasher.update(self.script.encode("utf-8"))
|
||||||
|
return hasher.digest()
|
||||||
|
|
||||||
def archive(self, file):
|
def archive(self, file):
|
||||||
"""
|
"""
|
||||||
Archive files from the build plan into ``file``, which can be either a filename, or
|
Archive files from the build plan into ``file``, which can be either a filename, or
|
||||||
|
|
Loading…
Reference in a new issue