meta-yadro: os-release: Add vendor/product info

Update the os-release generation script to set the welcome
string and the version according to the product name, branch name,
and vendor tags for all YADRO products.

(From meta-yadro rev: 5d28cfe0b0de03abd61707a013e63087e7ad18fd)

Signed-off-by: Alexander Amelkin <a.amelkin@yadro.com>
Change-Id: Ib8b6fd3d252c974fa3cdd2a703480dbd43cc9e0b
Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
diff --git a/meta-yadro/recipes-core/os-release/os-release.bbappend b/meta-yadro/recipes-core/os-release/os-release.bbappend
new file mode 100644
index 0000000..ae1e955
--- /dev/null
+++ b/meta-yadro/recipes-core/os-release/os-release.bbappend
@@ -0,0 +1,129 @@
+# This recipe append assumes that all YADRO branches follow the
+# <type>/<product>/<description> convention, or are either
+# "merge/upstream" or "master" e.g.:
+#
+# release/nicole/v1
+# feature/vesnin/some-feature
+# merge/upstream
+# master
+#
+# Release branches (release/<machine>/vX) are expected to be forked off
+# the master branch and may contain tags in the form
+# <machine>-vX.Y[-rcZ|-dev*]. All release branches without machine tags,
+# as well as any non-release branches produce 'Unofficial' builds.
+# So do the release branches with -rc or -dev suffix in the latest tag.
+
+python do_compile_prepend() {
+    print ("Preparing YADRO-specific version information")
+    version_id = d.getVar('VERSION_ID')
+
+    print ('Original VERSION_ID = %s' % version_id)
+
+    versionList = version_id.split('-')
+
+    branch_info = run_git(d, 'rev-parse --abbrev-ref HEAD').split('/')
+    branch_type = branch_info[0]
+
+    if len(branch_info) > 1:
+        branch_product = branch_info[1]
+    else:
+        branch_product = d.getVar('MACHINE', True).split('-')[0]
+
+    if len(branch_info) > 2:
+        # This is for <type>/<product>/<description> branches
+        # and <type>/<product>/<any>/<level>/<of>/<hierarchy> branches alike
+        branch_name = '-'.join(branch_info[2::])
+    else:
+        # This is for "merge/upstream", "master" and any arbitrary branches
+        branch_name = '-'.join(branch_info)
+
+    print ('Branch type = %s' % branch_type)
+    print ('Branch product = %s' % branch_product)
+    print ('Branch name = %s' % branch_name)
+
+    # For <product>-vX.Y tags, simply strip off the '<product>-' part,
+    # then pretend it is a normal version tag
+    product_tagged = False
+    if branch_product == versionList[0]:
+        product_tagged = True
+        versionList.pop(0)
+
+    version = versionList[0] if len(versionList) > 0 else ''
+    if versionList[1][:2] == 'rc' or versionList[1] == 'dev': # Remove the '-rcX' and '-dev' parts
+        rcdev = versionList[1]
+        versionList.pop(1)
+    patch_level = versionList[1] if len(versionList) > 1 else 0
+    git_hash = versionList[2] if len(versionList) > 2 else 'nongit'
+    dirty = ('dirty' == versionList[3]) if len(versionList) > 3 else 0
+
+    # For release branches:
+    if 'release' == branch_type:
+        flag = ''
+        if not product_tagged:
+            # If there is no tag, take branch name for the major version
+            # and assume the minor version to be 0, patch level will
+            # represent the number of commits since branch creation
+            # (assuming that it branched off the master branch)
+            patch_level = run_git(d, 'rev-list --count origin/master..%s'
+                                     % '/'.join(branch_info))
+            # Prevent zero patch level. Zero patch level is an official release.
+            patch_level = str(int(patch_level) + 1)
+            version = branch_name.split('-')[0]
+            version += '.0'
+            # Any build from a release/<product>/* branch without a <product>-* tag
+            # is not an official release
+            release = 'Unofficial ' + branch_name
+            flag = '-unofficial'
+        else:
+            # If there is a product tag, then it is used as the normal tag to
+            # designate the major and minor version, patch level is as usual
+            # the number of commits since the tag.
+            release = version
+            if (rcdev):
+                flag = '-' + rcdev
+                release += flag
+            # Official releases happen only exactly on tags, without extra
+            # commits. Release candidates and development releases are also
+            # not considered 'official'
+            if int(patch_level) or rcdev:
+                release = 'Unofficial ' + release
+                flag += '-unofficial'
+
+        version_id = version
+        version_id += 'r' + git_hash[1:7]
+        version_id += ('p' + patch_level) if int(patch_level) else ''
+        version_id += flag
+        version_id += '-dirty' if dirty else ''
+        name = 'YADRO %s BMC Firmware'
+    else:
+        version_id += ("-" + branch_name) if (branch_name) else ''
+        release = version_id
+        name = 'YADRO %s BMC Development Firmware'
+
+    u_product = branch_product.upper()
+
+    d.setVar('VERSION_ID', version_id)
+    d.setVar('VERSION', version)
+    d.setVar('RELEASE', release)
+    d.setVar('PATCH_LEVEL', patch_level)
+    d.setVar('NAME', '%s' % (name % u_product))
+    d.setVar('PRETTY_NAME', '%s %s' % (name % u_product, release))
+
+    print ('%s VERSION_ID = %s' % (u_product, version_id))
+    print ('%s RELEASE = %s' % (u_product, release))
+    print ('%s PATCH_LEVEL = %s' % (u_product, patch_level))
+}
+
+python do_compile_append () {
+    with open(d.expand('${B}/issue'), 'w') as f:
+        f.write('%s %s @ \\l\n' % (name % u_product, release))
+}
+
+do_install_append () {
+    install -m 0644 issue ${D}${sysconfdir}/issue
+    install -m 0644 issue ${D}${sysconfdir}/issue.net
+}
+
+CONFFILES_${PN} += " ${sysconfdir}/issue ${sysconfdir}/issue.net"
+OS_RELEASE_FIELDS_append = " RELEASE PATCH_LEVEL"
+BB_DONT_CACHE = "1"