-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathverbump.py
More file actions
executable file
·198 lines (174 loc) · 7.77 KB
/
verbump.py
File metadata and controls
executable file
·198 lines (174 loc) · 7.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import re
import sys
import time
from optparse import OptionParser
from pisi.specfile import SpecFile
RELEASE = """\
<Update release="%(RELEASE)s">
<Date>%(DATE)s</Date>
<Version>%(VERSION)s</Version>
<Comment>%(COMMENT)s</Comment>
<Name>%(NAME)s</Name>
<Email>%(EMAIL)s</Email>
</Update>"""
def get_and_save_user_info():
info = [("NAME", "Please enter your full name as seen in pspec files"),
("EMAIL", "Please enter your e-mail as seen in pspec files")]
res = {}
conf_file = os.path.expanduser("~/.packagerinfo")
if not os.path.exists(conf_file): open(conf_file, "a")
for line in open(conf_file, "r"):
line = line.strip().split("=")
try:
res[line[0].strip()] = line[1].strip()
except IndexError:
pass
for i in info:
if not res.has_key(i[0]) or not res[i[0]]:
print "%s is not defined in %s. %s" % (i[0], conf_file, i[1])
res[i[0]] = raw_input("> ")
open(conf_file, "a").write("%s\t= %s\n" % (i[0], res[i[0]]))
return res
def bump(options, path):
if path.endswith("/"): path = path[:-1]
if not path.endswith("/pspec.xml"): path += "/pspec.xml"
if not os.path.isfile(path):
print "%s not found!" % path
sys.exit(1)
if not os.access(path, os.W_OK):
print "Cannot write to %s." % path
sys.exit(1)
info = get_and_save_user_info()
pspec = open(path, "r").read().strip()
specfile = SpecFile(path)
old_archive = specfile.source.archive
if len(old_archive) == 0:
print("No <Archive> tag found in %s." % path)
return
elif len(old_archive) > 1 and not options.many and not options.release and not options.rrelease:
print("Multiarchive pspec.xml not supported yet.")
sys.exit(1)
old_archive = old_archive[0].uri
old_type = re.sub(ver_ext_pattern, "\\2", old_archive).replace(".", "").replace("src", "")
new_type = old_type
last = specfile.history[0]
old_version = last.version
if options.many:
verfrom = options.many.split("-")[0]
new_version = options.many.split("-")[1]
if not old_version == verfrom:
print "skipping %s, different versions" % specfile.source.name
return
new_archive = old_archive.replace(old_version, new_version)
elif options.uri:
if not options.uri.split(":")[0] in ["ftp", "file", "http", "https", "mirrors"]:
print "Wrong uri: %s" % options.uri
sys.exit(1)
new_archive = options.uri
new_version = re.sub(ver_ext_pattern, "\\1", new_archive)
new_type = re.sub(ver_ext_pattern, "\\2", new_archive).replace(".", "").replace("tgz", "targz").replace("src", "")
elif options.ver:
if not re.search("[\d\.]", options.ver):
print "Wrong version number: %s" % options.ver
sys.exit(1)
new_version = options.ver
new_archive = old_archive.replace(old_version, new_version)
if "." in old_version:
mver = ".".join(old_version.split(".")[:-1])
if "/%s/" % mver in new_archive:
new_archive = new_archive.replace("/%s/" % mver, "/%s/" % ".".join(new_version.split(".")[:-1]))
elif options.release or options.rrelease:
new_type = old_type
new_archive = old_archive
new_version = old_version
else:
print old_archive
sys.exit(0)
info["RELEASE"] = int(last.release) + 1
info["DATE"] = time.strftime("%Y-%m-%d")
info["VERSION"] = new_version
if options.release or options.rrelease:
info["COMMENT"] = "Release bump."
else:
info["COMMENT"] = "Version bump."
new_release = RELEASE % info
new_pspec = ''
if new_type == "tgz": new_type = "targz"
elif not new_type in types: new_type = "binary"
for line in pspec.split("\n"):
if "<Archive" in line and old_archive in line:
new_line = line.split('>')
new_line = new_line[0] + '>' + new_archive + '<' + new_line[1].split('<')[1] + '>'
new_pspec = "\n".join((new_pspec, new_line))
elif "<History>" in line:
new_pspec = "\n".join((new_pspec, " <History>\n%s" % new_release))
elif options.vfrom and "<Dependency versionFrom" in line:
new_pspec = "\n".join((new_pspec, line.replace(old_version, new_version)))
else:
if not new_pspec: new_pspec = line
else: new_pspec = "\n".join((new_pspec, line))
open(path, "w").write(new_pspec)
open(path, "a").write("\n")
if options.release or options.rrelease: return specfile.source.name
if os.getenv("USER") != "root":
os.system("sudo pisi build %s --fetch" % path)
else:
os.system("pisi build %s --fetch" % path)
pspec = open(path, "r").read().strip()
new_pspec = ''
for line in pspec.split("\n"):
if "<Archive" in line and os.path.basename(new_archive) in line:
sha1sum = os.popen("sha1sum /var/cache/pisi/archives/%s" % os.path.basename(new_archive)).read().split()[0]
new_line = re.sub("(.*sha1sum=)[\"\'][^\"^\']+[\"\'](.*)", r'\1"%s"\2' % sha1sum, line)
new_line = re.sub("(.*type=)[\"\'][^\"^\']+[\"\'](.*)", r'\1"%s"\2' % new_type, new_line)
new_pspec = "\n".join((new_pspec, new_line))
else:
if not new_pspec: new_pspec = line
else: new_pspec = "\n".join((new_pspec, line))
open(path, "w").write(new_pspec)
open(path, "a").write("\n")
return specfile.source.name
if __name__ == "__main__":
ver_ext_pattern = re.compile("^.+?-?[\D^\-]*?([\d\._]+\d)[\D^\.]*?\.([\w\.]+)$")
types = ["targz", "tarbz2", "tarlzma", "tarxz", "tarZ", "tar", "zip", "gz", "gzip", "bz2", "bzip2", "lzma", "xz"]
usage = "Usage: %prog [options] [PATH]"
parser = OptionParser(usage)
parser.add_option("-r", "--release-bump", action="store_true", default=False, dest="release", help="release bump")
parser.add_option("-R", "--release-bump-recursively", action="store_true", default=False, dest="rrelease", help="release bump recursively")
parser.add_option("-u", "--new-uri", dest="uri", help="version bump using specified uri")
parser.add_option("-m", "--bump-many", dest="many", help="version/release bump for many packages")
parser.add_option("-v", "--new-version", dest="ver", help="version bump using specified version")
parser.add_option("-f", "--from-version", dest="vfrom", help="modify versionFrom too")
(options, args) = parser.parse_args()
try:
path = args[0]
except IndexError:
path = "."
if options.uri and options.ver:
print "Using options -u and -v together not allowed"
sys.exit(1)
elif options.many and (options.uri or options.ver):
print "Using options -m with -u or -v not allowed"
sys.exit(1)
elif (options.release or options.rrelease) and (options.uri or options.ver):
print "Using options -r or -R with -u or -v not allowed"
sys.exit(1)
elif options.many:
if not len(options.many.split("-")) == 2:
print "Wrong argument for option -m: %s\nYou have to write 'version from' and 'version to' separated by '-'\ne.g: -m x.y-x.z" % options.many
sys.exit(1)
if options.rrelease or options.many:
bumped = []
for root, dirs, files in os.walk(path):
if "pspec.xml" in files:
name = bump(options, root)
if name: bumped.append(name)
if not bumped: print "No bumped packages."
else:
print "Bumped packages:"
print "----------------"
for b in bumped: print b
else: bump(options, path)