Introduce submit-bb tool
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Tue, 16 Dec 2014 17:19:30 +0000 (19:19 +0200)
committerMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Fri, 19 Dec 2014 12:10:43 +0000 (14:10 +0200)
This is a Tizen-specific tool for creating and pushing special submit
tags.

Change-Id: Id014ce2aeced75f6506cd8559adcd787f958e6b4
Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
gbp/config.py
gbp/scripts/submit_bb.py [new file with mode: 0755]

index fd6c32520d966aa6ee2369a0542ba7b7da77e57e..987be05db96e3ffbb7a1b6200e3db5b64a0db028 100644 (file)
@@ -711,6 +711,8 @@ class GbpOptionParserBB(GbpOptionParserRpm):
                        'meta-dir'               : '',
                        'bb-file'                : '',
                        'bb-vcs-info'            : '',
+                       'submit-tag'             : 'submit/%(target)s/%(nowtime)s',
+                       'target'                 : 'tizen',
                      } )
 
     help = dict(GbpOptionParserRpm.help)
@@ -723,6 +725,11 @@ class GbpOptionParserBB(GbpOptionParserRpm):
                    'bb-vcs-info':
                         "Format string for the VCS information automatically "
                         "set in the recipe file, default is '%(bb-vcs-info)s'",
+                   'submit-tag':
+                        "Submit tag format, default is '%(submit-tag)s'",
+                   'target':
+                        "Submit target used in submit tag, default is "
+                        "'%(target)s'",
                  } )
 
 # vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·:
diff --git a/gbp/scripts/submit_bb.py b/gbp/scripts/submit_bb.py
new file mode 100755 (executable)
index 0000000..7edece5
--- /dev/null
@@ -0,0 +1,138 @@
+# vim: set fileencoding=utf-8 :
+#
+# (C) 2014 Intel Corporation <markus.lehtonen@linux.intel.com>
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Create and push submit tag"""
+
+import ConfigParser
+import os
+import sys
+from datetime import datetime
+
+import gbp.log
+from gbp.config import GbpOptionParserBB
+from gbp.errors import GbpError
+from gbp.format import format_msg
+from gbp.git import GitRepository, GitRepositoryError
+
+#   pylint: disable=bad-continuation
+
+
+def guess_remote(repo, options):
+    """Guess remote where to push"""
+    if options.remote:
+        return options.remote
+
+    remotes = repo.get_remotes()
+    if not remotes:
+        raise GbpError("Local repo has no remotes configured. Please add one "
+                       "or use --remote to define the remote where to push.")
+    elif len(remotes) == 1:
+        return remotes.keys()[0]
+    else:
+        raise GbpError("Local repo has multiple remotes (%s). Don't know which "
+                       "one to choose. Use --remote to define where to push." %
+                       ', '.join(remotes.keys()))
+
+
+def build_parser(name):
+    """Build command line parser"""
+    usage_str = "%prog [options] - create and push submit tag"
+    try:
+        parser = GbpOptionParserBB(command=os.path.basename(name), prefix='',
+                                   usage=usage_str)
+    except ConfigParser.ParsingError as err:
+        gbp.log.err(err)
+        return None
+
+    parser.add_option("-v", "--verbose", action="store_true", dest="verbose",
+                        help="verbose command execution")
+    parser.add_config_file_option(option_name="color", dest="color",
+                        type='tristate')
+    parser.add_config_file_option(option_name="color-scheme",
+                        dest="color_scheme")
+    parser.add_option("-m", "--message", dest="message", help="tag message")
+    parser.add_option("-c", "--commit", dest="commit", help="commit to submit",
+                      default='HEAD')
+    parser.add_option("-r", "--remote", dest="remote",
+                        help="remote where to push")
+    parser.add_config_file_option(option_name="submit-tag", dest="submit_tag")
+    parser.add_config_file_option(option_name="target", dest="target")
+    parser.add_boolean_config_file_option(option_name="sign-tags",
+                        dest="sign_tags")
+    parser.add_config_file_option(option_name="keyid", dest="keyid")
+
+    return parser
+
+
+def parse_args(argv):
+    """Parse command line arguments"""
+    parser = build_parser(argv[0])
+    if not parser:
+        return None, None
+    options, args = parser.parse_args(argv)
+
+    gbp.log.setup(options.color, options.verbose, options.color_scheme)
+
+    return (options, args)
+
+
+def main(argv):
+    """Entry point for gbp-submit-bb"""
+    retval = 0
+
+    options, _args = parse_args(argv)
+    if not options:
+        return 1
+
+    try:
+        repo = GitRepository(os.path.curdir)
+    except GitRepositoryError:
+        gbp.log.err("The command must be run under a Git repository")
+        return 1
+
+    try:
+        remote = guess_remote(repo, options)
+
+        tag_fields = {'nowtime': datetime.now().strftime('%Y%m%d.%H%M%S'),
+                      'target': options.target}
+        tag_name = format_msg(options.submit_tag, tag_fields)
+
+        gbp.log.info("Tagging %s" % tag_name)
+        repo.create_tag(tag_name, msg=options.message, commit=options.commit,
+                        sign=options.sign_tags, keyid=options.keyid,
+                        annotate=True)
+
+        gbp.log.info("Pushing to remote %s" % remote)
+        try:
+            repo.push_tag(remote, tag_name)
+        except GitRepositoryError as err:
+            gbp.log.err(err)
+            gbp.log.info("Removing tag %s" % tag_name)
+            repo.delete_tag(tag_name)
+            raise GbpError("Git push failed!")
+
+    except (GbpError, GitRepositoryError) as err:
+        if len(err.__str__()):
+            gbp.log.err(err)
+        retval = 1
+
+    return retval
+
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))
+