summaryrefslogtreecommitdiffstats
path: root/meta/lib/oe/sstatesig.py
diff options
context:
space:
mode:
Diffstat (limited to 'meta/lib/oe/sstatesig.py')
-rw-r--r--meta/lib/oe/sstatesig.py39
1 files changed, 36 insertions, 3 deletions
diff --git a/meta/lib/oe/sstatesig.py b/meta/lib/oe/sstatesig.py
index 24577249ff..0c3b4589c5 100644
--- a/meta/lib/oe/sstatesig.py
+++ b/meta/lib/oe/sstatesig.py
@@ -470,6 +470,8 @@ def OEOuthashBasic(path, sigfile, task, d):
470 import stat 470 import stat
471 import pwd 471 import pwd
472 import grp 472 import grp
473 import re
474 import fnmatch
473 475
474 def update_hash(s): 476 def update_hash(s):
475 s = s.encode('utf-8') 477 s = s.encode('utf-8')
@@ -479,6 +481,8 @@ def OEOuthashBasic(path, sigfile, task, d):
479 481
480 h = hashlib.sha256() 482 h = hashlib.sha256()
481 prev_dir = os.getcwd() 483 prev_dir = os.getcwd()
484 corebase = d.getVar("COREBASE")
485 tmpdir = d.getVar("TMPDIR")
482 include_owners = os.environ.get('PSEUDO_DISABLED') == '0' 486 include_owners = os.environ.get('PSEUDO_DISABLED') == '0'
483 if "package_write_" in task or task == "package_qa": 487 if "package_write_" in task or task == "package_qa":
484 include_owners = False 488 include_owners = False
@@ -489,8 +493,17 @@ def OEOuthashBasic(path, sigfile, task, d):
489 include_root = False 493 include_root = False
490 extra_content = d.getVar('HASHEQUIV_HASH_VERSION') 494 extra_content = d.getVar('HASHEQUIV_HASH_VERSION')
491 495
496 filemaps = {}
497 for m in (d.getVar('SSTATE_HASHEQUIV_FILEMAP') or '').split():
498 entry = m.split(":")
499 if len(entry) != 3 or entry[0] != task:
500 continue
501 filemaps.setdefault(entry[1], [])
502 filemaps[entry[1]].append(entry[2])
503
492 try: 504 try:
493 os.chdir(path) 505 os.chdir(path)
506 basepath = os.path.normpath(path)
494 507
495 update_hash("OEOuthashBasic\n") 508 update_hash("OEOuthashBasic\n")
496 if extra_content: 509 if extra_content:
@@ -572,8 +585,13 @@ def OEOuthashBasic(path, sigfile, task, d):
572 else: 585 else:
573 update_hash(" " * 9) 586 update_hash(" " * 9)
574 587
588 filterfile = False
589 for entry in filemaps:
590 if fnmatch.fnmatch(path, entry):
591 filterfile = True
592
575 update_hash(" ") 593 update_hash(" ")
576 if stat.S_ISREG(s.st_mode): 594 if stat.S_ISREG(s.st_mode) and not filterfile:
577 update_hash("%10d" % s.st_size) 595 update_hash("%10d" % s.st_size)
578 else: 596 else:
579 update_hash(" " * 10) 597 update_hash(" " * 10)
@@ -582,9 +600,24 @@ def OEOuthashBasic(path, sigfile, task, d):
582 fh = hashlib.sha256() 600 fh = hashlib.sha256()
583 if stat.S_ISREG(s.st_mode): 601 if stat.S_ISREG(s.st_mode):
584 # Hash file contents 602 # Hash file contents
585 with open(path, 'rb') as d: 603 if filterfile:
586 for chunk in iter(lambda: d.read(4096), b""): 604 # Need to ignore paths in crossscripts and postinst-useradd files.
605 with open(path, 'rb') as d:
606 chunk = d.read()
607 chunk = chunk.replace(bytes(basepath, encoding='utf8'), b'')
608 for entry in filemaps:
609 if not fnmatch.fnmatch(path, entry):
610 continue
611 for r in filemaps[entry]:
612 if r.startswith("regex-"):
613 chunk = re.sub(bytes(r[6:], encoding='utf8'), b'', chunk)
614 else:
615 chunk = chunk.replace(bytes(r, encoding='utf8'), b'')
587 fh.update(chunk) 616 fh.update(chunk)
617 else:
618 with open(path, 'rb') as d:
619 for chunk in iter(lambda: d.read(4096), b""):
620 fh.update(chunk)
588 update_hash(fh.hexdigest()) 621 update_hash(fh.hexdigest())
589 else: 622 else:
590 update_hash(" " * len(fh.hexdigest())) 623 update_hash(" " * len(fh.hexdigest()))