|
@@ -0,0 +1,46 @@ |
|
|
|
|
|
import hashlib
|
|
|
|
|
|
import json
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def filehash(fname):
|
|
|
|
|
|
h = hashlib.sha256()
|
|
|
|
|
|
with open(fname, 'rb') as f:
|
|
|
|
|
|
while True:
|
|
|
|
|
|
data = f.read(1024*1024*4)
|
|
|
|
|
|
if not data:
|
|
|
|
|
|
break
|
|
|
|
|
|
h.update(data)
|
|
|
|
|
|
res = h.hexdigest()
|
|
|
|
|
|
return res
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RunStep(object):
|
|
|
|
|
|
def __init__(self, base, spec):
|
|
|
|
|
|
self.base = base
|
|
|
|
|
|
self.spec = spec
|
|
|
|
|
|
|
|
|
|
|
|
def hash(self):
|
|
|
|
|
|
res = hashlib.sha256(
|
|
|
|
|
|
json.dumps(( self.base, self.spec ))
|
|
|
|
|
|
.encode('utf-8')).hexdigest()
|
|
|
|
|
|
return res
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CopyStep(object):
|
|
|
|
|
|
def __init__(self, base, spec):
|
|
|
|
|
|
if not isinstance(spec, list):
|
|
|
|
|
|
raise ValueError('CopyStep spec should be a list')
|
|
|
|
|
|
self.base = base
|
|
|
|
|
|
self.spec = spec
|
|
|
|
|
|
|
|
|
|
|
|
def hash(self):
|
|
|
|
|
|
if len(self.spec) == 0:
|
|
|
|
|
|
fh = []
|
|
|
|
|
|
elif isinstance(self.spec[0], list):
|
|
|
|
|
|
fh = list(map(lambda a: filehash(a[0]), self.spec))
|
|
|
|
|
|
else:
|
|
|
|
|
|
fh = [ filehash(self.spec[0]) ]
|
|
|
|
|
|
res = hashlib.sha256(
|
|
|
|
|
|
json.dumps(( self.base, fh, self.spec ))
|
|
|
|
|
|
.encode('utf-8')).hexdigest()
|
|
|
|
|
|
return res
|