File 0001-add-special-SUSE-Tagger.patch of Package tito
From cefbbb319f463a7a3dbf38564d9e33d63acc3dfe Mon Sep 17 00:00:00 2001
From: Michael Calmer <mc@suse.de>
Date: Sat, 5 Mar 2016 17:33:48 +0100
Subject: [PATCH 1/9] add special SUSE Tagger
---
src/tito/tagger/__init__.py | 1 +
src/tito/tagger/susetagger.py | 189 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 190 insertions(+)
create mode 100644 src/tito/tagger/susetagger.py
diff --git a/src/tito/tagger/__init__.py b/src/tito/tagger/__init__.py
index f8c6847..cead80f 100644
--- a/src/tito/tagger/__init__.py
+++ b/src/tito/tagger/__init__.py
@@ -8,3 +8,4 @@
from tito.tagger.rheltagger import RHELTagger
from tito.tagger.zstreamtagger import zStreamTagger
from tito.tagger.cargobump import CargoBump
+from tito.tagger.susetagger import SUSETagger
diff --git a/src/tito/tagger/susetagger.py b/src/tito/tagger/susetagger.py
new file mode 100644
index 0000000..f9cc668
--- /dev/null
+++ b/src/tito/tagger/susetagger.py
@@ -0,0 +1,192 @@
+# Copyright (c) 2012 SUSE Linux Products GmbH
+#
+# This software is licensed to you under the GNU General Public License,
+# version 2 (GPLv2). There is NO WARRANTY for this software, express or
+# implied, including the implied warranties of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+# along with this software; if not, see
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+"""
+Code for tagging packages in SUSE Style.
+"""
+import os
+import re
+try:
+ from StringIO import StringIO
+except ImportError:
+ from io import StringIO
+import shutil
+import subprocess
+import tempfile
+import textwrap
+from tito.common import (run_command, get_latest_tagged_version)
+from tito.tagger import VersionTagger
+
+from time import strftime
+
+class SUSETagger(VersionTagger):
+ """
+ Tagger which is based on VersionTagger and use SUSE format of Changelog
+ and SUSE specific changes file:
+
+ If you want it put in tito.pros (global) or localy in build.py.props:
+ [buildconfig]
+ tagger = tito.susetagger.SUSETagger
+ """
+
+ def __init__(self, config=None, keep_version=False, offline=False, user_config=None):
+ VersionTagger.__init__(self, config=config, keep_version=keep_version,
+ offline=offline, user_config=user_config)
+ self.today = strftime("%a %b %d %T %Z %Y")
+ self.changes_file_name = self.spec_file_name.replace('.spec', '.changes')
+ self.changes_file = os.path.join(self.full_project_dir,
+ self.changes_file_name)
+ self._new_changelog_msg = "Initial package release"
+ self.changelog_regex = re.compile('^%s\s-\s%s' % (self.today, self.git_email))
+
+ def _make_changelog(self):
+ """
+ Create a new changelog entry in the changes, with line items from git
+ """
+ if self._no_auto_changelog:
+ debug("Skipping changelog generation.")
+ return
+
+ in_f = open(self.changes_file, 'r')
+ out_f = open(self.changes_file + ".new", 'w')
+
+
+ old_version = get_latest_tagged_version(self.project_name)
+
+ # don't die if this is a new package with no history
+ if old_version != None:
+ last_tag = "%s-%s" % (self.project_name, old_version)
+ output = self._generate_default_changelog(last_tag)
+ else:
+ output = self._new_changelog_msg
+
+ fd, name = tempfile.mkstemp()
+ os.write(fd, "# Create your changelog entry below:\n")
+ header = "-------------------------------------------------------------------\n"
+ header = header + "%s - %s\n\n" % (self.today, self.git_email)
+
+ os.write(fd, header)
+
+ for cmd_out in output.split("\n"):
+ os.write(fd, "- ")
+ os.write(fd, "\n ".join(textwrap.wrap(cmd_out, 77)))
+ os.write(fd, "\n")
+
+ os.write(fd, "\n")
+
+ if not self._accept_auto_changelog:
+ os.write(fd, "###################################################\n")
+ os.write(fd, "# These are the already existing changelog entries:\n")
+ os.write(fd, "###################################################\n")
+ for line in in_f.readlines():
+ os.write(fd, "#" + line)
+ in_f.seek(0, 0)
+
+ # Give the user a chance to edit the generated changelog:
+ editor = 'vi'
+ if "EDITOR" in os.environ:
+ editor = os.environ["EDITOR"]
+ subprocess.call([editor, name])
+
+ os.lseek(fd, 0, 0)
+ file = os.fdopen(fd)
+
+ for line in file.readlines():
+ if not line.startswith("#"):
+ out_f.write(line)
+
+ output = file.read()
+
+ file.close()
+ os.unlink(name)
+
+ for line in in_f.readlines():
+ out_f.write(line)
+
+ in_f.close()
+ out_f.close()
+
+ shutil.move(self.changes_file + ".new", self.changes_file)
+
+ def _update_changelog(self, new_version):
+ """
+ Update the changelog with the new version.
+ """
+ # Not thrilled about having to re-read the file here but we need to
+ # check for the changelog entry before making any modifications, then
+ # bump the version, then update the changelog.
+ f = open(self.changes_file, 'r')
+ buf = StringIO()
+ found_match = False
+ done = False
+ empty_line_regex = re.compile('^\s*$')
+
+ for line in f.readlines():
+ if not done and not found_match and self.changelog_regex.match(line):
+ buf.write(line)
+ found_match = True
+ elif not done and found_match and empty_line_regex.match(line):
+ buf.write("\n- version %s\n" % new_version)
+ done = True
+ else:
+ buf.write(line)
+ f.close()
+
+ # Write out the new file contents with our modified changelog entry:
+ f = open(self.changes_file, 'w')
+ f.write(buf.getvalue())
+ f.close()
+ buf.close()
+
+ def _update_package_metadata(self, new_version):
+ """
+ We track package metadata in the rel-eng/packages/ directory. Each
+ file here stores the latest package version (for the git branch you
+ are on) as well as the relative path to the project's code. (from the
+ git root)
+ """
+ self._clear_package_metadata()
+
+ suffix = ""
+ # If global config specifies a tag suffix, use it:
+ if self.config.has_option("globalconfig", "tag_suffix"):
+ suffix = self.config.get("globalconfig", "tag_suffix")
+
+ new_version_w_suffix = "%s%s" % (new_version, suffix)
+ # Write out our package metadata:
+ metadata_file = os.path.join(self.rel_eng_dir, "packages",
+ self.project_name)
+ f = open(metadata_file, 'w')
+ f.write("%s %s\n" % (new_version_w_suffix, self.relative_project_dir))
+ f.close()
+
+ # Git add it (in case it's a new file):
+ run_command("git add %s" % metadata_file)
+ run_command("git add %s" % os.path.join(self.full_project_dir,
+ self.spec_file_name))
+ if not self._no_auto_changelog:
+ run_command("git add %s" % os.path.join(self.full_project_dir,
+ self.changes_file_name))
+
+ run_command('git commit -m "Automatic commit of package ' +
+ '[%s] %s [%s]."' % (self.project_name, self.release_type(),
+ new_version_w_suffix))
+
+ tag_msg = "Tagging package [%s] version [%s] in directory [%s]." % \
+ (self.project_name, new_version_w_suffix,
+ self.relative_project_dir)
+
+ new_tag = self._get_new_tag(new_version)
+ run_command('git tag -m "%s" %s' % (tag_msg, new_tag))
+ print
+ print("Created tag: %s" % new_tag)
+ print(" View: git show HEAD")
+ print(" Undo: tito tag -u")
+ print(" Push: git push origin HEAD && git push origin %s" % new_tag)
+ print("or Push: git push origin HEAD && git push origin --tags")
+
--
2.13.5