def get_taskhash(self, tid, deps, dataCache): data = self.basehash[tid] for dep in self.runtaskdeps[tid]: if dep in self.unihash: if self.unihash[dep] is None: data = data + self.taskhash[dep] else: data = data + self.unihash[dep] else: data = data + self.get_unihash(dep) for (f, cs) in self.file_checksum_values[tid]: if cs: data = data + cs if tid in self.taints: if self.taints[tid].startswith("nostamp:"): data = data + self.taints[tid][8:] else: data = data + self.taints[tid] h = hashlib.sha256(data.encode("utf-8")).hexdigest() self.taskhash[tid] = h #d.setVar("BB_TASKHASH_task-%s" % task, taskhash[task]) return h
def get_taskhash(self, fn, task, deps, dataCache): mc = '' if fn.startswith('multiconfig:'): mc = fn.split(':')[1] k = fn + "." + task data = dataCache.basetaskhash[k] self.basehash[k] = data self.runtaskdeps[k] = [] self.file_checksum_values[k] = [] recipename = dataCache.pkg_fn[fn] for dep in sorted(deps, key=clean_basepath): pkgname = self.pkgnameextract.search(dep).group('fn') if mc: depmc = pkgname.split(':')[1] if mc != depmc: continue depname = dataCache.pkg_fn[pkgname] if not self.rundep_check(fn, recipename, task, dep, depname, dataCache): continue if dep not in self.taskhash: bb.fatal( "%s is not in taskhash, caller isn't calling in dependency order?", dep) data = data + self.taskhash[dep] self.runtaskdeps[k].append(dep) if task in dataCache.file_checksums[fn]: if self.checksum_cache: checksums = self.checksum_cache.get_checksums( dataCache.file_checksums[fn][task], recipename) else: checksums = bb.fetch2.get_file_checksums( dataCache.file_checksums[fn][task], recipename) for (f, cs) in checksums: self.file_checksum_values[k].append((f, cs)) if cs: data = data + cs taskdep = dataCache.task_deps[fn] if 'nostamp' in taskdep and task in taskdep['nostamp']: # Nostamp tasks need an implicit taint so that they force any dependent tasks to run import uuid taint = str(uuid.uuid4()) data = data + taint self.taints[k] = "nostamp:" + taint taint = self.read_taint(fn, task, dataCache.stamp[fn]) if taint: data = data + taint self.taints[k] = taint logger.warning("%s is tainted from a forced run" % k) h = hashlib.md5(data.encode("utf-8")).hexdigest() self.taskhash[k] = h #d.setVar("BB_TASKHASH_task-%s" % task, taskhash[task]) return h
def get_taskhash(self, tid, deps, dataCache): (mc, _, task, fn) = bb.runqueue.split_tid_mcfn(tid) data = dataCache.basetaskhash[tid] self.basehash[tid] = data self.runtaskdeps[tid] = [] self.file_checksum_values[tid] = [] recipename = dataCache.pkg_fn[fn] for dep in sorted(deps, key=clean_basepath): (depmc, _, deptaskname, depfn) = bb.runqueue.split_tid_mcfn(dep) if mc != depmc: continue depname = dataCache.pkg_fn[depfn] if not self.rundep_check(fn, recipename, task, dep, depname, dataCache): continue if dep not in self.taskhash: bb.fatal( "%s is not in taskhash, caller isn't calling in dependency order?" % dep) data = data + self.get_unihash(dep) self.runtaskdeps[tid].append(dep) if task in dataCache.file_checksums[fn]: if self.checksum_cache: checksums = self.checksum_cache.get_checksums( dataCache.file_checksums[fn][task], recipename) else: checksums = bb.fetch2.get_file_checksums( dataCache.file_checksums[fn][task], recipename) for (f, cs) in checksums: self.file_checksum_values[tid].append((f, cs)) if cs: data = data + cs taskdep = dataCache.task_deps[fn] if 'nostamp' in taskdep and task in taskdep['nostamp']: # Nostamp tasks need an implicit taint so that they force any dependent tasks to run if tid in self.taints and self.taints[tid].startswith("nostamp:"): # Don't reset taint value upon every call data = data + self.taints[tid][8:] else: import uuid taint = str(uuid.uuid4()) data = data + taint self.taints[tid] = "nostamp:" + taint taint = self.read_taint(fn, task, dataCache.stamp[fn]) if taint: data = data + taint self.taints[tid] = taint logger.warning("%s is tainted from a forced run" % tid) h = hashlib.sha256(data.encode("utf-8")).hexdigest() self.taskhash[tid] = h #d.setVar("BB_TASKHASH_task-%s" % task, taskhash[task]) return h
def get_taskhash(self, fn, task, deps, dataCache): mc = '' if fn.startswith('multiconfig:'): mc = fn.split(':')[1] k = fn + "." + task data = dataCache.basetaskhash[k] self.basehash[k] = data self.runtaskdeps[k] = [] self.file_checksum_values[k] = [] recipename = dataCache.pkg_fn[fn] for dep in sorted(deps, key=clean_basepath): pkgname = self.pkgnameextract.search(dep).group('fn') if mc: depmc = pkgname.split(':')[1] if mc != depmc: continue if dep.startswith("multiconfig:") and not mc: continue depname = dataCache.pkg_fn[pkgname] if not self.rundep_check(fn, recipename, task, dep, depname, dataCache): continue if dep not in self.taskhash: bb.fatal("%s is not in taskhash, caller isn't calling in dependency order?" % dep) data = data + self.get_unihash(dep) self.runtaskdeps[k].append(dep) if task in dataCache.file_checksums[fn]: if self.checksum_cache: checksums = self.checksum_cache.get_checksums(dataCache.file_checksums[fn][task], recipename) else: checksums = bb.fetch2.get_file_checksums(dataCache.file_checksums[fn][task], recipename) for (f,cs) in checksums: self.file_checksum_values[k].append((f,cs)) if cs: data = data + cs taskdep = dataCache.task_deps[fn] if 'nostamp' in taskdep and task in taskdep['nostamp']: # Nostamp tasks need an implicit taint so that they force any dependent tasks to run import uuid taint = str(uuid.uuid4()) data = data + taint self.taints[k] = "nostamp:" + taint taint = self.read_taint(fn, task, dataCache.stamp[fn]) if taint: data = data + taint self.taints[k] = taint logger.warning("%s is tainted from a forced run" % k) h = hashlib.sha256(data.encode("utf-8")).hexdigest() self.taskhash[k] = h #d.setVar("BB_TASKHASH_task-%s" % task, taskhash[task]) return h
def _build_data(self, fn, d): ignore_mismatch = ((d.getVar("BB_HASH_IGNORE_MISMATCH") or '') == '1') tasklist, gendeps, lookupcache = bb.data.generate_dependencies(d) taskdeps = {} basehash = {} for task in tasklist: data = lookupcache[task] if data is None: bb.error("Task %s from %s seems to be empty?!" % (task, fn)) data = '' gendeps[task] -= self.basewhitelist newdeps = gendeps[task] seen = set() while newdeps: nextdeps = newdeps seen |= nextdeps newdeps = set() for dep in nextdeps: if dep in self.basewhitelist: continue gendeps[dep] -= self.basewhitelist newdeps |= gendeps[dep] newdeps -= seen alldeps = sorted(seen) for dep in alldeps: data = data + dep var = lookupcache[dep] if var is not None: data = data + str(var) datahash = hashlib.md5(data.encode("utf-8")).hexdigest() k = fn + "." + task if not ignore_mismatch and k in self.basehash and self.basehash[ k] != datahash: bb.error( "When reparsing %s, the basehash value changed from %s to %s. The metadata is not deterministic and this needs to be fixed." % (k, self.basehash[k], datahash)) self.basehash[k] = datahash taskdeps[task] = alldeps self.taskdeps[fn] = taskdeps self.gendeps[fn] = gendeps self.lookupcache[fn] = lookupcache return taskdeps
def calc_taskhash(sigdata): data = sigdata['basehash'] for dep in sigdata['runtaskdeps']: data = data + sigdata['runtaskhashes'][dep] for c in sigdata['file_checksum_values']: data = data + c[1] if 'taint' in sigdata: if 'nostamp:' in sigdata['taint']: data = data + sigdata['taint'][8:] else: data = data + sigdata['taint'] return hashlib.md5(data.encode("utf-8")).hexdigest()
def _build_data(self, fn, d): ignore_mismatch = ((d.getVar("BB_HASH_IGNORE_MISMATCH") or '') == '1') tasklist, gendeps, lookupcache = bb.data.generate_dependencies(d) taskdeps = {} basehash = {} for task in tasklist: data = lookupcache[task] if data is None: bb.error("Task %s from %s seems to be empty?!" % (task, fn)) data = '' gendeps[task] -= self.basewhitelist newdeps = gendeps[task] seen = set() while newdeps: nextdeps = newdeps seen |= nextdeps newdeps = set() for dep in nextdeps: if dep in self.basewhitelist: continue gendeps[dep] -= self.basewhitelist newdeps |= gendeps[dep] newdeps -= seen alldeps = sorted(seen) for dep in alldeps: data = data + dep var = lookupcache[dep] if var is not None: data = data + str(var) datahash = hashlib.md5(data.encode("utf-8")).hexdigest() k = fn + "." + task if not ignore_mismatch and k in self.basehash and self.basehash[k] != datahash: bb.error("When reparsing %s, the basehash value changed from %s to %s. The metadata is not deterministic and this needs to be fixed." % (k, self.basehash[k], datahash)) self.basehash[k] = datahash taskdeps[task] = alldeps self.taskdeps[fn] = taskdeps self.gendeps[fn] = gendeps self.lookupcache[fn] = lookupcache return taskdeps
def _build_data(self, fn, d): tasklist, gendeps, lookupcache = bb.data.generate_dependencies(d) taskdeps = {} basehash = {} for task in tasklist: data = lookupcache[task] if data is None: bb.error("Task %s from %s seems to be empty?!" % (task, fn)) data = '' gendeps[task] -= self.basewhitelist newdeps = gendeps[task] seen = set() while newdeps: nextdeps = newdeps seen |= nextdeps newdeps = set() for dep in nextdeps: if dep in self.basewhitelist: continue gendeps[dep] -= self.basewhitelist newdeps |= gendeps[dep] newdeps -= seen alldeps = sorted(seen) for dep in alldeps: data = data + dep var = lookupcache[dep] if var is not None: data = data + str(var) self.basehash[fn + "." + task] = hashlib.md5( data.encode("utf-8")).hexdigest() taskdeps[task] = alldeps self.taskdeps[fn] = taskdeps self.gendeps[fn] = gendeps self.lookupcache[fn] = lookupcache return taskdeps
def _build_data(self, fn, d): tasklist, gendeps, lookupcache = bb.data.generate_dependencies(d) taskdeps = {} basehash = {} for task in tasklist: data = lookupcache[task] if data is None: bb.error("Task %s from %s seems to be empty?!" % (task, fn)) data = '' gendeps[task] -= self.basewhitelist newdeps = gendeps[task] seen = set() while newdeps: nextdeps = newdeps seen |= nextdeps newdeps = set() for dep in nextdeps: if dep in self.basewhitelist: continue gendeps[dep] -= self.basewhitelist newdeps |= gendeps[dep] newdeps -= seen alldeps = sorted(seen) for dep in alldeps: data = data + dep var = lookupcache[dep] if var is not None: data = data + str(var) self.basehash[fn + "." + task] = hashlib.md5(data.encode("utf-8")).hexdigest() taskdeps[task] = alldeps self.taskdeps[fn] = taskdeps self.gendeps[fn] = gendeps self.lookupcache[fn] = lookupcache return taskdeps