Try hotfixing rpmdev-bumpspec for hotness01.stg.
This commit is contained in:
parent
73825e3144
commit
fe6616b446
2 changed files with 343 additions and 1 deletions
336
roles/hotness/files/hotfix/rpmdev-bumpspec
Executable file
336
roles/hotness/files/hotfix/rpmdev-bumpspec
Executable file
|
@ -0,0 +1,336 @@
|
|||
#!/usr/bin/python -tt
|
||||
# -*- mode: Python; indent-tabs-mode: nil; coding: utf-8 -*-
|
||||
#
|
||||
# Copyright (c) 2005-2014 Fedora Project
|
||||
#
|
||||
# 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.
|
||||
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
import textwrap
|
||||
import time
|
||||
from optparse import OptionParser
|
||||
|
||||
|
||||
__version__ = "1.0.13"
|
||||
|
||||
|
||||
class BumpSpecError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class SpecFile:
|
||||
def __init__(self, filename, verbose=False, string=None):
|
||||
self.verbose = verbose
|
||||
self.string = string
|
||||
|
||||
self.filename = filename
|
||||
f = None
|
||||
try:
|
||||
f = open(filename, "r")
|
||||
self.lines = f.readlines()
|
||||
finally:
|
||||
f and f.close()
|
||||
|
||||
# supported release value macro definitions
|
||||
_macro_bump_patterns = (
|
||||
re.compile(r"^%(?:define|global)\s+(?i)release\s+(\d+.*)"),
|
||||
re.compile(r"^%(?:define|global)\s+(?i)baserelease\s+(\d+.*)"),
|
||||
)
|
||||
# normal "Release:" tag lines
|
||||
_tag_bump_patterns = (
|
||||
re.compile(r"^Release\s*:\s*(\d+.*)", re.I),
|
||||
re.compile(r"^Release\s*:\s+%release_func\s+(\d+.*)", re.I),
|
||||
)
|
||||
# lines we don't want to mess with
|
||||
_skip_patterns = (
|
||||
re.compile(r"\$Revision:"),
|
||||
)
|
||||
|
||||
def bumpRelease(self):
|
||||
# remember whether we've bumped a macro definition
|
||||
bumped_macro = False
|
||||
# count how many times/lines we've bumped
|
||||
bumped = 0
|
||||
|
||||
for i in range(len(self.lines)):
|
||||
# If we've bumped a macro, we assume this is enough for
|
||||
# the rest of the spec file, so we don't bump a macro and
|
||||
# a corresponding Release tag. The macro may or may not be
|
||||
# used for the definition of one or more Release tags.
|
||||
# Macro-madness makes that hard to check for.
|
||||
if bumped_macro:
|
||||
break
|
||||
|
||||
skipped = False
|
||||
for pattern in SpecFile._skip_patterns:
|
||||
if pattern.search(self.lines[i]):
|
||||
skipped = True
|
||||
break
|
||||
if skipped:
|
||||
continue
|
||||
|
||||
for pattern in SpecFile._macro_bump_patterns:
|
||||
(self.lines[i], n) = \
|
||||
pattern.subn(self.increase, self.lines[i], 1)
|
||||
if n: # this pattern has lead to a change
|
||||
bumped += 1
|
||||
bumped_macro = True
|
||||
break
|
||||
else: # no pattern matched
|
||||
for pattern in SpecFile._tag_bump_patterns:
|
||||
(self.lines[i], n) = \
|
||||
pattern.subn(self.increase, self.lines[i], 1)
|
||||
if n: # this pattern has lead to a change
|
||||
bumped += 1
|
||||
break
|
||||
else: # no pattern matched at all
|
||||
# Bump ^Release: ... line least-significant.
|
||||
if self.lines[i].lower().startswith('release:'):
|
||||
old = self.lines[i][len('Release:'):].rstrip()
|
||||
new = self.increaseFallback(old)
|
||||
if self.verbose:
|
||||
self.debugdiff(old, new)
|
||||
if old != new:
|
||||
self.lines[i] = self.lines[i].replace(old, new)
|
||||
bumped += 1
|
||||
|
||||
if bumped:
|
||||
return
|
||||
if self.verbose:
|
||||
sys.stderr.write('ERROR: No release value matched: %s\n' %
|
||||
self.filename)
|
||||
sys.exit(1)
|
||||
|
||||
def newVersion(self, vr):
|
||||
rpos = vr.find('-')
|
||||
if rpos >= 0: # set custom Release value
|
||||
r = vr[rpos+1:]
|
||||
v = vr[:rpos]
|
||||
else:
|
||||
r = "1%{?dist}"
|
||||
v = vr
|
||||
for i in range(len(self.lines)):
|
||||
if self.lines[i].lower().startswith('version:'):
|
||||
self.lines[i] = re.sub(
|
||||
r'[^: \t]*$', v, self.lines[i].rstrip()) + '\n'
|
||||
elif self.lines[i].lower().startswith('release:'):
|
||||
self.lines[i] = re.sub(
|
||||
r'[^: \t]*$', r, self.lines[i].rstrip()) + '\n'
|
||||
|
||||
_changelog_pattern = re.compile(r"^%changelog(\s|$)", re.I)
|
||||
|
||||
def addChangelogEntry(self, evr, entry, email):
|
||||
for i in range(len(self.lines)):
|
||||
if SpecFile._changelog_pattern.match(self.lines[i]):
|
||||
if len(evr):
|
||||
evrstring = ' - %s' % evr
|
||||
else:
|
||||
evrstring = ''
|
||||
date = time.strftime("%a %b %d %Y", time.gmtime())
|
||||
newchangelogentry = "* %s %s%s\n%s\n\n" % \
|
||||
(date, email, evrstring, entry)
|
||||
self.lines[i] += newchangelogentry
|
||||
return
|
||||
|
||||
_main_pre_pattern = re.compile(r'^0\.(?P<rel>\d+)(?P<post>.*)')
|
||||
_main_pattern = re.compile(r'^(?P<rel>\d+)(?P<post>.*)')
|
||||
|
||||
def increaseMain(self, release):
|
||||
if release.startswith('0.'):
|
||||
relre = SpecFile._main_pre_pattern
|
||||
pre = True
|
||||
else:
|
||||
relre = SpecFile._main_pattern
|
||||
pre = False
|
||||
relmatch = relre.search(release)
|
||||
if not relmatch: # pattern match failed
|
||||
raise BumpSpecError
|
||||
value = str(int(relmatch.group('rel')) + 1)
|
||||
post = relmatch.group('post')
|
||||
|
||||
new = value + post
|
||||
if not pre:
|
||||
if post.find('rc') >= 0:
|
||||
sys.stderr.write(
|
||||
'WARNING: Bad pre-release versioning scheme: %s\n' %
|
||||
self.filename)
|
||||
raise BumpSpecError
|
||||
else:
|
||||
new = '0.' + new
|
||||
return new
|
||||
|
||||
_jpp_pattern = \
|
||||
re.compile(r'(?P<prefix>.*)(?P<rel>\d+)(?P<jpp>jpp\.)(?P<post>.*)')
|
||||
|
||||
def increaseJPP(self, release):
|
||||
"""Fedora jpackage release versioning scheme"""
|
||||
|
||||
relmatch = SpecFile._jpp_pattern.search(release)
|
||||
if not relmatch: # pattern match failed
|
||||
sys.stderr.write(
|
||||
'WARNING: Bad Fedora jpackage release versioning scheme: %s\n'
|
||||
% self.filename)
|
||||
raise BumpSpecError
|
||||
|
||||
prefix = relmatch.group('prefix')
|
||||
value = int(relmatch.group('rel'))
|
||||
jpp = relmatch.group('jpp')
|
||||
post = relmatch.group('post')
|
||||
|
||||
newpost = self.increaseMain(post)
|
||||
new = prefix+str(value)+jpp+newpost
|
||||
return new
|
||||
|
||||
def increaseFallback(self, release):
|
||||
"""bump trailing .<self.string><DIGIT> or add .<self.string>1"""
|
||||
string = self.string
|
||||
if string is None:
|
||||
string = ""
|
||||
relre = re.compile(r'(?P<prefix>.+\.)' + re.escape(string) +
|
||||
r'(?P<post>\d+$)')
|
||||
relmatch = relre.search(release)
|
||||
if relmatch:
|
||||
prefix = relmatch.group('prefix')
|
||||
post = relmatch.group('post')
|
||||
new = prefix + string + self.increaseMain(post)
|
||||
else:
|
||||
new = release.rstrip() + '.' + string + '1'
|
||||
return new
|
||||
|
||||
def increase(self, match):
|
||||
old = match.group(1) # only the release value
|
||||
try:
|
||||
if self.string is not None:
|
||||
new = self.increaseFallback(old)
|
||||
elif old.find('jpp') > 0:
|
||||
new = self.increaseJPP(old)
|
||||
else:
|
||||
new = self.increaseMain(old)
|
||||
except BumpSpecError:
|
||||
new = self.increaseFallback(old)
|
||||
if self.verbose:
|
||||
self.debugdiff(old, new)
|
||||
# group 0 is the full line that defines the release
|
||||
return match.group(0).replace(old, new)
|
||||
|
||||
def writeFile(self, filename):
|
||||
f = open(filename, "w")
|
||||
f.writelines(self.lines)
|
||||
f.close()
|
||||
|
||||
def debugdiff(self, old, new):
|
||||
print ('%s\n-%s\n+%s\n' % (self.filename, old, new))
|
||||
|
||||
if __name__ == "__main__":
|
||||
usage = '''Usage: %prog [OPTION]... SPECFILE...
|
||||
|
||||
rpmdev-bumpspec bumps release tags in specfiles.'''
|
||||
|
||||
version = '''rpmdev-bumpspec version %s
|
||||
|
||||
Copyright (c) 2005-2014 Fedora Project
|
||||
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.''' % __version__
|
||||
|
||||
userstring = subprocess.Popen("rpmdev-packager 2>/dev/null", shell=True,
|
||||
stdout=subprocess.PIPE).communicate()[0]
|
||||
if sys.version_info[0] > 2:
|
||||
userstring = userstring.decode(errors='replace')
|
||||
userstring = userstring.strip() or None
|
||||
|
||||
parser = OptionParser(usage=usage)
|
||||
parser.add_option("-c", "--comment",
|
||||
help="changelog comment (default: \"- rebuilt\")")
|
||||
parser.add_option("-u", "--userstring", default=userstring,
|
||||
help="user name+email string (default: output from "
|
||||
"rpmdev-packager(1))")
|
||||
parser.add_option("-r", "--rightmost", default=False, action='store_true',
|
||||
help="bump trailing .<DIGIT> component if found, "
|
||||
"append .1 if not; no-op if -s is specified")
|
||||
parser.add_option("-s", "--string", default=None,
|
||||
help="bump trailing .STRING<DIGIT> component if found, "
|
||||
"append .STRING1 if not; trumps -r")
|
||||
parser.add_option("-n", "--new",
|
||||
help="set new version and reset/set release "
|
||||
"(simple spec files only)")
|
||||
parser.add_option("-V", "--verbose", default=False, action='store_true',
|
||||
help="more output")
|
||||
parser.add_option("-v", "--version", default=False, action='store_true',
|
||||
help="output version number and exit")
|
||||
(opts, args) = parser.parse_args()
|
||||
|
||||
if opts.version:
|
||||
print (version)
|
||||
sys.exit(0)
|
||||
|
||||
if not args:
|
||||
parser.error('No specfiles specified')
|
||||
|
||||
if not opts.userstring:
|
||||
parser.error('Userstring required, see option -u')
|
||||
|
||||
if not opts.comment:
|
||||
opts.comment = '- new version' if opts.new else '- rebuilt'
|
||||
|
||||
# Grab bullet, insert one if not found.
|
||||
bullet_re = re.compile(r'^([^\s\w])\s', re.UNICODE)
|
||||
bullet = "-"
|
||||
match = bullet_re.search(opts.comment)
|
||||
if match:
|
||||
bullet = match.group(1)
|
||||
else:
|
||||
opts.comment = bullet + " " + opts.comment
|
||||
|
||||
# Format comment.
|
||||
if opts.comment.find("\n") == -1:
|
||||
wrapopts = {"subsequent_indent": (len(bullet)+1) * " ",
|
||||
"break_long_words": False}
|
||||
if sys.version_info[:2] > (2, 5):
|
||||
wrapopts["break_on_hyphens"] = False
|
||||
opts.comment = textwrap.fill(opts.comment, 80, **wrapopts)
|
||||
|
||||
# Prepare release component string.
|
||||
string = opts.string
|
||||
if string is None and opts.rightmost:
|
||||
string = ""
|
||||
|
||||
for aspec in args:
|
||||
try:
|
||||
s = SpecFile(aspec, opts.verbose, string)
|
||||
except:
|
||||
# Not actually a parser error, but... meh.
|
||||
parser.error(sys.exc_info()[1])
|
||||
if opts.new:
|
||||
s.newVersion(opts.new)
|
||||
else:
|
||||
s.bumpRelease()
|
||||
s.writeFile(aspec)
|
||||
|
||||
# Get EVR for changelog entry.
|
||||
cmd = ("rpm", "-q", "--specfile", "--define", "dist %{nil}",
|
||||
"--qf=%|epoch?{%{epoch}:}:{}|%{version}-%{release}\n", aspec)
|
||||
popen = subprocess.Popen(cmd, stdout=subprocess.PIPE)
|
||||
evr = popen.communicate()[0].split(b"\n")[0]
|
||||
if sys.version_info[0] > 2:
|
||||
evr = evr.decode(errors='replace')
|
||||
|
||||
s.addChangelogEntry(evr, opts.comment, opts.userstring)
|
||||
s.writeFile(aspec)
|
||||
|
||||
sys.exit(0)
|
|
@ -9,11 +9,17 @@
|
|||
- python-sh
|
||||
- koji
|
||||
- git
|
||||
#- rpmdevtools # we need rpmdevtools-8.5-1 release or later
|
||||
- rpmdevtools # Note that we hotfix rpmdev-bumpspec on top of this
|
||||
tags:
|
||||
- packages
|
||||
- hotness
|
||||
|
||||
- name: hotfix rpmdev-bumpspec to a copy from rpmdevtools-8.5-1
|
||||
copy: src=hotfix/rpmdev-bumpspec dest=/usr/bin/rpmdev-bumpspec
|
||||
tags:
|
||||
- hotfix
|
||||
- hotness
|
||||
|
||||
- name: copy database configuration
|
||||
template: >
|
||||
src={{ item }} dest=/etc/fedmsg.d/{{ item }}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue