8 from string import Template
11 upload_server = 'master.gnome.org'
13 $name $version is now available for download from:
22 You can visit the project web site:
37 f = open('config.h', 'r')
42 key['package'] = '#define PACKAGE_NAME "'
43 key['version'] = '#define PACKAGE_VERSION "'
44 key['bugreport'] = '#define PACKAGE_BUGREPORT "'
46 for line in s.splitlines(1):
47 if line.startswith(key['package']):
48 p1 = len(key['package'])
50 self.package_name = line[p1:p2]
51 elif line.startswith(key['version']):
52 p1 = len(key['version'])
54 self.package_version = line[p1:p2]
55 elif line.startswith(key['bugreport']):
57 p1 = line.rfind('=') + 1
58 self.package_module = line[p1:p2]
60 first = self.package_version.find('.')
61 second = self.package_version.find('.', first + 1)
62 if first == -1 or second == -1 or first == second:
63 version_dir = self.package_version
65 version_dir = self.package_version[:second]
66 self.package_dl_url = 'http://download.gnome.org/sources/%s/%s/' % (self.package_name.lower(),
68 def exec_cmd(self,cmd):
69 return os.popen(cmd).read()
72 f = open ('NEWS', 'r')
75 start = s.find ('NEW in '+ self.package_version)
77 start = s.find ('\n', start) + 1
78 start = s.find ('\n', start) + 1
79 end = s.find ('NEW in', start) - 1
80 return s[start:end].strip()
82 def get_md5sums(self):
85 cmd = 'md5sum %s-%s.tar.gz' % (self.package_name.lower(), self.package_version)
86 md5sums += self.exec_cmd(cmd)
88 cmd = 'md5sum %s-%s.tar.bz2' % (self.package_name.lower(), self.package_version)
89 md5sums += self.exec_cmd(cmd).strip()
93 def get_bugzilla_info(self):
94 query = 'http://bugzilla.gnome.org/browse.cgi?product=%s' % (self.package_module)
95 f = urllib.urlopen(query)
103 end = s.find(s2, i + 1)
104 description = s[start:end]
112 end = s.find(s2, start)
113 project_url = s[start:end]
115 return (description, project_url)
117 def get_release_notes(self):
118 name = self.package_name
119 version = self.package_version
120 download = self.package_dl_url
121 md5sums = self.get_md5sums()
122 (about, website) = self.get_bugzilla_info()
123 news = self.get_news()
124 footer = '%s\n%s team' % (datetime.date.today().strftime('%d %B %Y'),\
127 t = Template(template)
128 return t.substitute(locals())
130 def get_last_tag(self):
131 tags_str = self.exec_cmd('git-tag')
132 tags = tags_str.splitlines()
134 return tags[len(tags)-1]
136 def parse_commit(self, ref, author, date, message):
137 p1 = message.rfind('(')
138 p2 = message.rfind (')')
139 if len(message) - p2 <= 2:
140 author = message[p1+1:p2]
141 message = message[:p1]
143 msg = message.lower()
144 if msg.find('translation') != -1 and\
145 msg.find('updated') != -1:
146 self.translations += ' - ' + message + ' (' + author + ').\n'
147 elif message.find('#') != -1:
148 p1 = message.find('#')
151 p2 = message.find(' ', p1)
152 bug.number = message[p1+1:p2]
154 self.bug_commits.append(bug)
155 p1 = message.find('#', p2)
157 self.commits += ' - ' + message + ' (' + author + ').\n'
159 def query_bug_commits(self):
161 for bug in self.bug_commits:
162 bugs += bug.number + ','
164 # Bugzilla query to use
165 query = 'http://bugzilla.gnome.org/buglist.cgi?ctype=csv' \
166 '&bug_status=RESOLVED,CLOSED,VERIFIED' \
167 '&resolution=FIXED' \
168 '&bug_id=' + bugs.replace(',', '%2c')
170 f = urllib.urlopen(query)
177 reader = csv.reader(s.splitlines(1))
178 header = reader.next()
184 if col == 'short_short_desc':
189 bug_number = row[col_bug_id]
190 description = row[col_description]
192 for bug in self.bug_commits:
193 if bug.number == bug_number:
194 self.bugs += ' - Fixed #%s, %s (%s)\n' % (bug.number, description, bug.author)
197 def get_commits(self):
199 self.translations = ''
201 self.bug_commits = []
202 last_tag = self.get_last_tag()
205 changes = self.exec_cmd ("git-log " + last_tag + "..")
206 for line in changes.splitlines(1):
207 if line.startswith('commit'):
209 self.parse_commit (ref, author, date, message)
211 ref = line[p1:].strip()
215 elif line.startswith('Author:'):
218 author = line[p1:p2].strip()
219 elif line.startswith('Date:'):
221 date = line[p1:].strip()
222 elif line.startswith(' git-svn-id:'):
224 elif line.startswith('Merge:'):
234 self.query_bug_commits ()
237 new_tag = self.package_name.upper() + '_' +\
238 self.package_version.replace('.', '_')
240 url1 = self.exec_cmd('git-config svn-remote.svn.url').strip()
241 url2 = url1[:url1.rfind('/')] + '/tags/' + new_tag
242 self.exec_cmd('svn copy %s %s -m "Tagged for release %s."' % (url1, url2, self.package_version))
244 self.exec_cmd('git-tag -m "Tagged for release %s." %s' % ( self.package_version, new_tag))
246 def generate_news(self):
248 news = 'NEW in '+ self.package_version + '\n==============\n'
249 news += self.commits + '\nBugs fixed:\n' + self.bugs + '\nTranslations:\n' + self.translations + '\n'
253 def write_news(self):
254 news = self.generate_news()
256 f = open ('/tmp/NEWS', 'w')
260 self.exec_cmd('cat NEWS >> /tmp/NEWS')
261 self.exec_cmd('mv /tmp/NEWS .')
263 def upload_tarball(self):
264 tarball = '%s-%s.tar.gz' % (self.package_name.lower(), self.package_version)
266 cmd = 'scp %s %s@%s:' % (tarball, username, upload_server)
269 cmd = 'ssh %s@%s install-module -u %s' % (username, upload_server, tarball)
274 self.upload_tarball()
275 print self.get_release_notes()
278 #print p.generate_news()
281 #print p.get_release_notes()