Skip to contentSkip to conversation

Signature generation for bitbake-diffsigs

PATCH New Paul Eggleton 1 participant 2 messages Aug 27, 2012

lore
Share & tools
lore
#0 lore raw

cover Signature generation for bitbake-diffsigs

This is the OE-Core part of the changes for bitbake-diffsigs just posted to the bitbake-devel mailing list.

The following change since commit 1677b736bca5dc46db522da1874459d2de77209d:

terminal.py: use unique ids for screen sessions (2012-08-25 14:44:31 +0100)

is available in the git repository at:

git://git.openembedded.org/openembedded-core-contrib paule/bbdiffsigs-oe
http://cgit.openembedded.org/cgit.cgi/openembedded-core-contrib/log/?h=paule/bbdiffsigs-oe

Paul Eggleton (1):
lib/oe/sstatesig.py: add signature data query function

 meta/lib/oe/sstatesig.py |   81 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 81 insertions(+)
Signature · 1 line
1.7.9.5
#1 lore raw

PATCH 1/1 lib/oe/sstatesig.py: add signature data query function

Add a function that can be used from BitBake code which will find signature data (sigdata/siginfo) files based on specified criteria, and hook it into BitBake as bb.siggen.find_siginfo.

---
 meta/lib/oe/sstatesig.py |   81 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 81 insertions(+)
meta/lib/oe/sstatesig.py +81 -0
index 20d94b2..749029b 100644
@@ -74,3 +74,84 @@ class SignatureGeneratorOEBasicHash(bb.siggen.SignatureGeneratorBasicHash):
 # Insert these classes into siggen's namespace so it can see and select them
 bb.siggen.SignatureGeneratorOEBasic = SignatureGeneratorOEBasic
 bb.siggen.SignatureGeneratorOEBasicHash = SignatureGeneratorOEBasicHash
+
+
+def find_siginfo(pn, taskname, taskhashlist, d):
+    """ Find signature data files for comparison purposes """
+
+    import fnmatch
+
+    if taskhashlist:
+        hashfiles = {}
+
+    if not taskname:
+        # We have to derive pn and taskname
+        key = pn
+        splitit = key.split('.bb.')
+        taskname = splitit[1]
+        pn = os.path.basename(splitit[0]).split('_')[0]
+        if key.startswith('virtual:native:'):
+            pn = pn + '-native'
+
+    # First search in stamps dir
+    stampdir = d.getVar('TMPDIR', True) + '/stamps'
+    filespec = '%s-*.%s.sigdata.*' % (pn, taskname)
+    filedates = {}
+    foundall = False
+    for root, dirs, files in os.walk(stampdir):
+        for fn in files:
+            if fnmatch.fnmatch(fn, filespec):
+                fullpath = os.path.join(root, fn)
+                match = False
+                if taskhashlist:
+                    for taskhash in taskhashlist:
+                        if fn.endswith('.%s' % taskhash):
+                            hashfiles[taskhash] = fullpath
+                            if len(hashfiles) == len(taskhashlist):
+                                foundall = True
+                                break
+                else:
+                    filedates[fullpath] = os.stat(fullpath).st_mtime
+        if foundall:
+            break
+
+    if len(filedates) < 2 and not foundall:
+        # That didn't work, look in sstate-cache
+        hashes = taskhashlist or ['*']
+        localdata = bb.data.createCopy(d)
+        for hashval in hashes:
+            localdata.setVar('PACKAGE_ARCH', '*')
+            localdata.setVar('TARGET_VENDOR', '*')
+            localdata.setVar('TARGET_OS', '*')
+            localdata.setVar('PN', pn)
+            localdata.setVar('PV', '*')
+            localdata.setVar('PR', '*')
+            localdata.setVar('BB_TASKHASH', hashval)
+            if pn.endswith('-native') or pn.endswith('-crosssdk') or pn.endswith('-cross'):
+                localdata.setVar('SSTATE_EXTRAPATH', "${NATIVELSBSTRING}/")
+            sstatename = d.getVarFlag(taskname, "sstate-name")
+            if not sstatename:
+                sstatename = taskname
+            filespec = '%s_%s.*.siginfo' % (localdata.getVar('SSTATE_PKG', True), sstatename)
+
+            if hashval != '*':
+                sstatedir = "%s/%s" % (d.getVar('SSTATE_DIR', True), hashval[:2])
+            else:
+                sstatedir = d.getVar('SSTATE_DIR', True)
+
+            filedates = {}
+            for root, dirs, files in os.walk(sstatedir):
+                for fn in files:
+                    fullpath = os.path.join(root, fn)
+                    if fnmatch.fnmatch(fullpath, filespec):
+                        if taskhashlist:
+                            hashfiles[hashval] = fullpath
+                        else:
+                            filedates[fullpath] = os.stat(fullpath).st_mtime
+
+    if taskhashlist:
+        return hashfiles
+    else:
+        return filedates
+
+bb.siggen.find_siginfo = find_siginfo
Signature · 1 line
1.7.9.5