Patchwork [PATCHv2] buildhistory: record tag names and show warning when the same tag corresponds to different revision

login
register
mail settings
Submitter Martin Jansa
Date April 3, 2013, 8:49 a.m.
Message ID <1364978976-18388-1-git-send-email-Martin.Jansa@gmail.com>
Download mbox | patch
Permalink /patch/47325/
State Accepted
Commit 0bc22ed6bd67031749e8f2cb5415dabf933eef56
Headers show

Comments

Martin Jansa - April 3, 2013, 8:49 a.m.
* persistent cache records tag-srcrev mappings, but is not shared between builders
* when tag is moved in remote repo, all builders should rebuild the component to
  use the same source, show warning when revision is different than what was used
  in last build

Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
---
 meta/classes/buildhistory.bbclass | 29 +++++++++++++++++++++++++----
 1 file changed, 25 insertions(+), 4 deletions(-)
Paul Eggleton - April 3, 2013, 4:45 p.m.
On Wednesday 03 April 2013 10:49:36 Martin Jansa wrote:
> * persistent cache records tag-srcrev mappings, but is not shared between
> builders 
> * when tag is moved in remote repo, all builders should rebuild
> the component to use the same source, show warning when revision is
> different than what was used in last build
> 
> Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
> ---
>  meta/classes/buildhistory.bbclass | 29 +++++++++++++++++++++++++----
>  1 file changed, 25 insertions(+), 4 deletions(-)
> 
> diff --git a/meta/classes/buildhistory.bbclass
> b/meta/classes/buildhistory.bbclass index 82d0bf8..8c9f794 100644
> --- a/meta/classes/buildhistory.bbclass
> +++ b/meta/classes/buildhistory.bbclass
> @@ -538,24 +538,38 @@ def _get_srcrev_values(d):
>              scms.append(u)
> 
>      autoinc_templ = 'AUTOINC+'
> -    dict = {}
> +    dict_srcrevs = {}
> +    dict_tag_srcrevs = {}
>      for scm in scms:
>          ud = urldata[scm]
>          for name in ud.names:
>              rev = ud.method.sortable_revision(scm, ud, d, name)
>              if rev.startswith(autoinc_templ):
>                  rev = rev[len(autoinc_templ):]
> -            dict[name] = rev
> -    return dict
> +            dict_srcrevs[name] = rev
> +            if 'tag' in ud.parm:
> +                tag = ud.parm['tag'];
> +                key = name+'_'+tag
> +                dict_tag_srcrevs[key] = rev
> +    return (dict_srcrevs, dict_tag_srcrevs)
> 
>  python do_write_srcrev() {
>      pkghistdir = d.getVar('BUILDHISTORY_DIR_PACKAGE', True)
>      srcrevfile = os.path.join(pkghistdir, 'latest_srcrev')
> 
> -    srcrevs = _get_srcrev_values(d)
> +    srcrevs, tag_srcrevs = _get_srcrev_values(d)
>      if srcrevs:
>          if not os.path.exists(pkghistdir):
>              os.makedirs(pkghistdir)
> +        old_tag_srcrevs = {}
> +        if os.path.exists(srcrevfile):
> +            with open(srcrevfile) as f:
> +                for line in f:
> +                    if line.startswith('# tag_'):
> +                        key, value = line.split("=", 1)
> +                        key = key.replace('# tag_', '').strip()
> +                        value = value.replace('"', '').strip()
> +                        old_tag_srcrevs[key] = value
>          with open(srcrevfile, 'w') as f:
>              orig_srcrev = d.getVar('SRCREV', False) or 'INVALID'
>              if orig_srcrev != 'INVALID':
> @@ -568,6 +582,13 @@ python do_write_srcrev() {
>                      f.write('SRCREV_%s = "%s"\n' % (name, srcrev))
>              else:
>                  f.write('SRCREV = "%s"\n' % srcrevs.itervalues().next())
> +            if len(tag_srcrevs) > 0:
> +                for name, srcrev in tag_srcrevs.items():
> +                    f.write('# tag_%s = "%s"\n' % (name, srcrev))
> +                    if name in old_tag_srcrevs and old_tag_srcrevs[name] !=
> srcrev: +                        pkg = d.getVar('PN', True)
> +                        bb.warn("Revision for tag %s in package %s was
> changed since last build (from %s to %s)" % (name, pkg,
> old_tag_srcrevs[name], srcrev)) +
>      else:
>          if os.path.exists(srcrevfile):
>              os.remove(srcrevfile)

Acked-by: Paul Eggleton <paul.eggleton@linux.intel.com>

Cheers,
Paul

Patch

diff --git a/meta/classes/buildhistory.bbclass b/meta/classes/buildhistory.bbclass
index 82d0bf8..8c9f794 100644
--- a/meta/classes/buildhistory.bbclass
+++ b/meta/classes/buildhistory.bbclass
@@ -538,24 +538,38 @@  def _get_srcrev_values(d):
             scms.append(u)
 
     autoinc_templ = 'AUTOINC+'
-    dict = {}
+    dict_srcrevs = {}
+    dict_tag_srcrevs = {}
     for scm in scms:
         ud = urldata[scm]
         for name in ud.names:
             rev = ud.method.sortable_revision(scm, ud, d, name)
             if rev.startswith(autoinc_templ):
                 rev = rev[len(autoinc_templ):]
-            dict[name] = rev
-    return dict
+            dict_srcrevs[name] = rev
+            if 'tag' in ud.parm:
+                tag = ud.parm['tag'];
+                key = name+'_'+tag
+                dict_tag_srcrevs[key] = rev
+    return (dict_srcrevs, dict_tag_srcrevs)
 
 python do_write_srcrev() {
     pkghistdir = d.getVar('BUILDHISTORY_DIR_PACKAGE', True)
     srcrevfile = os.path.join(pkghistdir, 'latest_srcrev')
 
-    srcrevs = _get_srcrev_values(d)
+    srcrevs, tag_srcrevs = _get_srcrev_values(d)
     if srcrevs:
         if not os.path.exists(pkghistdir):
             os.makedirs(pkghistdir)
+        old_tag_srcrevs = {}
+        if os.path.exists(srcrevfile):
+            with open(srcrevfile) as f:
+                for line in f:
+                    if line.startswith('# tag_'):
+                        key, value = line.split("=", 1)
+                        key = key.replace('# tag_', '').strip()
+                        value = value.replace('"', '').strip()
+                        old_tag_srcrevs[key] = value
         with open(srcrevfile, 'w') as f:
             orig_srcrev = d.getVar('SRCREV', False) or 'INVALID'
             if orig_srcrev != 'INVALID':
@@ -568,6 +582,13 @@  python do_write_srcrev() {
                     f.write('SRCREV_%s = "%s"\n' % (name, srcrev))
             else:
                 f.write('SRCREV = "%s"\n' % srcrevs.itervalues().next())
+            if len(tag_srcrevs) > 0:
+                for name, srcrev in tag_srcrevs.items():
+                    f.write('# tag_%s = "%s"\n' % (name, srcrev))
+                    if name in old_tag_srcrevs and old_tag_srcrevs[name] != srcrev:
+                        pkg = d.getVar('PN', True)
+                        bb.warn("Revision for tag %s in package %s was changed since last build (from %s to %s)" % (name, pkg, old_tag_srcrevs[name], srcrev))
+
     else:
         if os.path.exists(srcrevfile):
             os.remove(srcrevfile)