* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-05-22 13:36 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-05-22 13:36 UTC (permalink / raw
To: gentoo-commits
commit: 59f26733ad4684cc923bd4b299b5498f8f015b37
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Sun May 22 13:36:34 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Sun May 22 13:36:34 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=59f26733
Cleanup: convert all indentation to tabs.
---
bugzilla-viewer.py | 292 ++++++++++++++++++++++++++--------------------------
1 files changed, 146 insertions(+), 146 deletions(-)
diff --git a/bugzilla-viewer.py b/bugzilla-viewer.py
index bf034cc..d1de3c0 100755
--- a/bugzilla-viewer.py
+++ b/bugzilla-viewer.py
@@ -22,163 +22,163 @@ class TermTooSmall(Exception):
# Main class (called with curses.wrapper later).
class MainWindow:
- def __init__(self, screen, bugs, bugs_dict, packages_dict, related_bugs, repoman_dict):
- self.bugs = bugs
- self.bugs_dict = bugs_dict
- self.packages_dict = packages_dict
- self.related_bugs = related_bugs
- self.repoman_dict = repoman_dict
-
- curses.curs_set(0)
- self.screen = screen
-
- curses.use_default_colors()
- self.init_screen()
-
- c = self.screen.getch()
- while c not in ( ord("q"), curses.ascii.ESC):
- if c == ord("j"):
- self.scroll_bugs_pad(1)
- elif c == ord("k"):
- self.scroll_bugs_pad(-1)
- elif c == curses.KEY_DOWN:
- self.scroll_contents_pad(1)
- elif c == curses.KEY_UP:
- self.scroll_contents_pad(-1)
- elif c == curses.KEY_RESIZE:
- self.init_screen()
-
- c = self.screen.getch()
-
- def init_screen(self):
- (self.height, self.width) = self.screen.getmaxyx()
-
- if self.height < 12 or self.width < 80:
- raise TermTooSmall()
-
- self.screen.border()
- self.screen.vline(1, self.width / 3, curses.ACS_VLINE, self.height - 2)
- self.screen.refresh()
-
- self.fill_bugs_pad()
- self.refresh_bugs_pad()
-
- self.fill_contents_pad()
- self.refresh_contents_pad()
-
- def fill_bugs_pad(self):
- self.bugs_pad = curses.newpad(len(self.bugs),self.width)
- self.bugs_pad.erase()
-
- self.bugs_pad_pos = 0
+ def __init__(self, screen, bugs, bugs_dict, packages_dict, related_bugs, repoman_dict):
+ self.bugs = bugs
+ self.bugs_dict = bugs_dict
+ self.packages_dict = packages_dict
+ self.related_bugs = related_bugs
+ self.repoman_dict = repoman_dict
+
+ curses.curs_set(0)
+ self.screen = screen
+
+ curses.use_default_colors()
+ self.init_screen()
+
+ c = self.screen.getch()
+ while c not in (ord("q"), curses.ascii.ESC):
+ if c == ord("j"):
+ self.scroll_bugs_pad(1)
+ elif c == ord("k"):
+ self.scroll_bugs_pad(-1)
+ elif c == curses.KEY_DOWN:
+ self.scroll_contents_pad(1)
+ elif c == curses.KEY_UP:
+ self.scroll_contents_pad(-1)
+ elif c == curses.KEY_RESIZE:
+ self.init_screen()
+
+ c = self.screen.getch()
+
+ def init_screen(self):
+ (self.height, self.width) = self.screen.getmaxyx()
+
+ if self.height < 12 or self.width < 80:
+ raise TermTooSmall()
+
+ self.screen.border()
+ self.screen.vline(1, self.width / 3, curses.ACS_VLINE, self.height - 2)
+ self.screen.refresh()
+
+ self.fill_bugs_pad()
+ self.refresh_bugs_pad()
+
+ self.fill_contents_pad()
+ self.refresh_contents_pad()
+
+ def fill_bugs_pad(self):
+ self.bugs_pad = curses.newpad(len(self.bugs),self.width)
+ self.bugs_pad.erase()
- for i in range(len(self.bugs)):
- self.bugs_pad.addstr(i, 0,
- " " + self.bugs[i].find('bug_id').text + " " + self.bugs[i].find('short_desc').text)
-
- def scroll_bugs_pad(self, amount):
- height = len(self.bugs)
-
- self.bugs_pad_pos += amount
- if self.bugs_pad_pos < 0:
self.bugs_pad_pos = 0
- if self.bugs_pad_pos >= height:
- self.bugs_pad_pos = height - 1
- self.refresh_bugs_pad()
-
- self.fill_contents_pad()
- self.refresh_contents_pad()
-
- def refresh_bugs_pad(self):
- (height, width) = self.bugs_pad.getmaxyx()
- for i in range(height):
- self.bugs_pad.addch(i, 0, " ")
- self.bugs_pad.addch(self.bugs_pad_pos, 0, "*")
- pos = min(height - self.height + 2, max(0, self.bugs_pad_pos - (self.height / 2)))
- self.bugs_pad.refresh(
- pos, 0,
- 1, 1,
- self.height - 2, self.width / 3 - 1)
-
- def fill_contents_pad(self):
- width = 2 * self.width / 3
-
- bug = self.bugs[self.bugs_pad_pos]
-
- output = []
- output += textwrap.wrap(bug.find("short_desc").text, width=width-2)
- output.append("-" * (width - 2))
-
- cpvs = self.packages_dict[bug.find("bug_id").text]
- if cpvs:
- output += textwrap.wrap("Found package cpvs:", width=width-2)
- for cpv in cpvs:
- output += textwrap.wrap(cpv, width=width-2)
- output.append("-" * (width - 2))
- deps = bug.findall("dependson")
- if deps:
- output += textwrap.wrap("Depends on:", width=width-2)
- for dep in deps:
- dep_bug = self.bugs_dict[dep.text]
- desc = dep.text + " " + dep_bug.find("bug_status").text + " " + dep_bug.find("short_desc").text
- output += textwrap.wrap(desc, width=width-2)
+ for i in range(len(self.bugs)):
+ self.bugs_pad.addstr(i, 0,
+ " " + self.bugs[i].find('bug_id').text + " " + self.bugs[i].find('short_desc').text)
+
+ def scroll_bugs_pad(self, amount):
+ height = len(self.bugs)
+
+ self.bugs_pad_pos += amount
+ if self.bugs_pad_pos < 0:
+ self.bugs_pad_pos = 0
+ if self.bugs_pad_pos >= height:
+ self.bugs_pad_pos = height - 1
+ self.refresh_bugs_pad()
+
+ self.fill_contents_pad()
+ self.refresh_contents_pad()
+
+ def refresh_bugs_pad(self):
+ (height, width) = self.bugs_pad.getmaxyx()
+ for i in range(height):
+ self.bugs_pad.addch(i, 0, " ")
+ self.bugs_pad.addch(self.bugs_pad_pos, 0, "*")
+ pos = min(height - self.height + 2, max(0, self.bugs_pad_pos - (self.height / 2)))
+ self.bugs_pad.refresh(
+ pos, 0,
+ 1, 1,
+ self.height - 2, self.width / 3 - 1)
+
+ def fill_contents_pad(self):
+ width = 2 * self.width / 3
+
+ bug = self.bugs[self.bugs_pad_pos]
+
+ output = []
+ output += textwrap.wrap(bug.find("short_desc").text, width=width-2)
output.append("-" * (width - 2))
+
+ cpvs = self.packages_dict[bug.find("bug_id").text]
+ if cpvs:
+ output += textwrap.wrap("Found package cpvs:", width=width-2)
+ for cpv in cpvs:
+ output += textwrap.wrap(cpv, width=width-2)
+ output.append("-" * (width - 2))
+
+ deps = bug.findall("dependson")
+ if deps:
+ output += textwrap.wrap("Depends on:", width=width-2)
+ for dep in deps:
+ dep_bug = self.bugs_dict[dep.text]
+ desc = dep.text + " " + dep_bug.find("bug_status").text + " " + dep_bug.find("short_desc").text
+ output += textwrap.wrap(desc, width=width-2)
+ output.append("-" * (width - 2))
- related = self.related_bugs[bug.find("bug_id").text]
- if related:
- output += textwrap.wrap("Related bugs:", width=width-2)
- for related_bug in related:
- if related_bug['bugid'] == bug.find("bug_id").text:
- continue
- desc = related_bug['bugid'] + " " + related_bug['desc']
- output += textwrap.wrap(desc, width=width-2)
- output.append("-" * (width - 2))
+ related = self.related_bugs[bug.find("bug_id").text]
+ if related:
+ output += textwrap.wrap("Related bugs:", width=width-2)
+ for related_bug in related:
+ if related_bug['bugid'] == bug.find("bug_id").text:
+ continue
+ desc = related_bug['bugid'] + " " + related_bug['desc']
+ output += textwrap.wrap(desc, width=width-2)
+ output.append("-" * (width - 2))
- if bug.find("bug_id").text in repoman_dict and repoman_dict[bug.find("bug_id").text]:
- output += textwrap.wrap("Repoman output:", width=width-2)
- lines = repoman_dict[bug.find("bug_id").text].split("\n")
- for line in lines:
- output += textwrap.wrap(line, width=width-2)
- output.append("-" * (width - 2))
+ if bug.find("bug_id").text in repoman_dict and repoman_dict[bug.find("bug_id").text]:
+ output += textwrap.wrap("Repoman output:", width=width-2)
+ lines = repoman_dict[bug.find("bug_id").text].split("\n")
+ for line in lines:
+ output += textwrap.wrap(line, width=width-2)
+ output.append("-" * (width - 2))
- for elem in bug.findall("long_desc"):
- output += textwrap.wrap("%s:" % elem.find("who").text, width=width-2)
- lines = elem.find("thetext").text.split("\n")
- for line in lines:
- output += textwrap.wrap(line, width=width-2)
- output.append("-" * (width - 2))
-
- self.contents_pad_length = len(output)
-
- self.contents_pad = curses.newpad(max(self.contents_pad_length, self.height), width)
- self.contents_pad.erase()
+ for elem in bug.findall("long_desc"):
+ output += textwrap.wrap("%s:" % elem.find("who").text, width=width-2)
+ lines = elem.find("thetext").text.split("\n")
+ for line in lines:
+ output += textwrap.wrap(line, width=width-2)
+ output.append("-" * (width - 2))
- self.contents_pad_pos = 0
+ self.contents_pad_length = len(output)
- for i in range(len(output)):
- if type(output[i]) == unicode:
- real_output = output[i]
- else:
- real_output = unicode(output[i], errors='replace')
- self.contents_pad.addstr(i, 0, real_output.encode("utf-8"))
+ self.contents_pad = curses.newpad(max(self.contents_pad_length, self.height), width)
+ self.contents_pad.erase()
- def scroll_contents_pad(self, amount):
- height = self.contents_pad_length - self.height + 5
-
- self.contents_pad_pos += amount
- if self.contents_pad_pos < 0:
self.contents_pad_pos = 0
- if self.contents_pad_pos >= height:
- self.contents_pad_pos = height - 1
- self.refresh_contents_pad()
-
- def refresh_contents_pad(self):
- self.contents_pad.refresh(
- self.contents_pad_pos, 0,
- 1, self.width / 3 + 1,
- self.height - 2, self.width - 2)
- self.screen.refresh()
+
+ for i in range(len(output)):
+ if type(output[i]) == unicode:
+ real_output = output[i]
+ else:
+ real_output = unicode(output[i], errors='replace')
+ self.contents_pad.addstr(i, 0, real_output.encode("utf-8"))
+
+ def scroll_contents_pad(self, amount):
+ height = self.contents_pad_length - self.height + 5
+
+ self.contents_pad_pos += amount
+ if self.contents_pad_pos < 0:
+ self.contents_pad_pos = 0
+ if self.contents_pad_pos >= height:
+ self.contents_pad_pos = height - 1
+ self.refresh_contents_pad()
+
+ def refresh_contents_pad(self):
+ self.contents_pad.refresh(
+ self.contents_pad_pos, 0,
+ 1, self.width / 3 + 1,
+ self.height - 2, self.width - 2)
+ self.screen.refresh()
if __name__ == "__main__":
parser = optparse.OptionParser()
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-05-22 15:16 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-05-22 15:16 UTC (permalink / raw
To: gentoo-commits
commit: c113ff742b3910ef257dd3b4479020d6a8865919
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Sun May 22 15:16:03 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Sun May 22 15:16:03 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=c113ff74
Cleanup: use a Bug class instead of raw XML processing all over the place.
---
bugzilla-viewer.py | 76 ++++++++++++++++++++++++++++++++-------------------
1 files changed, 48 insertions(+), 28 deletions(-)
diff --git a/bugzilla-viewer.py b/bugzilla-viewer.py
index d1de3c0..e160a96 100755
--- a/bugzilla-viewer.py
+++ b/bugzilla-viewer.py
@@ -20,6 +20,29 @@ CPV_REGEX = re.compile("[A-Za-z0-9+_.-]+/[A-Za-z0-9+_-]+-[0-9]+(?:\.[0-9]+)*[a-z
class TermTooSmall(Exception):
pass
+class Bug:
+ def __init__(self, xml):
+ self.__id = int(xml.find("bug_id").text)
+ self.__summary = xml.find("short_desc").text
+ self.__status = xml.find("bug_status").text
+ self.__depends_on = [int(dep.text) for dep in xml.findall("dependson")]
+ self.__comments = [c.find("who").text + "\n" + c.find("thetext").text for c in xml.findall("long_desc")]
+
+ def id_number(self):
+ return self.__id
+
+ def summary(self):
+ return self.__summary
+
+ def status(self):
+ return self.__status
+
+ def depends_on(self):
+ return self.__depends_on
+
+ def comments(self):
+ return self.__comments
+
# Main class (called with curses.wrapper later).
class MainWindow:
def __init__(self, screen, bugs, bugs_dict, packages_dict, related_bugs, repoman_dict):
@@ -74,7 +97,7 @@ class MainWindow:
for i in range(len(self.bugs)):
self.bugs_pad.addstr(i, 0,
- " " + self.bugs[i].find('bug_id').text + " " + self.bugs[i].find('short_desc').text)
+ " %d %s" % (self.bugs[i].id_number(), self.bugs[i].summary()))
def scroll_bugs_pad(self, amount):
height = len(self.bugs)
@@ -106,46 +129,43 @@ class MainWindow:
bug = self.bugs[self.bugs_pad_pos]
output = []
- output += textwrap.wrap(bug.find("short_desc").text, width=width-2)
+ output += textwrap.wrap(bug.summary(), width=width-2)
output.append("-" * (width - 2))
- cpvs = self.packages_dict[bug.find("bug_id").text]
+ cpvs = self.packages_dict[bug.id_number()]
if cpvs:
output += textwrap.wrap("Found package cpvs:", width=width-2)
for cpv in cpvs:
output += textwrap.wrap(cpv, width=width-2)
output.append("-" * (width - 2))
- deps = bug.findall("dependson")
+ deps = [self.bugs_dict[dep_id] for dep_id in bug.depends_on()]
if deps:
output += textwrap.wrap("Depends on:", width=width-2)
for dep in deps:
- dep_bug = self.bugs_dict[dep.text]
- desc = dep.text + " " + dep_bug.find("bug_status").text + " " + dep_bug.find("short_desc").text
+ desc = "%d %s %s" % (dep.id_number(), dep.status(), dep.summary())
output += textwrap.wrap(desc, width=width-2)
output.append("-" * (width - 2))
- related = self.related_bugs[bug.find("bug_id").text]
+ related = self.related_bugs[bug.id_number()]
if related:
output += textwrap.wrap("Related bugs:", width=width-2)
for related_bug in related:
- if related_bug['bugid'] == bug.find("bug_id").text:
+ if str(related_bug['bugid']) == str(bug.id_number()):
continue
desc = related_bug['bugid'] + " " + related_bug['desc']
output += textwrap.wrap(desc, width=width-2)
output.append("-" * (width - 2))
- if bug.find("bug_id").text in repoman_dict and repoman_dict[bug.find("bug_id").text]:
+ if bug.id_number() in repoman_dict and repoman_dict[bug.id_number()]:
output += textwrap.wrap("Repoman output:", width=width-2)
- lines = repoman_dict[bug.find("bug_id").text].split("\n")
+ lines = repoman_dict[bug.id_number()].split("\n")
for line in lines:
output += textwrap.wrap(line, width=width-2)
output.append("-" * (width - 2))
- for elem in bug.findall("long_desc"):
- output += textwrap.wrap("%s:" % elem.find("who").text, width=width-2)
- lines = elem.find("thetext").text.split("\n")
- for line in lines:
+ for comment in bug.comments():
+ for line in comment.split("\n"):
output += textwrap.wrap(line, width=width-2)
output.append("-" * (width - 2))
@@ -196,7 +216,7 @@ if __name__ == "__main__":
print "Searching for arch bugs..."
raw_bugs = bugzilla.search("", cc="%s@gentoo.org" % options.arch, keywords="STABLEREQ")
- bugs = bugzilla.get([bug['bugid'] for bug in raw_bugs]).findall("bug")
+ bugs = [Bug(xml) for xml in bugzilla.get([bug['bugid'] for bug in raw_bugs]).findall("bug")]
dep_bug_ids = []
@@ -205,17 +225,17 @@ if __name__ == "__main__":
related_bugs = {}
repoman_dict = {}
for bug in bugs:
- print "Processing bug %s: %s" % (bug.find("bug_id").text, bug.find("short_desc").text)
- bugs_dict[bug.find("bug_id").text] = bug
- packages_dict[bug.find("bug_id").text] = []
- related_bugs[bug.find("bug_id").text] = []
- repoman_dict[bug.find("bug_id").text] = ""
- for cpv_candidate in CPV_REGEX.findall(bug.find("short_desc").text):
+ print "Processing bug %d: %s" % (bug.id_number(), bug.summary())
+ bugs_dict[bug.id_number()] = bug
+ packages_dict[bug.id_number()] = []
+ related_bugs[bug.id_number()] = []
+ repoman_dict[bug.id_number()] = ""
+ for cpv_candidate in CPV_REGEX.findall(bug.summary()):
if portage.db["/"]["porttree"].dbapi.cpv_exists(cpv_candidate):
- packages_dict[bug.find("bug_id").text].append(cpv_candidate)
+ packages_dict[bug.id_number()].append(cpv_candidate)
pv = portage.versions.cpv_getkey(cpv_candidate)
if options.verbose:
- related_bugs[bug.find("bug_id").text] += bugzilla.search(pv)
+ related_bugs[bug.id_number()] += bugzilla.search(pv)
if options.repo:
cvs_path = os.path.join(options.repo, pv)
@@ -226,11 +246,11 @@ if __name__ == "__main__":
original_contents = open(ebuild_path).read()
manifest_contents = open(manifest_path).read()
try:
- output = repoman_dict[bug.find("bug_id").text]
+ output = repoman_dict[bug.id_number()]
output += subprocess.Popen(["ekeyword", options.arch, ebuild_name], cwd=cvs_path, stdout=subprocess.PIPE).communicate()[0]
subprocess.check_call(["repoman", "manifest"], cwd=cvs_path)
output += subprocess.Popen(["repoman", "full"], cwd=cvs_path, stdout=subprocess.PIPE).communicate()[0]
- repoman_dict[bug.find("bug_id").text] = output
+ repoman_dict[bug.id_number()] = output
finally:
f = open(ebuild_path, "w")
f.write(original_contents)
@@ -238,12 +258,12 @@ if __name__ == "__main__":
f = open(manifest_path, "w")
f.write(manifest_contents)
f.close()
- dep_bug_ids += [dep.text for dep in bug.findall("dependson")]
+ dep_bug_ids += bug.depends_on()
dep_bug_ids = list(set(dep_bug_ids))
- dep_bugs = bugzilla.get(dep_bug_ids).findall("bug")
+ dep_bugs = [Bug(xml) for xml in bugzilla.get(dep_bug_ids).findall("bug")]
for bug in dep_bugs:
- bugs_dict[bug.find("bug_id").text] = bug
+ bugs_dict[bug.id_number()] = bug
try:
curses.wrapper(MainWindow, bugs=bugs, bugs_dict=bugs_dict, packages_dict=packages_dict, related_bugs=related_bugs, repoman_dict=repoman_dict)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-05-22 15:31 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-05-22 15:31 UTC (permalink / raw
To: gentoo-commits
commit: 39fcde8e77f44c1df8d966d6c147abfcc6cb747b
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Sun May 22 15:31:44 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Sun May 22 15:31:44 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=39fcde8e
Bugfix: we need to pass status=None to pybugz, otherwise it returns completely different set of bugs.
---
bugzilla-viewer.py | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/bugzilla-viewer.py b/bugzilla-viewer.py
index e160a96..72ae93e 100755
--- a/bugzilla-viewer.py
+++ b/bugzilla-viewer.py
@@ -215,7 +215,7 @@ if __name__ == "__main__":
bugzilla = bugz.bugzilla.Bugz('http://bugs.gentoo.org', skip_auth=True)
print "Searching for arch bugs..."
- raw_bugs = bugzilla.search("", cc="%s@gentoo.org" % options.arch, keywords="STABLEREQ")
+ raw_bugs = bugzilla.search("", cc="%s@gentoo.org" % options.arch, keywords="STABLEREQ", status=None)
bugs = [Bug(xml) for xml in bugzilla.get([bug['bugid'] for bug in raw_bugs]).findall("bug")]
dep_bug_ids = []
@@ -235,7 +235,7 @@ if __name__ == "__main__":
packages_dict[bug.id_number()].append(cpv_candidate)
pv = portage.versions.cpv_getkey(cpv_candidate)
if options.verbose:
- related_bugs[bug.id_number()] += bugzilla.search(pv)
+ related_bugs[bug.id_number()] += bugzilla.search(pv, status=None)
if options.repo:
cvs_path = os.path.join(options.repo, pv)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-05-25 10:32 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-05-25 10:32 UTC (permalink / raw
To: gentoo-commits
commit: e7192b0daf2c87a6e8be4ecda48e66cc5f8f34ac
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Wed May 25 10:32:03 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Wed May 25 10:32:03 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=e7192b0d
Write stabilization list to a file.
---
bugzilla-viewer.py | 129 +++++++++++++++++++++++++++++++++++++--------------
1 files changed, 93 insertions(+), 36 deletions(-)
diff --git a/bugzilla-viewer.py b/bugzilla-viewer.py
index 72ae93e..b62eaf4 100755
--- a/bugzilla-viewer.py
+++ b/bugzilla-viewer.py
@@ -27,6 +27,16 @@ class Bug:
self.__status = xml.find("bug_status").text
self.__depends_on = [int(dep.text) for dep in xml.findall("dependson")]
self.__comments = [c.find("who").text + "\n" + c.find("thetext").text for c in xml.findall("long_desc")]
+ self.__cpvs_detected = False
+ self.__cpvs = []
+
+ def detect_cpvs(self):
+ if self.__cpvs_detected:
+ return
+ for cpv_candidate in CPV_REGEX.findall(self.summary()):
+ if portage.db["/"]["porttree"].dbapi.cpv_exists(cpv_candidate):
+ self.__cpvs.append(cpv_candidate)
+ self.__cpvs_detected = True
def id_number(self):
return self.__id
@@ -42,15 +52,41 @@ class Bug:
def comments(self):
return self.__comments
+
+ def cpvs(self):
+ assert(self.__cpvs_detected)
+ return self.__cpvs
+
+class BugQueue:
+ def __init__(self):
+ self.__bug_list = []
+ self.__bug_set = set()
+
+ def add_bug(self, bug):
+ if self.has_bug(bug):
+ return
+ self.__bug_list.append(bug)
+ self.__bug_set.add(bug.id_number())
+
+ def has_bug(self, bug):
+ return bug.id_number() in self.__bug_set
+
+ def generate_stabilization_list(self):
+ result = []
+ for bug in self.__bug_list:
+ result.append("# Bug %d: %s" % (bug.id_number(), bug.summary()))
+ for cpv in bug.cpvs():
+ result.append("=" + cpv)
+ return "\n".join(result)
# Main class (called with curses.wrapper later).
class MainWindow:
- def __init__(self, screen, bugs, bugs_dict, packages_dict, related_bugs, repoman_dict):
+ def __init__(self, screen, bugs, bugs_dict, related_bugs, repoman_dict, bug_queue):
self.bugs = bugs
self.bugs_dict = bugs_dict
- self.packages_dict = packages_dict
self.related_bugs = related_bugs
self.repoman_dict = repoman_dict
+ self.bug_queue = bug_queue
curses.curs_set(0)
self.screen = screen
@@ -70,6 +106,8 @@ class MainWindow:
self.scroll_contents_pad(-1)
elif c == curses.KEY_RESIZE:
self.init_screen()
+ elif c == ord("a"):
+ self.add_bug_to_queue()
c = self.screen.getch()
@@ -97,7 +135,7 @@ class MainWindow:
for i in range(len(self.bugs)):
self.bugs_pad.addstr(i, 0,
- " %d %s" % (self.bugs[i].id_number(), self.bugs[i].summary()))
+ " %d %s" % (self.bugs[i].id_number(), self.bugs[i].summary()))
def scroll_bugs_pad(self, amount):
height = len(self.bugs)
@@ -115,7 +153,9 @@ class MainWindow:
def refresh_bugs_pad(self):
(height, width) = self.bugs_pad.getmaxyx()
for i in range(height):
- self.bugs_pad.addch(i, 0, " ")
+ self.bugs_pad.addstr(i, 0, " ")
+ if self.bug_queue.has_bug(self.bugs[i]):
+ self.bugs_pad.addch(i, 2, "+")
self.bugs_pad.addch(self.bugs_pad_pos, 0, "*")
pos = min(height - self.height + 2, max(0, self.bugs_pad_pos - (self.height / 2)))
self.bugs_pad.refresh(
@@ -132,11 +172,12 @@ class MainWindow:
output += textwrap.wrap(bug.summary(), width=width-2)
output.append("-" * (width - 2))
- cpvs = self.packages_dict[bug.id_number()]
+ cpvs = bug.cpvs()
if cpvs:
output += textwrap.wrap("Found package cpvs:", width=width-2)
for cpv in cpvs:
output += textwrap.wrap(cpv, width=width-2)
+ output += textwrap.wrap("Press 'a' to add them to the stabilization queue.", width=width-2)
output.append("-" * (width - 2))
deps = [self.bugs_dict[dep_id] for dep_id in bug.depends_on()]
@@ -199,10 +240,21 @@ class MainWindow:
1, self.width / 3 + 1,
self.height - 2, self.width - 2)
self.screen.refresh()
+
+ def add_bug_to_queue(self):
+ bug = self.bugs[self.bugs_pad_pos]
+
+ # For now we only support auto-detected CPVs.
+ if not bug.cpvs():
+ return
+
+ self.bug_queue.add_bug(bug)
+ self.refresh_bugs_pad()
if __name__ == "__main__":
parser = optparse.OptionParser()
parser.add_option("--arch", dest="arch", help="Gentoo arch to use, e.g. x86, amd64, ...")
+ parser.add_option("-o", "--output", dest="output_filename", default="package.keywords", help="Output filename for generated package.keywords file [default=%default]")
parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
parser.add_option("-v", "--verbose", dest="verbose", action="store_true", default=False, help="Include more output, e.g. related bugs")
@@ -212,6 +264,8 @@ if __name__ == "__main__":
if args:
parser.error("unrecognized command-line args")
+ bug_queue = BugQueue()
+
bugzilla = bugz.bugzilla.Bugz('http://bugs.gentoo.org', skip_auth=True)
print "Searching for arch bugs..."
@@ -221,43 +275,40 @@ if __name__ == "__main__":
dep_bug_ids = []
bugs_dict = {}
- packages_dict = {}
related_bugs = {}
repoman_dict = {}
for bug in bugs:
print "Processing bug %d: %s" % (bug.id_number(), bug.summary())
bugs_dict[bug.id_number()] = bug
- packages_dict[bug.id_number()] = []
related_bugs[bug.id_number()] = []
repoman_dict[bug.id_number()] = ""
- for cpv_candidate in CPV_REGEX.findall(bug.summary()):
- if portage.db["/"]["porttree"].dbapi.cpv_exists(cpv_candidate):
- packages_dict[bug.id_number()].append(cpv_candidate)
- pv = portage.versions.cpv_getkey(cpv_candidate)
- if options.verbose:
- related_bugs[bug.id_number()] += bugzilla.search(pv, status=None)
-
- if options.repo:
- cvs_path = os.path.join(options.repo, pv)
- ebuild_name = portage.versions.catsplit(cpv_candidate)[1] + ".ebuild"
- ebuild_path = os.path.join(cvs_path, ebuild_name)
- manifest_path = os.path.join(cvs_path, 'Manifest')
- if os.path.exists(ebuild_path):
- original_contents = open(ebuild_path).read()
- manifest_contents = open(manifest_path).read()
- try:
- output = repoman_dict[bug.id_number()]
- output += subprocess.Popen(["ekeyword", options.arch, ebuild_name], cwd=cvs_path, stdout=subprocess.PIPE).communicate()[0]
- subprocess.check_call(["repoman", "manifest"], cwd=cvs_path)
- output += subprocess.Popen(["repoman", "full"], cwd=cvs_path, stdout=subprocess.PIPE).communicate()[0]
- repoman_dict[bug.id_number()] = output
- finally:
- f = open(ebuild_path, "w")
- f.write(original_contents)
- f.close()
- f = open(manifest_path, "w")
- f.write(manifest_contents)
- f.close()
+ bug.detect_cpvs()
+ for cpv in bug.cpvs():
+ pv = portage.versions.cpv_getkey(cpv)
+ if options.verbose:
+ related_bugs[bug.id_number()] += bugzilla.search(pv, status=None)
+
+ if options.repo:
+ cvs_path = os.path.join(options.repo, pv)
+ ebuild_name = portage.versions.catsplit(cpv_candidate)[1] + ".ebuild"
+ ebuild_path = os.path.join(cvs_path, ebuild_name)
+ manifest_path = os.path.join(cvs_path, 'Manifest')
+ if os.path.exists(ebuild_path):
+ original_contents = open(ebuild_path).read()
+ manifest_contents = open(manifest_path).read()
+ try:
+ output = repoman_dict[bug.id_number()]
+ output += subprocess.Popen(["ekeyword", options.arch, ebuild_name], cwd=cvs_path, stdout=subprocess.PIPE).communicate()[0]
+ subprocess.check_call(["repoman", "manifest"], cwd=cvs_path)
+ output += subprocess.Popen(["repoman", "full"], cwd=cvs_path, stdout=subprocess.PIPE).communicate()[0]
+ repoman_dict[bug.id_number()] = output
+ finally:
+ f = open(ebuild_path, "w")
+ f.write(original_contents)
+ f.close()
+ f = open(manifest_path, "w")
+ f.write(manifest_contents)
+ f.close()
dep_bug_ids += bug.depends_on()
dep_bug_ids = list(set(dep_bug_ids))
@@ -266,7 +317,13 @@ if __name__ == "__main__":
bugs_dict[bug.id_number()] = bug
try:
- curses.wrapper(MainWindow, bugs=bugs, bugs_dict=bugs_dict, packages_dict=packages_dict, related_bugs=related_bugs, repoman_dict=repoman_dict)
+ curses.wrapper(MainWindow, bugs=bugs, bugs_dict=bugs_dict, related_bugs=related_bugs, repoman_dict=repoman_dict, bug_queue=bug_queue)
except TermTooSmall:
print "Your terminal window is too small, please try to enlarge it"
sys.exit(1)
+
+ stabilization_list = bug_queue.generate_stabilization_list()
+ if stabilization_list:
+ with open(options.output_filename, "w") as f:
+ f.write(stabilization_list)
+ print "Writing stabilization list to %s" % options.output_filename
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-05-25 19:51 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-05-25 19:51 UTC (permalink / raw
To: gentoo-commits
commit: 90ea2095b43b3bb025d121d40f7892c7d077d488
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Wed May 25 19:51:34 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Wed May 25 19:51:34 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=90ea2095
Bugfix: wrong variable name used for repoman output.
---
bugzilla-viewer.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/bugzilla-viewer.py b/bugzilla-viewer.py
index b62eaf4..686a3aa 100755
--- a/bugzilla-viewer.py
+++ b/bugzilla-viewer.py
@@ -290,7 +290,7 @@ if __name__ == "__main__":
if options.repo:
cvs_path = os.path.join(options.repo, pv)
- ebuild_name = portage.versions.catsplit(cpv_candidate)[1] + ".ebuild"
+ ebuild_name = portage.versions.catsplit(cpv)[1] + ".ebuild"
ebuild_path = os.path.join(cvs_path, ebuild_name)
manifest_path = os.path.join(cvs_path, 'Manifest')
if os.path.exists(ebuild_path):
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-06-02 15:38 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-06-02 15:38 UTC (permalink / raw
To: gentoo-commits
commit: 5cd96f04deb82e55aa60f91a2340240c076771d8
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Thu Jun 2 15:37:54 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Thu Jun 2 15:37:54 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=5cd96f04
Make sure to unicode-sanitize all strings passed to ncurses to prevent runtime exceptions.
---
bugzilla-viewer.py | 16 ++++++++++------
1 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/bugzilla-viewer.py b/bugzilla-viewer.py
index 686a3aa..e62ac98 100755
--- a/bugzilla-viewer.py
+++ b/bugzilla-viewer.py
@@ -17,6 +17,14 @@ import portage.versions
CPV_REGEX = re.compile("[A-Za-z0-9+_.-]+/[A-Za-z0-9+_-]+-[0-9]+(?:\.[0-9]+)*[a-z0-9_]*(?:-r[0-9]+)?")
+def unicode_sanitize(text):
+ """Converts a possibly unicode text to a regular string."""
+ if type(text) == unicode:
+ real_output = text
+ else:
+ real_output = unicode(text, errors='replace')
+ return real_output.encode("utf-8")
+
class TermTooSmall(Exception):
pass
@@ -135,7 +143,7 @@ class MainWindow:
for i in range(len(self.bugs)):
self.bugs_pad.addstr(i, 0,
- " %d %s" % (self.bugs[i].id_number(), self.bugs[i].summary()))
+ unicode_sanitize(" %d %s" % (self.bugs[i].id_number(), self.bugs[i].summary())))
def scroll_bugs_pad(self, amount):
height = len(self.bugs)
@@ -218,11 +226,7 @@ class MainWindow:
self.contents_pad_pos = 0
for i in range(len(output)):
- if type(output[i]) == unicode:
- real_output = output[i]
- else:
- real_output = unicode(output[i], errors='replace')
- self.contents_pad.addstr(i, 0, real_output.encode("utf-8"))
+ self.contents_pad.addstr(i, 0, unicode_sanitize(output[i]))
def scroll_contents_pad(self, amount):
height = self.contents_pad_length - self.height + 5
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-06-02 15:41 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-06-02 15:41 UTC (permalink / raw
To: gentoo-commits
commit: 67fb002b35cfd56ee6d07838b55ec3723518198d
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Thu Jun 2 15:41:38 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Thu Jun 2 15:41:38 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=67fb002b
Gracefully handle empty bug queue.
---
bugzilla-viewer.py | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/bugzilla-viewer.py b/bugzilla-viewer.py
index e62ac98..d04e6db 100755
--- a/bugzilla-viewer.py
+++ b/bugzilla-viewer.py
@@ -276,6 +276,10 @@ if __name__ == "__main__":
raw_bugs = bugzilla.search("", cc="%s@gentoo.org" % options.arch, keywords="STABLEREQ", status=None)
bugs = [Bug(xml) for xml in bugzilla.get([bug['bugid'] for bug in raw_bugs]).findall("bug")]
+ if not bugs:
+ print 'The bug list is empty. Exiting.'
+ sys.exit(0)
+
dep_bug_ids = []
bugs_dict = {}
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-06-05 16:16 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-06-05 16:16 UTC (permalink / raw
To: gentoo-commits
commit: 03dcfcf90388c8bb1e9fb8ecd58c96f9d74301bd
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Sun Jun 5 16:16:30 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Sun Jun 5 16:16:30 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=03dcfcf9
Fix an off-by-two error in contents pad scrolling routine.
---
bugzilla-viewer.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/bugzilla-viewer.py b/bugzilla-viewer.py
index d04e6db..0891979 100755
--- a/bugzilla-viewer.py
+++ b/bugzilla-viewer.py
@@ -229,7 +229,7 @@ class MainWindow:
self.contents_pad.addstr(i, 0, unicode_sanitize(output[i]))
def scroll_contents_pad(self, amount):
- height = self.contents_pad_length - self.height + 5
+ height = self.contents_pad_length - self.height + 3
self.contents_pad_pos += amount
if self.contents_pad_pos < 0:
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-08-07 3:26 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-08-07 3:26 UTC (permalink / raw
To: gentoo-commits
commit: e8ad6147da9fec953419799d136dff1f05d378ea
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Sun Aug 7 03:26:10 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Sun Aug 7 03:26:10 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=e8ad6147
Add batch stabilization tool.
---
batch-stabilize.py | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 117 insertions(+), 0 deletions(-)
diff --git a/batch-stabilize.py b/batch-stabilize.py
new file mode 100755
index 0000000..8414f44
--- /dev/null
+++ b/batch-stabilize.py
@@ -0,0 +1,117 @@
+#!/usr/bin/env python
+# Copyright 2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+import itertools
+import optparse
+import os
+import re
+import subprocess
+import sys
+
+import portage.versions
+
+BUG_REGEX = re.compile("[Bb]ug #?(\d+)")
+
+def print_and_log(message, log):
+ try:
+ print message
+ log.write(message)
+ finally:
+ log.flush()
+
+def run_command(args, cwd, log):
+ try:
+ log.write("Running %r in %s...\n" % (args, cwd))
+ cmd = subprocess.Popen(args, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ output = cmd.communicate()[0]
+ log.write("Finished with exit code %d\n" % cmd.returncode)
+ log.write(output)
+ return (cmd.returncode, output)
+ finally:
+ log.flush()
+
+if __name__ == "__main__":
+ parser = optparse.OptionParser()
+ parser.add_option("--arch", dest="arch", help="Gentoo arch to use, e.g. x86, amd64, ...")
+ parser.add_option("-i", "--input", dest="input_filename", default="package.keywords", help="Input filename for generated package.keywords file [default=%default]")
+ parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
+ parser.add_option("-v", "--verbose", dest="verbose", action="store_true", default=False)
+
+ (options, args) = parser.parse_args()
+ if not options.arch:
+ parser.error("--arch option is required")
+ if not options.input_filename:
+ parser.error("--input option is required")
+ if not options.repo:
+ parser.error("--repo option is required")
+ if args:
+ parser.error("unrecognized command-line args")
+
+ with open(options.input_filename, "r") as input_file:
+ stabilization_list = []
+ bug_id = -1
+ for line in input_file:
+ if line == "\n":
+ continue
+
+ if line.startswith("#"):
+ match = BUG_REGEX.search(line, re.IGNORECASE)
+ if not match:
+ print 'Ignoring comment line [%s]...' % line
+ continue
+ else:
+ bug_id = int(match.group(1))
+ continue
+
+ if bug_id == -1:
+ print 'Could not recognize bug id'
+ sys.exit(1)
+
+ if not line.endswith("\n"):
+ line += "\n"
+ cpv = line[1:-1]
+ p = portage.versions.catsplit(cpv)[1]
+ pn = portage.versions.pkgsplit(cpv)[0]
+ ebuild_name = p + ".ebuild"
+ stabilization_list.append((pn, ebuild_name, bug_id))
+
+ # Sanity check.
+ success = True
+ for pn, ebuild_name, bug_id in stabilization_list:
+ ebuild_path = os.path.join(options.repo, pn, ebuild_name)
+ if not os.path.exists(ebuild_path):
+ print '%s: file does not exist' % ebuild_path
+ success = False
+ if not success:
+ print 'Sanity check failed. Please make sure your CVS repo is up to date (cvs up).'
+ sys.exit(1)
+
+ with open('batch-stabilize.log', 'w') as log_file:
+ for pn, ebuild_name, bug_id in stabilization_list:
+ commit_message = "%s stable wrt bug #%d" % (options.arch, bug_id)
+ cvs_path = os.path.join(options.repo, pn)
+ print_and_log('Working in %s...' % cvs_path, log_file)
+ if run_command(["cvs", "up"], cvs_path, log_file)[0] != 0:
+ print '!!! cvs up failed'
+ sys.exit(1)
+ if run_command(["ekeyword", options.arch, ebuild_name], cvs_path, log_file)[0] != 0:
+ print '!!! ekeyword failed'
+ sys.exit(1)
+ return_code, output = run_command(["cvs", "diff"], cvs_path, log_file)
+ # It seems that cvs diff returns 1 if there are differences.
+ if return_code == 0 and not output:
+ print_and_log('Seems already keyworded, skipping.', log_file)
+ continue
+ if run_command(["echangelog", commit_message], cvs_path, log_file)[0] != 0:
+ print '!!! ekeyword failed'
+ sys.exit(1)
+ if run_command(["repoman", "manifest"], cvs_path, log_file)[0] != 0:
+ print '!!! repoman manifest failed'
+ sys.exit(1)
+ if run_command(["repoman", "full"], cvs_path, log_file)[0] != 0:
+ print '!!! repoman full failed'
+ sys.exit(1)
+ if run_command(["repoman", "commit", "-m", commit_message], cvs_path, log_file)[0] != 0:
+ print '!!! repoman full failed'
+ sys.exit(1)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-09-19 3:09 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-09-19 3:09 UTC (permalink / raw
To: gentoo-commits
commit: 07e7a0eb8cf5656bb7b15f9a9b78eda6101910ac
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Mon Sep 19 03:08:25 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Mon Sep 19 03:08:25 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=07e7a0eb
Add a tool to find reverse dependencies.
---
reverse-dependencies.py | 78 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 78 insertions(+), 0 deletions(-)
diff --git a/reverse-dependencies.py b/reverse-dependencies.py
new file mode 100755
index 0000000..88d79aa
--- /dev/null
+++ b/reverse-dependencies.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+# Copyright 2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+import optparse
+import os
+import types
+
+os.environ["PORTDIR_OVERLAY"] = ""
+
+import portage
+
+def process_deps(deps, use=None):
+ if not use:
+ use = []
+ result = []
+ for index, x in enumerate(deps):
+ if type(x) == types.ListType:
+ continue
+ elif x == "||": # Any-of.
+ result.extend(process_deps(deps[index + 1], use))
+ elif x[-1] == "?": # Use-conditional.
+ result.extend(process_deps(deps[index + 1], use + [x[:-1]]))
+ elif x[0] == "!": # Blocker.
+ result.append((portage.dep_getkey(x), True, use))
+ else:
+ result.append((portage.dep_getkey(x), False, use))
+ return result
+
+if __name__ == "__main__":
+ parser = optparse.OptionParser()
+ parser.add_option("-i", "--input", dest="input_filename", default="package.keywords", help="Input filename for generated package.keywords file [default=%default]")
+ parser.add_option("-o", "--output", dest="output_filename", default="package.rdeps", help="Output filename for generated package.rdeps file [default=%default]")
+ parser.add_option("-v", "--verbose", dest="verbose", action="store_true", default=False)
+
+ (options, args) = parser.parse_args()
+ if not options.input_filename:
+ parser.error("--input option is required")
+ if not options.output_filename:
+ parser.error("--output option is required")
+ if args:
+ parser.error("unrecognized command-line args")
+
+ reverse_deps = {}
+ for pkg in portage.portdb.cp_all():
+ deps = []
+ for match in portage.portdb.match(pkg):
+ deps.extend(process_deps(portage.dep.paren_reduce(portage.portdb.aux_get(match, ['DEPEND', 'RDEPEND', 'PDEPEND'])[0])))
+ for cp, blocker, use in deps:
+ if blocker:
+ continue
+ if cp not in reverse_deps:
+ reverse_deps[cp] = {}
+ if pkg not in reverse_deps[cp]:
+ reverse_deps[cp][pkg] = []
+ if use not in reverse_deps[cp][pkg]:
+ reverse_deps[cp][pkg].append(use)
+
+ with open(options.input_filename, "r") as input_file:
+ with open(options.output_filename, "w") as output_file:
+ for line in input_file:
+ if line == "\n" or line.startswith("#"):
+ continue
+
+ if not line.endswith("\n"):
+ line += "\n"
+ cpv = line[1:-1]
+ pn = portage.versions.pkgsplit(cpv)[0]
+ if pn in reverse_deps:
+ output_file.write("# Reverse dependencies for %s\n" % pn)
+ for cp, use_combinations in reverse_deps[pn].items():
+ if use_combinations != [[]]:
+ output_file.write("# One of the following USE flag combinations is required:\n")
+ for use_combination in use_combinations:
+ output_file.write("#\t%s\n" % ",".join(use_combination))
+ output_file.write("%s\n" % cp)
+ elif options.verbose:
+ print 'No reverse dependencies for %s' % pn
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-10-04 21:46 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-10-04 21:46 UTC (permalink / raw
To: gentoo-commits
commit: a6ed12cee737b66c730f8a93769f242154ee3ec1
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Tue Oct 4 21:45:38 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Tue Oct 4 21:45:38 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=a6ed12ce
Update Bugzilla when stabilizing packages.
---
batch-stabilize.py | 33 +++++++++++++++++++++++++++++++++
1 files changed, 33 insertions(+), 0 deletions(-)
diff --git a/batch-stabilize.py b/batch-stabilize.py
index 8414f44..912d26b 100755
--- a/batch-stabilize.py
+++ b/batch-stabilize.py
@@ -9,6 +9,7 @@ import re
import subprocess
import sys
+import bugz.bugzilla
import portage.versions
BUG_REGEX = re.compile("[Bb]ug #?(\d+)")
@@ -31,6 +32,10 @@ def run_command(args, cwd, log):
finally:
log.flush()
+class MyBugz(bugz.bugzilla.Bugz):
+ def get_input(self, prompt):
+ return raw_input(prompt)
+
if __name__ == "__main__":
parser = optparse.OptionParser()
parser.add_option("--arch", dest="arch", help="Gentoo arch to use, e.g. x86, amd64, ...")
@@ -47,6 +52,11 @@ if __name__ == "__main__":
parser.error("--repo option is required")
if args:
parser.error("unrecognized command-line args")
+
+ url = 'https://bugs.gentoo.org'
+ print 'You may be prompted for your Gentoo Bugzilla username and password (%s).' % url
+ bugzilla = MyBugz(url)
+ bugzilla.auth()
with open(options.input_filename, "r") as input_file:
stabilization_list = []
@@ -115,3 +125,26 @@ if __name__ == "__main__":
if run_command(["repoman", "commit", "-m", commit_message], cvs_path, log_file)[0] != 0:
print '!!! repoman full failed'
sys.exit(1)
+ log_file.write('Posting automated reply in bugzilla...\n')
+ bug_xml = bugzilla.get(bug_id).find('bug')
+ has_other_arches = False
+ for cc in bug_xml.findall('cc'):
+ body, domain = cc.text.split('@', 1)
+ if domain == 'gentoo.org' and body in portage.archlist and body != options.arch:
+ has_other_arches=True
+ # We don't close bugs which still have other arches for obvious reasons,
+ # and security bugs because stabilization is not the last step for them.
+ if has_other_arches or 'Security' in bug_xml.find('product').text:
+ bugzilla.modify(
+ bug_id,
+ comment='%s stable' % options.arch,
+ remove_cc='%s@gentoo.org' % options.arch)
+ log_file.write('Successfully updated bug %d.\n' % bug_id)
+ else:
+ bugzilla.modify(
+ bug_id,
+ comment='%s stable, closing' % options.arch,
+ remove_cc='%s@gentoo.org' % options.arch,
+ status='RESOLVED',
+ resolution='FIXED')
+ log_file.write('Succesfully updated bug %d and closed it.\n' % bug_id)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-10-13 21:59 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-10-13 21:59 UTC (permalink / raw
To: gentoo-commits
commit: cb1eac2e87e24b35de97afff8e6332eacccb57e5
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Thu Oct 13 21:58:45 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Thu Oct 13 21:58:45 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=cb1eac2e
Fix a crash when dependent bug is not accessible.
---
bugzilla-viewer.py | 26 +++++++++++++++++++-------
1 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/bugzilla-viewer.py b/bugzilla-viewer.py
index 0891979..c45530a 100755
--- a/bugzilla-viewer.py
+++ b/bugzilla-viewer.py
@@ -29,12 +29,19 @@ class TermTooSmall(Exception):
pass
class Bug:
- def __init__(self, xml):
- self.__id = int(xml.find("bug_id").text)
- self.__summary = xml.find("short_desc").text
- self.__status = xml.find("bug_status").text
- self.__depends_on = [int(dep.text) for dep in xml.findall("dependson")]
- self.__comments = [c.find("who").text + "\n" + c.find("thetext").text for c in xml.findall("long_desc")]
+ def __init__(self, xml=None, id_number=None, summary=None, status=None):
+ if xml is not None:
+ self.__id = int(xml.find("bug_id").text)
+ self.__summary = xml.find("short_desc").text
+ self.__status = xml.find("bug_status").text
+ self.__depends_on = [int(dep.text) for dep in xml.findall("dependson")]
+ self.__comments = [c.find("who").text + "\n" + c.find("thetext").text for c in xml.findall("long_desc")]
+ if id_number is not None:
+ self.__id = id_number
+ if summary is not None:
+ self.__summary = summary
+ if status is not None:
+ self.__status = status
self.__cpvs_detected = False
self.__cpvs = []
@@ -118,6 +125,11 @@ class MainWindow:
self.add_bug_to_queue()
c = self.screen.getch()
+
+ def bug_for_id(self, bug_id):
+ if bug_id in self.bugs_dict:
+ return self.bugs_dict[bug_id]
+ return Bug(id_number=bug_id, summary='(summary unavailable)', status='UNKNOWN')
def init_screen(self):
(self.height, self.width) = self.screen.getmaxyx()
@@ -188,7 +200,7 @@ class MainWindow:
output += textwrap.wrap("Press 'a' to add them to the stabilization queue.", width=width-2)
output.append("-" * (width - 2))
- deps = [self.bugs_dict[dep_id] for dep_id in bug.depends_on()]
+ deps = [self.bug_for_id(dep_id) for dep_id in bug.depends_on()]
if deps:
output += textwrap.wrap("Depends on:", width=width-2)
for dep in deps:
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-10-16 3:51 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-10-16 3:51 UTC (permalink / raw
To: gentoo-commits
commit: 2b5642259eb7ca590ce34579b979fbdd6116af94
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Sun Oct 16 03:49:45 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Sun Oct 16 03:49:45 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=2b564225
Improve batch stabilization:
- only update bugzilla once per bug
- keyword all packages for each bug first, then commit
(in case packages stabilized in single bug depend on each other,
so that we don't need to worry about their order)
- cosmetic logging improvements
---
batch-stabilize.py | 87 ++++++++++++++++++++++++++++++----------------------
1 files changed, 50 insertions(+), 37 deletions(-)
diff --git a/batch-stabilize.py b/batch-stabilize.py
index 912d26b..b76bac7 100755
--- a/batch-stabilize.py
+++ b/batch-stabilize.py
@@ -17,7 +17,7 @@ BUG_REGEX = re.compile("[Bb]ug #?(\d+)")
def print_and_log(message, log):
try:
print message
- log.write(message)
+ log.write(message + '\n')
finally:
log.flush()
@@ -59,7 +59,7 @@ if __name__ == "__main__":
bugzilla.auth()
with open(options.input_filename, "r") as input_file:
- stabilization_list = []
+ stabilization_dict = {}
bug_id = -1
for line in input_file:
if line == "\n":
@@ -84,54 +84,67 @@ if __name__ == "__main__":
p = portage.versions.catsplit(cpv)[1]
pn = portage.versions.pkgsplit(cpv)[0]
ebuild_name = p + ".ebuild"
- stabilization_list.append((pn, ebuild_name, bug_id))
+ if bug_id not in stabilization_dict:
+ stabilization_dict[bug_id] = []
+ stabilization_dict[bug_id].append((pn, ebuild_name))
# Sanity check.
success = True
- for pn, ebuild_name, bug_id in stabilization_list:
- ebuild_path = os.path.join(options.repo, pn, ebuild_name)
- if not os.path.exists(ebuild_path):
- print '%s: file does not exist' % ebuild_path
- success = False
+ for bug_id in stabilization_dict:
+ for (pn, ebuild_name) in stabilization_dict[bug_id]:
+ ebuild_path = os.path.join(options.repo, pn, ebuild_name)
+ if not os.path.exists(ebuild_path):
+ print '%s: file does not exist' % ebuild_path
+ success = False
if not success:
print 'Sanity check failed. Please make sure your CVS repo is up to date (cvs up).'
sys.exit(1)
with open('batch-stabilize.log', 'w') as log_file:
- for pn, ebuild_name, bug_id in stabilization_list:
+ for bug_id in stabilization_dict:
+ print_and_log('Working on bug %d...' % bug_id, log_file)
commit_message = "%s stable wrt bug #%d" % (options.arch, bug_id)
- cvs_path = os.path.join(options.repo, pn)
- print_and_log('Working in %s...' % cvs_path, log_file)
- if run_command(["cvs", "up"], cvs_path, log_file)[0] != 0:
- print '!!! cvs up failed'
- sys.exit(1)
- if run_command(["ekeyword", options.arch, ebuild_name], cvs_path, log_file)[0] != 0:
- print '!!! ekeyword failed'
- sys.exit(1)
- return_code, output = run_command(["cvs", "diff"], cvs_path, log_file)
- # It seems that cvs diff returns 1 if there are differences.
- if return_code == 0 and not output:
- print_and_log('Seems already keyworded, skipping.', log_file)
- continue
- if run_command(["echangelog", commit_message], cvs_path, log_file)[0] != 0:
- print '!!! ekeyword failed'
- sys.exit(1)
- if run_command(["repoman", "manifest"], cvs_path, log_file)[0] != 0:
- print '!!! repoman manifest failed'
- sys.exit(1)
- if run_command(["repoman", "full"], cvs_path, log_file)[0] != 0:
- print '!!! repoman full failed'
- sys.exit(1)
- if run_command(["repoman", "commit", "-m", commit_message], cvs_path, log_file)[0] != 0:
- print '!!! repoman full failed'
- sys.exit(1)
- log_file.write('Posting automated reply in bugzilla...\n')
+ for (pn, ebuild_name) in stabilization_dict[bug_id]:
+ cvs_path = os.path.join(options.repo, pn)
+ print_and_log('Working in %s...' % cvs_path, log_file)
+ if run_command(["cvs", "up"], cvs_path, log_file)[0] != 0:
+ print '!!! cvs up failed'
+ sys.exit(1)
+ if run_command(["ekeyword", options.arch, ebuild_name], cvs_path, log_file)[0] != 0:
+ print '!!! ekeyword failed'
+ sys.exit(1)
+ for (pn, ebuild_name) in stabilization_dict[bug_id]:
+ cvs_path = os.path.join(options.repo, pn)
+ print_and_log('Working in %s...' % cvs_path, log_file)
+ return_code, output = run_command(["cvs", "diff"], cvs_path, log_file)
+ # It seems that cvs diff returns 1 if there are differences.
+ if return_code == 0 and not output:
+ print_and_log('Seems already keyworded, skipping.', log_file)
+ continue
+ if run_command(["echangelog", commit_message], cvs_path, log_file)[0] != 0:
+ print '!!! echangelog failed'
+ sys.exit(1)
+ if run_command(["repoman", "manifest"], cvs_path, log_file)[0] != 0:
+ print '!!! repoman manifest failed'
+ sys.exit(1)
+ if run_command(["repoman", "commit", "-m", commit_message], cvs_path, log_file)[0] != 0:
+ print '!!! repoman commit failed'
+ sys.exit(1)
bug_xml = bugzilla.get(bug_id).find('bug')
+ has_my_arch = False
has_other_arches = False
for cc in bug_xml.findall('cc'):
body, domain = cc.text.split('@', 1)
+ if domain == 'gentoo.org' and body == options.arch:
+ has_my_arch = True
if domain == 'gentoo.org' and body in portage.archlist and body != options.arch:
has_other_arches=True
+
+ if not has_my_arch:
+ print_and_log('Seems that bugzilla has already been updated.', log_file)
+ continue
+
+ print_and_log('Posting automated reply in bugzilla...', log_file)
# We don't close bugs which still have other arches for obvious reasons,
# and security bugs because stabilization is not the last step for them.
if has_other_arches or 'Security' in bug_xml.find('product').text:
@@ -139,7 +152,7 @@ if __name__ == "__main__":
bug_id,
comment='%s stable' % options.arch,
remove_cc='%s@gentoo.org' % options.arch)
- log_file.write('Successfully updated bug %d.\n' % bug_id)
+ print_and_log('Successfully updated bug %d.' % bug_id, log_file)
else:
bugzilla.modify(
bug_id,
@@ -147,4 +160,4 @@ if __name__ == "__main__":
remove_cc='%s@gentoo.org' % options.arch,
status='RESOLVED',
resolution='FIXED')
- log_file.write('Succesfully updated bug %d and closed it.\n' % bug_id)
+ print_and_log('Succesfully updated bug %d and closed it.' % bug_id, log_file)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-10-18 14:05 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-10-18 14:05 UTC (permalink / raw
To: gentoo-commits
commit: c8fd3c42664821fabdc7af7c976f197a4c5551c6
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Tue Oct 18 14:00:13 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Tue Oct 18 14:00:13 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=c8fd3c42
Implement limit option for reverse dependencies.
---
reverse-dependencies.py | 9 ++++++++-
1 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/reverse-dependencies.py b/reverse-dependencies.py
index 88d79aa..4f87139 100755
--- a/reverse-dependencies.py
+++ b/reverse-dependencies.py
@@ -4,6 +4,7 @@
import optparse
import os
+import random
import types
os.environ["PORTDIR_OVERLAY"] = ""
@@ -31,6 +32,7 @@ if __name__ == "__main__":
parser = optparse.OptionParser()
parser.add_option("-i", "--input", dest="input_filename", default="package.keywords", help="Input filename for generated package.keywords file [default=%default]")
parser.add_option("-o", "--output", dest="output_filename", default="package.rdeps", help="Output filename for generated package.rdeps file [default=%default]")
+ parser.add_option("-l", "--limit", dest="limit", type="int", default=-1, help="Limit of reverse dependencies per package. Default is no limit.")
parser.add_option("-v", "--verbose", dest="verbose", action="store_true", default=False)
(options, args) = parser.parse_args()
@@ -68,7 +70,12 @@ if __name__ == "__main__":
pn = portage.versions.pkgsplit(cpv)[0]
if pn in reverse_deps:
output_file.write("# Reverse dependencies for %s\n" % pn)
- for cp, use_combinations in reverse_deps[pn].items():
+ if options.limit == -1:
+ cps = reverse_deps[pn]
+ else:
+ cps = random.sample(reverse_deps[pn], min(options.limit, len(reverse_deps[pn])))
+ for cp in cps:
+ use_combinations = reverse_deps[pn][cp]
if use_combinations != [[]]:
output_file.write("# One of the following USE flag combinations is required:\n")
for use_combination in use_combinations:
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-10-21 15:15 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-10-21 15:15 UTC (permalink / raw
To: gentoo-commits
commit: 9b8ef056ffe123fdd90e5c156f8c6ce532376db9
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Fri Oct 21 15:14:28 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Fri Oct 21 15:14:28 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=9b8ef056
Fix bugs:
- open log in append mode to avoid losing logs on retry
- delete old ChangeLogs to avoid adding the same entry multiple times
- re-Manifest after ekeyword to avoid manifest error on dependent
packages
---
batch-stabilize.py | 12 +++++++++++-
1 files changed, 11 insertions(+), 1 deletions(-)
diff --git a/batch-stabilize.py b/batch-stabilize.py
index b76bac7..0289c42 100755
--- a/batch-stabilize.py
+++ b/batch-stabilize.py
@@ -100,19 +100,29 @@ if __name__ == "__main__":
print 'Sanity check failed. Please make sure your CVS repo is up to date (cvs up).'
sys.exit(1)
- with open('batch-stabilize.log', 'w') as log_file:
+ with open('batch-stabilize.log', 'a') as log_file:
for bug_id in stabilization_dict:
print_and_log('Working on bug %d...' % bug_id, log_file)
commit_message = "%s stable wrt bug #%d" % (options.arch, bug_id)
for (pn, ebuild_name) in stabilization_dict[bug_id]:
cvs_path = os.path.join(options.repo, pn)
print_and_log('Working in %s...' % cvs_path, log_file)
+
+ # Remove existing changelog to avoid adding duplicate entries.
+ try:
+ os.remove(os.path.join(cvs_path, 'ChangeLog'))
+ except OSError:
+ pass
+
if run_command(["cvs", "up"], cvs_path, log_file)[0] != 0:
print '!!! cvs up failed'
sys.exit(1)
if run_command(["ekeyword", options.arch, ebuild_name], cvs_path, log_file)[0] != 0:
print '!!! ekeyword failed'
sys.exit(1)
+ if run_command(["repoman", "manifest"], cvs_path, log_file)[0] != 0:
+ print '!!! repoman manifest failed'
+ sys.exit(1)
for (pn, ebuild_name) in stabilization_dict[bug_id]:
cvs_path = os.path.join(options.repo, pn)
print_and_log('Working in %s...' % cvs_path, log_file)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-10-22 8:18 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-10-22 8:18 UTC (permalink / raw
To: gentoo-commits
commit: ec0907549e7827f7b32988dff21eaee40b7e45ab
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Sat Oct 22 08:17:12 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Sat Oct 22 08:17:12 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=ec090754
Improvements for the bugzilla viewer:
- do brace expansion on the bug summary
- make sure every entry for package.keywords ends with a newline
- add an option to query only for security bugs
---
bugzilla-viewer.py | 49 ++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 42 insertions(+), 7 deletions(-)
diff --git a/bugzilla-viewer.py b/bugzilla-viewer.py
index c45530a..48b253e 100755
--- a/bugzilla-viewer.py
+++ b/bugzilla-viewer.py
@@ -17,6 +17,31 @@ import portage.versions
CPV_REGEX = re.compile("[A-Za-z0-9+_.-]+/[A-Za-z0-9+_-]+-[0-9]+(?:\.[0-9]+)*[a-z0-9_]*(?:-r[0-9]+)?")
+# Snippet from http://bugs.python.org/issue9584
+def expand_braces(orig):
+ r = r'.*(\{.+?[^\\]\})'
+ p = re.compile(r)
+
+ s = orig[:]
+ res = list()
+
+ m = p.search(s)
+ if m is not None:
+ sub = m.group(1)
+ open_brace = s.find(sub)
+ close_brace = open_brace + len(sub) - 1
+ if ',' in sub:
+ for pat in sub.strip('{}').split(','):
+ res.extend(expand_braces(s[:open_brace] + pat + s[close_brace+1:]))
+
+ else:
+ res.extend(expand_braces(s[:open_brace] + sub.replace('}', '\\}') + s[close_brace+1:]))
+
+ else:
+ res.append(s.replace('\\}', '}'))
+
+ return list(set(res))
+
def unicode_sanitize(text):
"""Converts a possibly unicode text to a regular string."""
if type(text) == unicode:
@@ -48,9 +73,11 @@ class Bug:
def detect_cpvs(self):
if self.__cpvs_detected:
return
- for cpv_candidate in CPV_REGEX.findall(self.summary()):
- if portage.db["/"]["porttree"].dbapi.cpv_exists(cpv_candidate):
- self.__cpvs.append(cpv_candidate)
+ for cpv_string in list(set([self.summary()] + expand_braces(self.summary()))):
+ for cpv_candidate in CPV_REGEX.findall(cpv_string):
+ if portage.db["/"]["porttree"].dbapi.cpv_exists(cpv_candidate):
+ self.__cpvs.append(cpv_candidate)
+ self.__cpvs = list(set(self.__cpvs))
self.__cpvs_detected = True
def id_number(self):
@@ -89,10 +116,10 @@ class BugQueue:
def generate_stabilization_list(self):
result = []
for bug in self.__bug_list:
- result.append("# Bug %d: %s" % (bug.id_number(), bug.summary()))
+ result.append("# Bug %d: %s\n" % (bug.id_number(), bug.summary()))
for cpv in bug.cpvs():
- result.append("=" + cpv)
- return "\n".join(result)
+ result.append("=" + cpv + "\n")
+ return ''.join(result)
# Main class (called with curses.wrapper later).
class MainWindow:
@@ -273,6 +300,7 @@ if __name__ == "__main__":
parser.add_option("-o", "--output", dest="output_filename", default="package.keywords", help="Output filename for generated package.keywords file [default=%default]")
parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
parser.add_option("-v", "--verbose", dest="verbose", action="store_true", default=False, help="Include more output, e.g. related bugs")
+ parser.add_option("--security", dest="security", action="store_true", default=False, help="Restrict search to security bugs.")
(options, args) = parser.parse_args()
if not options.arch:
@@ -285,7 +313,14 @@ if __name__ == "__main__":
bugzilla = bugz.bugzilla.Bugz('http://bugs.gentoo.org', skip_auth=True)
print "Searching for arch bugs..."
- raw_bugs = bugzilla.search("", cc="%s@gentoo.org" % options.arch, keywords="STABLEREQ", status=None)
+ criteria = {
+ 'cc': '%s@gentoo.org' % options.arch,
+ 'keywords': 'STABLEREQ',
+ 'status': None
+ }
+ if options.security:
+ criteria['assigned_to'] = 'security@gentoo.org'
+ raw_bugs = bugzilla.search("", **criteria)
bugs = [Bug(xml) for xml in bugzilla.get([bug['bugid'] for bug in raw_bugs]).findall("bug")]
if not bugs:
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-11-03 11:00 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-11-03 11:00 UTC (permalink / raw
To: gentoo-commits
commit: 575e47390093480f4b90e795bb2930fa6d85bb56
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Thu Nov 3 11:00:23 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Thu Nov 3 11:00:23 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=575e4739
Fix bugs resulting in ncurses-induced "crashes".
---
bugzilla-viewer.py | 46 +++++++++++++++++++++++-----------------------
1 files changed, 23 insertions(+), 23 deletions(-)
diff --git a/bugzilla-viewer.py b/bugzilla-viewer.py
index 48b253e..45584a5 100755
--- a/bugzilla-viewer.py
+++ b/bugzilla-viewer.py
@@ -160,12 +160,14 @@ class MainWindow:
def init_screen(self):
(self.height, self.width) = self.screen.getmaxyx()
+ self.bugs_pad_width = self.width / 3 - 1
+ self.contents_pad_width = self.width - self.bugs_pad_width - 1
if self.height < 12 or self.width < 80:
raise TermTooSmall()
self.screen.border()
- self.screen.vline(1, self.width / 3, curses.ACS_VLINE, self.height - 2)
+ self.screen.vline(1, self.bugs_pad_width + 1, curses.ACS_VLINE, self.height - 2)
self.screen.refresh()
self.fill_bugs_pad()
@@ -208,58 +210,56 @@ class MainWindow:
self.bugs_pad.refresh(
pos, 0,
1, 1,
- self.height - 2, self.width / 3 - 1)
+ self.height - 2, self.bugs_pad_width)
def fill_contents_pad(self):
- width = 2 * self.width / 3
-
bug = self.bugs[self.bugs_pad_pos]
output = []
- output += textwrap.wrap(bug.summary(), width=width-2)
- output.append("-" * (width - 2))
+ output += textwrap.wrap(bug.summary(), width=self.contents_pad_width-2)
+ output.append("-" * (self.contents_pad_width - 2))
cpvs = bug.cpvs()
if cpvs:
- output += textwrap.wrap("Found package cpvs:", width=width-2)
+ output += textwrap.wrap("Found package cpvs:", width=self.contents_pad_width-2)
for cpv in cpvs:
- output += textwrap.wrap(cpv, width=width-2)
- output += textwrap.wrap("Press 'a' to add them to the stabilization queue.", width=width-2)
- output.append("-" * (width - 2))
+ output += textwrap.wrap(cpv, width=self.contents_pad_width-2)
+ output += textwrap.wrap("Press 'a' to add them to the stabilization queue.", width=self.contents_pad_width-2)
+ output.append("-" * (self.contents_pad_width - 2))
deps = [self.bug_for_id(dep_id) for dep_id in bug.depends_on()]
if deps:
- output += textwrap.wrap("Depends on:", width=width-2)
+ output += textwrap.wrap("Depends on:", width=self.contents_pad_width-2)
for dep in deps:
desc = "%d %s %s" % (dep.id_number(), dep.status(), dep.summary())
- output += textwrap.wrap(desc, width=width-2)
- output.append("-" * (width - 2))
+ output += textwrap.wrap(desc, width=self.contents_pad_width-2)
+ output.append("-" * (self.contents_pad_width - 2))
related = self.related_bugs[bug.id_number()]
if related:
- output += textwrap.wrap("Related bugs:", width=width-2)
+ output += textwrap.wrap("Related bugs:", width=self.contents_pad_width-2)
for related_bug in related:
if str(related_bug['bugid']) == str(bug.id_number()):
continue
desc = related_bug['bugid'] + " " + related_bug['desc']
- output += textwrap.wrap(desc, width=width-2)
- output.append("-" * (width - 2))
+ output += textwrap.wrap(desc, width=self.contents_pad_width-2)
+ output.append("-" * (self.contents_pad_width - 2))
if bug.id_number() in repoman_dict and repoman_dict[bug.id_number()]:
- output += textwrap.wrap("Repoman output:", width=width-2)
+ output += textwrap.wrap("Repoman output:", width=self.contents_pad_width-2)
lines = repoman_dict[bug.id_number()].split("\n")
for line in lines:
- output += textwrap.wrap(line, width=width-2)
- output.append("-" * (width - 2))
+ output += textwrap.wrap(line, width=self.contents_pad_width-2)
+ output.append("-" * (self.contents_pad_width - 2))
for comment in bug.comments():
for line in comment.split("\n"):
- output += textwrap.wrap(line, width=width-2)
- output.append("-" * (width - 2))
+ output += textwrap.wrap(line, width=self.contents_pad_width-2)
+ output.append("-" * (self.contents_pad_width - 2))
self.contents_pad_length = len(output)
- self.contents_pad = curses.newpad(max(self.contents_pad_length, self.height), width)
+ self.contents_pad = curses.newpad(max(self.contents_pad_length, self.height), self.contents_pad_width)
self.contents_pad.erase()
self.contents_pad_pos = 0
@@ -280,7 +280,7 @@ class MainWindow:
def refresh_contents_pad(self):
self.contents_pad.refresh(
self.contents_pad_pos, 0,
- 1, self.width / 3 + 1,
+ 1, self.bugs_pad_width + 2,
self.height - 2, self.width - 2)
self.screen.refresh()
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-11-21 8:34 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-11-21 8:34 UTC (permalink / raw
To: gentoo-commits
commit: 6f2f2e0dde5c8a1f593fe523e8e72b6eeff5cbb9
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Mon Nov 21 08:34:19 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Mon Nov 21 08:34:19 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=6f2f2e0d
Automated finding candidates for stabilization.
---
stabilization-candidates.py | 122 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 122 insertions(+), 0 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
new file mode 100755
index 0000000..5d0c3f8
--- /dev/null
+++ b/stabilization-candidates.py
@@ -0,0 +1,122 @@
+#!/usr/bin/env python
+# Copyright 2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+import datetime
+import optparse
+import os.path
+import re
+import subprocess
+
+import bugz.bugzilla
+from portage.package.ebuild.getmaskingstatus import getmaskingstatus
+from portage.xml.metadata import MetaDataXML
+import portage.versions
+
+class MyBugz(bugz.bugzilla.Bugz):
+ def get_input(self, prompt):
+ return raw_input(prompt)
+
+if __name__ == "__main__":
+ parser = optparse.OptionParser()
+ parser.add_option("--arch", dest="arch", action="append", help="Gentoo arch to use, e.g. x86, amd64, ... Can be passed multiple times.")
+ parser.add_option("--days", dest="days", type=int, default=30, help="Number of days in the tree after stabilization is possible.")
+ parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
+ parser.add_option("--category", dest="category", help="Portage category filter (default is all categories)")
+
+ (options, args) = parser.parse_args()
+ if not options.arch:
+ parser.error("--arch option is required")
+ if not options.repo:
+ parser.error("--repo option is required")
+ if args:
+ parser.error("unrecognized command-line args")
+
+ url = 'https://bugs.gentoo.org'
+ print 'You may be prompted for your Gentoo Bugzilla username and password (%s).' % url
+ bugzilla = MyBugz(url)
+ bugzilla.auth()
+
+ now = datetime.datetime.now()
+ for cp in portage.portdb.cp_all():
+ if options.category and not cp.startswith(options.category + "/"):
+ continue
+ best_stable = portage.versions.best(portage.portdb.match(cp))
+ if not best_stable:
+ continue
+ candidates = []
+ for cpv in portage.portdb.cp_list(cp):
+ # Only consider higher versions than best stable.
+ if portage.versions.pkgcmp(portage.versions.pkgsplit(cpv), portage.versions.pkgsplit(best_stable)) != 1:
+ continue
+
+ # Eliminate alpha, beta, pre, rc, and so on packages.
+ is_unstable = False
+ for suffix in portage.versions.endversion_keys:
+ if ("_" + suffix) in portage.versions.pkgsplit(cpv)[1]:
+ is_unstable = True
+ break
+ if is_unstable:
+ continue
+
+ # Eliminate hard masked packages among others.
+ if getmaskingstatus(cpv) not in [[u'~%s keyword' % arch] for arch in options.arch]:
+ continue
+
+ pv = portage.versions.catsplit(cpv)[1]
+ with open(os.path.join(options.repo, cp, 'ChangeLog')) as changelog_file:
+ regex = '\*%s \((.*)\)' % re.escape(pv)
+ match = re.search(regex, changelog_file.read())
+ if not match:
+ continue
+ changelog_date = datetime.datetime.strptime(match.group(1), '%d %b %Y')
+ if now - changelog_date < datetime.timedelta(days=options.days):
+ continue
+
+ candidates.append(cpv)
+ if not candidates:
+ continue
+ candidates.sort(key=portage.versions.cpv_sort_key())
+ print '\t\tWorking on %s. Candidates: %s' % (cp, ', '.join(candidates))
+ candidates.reverse()
+ best_candidate = None
+ cvs_path = os.path.join(options.repo, cp)
+ for candidate in candidates:
+ ebuild_name = portage.versions.catsplit(candidate)[1] + ".ebuild"
+ ebuild_path = os.path.join(cvs_path, ebuild_name)
+ manifest_path = os.path.join(cvs_path, 'Manifest')
+ original_contents = open(ebuild_path).read()
+ manifest_contents = open(manifest_path).read()
+ try:
+ for arch in options.arch:
+ subprocess.check_output(["ekeyword", arch, ebuild_name], cwd=cvs_path)
+ subprocess.check_output(["repoman", "manifest"], cwd=cvs_path)
+ subprocess.check_output(["repoman", "full"], cwd=cvs_path)
+ except subprocess.CalledProcessError:
+ continue
+ finally:
+ f = open(ebuild_path, "w")
+ f.write(original_contents)
+ f.close()
+ f = open(manifest_path, "w")
+ f.write(manifest_contents)
+ f.close()
+ best_candidate = candidate
+ break
+ if best_candidate:
+ # Do not risk trying to stabilize a package with known bugs.
+ bugs = bugzilla.search(cp, status=None)
+ if bugs:
+ continue
+
+ # Protection against filing a stabilization bug twice.
+ bugs = bugzilla.search(best_candidate)
+ if bugs:
+ continue
+
+ metadata = MetaDataXML(os.path.join(cvs_path, 'metadata.xml'), '/usr/portage/metadata/herds.xml')
+
+ # Spam protection (strip @ and domain name).
+ maintainer_string = re.sub('@[^\s]*', '', metadata.format_maintainer_string())
+
+ print (cp, best_stable, best_candidate, maintainer_string)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-11-23 8:59 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-11-23 8:59 UTC (permalink / raw
To: gentoo-commits
commit: 2730e673145944ab74b0e3967b0377cd504556d3
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Wed Nov 23 08:58:32 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Wed Nov 23 08:58:32 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=2730e673
Ignore ruby for now.
---
stabilization-candidates.py | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 696ad9c..55c3da1 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -45,6 +45,11 @@ if __name__ == "__main__":
for cp in portage.portdb.cp_all():
if options.category and not cp.startswith(options.category + "/"):
continue
+
+ # Ignore ruby for now, bug #391645.
+ if 'ruby' in cp:
+ continue
+
best_stable = portage.versions.best(portage.portdb.match(cp))
if not best_stable:
continue
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-11-23 8:59 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-11-23 8:59 UTC (permalink / raw
To: gentoo-commits
commit: 5a195bce432416b7486ec481d7dbb241c80fc412
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Wed Nov 23 08:57:03 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Wed Nov 23 08:57:03 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=5a195bce
Automatically file stabilization bugs.
---
stabilization-candidates.py | 43 ++++++++++++++++++++++++++++++++++++++-----
1 files changed, 38 insertions(+), 5 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 5d0c3f8..696ad9c 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -5,8 +5,10 @@
import datetime
import optparse
import os.path
+import random
import re
import subprocess
+import urllib
import bugz.bugzilla
from portage.package.ebuild.getmaskingstatus import getmaskingstatus
@@ -21,6 +23,7 @@ if __name__ == "__main__":
parser = optparse.OptionParser()
parser.add_option("--arch", dest="arch", action="append", help="Gentoo arch to use, e.g. x86, amd64, ... Can be passed multiple times.")
parser.add_option("--days", dest="days", type=int, default=30, help="Number of days in the tree after stabilization is possible.")
+ parser.add_option("-l", "--limit", dest="limit", type="int", default=-1, help="Limit of filed bugs. Default is no limit.")
parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
parser.add_option("--category", dest="category", help="Portage category filter (default is all categories)")
@@ -37,6 +40,7 @@ if __name__ == "__main__":
bugzilla = MyBugz(url)
bugzilla.auth()
+ final_candidates = []
now = datetime.datetime.now()
for cp in portage.portdb.cp_all():
if options.category and not cp.startswith(options.category + "/"):
@@ -44,6 +48,7 @@ if __name__ == "__main__":
best_stable = portage.versions.best(portage.portdb.match(cp))
if not best_stable:
continue
+ print 'Working on %s...' % cp
candidates = []
for cpv in portage.portdb.cp_list(cp):
# Only consider higher versions than best stable.
@@ -58,6 +63,12 @@ if __name__ == "__main__":
break
if is_unstable:
continue
+
+ # Eliminate 'live' packages. Obviously have some false positives,
+ # but it'd be much worse to miss something. There are variations
+ # like -r9999 or .9999 in the tree.
+ if '99' in cpv:
+ continue
# Eliminate hard masked packages among others.
if getmaskingstatus(cpv) not in [[u'~%s keyword' % arch] for arch in options.arch]:
@@ -77,7 +88,6 @@ if __name__ == "__main__":
if not candidates:
continue
candidates.sort(key=portage.versions.cpv_sort_key())
- print '\t\tWorking on %s. Candidates: %s' % (cp, ', '.join(candidates))
candidates.reverse()
best_candidate = None
cvs_path = os.path.join(options.repo, cp)
@@ -115,8 +125,31 @@ if __name__ == "__main__":
continue
metadata = MetaDataXML(os.path.join(cvs_path, 'metadata.xml'), '/usr/portage/metadata/herds.xml')
+ maintainer_split = metadata.format_maintainer_string().split(' ', 1)
+ maintainer = maintainer_split[0]
+ if len(maintainer_split) > 1:
+ other_maintainers = maintainer_split[1].split(',')
+ else:
+ other_maintainers = []
+ url = 'http://packages.gentoo.org/package/%s?arches=linux' % urllib.quote(cp)
+ final_candidates.append((best_candidate, url, maintainer, other_maintainers))
- # Spam protection (strip @ and domain name).
- maintainer_string = re.sub('@[^\s]*', '', metadata.format_maintainer_string())
-
- print (cp, best_stable, best_candidate, maintainer_string)
+ if options.limit != -1:
+ final_candidates = random.sample(final_candidates, min(options.limit, len(final_candidates)))
+ for x in final_candidates:
+ best_candidate, url, maintainer, other_maintainers = x
+ description = ('Is it OK to stabilize =%s ?\n\n' % best_candidate +
+ 'If so, please CC arches and add STABLEREQ keyword.\n\n' +
+ 'Stabilization of this package has been repoman-checked on the following arches: %s' % ', '.join(options.arch))
+ bug_id = bugzilla.post('Gentoo Linux',
+ 'Keywording and Stabilization',
+ 'Please stabilize =%s' % best_candidate,
+ description,
+ url=url,
+ assigned_to=maintainer,
+ cc=other_maintainers,
+ severity='enhancement')
+ if bug_id == 0:
+ print 'Submitting bug for %s failed. :-(' % best_candidate
+ else:
+ print 'Submitted bug #%d for %s. ;-)' % (bug_id, best_candidate)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-11-30 17:38 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-11-30 17:38 UTC (permalink / raw
To: gentoo-commits
commit: b41b45df8693af1b00b59f8ad64ce4d4e1815cbf
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Wed Nov 30 17:37:53 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Wed Nov 30 17:37:53 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=b41b45df
Do not file bugs by default, and only stabilze latest version in ~arch.
---
stabilization-candidates.py | 118 +++++++++++++++++++++++--------------------
1 files changed, 63 insertions(+), 55 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 55c3da1..8feee30 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -26,6 +26,7 @@ if __name__ == "__main__":
parser.add_option("-l", "--limit", dest="limit", type="int", default=-1, help="Limit of filed bugs. Default is no limit.")
parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
parser.add_option("--category", dest="category", help="Portage category filter (default is all categories)")
+ parser.add_option("--file-bugs", dest="file_bugs", action="store_true", default=False, help="File stabilization bugs for detected candidates. Otherwise (default) the candidates are just displayed.")
(options, args) = parser.parse_args()
if not options.arch:
@@ -92,69 +93,76 @@ if __name__ == "__main__":
candidates.append(cpv)
if not candidates:
continue
+
candidates.sort(key=portage.versions.cpv_sort_key())
candidates.reverse()
- best_candidate = None
+
+ # Only consider the best version in ~arch for stabilization.
+ # It's usually better tested, and often maintainers refuse
+ # to stabilize anything else, e.g. bug #391607.
+ best_candidate = candidates[0]
+
cvs_path = os.path.join(options.repo, cp)
- for candidate in candidates:
- ebuild_name = portage.versions.catsplit(candidate)[1] + ".ebuild"
- ebuild_path = os.path.join(cvs_path, ebuild_name)
- manifest_path = os.path.join(cvs_path, 'Manifest')
- original_contents = open(ebuild_path).read()
- manifest_contents = open(manifest_path).read()
- try:
- for arch in options.arch:
- subprocess.check_output(["ekeyword", arch, ebuild_name], cwd=cvs_path)
- subprocess.check_output(["repoman", "manifest"], cwd=cvs_path)
- subprocess.check_output(["repoman", "full"], cwd=cvs_path)
- except subprocess.CalledProcessError:
- continue
- finally:
- f = open(ebuild_path, "w")
- f.write(original_contents)
- f.close()
- f = open(manifest_path, "w")
- f.write(manifest_contents)
- f.close()
- best_candidate = candidate
- break
- if best_candidate:
- # Do not risk trying to stabilize a package with known bugs.
- bugs = bugzilla.search(cp, status=None)
- if bugs:
- continue
+ ebuild_name = portage.versions.catsplit(best_candidate)[1] + ".ebuild"
+ ebuild_path = os.path.join(cvs_path, ebuild_name)
+ manifest_path = os.path.join(cvs_path, 'Manifest')
+ original_contents = open(ebuild_path).read()
+ manifest_contents = open(manifest_path).read()
+ try:
+ for arch in options.arch:
+ subprocess.check_output(["ekeyword", arch, ebuild_name], cwd=cvs_path)
+ subprocess.check_output(["repoman", "manifest"], cwd=cvs_path)
+ subprocess.check_output(["repoman", "full"], cwd=cvs_path)
+ except subprocess.CalledProcessError:
+ continue
+ finally:
+ f = open(ebuild_path, "w")
+ f.write(original_contents)
+ f.close()
+ f = open(manifest_path, "w")
+ f.write(manifest_contents)
+ f.close()
- # Protection against filing a stabilization bug twice.
- bugs = bugzilla.search(best_candidate)
- if bugs:
- continue
+ # Do not risk trying to stabilize a package with known bugs.
+ bugs = bugzilla.search(cp, status=None)
+ if bugs:
+ continue
- metadata = MetaDataXML(os.path.join(cvs_path, 'metadata.xml'), '/usr/portage/metadata/herds.xml')
- maintainer_split = metadata.format_maintainer_string().split(' ', 1)
- maintainer = maintainer_split[0]
- if len(maintainer_split) > 1:
- other_maintainers = maintainer_split[1].split(',')
- else:
- other_maintainers = []
- url = 'http://packages.gentoo.org/package/%s?arches=linux' % urllib.quote(cp)
- final_candidates.append((best_candidate, url, maintainer, other_maintainers))
+ # Protection against filing a stabilization bug twice.
+ bugs = bugzilla.search(best_candidate)
+ if bugs:
+ continue
+
+ metadata = MetaDataXML(os.path.join(cvs_path, 'metadata.xml'), '/usr/portage/metadata/herds.xml')
+ maintainer_split = metadata.format_maintainer_string().split(' ', 1)
+ maintainer = maintainer_split[0]
+ if len(maintainer_split) > 1:
+ other_maintainers = maintainer_split[1].split(',')
+ else:
+ other_maintainers = []
+ url = 'http://packages.gentoo.org/package/%s?arches=linux' % urllib.quote(cp)
+ final_candidates.append((best_candidate, url, maintainer, other_maintainers))
if options.limit != -1:
final_candidates = random.sample(final_candidates, min(options.limit, len(final_candidates)))
for x in final_candidates:
best_candidate, url, maintainer, other_maintainers = x
- description = ('Is it OK to stabilize =%s ?\n\n' % best_candidate +
- 'If so, please CC arches and add STABLEREQ keyword.\n\n' +
- 'Stabilization of this package has been repoman-checked on the following arches: %s' % ', '.join(options.arch))
- bug_id = bugzilla.post('Gentoo Linux',
- 'Keywording and Stabilization',
- 'Please stabilize =%s' % best_candidate,
- description,
- url=url,
- assigned_to=maintainer,
- cc=other_maintainers,
- severity='enhancement')
- if bug_id == 0:
- print 'Submitting bug for %s failed. :-(' % best_candidate
+
+ if options.file_bugs:
+ description = ('Is it OK to stabilize =%s ?\n\n' % best_candidate +
+ 'If so, please CC arches and add STABLEREQ keyword.\n\n' +
+ 'Stabilization of this package has been repoman-checked on the following arches: %s' % ', '.join(options.arch))
+ bug_id = bugzilla.post('Gentoo Linux',
+ 'Keywording and Stabilization',
+ 'Please stabilize =%s' % best_candidate,
+ description,
+ url=url,
+ assigned_to=maintainer,
+ cc=other_maintainers,
+ severity='enhancement')
+ if bug_id == 0:
+ print 'Submitting bug for %s failed. :-(' % best_candidate
+ else:
+ print 'Submitted bug #%d for %s. ;-)' % (bug_id, best_candidate)
else:
- print 'Submitted bug #%d for %s. ;-)' % (bug_id, best_candidate)
+ print (best_candidate, maintainer, other_maintainers)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-12-01 18:47 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-12-01 18:47 UTC (permalink / raw
To: gentoo-commits
commit: 19044e7c148d10a58c47476582925fbab10b574b
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Thu Dec 1 18:47:26 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Thu Dec 1 18:47:26 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=19044e7c
Check KEYWORDS for all requested arches.
---
stabilization-candidates.py | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index d2e539c..44cbe75 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -102,6 +102,15 @@ if __name__ == "__main__":
if now - changelog_date < datetime.timedelta(days=options.days):
continue
+ keywords = portage.db["/"]["porttree"].dbapi.aux_get(best_candidate, ['KEYWORDS'])[0]
+ missing_arch = False
+ for arch in options.arch:
+ if arch not in keywords:
+ missing_arch = True
+ break
+ if missing_arch:
+ continue
+
cvs_path = os.path.join(options.repo, cp)
ebuild_name = portage.versions.catsplit(best_candidate)[1] + ".ebuild"
ebuild_path = os.path.join(cvs_path, ebuild_name)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-12-01 18:47 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-12-01 18:47 UTC (permalink / raw
To: gentoo-commits
commit: ed362d1d47dd71a7deb1610cd1178305522339ac
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Thu Dec 1 18:46:56 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Thu Dec 1 18:46:56 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=ed362d1d
Really only consider latest version in ~arch.
---
stabilization-candidates.py | 22 +++++++++++-----------
1 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 8feee30..d2e539c 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -80,16 +80,6 @@ if __name__ == "__main__":
if getmaskingstatus(cpv) not in [[u'~%s keyword' % arch] for arch in options.arch]:
continue
- pv = portage.versions.catsplit(cpv)[1]
- with open(os.path.join(options.repo, cp, 'ChangeLog')) as changelog_file:
- regex = '\*%s \((.*)\)' % re.escape(pv)
- match = re.search(regex, changelog_file.read())
- if not match:
- continue
- changelog_date = datetime.datetime.strptime(match.group(1), '%d %b %Y')
- if now - changelog_date < datetime.timedelta(days=options.days):
- continue
-
candidates.append(cpv)
if not candidates:
continue
@@ -97,11 +87,21 @@ if __name__ == "__main__":
candidates.sort(key=portage.versions.cpv_sort_key())
candidates.reverse()
- # Only consider the best version in ~arch for stabilization.
+ # Only consider the best version for stabilization.
# It's usually better tested, and often maintainers refuse
# to stabilize anything else, e.g. bug #391607.
best_candidate = candidates[0]
+ pv = portage.versions.catsplit(best_candidate)[1]
+ with open(os.path.join(options.repo, cp, 'ChangeLog')) as changelog_file:
+ regex = '\*%s \((.*)\)' % re.escape(pv)
+ match = re.search(regex, changelog_file.read())
+ if not match:
+ continue
+ changelog_date = datetime.datetime.strptime(match.group(1), '%d %b %Y')
+ if now - changelog_date < datetime.timedelta(days=options.days):
+ continue
+
cvs_path = os.path.join(options.repo, cp)
ebuild_name = portage.versions.catsplit(best_candidate)[1] + ".ebuild"
ebuild_path = os.path.join(cvs_path, ebuild_name)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-12-01 18:56 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-12-01 18:56 UTC (permalink / raw
To: gentoo-commits
commit: 3905490ccb9f80f8a846e2d3cba60479a075b9cf
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Thu Dec 1 18:55:51 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Thu Dec 1 18:55:51 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=3905490c
Add an --exclude option instead of hardcoding ruby exclusion.
---
stabilization-candidates.py | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 44cbe75..62efa04 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -26,6 +26,7 @@ if __name__ == "__main__":
parser.add_option("-l", "--limit", dest="limit", type="int", default=-1, help="Limit of filed bugs. Default is no limit.")
parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
parser.add_option("--category", dest="category", help="Portage category filter (default is all categories)")
+ parser.add_option("--exclude", dest="exclude", help="Regular expression for excluded packages.")
parser.add_option("--file-bugs", dest="file_bugs", action="store_true", default=False, help="File stabilization bugs for detected candidates. Otherwise (default) the candidates are just displayed.")
(options, args) = parser.parse_args()
@@ -47,8 +48,7 @@ if __name__ == "__main__":
if options.category and not cp.startswith(options.category + "/"):
continue
- # Ignore ruby for now, bug #391645.
- if 'ruby' in cp:
+ if options.exclude and re.match(options.exclude, cp):
continue
best_stable = portage.versions.best(portage.portdb.match(cp))
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-12-06 11:14 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-12-06 11:14 UTC (permalink / raw
To: gentoo-commits
commit: 2dacce21a7418c147ab830e3f8e99ad682e3a51b
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Tue Dec 6 11:13:59 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Tue Dec 6 11:13:59 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=2dacce21
When repoman manifest fails, do not crash entire script.
---
bugzilla-viewer.py | 7 ++++---
1 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/bugzilla-viewer.py b/bugzilla-viewer.py
index 45584a5..ce0b2eb 100755
--- a/bugzilla-viewer.py
+++ b/bugzilla-viewer.py
@@ -353,9 +353,10 @@ if __name__ == "__main__":
manifest_contents = open(manifest_path).read()
try:
output = repoman_dict[bug.id_number()]
- output += subprocess.Popen(["ekeyword", options.arch, ebuild_name], cwd=cvs_path, stdout=subprocess.PIPE).communicate()[0]
- subprocess.check_call(["repoman", "manifest"], cwd=cvs_path)
- output += subprocess.Popen(["repoman", "full"], cwd=cvs_path, stdout=subprocess.PIPE).communicate()[0]
+ output += subprocess.Popen(["ekeyword", options.arch, ebuild_name], cwd=cvs_path, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()[0]
+ # repoman manifest may fail if files are unfetchable. It shouldn't abort this script.
+ output += subprocess.Popen(["repoman", "manifest"], cwd=cvs_path, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()[0]
+ output += subprocess.Popen(["repoman", "full"], cwd=cvs_path, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()[0]
repoman_dict[bug.id_number()] = output
finally:
f = open(ebuild_path, "w")
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2011-12-14 7:23 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2011-12-14 7:23 UTC (permalink / raw
To: gentoo-commits
commit: 05c2a91bc08d694c8d004126e2b99a610a67759b
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Wed Dec 14 07:23:10 2011 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Wed Dec 14 07:23:10 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=05c2a91b
Properly handle simultaneous stabilization of multiple packages
in a single bug.
---
bugzilla-viewer.py | 44 ++++++++++++++++++++++++--------------------
1 files changed, 24 insertions(+), 20 deletions(-)
diff --git a/bugzilla-viewer.py b/bugzilla-viewer.py
index ce0b2eb..e3cbcac 100755
--- a/bugzilla-viewer.py
+++ b/bugzilla-viewer.py
@@ -342,29 +342,33 @@ if __name__ == "__main__":
pv = portage.versions.cpv_getkey(cpv)
if options.verbose:
related_bugs[bug.id_number()] += bugzilla.search(pv, status=None)
-
- if options.repo:
- cvs_path = os.path.join(options.repo, pv)
- ebuild_name = portage.versions.catsplit(cpv)[1] + ".ebuild"
- ebuild_path = os.path.join(cvs_path, ebuild_name)
- manifest_path = os.path.join(cvs_path, 'Manifest')
- if os.path.exists(ebuild_path):
- original_contents = open(ebuild_path).read()
- manifest_contents = open(manifest_path).read()
- try:
- output = repoman_dict[bug.id_number()]
+ if options.repo:
+ to_restore = {}
+ try:
+ output = repoman_dict[bug.id_number()]
+ for cpv in bug.cpvs():
+ pv = portage.versions.cpv_getkey(cpv)
+ cvs_path = os.path.join(options.repo, pv)
+ ebuild_name = portage.versions.catsplit(cpv)[1] + ".ebuild"
+ ebuild_path = os.path.join(cvs_path, ebuild_name)
+ manifest_path = os.path.join(cvs_path, 'Manifest')
+ if os.path.exists(ebuild_path):
+ if ebuild_path not in to_restore:
+ to_restore[ebuild_path] = open(ebuild_path).read()
+ if manifest_path not in to_restore:
+ to_restore[manifest_path] = open(manifest_path).read()
output += subprocess.Popen(["ekeyword", options.arch, ebuild_name], cwd=cvs_path, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()[0]
# repoman manifest may fail if files are unfetchable. It shouldn't abort this script.
output += subprocess.Popen(["repoman", "manifest"], cwd=cvs_path, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()[0]
- output += subprocess.Popen(["repoman", "full"], cwd=cvs_path, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()[0]
- repoman_dict[bug.id_number()] = output
- finally:
- f = open(ebuild_path, "w")
- f.write(original_contents)
- f.close()
- f = open(manifest_path, "w")
- f.write(manifest_contents)
- f.close()
+ pvs = list(set([portage.versions.cpv_getkey(cpv) for cpv in bug.cpvs()]))
+ for pv in pvs:
+ cvs_path = os.path.join(options.repo, pv)
+ output += subprocess.Popen(["repoman", "full"], cwd=cvs_path, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()[0]
+ repoman_dict[bug.id_number()] = output
+ finally:
+ for path in to_restore:
+ with open(path, "w") as f:
+ f.write(to_restore[path])
dep_bug_ids += bug.depends_on()
dep_bug_ids = list(set(dep_bug_ids))
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2012-01-21 17:05 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-01-21 17:05 UTC (permalink / raw
To: gentoo-commits
commit: ec5a1892fb2d15238a303ccf0ef153cd817d140b
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 21 17:05:00 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Sat Jan 21 17:05:00 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=ec5a1892
Fix bugs related to empty lines handling.
---
batch-stabilize.py | 11 +++++++----
1 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/batch-stabilize.py b/batch-stabilize.py
index 0289c42..e2c4976 100755
--- a/batch-stabilize.py
+++ b/batch-stabilize.py
@@ -62,7 +62,10 @@ if __name__ == "__main__":
stabilization_dict = {}
bug_id = -1
for line in input_file:
- if line == "\n":
+ line = line.strip()
+
+ # Skip empty/whitespace lines.
+ if not line:
continue
if line.startswith("#"):
@@ -78,9 +81,9 @@ if __name__ == "__main__":
print 'Could not recognize bug id'
sys.exit(1)
- if not line.endswith("\n"):
- line += "\n"
- cpv = line[1:-1]
+ # Drop the leading '='.
+ cpv = line[1:]
+
p = portage.versions.catsplit(cpv)[1]
pn = portage.versions.pkgsplit(cpv)[0]
ebuild_name = p + ".ebuild"
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2012-01-27 14:55 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-01-27 14:55 UTC (permalink / raw
To: gentoo-commits
commit: 8aff939c6831ac73eb6a6a4a07a6c475e15ed308
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Fri Jan 27 14:54:19 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Fri Jan 27 14:54:19 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=8aff939c
Begin work on maintainer-timeout script.
Extract common parts to common.py
Fix bug where only first 100 bug details were retrieved from Bugzilla.
---
.gitignore | 1 +
bugzilla-viewer.py | 77 ++-------------------------------
common.py | 100 +++++++++++++++++++++++++++++++++++++++++++
maintainer-timeout.py | 51 ++++++++++++++++++++++
stabilization-candidates.py | 8 +++-
5 files changed, 162 insertions(+), 75 deletions(-)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0d20b64
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+*.pyc
diff --git a/bugzilla-viewer.py b/bugzilla-viewer.py
index e3cbcac..8a1e131 100755
--- a/bugzilla-viewer.py
+++ b/bugzilla-viewer.py
@@ -15,32 +15,7 @@ import xml.etree
import bugz.bugzilla
import portage.versions
-CPV_REGEX = re.compile("[A-Za-z0-9+_.-]+/[A-Za-z0-9+_-]+-[0-9]+(?:\.[0-9]+)*[a-z0-9_]*(?:-r[0-9]+)?")
-
-# Snippet from http://bugs.python.org/issue9584
-def expand_braces(orig):
- r = r'.*(\{.+?[^\\]\})'
- p = re.compile(r)
-
- s = orig[:]
- res = list()
-
- m = p.search(s)
- if m is not None:
- sub = m.group(1)
- open_brace = s.find(sub)
- close_brace = open_brace + len(sub) - 1
- if ',' in sub:
- for pat in sub.strip('{}').split(','):
- res.extend(expand_braces(s[:open_brace] + pat + s[close_brace+1:]))
-
- else:
- res.extend(expand_braces(s[:open_brace] + sub.replace('}', '\\}') + s[close_brace+1:]))
-
- else:
- res.append(s.replace('\\}', '}'))
-
- return list(set(res))
+from common import Bug, chunks
def unicode_sanitize(text):
"""Converts a possibly unicode text to a regular string."""
@@ -53,52 +28,6 @@ def unicode_sanitize(text):
class TermTooSmall(Exception):
pass
-class Bug:
- def __init__(self, xml=None, id_number=None, summary=None, status=None):
- if xml is not None:
- self.__id = int(xml.find("bug_id").text)
- self.__summary = xml.find("short_desc").text
- self.__status = xml.find("bug_status").text
- self.__depends_on = [int(dep.text) for dep in xml.findall("dependson")]
- self.__comments = [c.find("who").text + "\n" + c.find("thetext").text for c in xml.findall("long_desc")]
- if id_number is not None:
- self.__id = id_number
- if summary is not None:
- self.__summary = summary
- if status is not None:
- self.__status = status
- self.__cpvs_detected = False
- self.__cpvs = []
-
- def detect_cpvs(self):
- if self.__cpvs_detected:
- return
- for cpv_string in list(set([self.summary()] + expand_braces(self.summary()))):
- for cpv_candidate in CPV_REGEX.findall(cpv_string):
- if portage.db["/"]["porttree"].dbapi.cpv_exists(cpv_candidate):
- self.__cpvs.append(cpv_candidate)
- self.__cpvs = list(set(self.__cpvs))
- self.__cpvs_detected = True
-
- def id_number(self):
- return self.__id
-
- def summary(self):
- return self.__summary
-
- def status(self):
- return self.__status
-
- def depends_on(self):
- return self.__depends_on
-
- def comments(self):
- return self.__comments
-
- def cpvs(self):
- assert(self.__cpvs_detected)
- return self.__cpvs
-
class BugQueue:
def __init__(self):
self.__bug_list = []
@@ -320,8 +249,10 @@ if __name__ == "__main__":
}
if options.security:
criteria['assigned_to'] = 'security@gentoo.org'
+ bugs = []
raw_bugs = bugzilla.search("", **criteria)
- bugs = [Bug(xml) for xml in bugzilla.get([bug['bugid'] for bug in raw_bugs]).findall("bug")]
+ for chunk in chunks(raw_bugs, 100):
+ bugs += [Bug(xml) for xml in bugzilla.get([bug['bugid'] for bug in chunk]).findall("bug")]
if not bugs:
print 'The bug list is empty. Exiting.'
diff --git a/common.py b/common.py
new file mode 100644
index 0000000..d6841fb
--- /dev/null
+++ b/common.py
@@ -0,0 +1,100 @@
+# Copyright 2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+import cStringIO
+import re
+
+import portage
+
+
+CPV_REGEX = re.compile("[A-Za-z0-9+_.-]+/[A-Za-z0-9+_-]+-[0-9]+(?:\.[0-9]+)*[a-z0-9_]*(?:-r[0-9]+)?")
+
+
+def chunks(iterable, length):
+ for i in range(0, len(iterable), length):
+ yield iterable[i:i + length]
+
+
+# Snippet from http://bugs.python.org/issue9584
+def expand_braces(orig):
+ r = r'.*(\{.+?[^\\]\})'
+ p = re.compile(r)
+
+ s = orig[:]
+ res = list()
+
+ m = p.search(s)
+ if m is not None:
+ sub = m.group(1)
+ open_brace = s.find(sub)
+ close_brace = open_brace + len(sub) - 1
+ if ',' in sub:
+ for pat in sub.strip('{}').split(','):
+ res.extend(expand_braces(s[:open_brace] + pat + s[close_brace+1:]))
+
+ else:
+ res.extend(expand_braces(s[:open_brace] + sub.replace('}', '\\}') + s[close_brace+1:]))
+
+ else:
+ res.append(s.replace('\\}', '}'))
+
+ return list(set(res))
+
+
+class Bug:
+ def __init__(self, xml=None, id_number=None, summary=None, status=None):
+ if xml is not None:
+ self.__id = int(xml.find("bug_id").text)
+ self.__summary = xml.find("short_desc").text
+ self.__status = xml.find("bug_status").text
+ self.__depends_on = [int(dep.text) for dep in xml.findall("dependson")]
+ self.__comments = [c.find("who").text + "\n" + c.find("thetext").text for c in xml.findall("long_desc")]
+ self.__cc = [cc.text for cc in xml.findall("cc")]
+
+ self.__keywords = []
+ keywords_elem = xml.find("keywords")
+ if keywords_elem is not None and keywords_elem.text:
+ self.__keywords = [k.strip() for k in keywords_elem.text.split(",")]
+ if id_number is not None:
+ self.__id = id_number
+ if summary is not None:
+ self.__summary = summary
+ if status is not None:
+ self.__status = status
+ self.__cpvs_detected = False
+ self.__cpvs = []
+
+ def detect_cpvs(self):
+ if self.__cpvs_detected:
+ return
+ for cpv_string in list(set([self.summary()] + expand_braces(self.summary()))):
+ for cpv_candidate in CPV_REGEX.findall(cpv_string):
+ if portage.db["/"]["porttree"].dbapi.cpv_exists(cpv_candidate):
+ self.__cpvs.append(cpv_candidate)
+ self.__cpvs = list(set(self.__cpvs))
+ self.__cpvs_detected = True
+
+ def id_number(self):
+ return self.__id
+
+ def summary(self):
+ return self.__summary
+
+ def status(self):
+ return self.__status
+
+ def depends_on(self):
+ return self.__depends_on
+
+ def comments(self):
+ return self.__comments
+
+ def cc(self):
+ return self.__cc
+
+ def keywords(self):
+ return self.__keywords
+
+ def cpvs(self):
+ assert(self.__cpvs_detected)
+ return self.__cpvs
diff --git a/maintainer-timeout.py b/maintainer-timeout.py
new file mode 100755
index 0000000..c75edd6
--- /dev/null
+++ b/maintainer-timeout.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+# Copyright 2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+import optparse
+
+import bugz.bugzilla
+import portage.versions
+
+from common import Bug, chunks
+
+
+class MyBugz(bugz.bugzilla.Bugz):
+ def get_input(self, prompt):
+ return raw_input(prompt)
+
+
+if __name__ == "__main__":
+ parser = optparse.OptionParser()
+ (options, args) = parser.parse_args()
+ if args:
+ parser.error("unrecognized command-line args")
+
+ url = 'https://bugs.gentoo.org'
+ print 'You may be prompted for your Gentoo Bugzilla username and password (%s).' % url
+ bugzilla = MyBugz(url, forget=True)
+ bugzilla.auth()
+
+ bugs = []
+ raw_bugs = bugzilla.search('please stabilize', reporter=bugzilla.user, status=None)
+ for chunk in chunks(raw_bugs, 100):
+ bugs += [Bug(xml) for xml in bugzilla.get([bug['bugid'] for bug in chunk]).findall("bug")]
+ for bug in bugs:
+ if 'STABLEREQ' in bug.keywords():
+ continue
+ arch_found = False
+ for arch in portage.archlist:
+ if '%s@gentoo.org' % arch in bug.cc():
+ arch_found = True
+ break
+ if arch_found:
+ continue
+ if len(bug.comments()) > 1:
+ continue
+ bug.detect_cpvs()
+ if len(bug.cpvs()) != 1:
+ continue
+ cp = portage.versions.cpv_getkey(bug.cpvs()[0])
+ for cpv in portage.portdb.cp_list(cp):
+ print portage.portdb.aux_get(cpv, ['KEYWORDS'])
+ print (bug.id_number(), bug.summary(), cp)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 62efa04..1a7211c 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -115,8 +115,12 @@ if __name__ == "__main__":
ebuild_name = portage.versions.catsplit(best_candidate)[1] + ".ebuild"
ebuild_path = os.path.join(cvs_path, ebuild_name)
manifest_path = os.path.join(cvs_path, 'Manifest')
- original_contents = open(ebuild_path).read()
- manifest_contents = open(manifest_path).read()
+ try:
+ original_contents = open(ebuild_path).read()
+ manifest_contents = open(manifest_path).read()
+ except IOError, e:
+ print e
+ continue
try:
for arch in options.arch:
subprocess.check_output(["ekeyword", arch, ebuild_name], cwd=cvs_path)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2012-02-02 16:48 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-02-02 16:48 UTC (permalink / raw
To: gentoo-commits
commit: e6c4d9a4da903a2c4d1f190089bed7e365d28f39
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Thu Feb 2 16:47:36 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Thu Feb 2 16:47:36 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=e6c4d9a4
Working implementation of maintainer-timeout.
---
common.py | 5 +++++
maintainer-timeout.py | 25 +++++++++++++++++++++++--
2 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/common.py b/common.py
index d6841fb..ad25ad8 100644
--- a/common.py
+++ b/common.py
@@ -2,6 +2,7 @@
# Distributed under the terms of the GNU General Public License v2
import cStringIO
+import datetime
import re
import portage
@@ -50,6 +51,7 @@ class Bug:
self.__depends_on = [int(dep.text) for dep in xml.findall("dependson")]
self.__comments = [c.find("who").text + "\n" + c.find("thetext").text for c in xml.findall("long_desc")]
self.__cc = [cc.text for cc in xml.findall("cc")]
+ self.__creation_timestamp = datetime.datetime.strptime(xml.find('creation_ts').text, '%Y-%m-%d %H:%M:%S +0000')
self.__keywords = []
keywords_elem = xml.find("keywords")
@@ -92,6 +94,9 @@ class Bug:
def cc(self):
return self.__cc
+ def creation_timestamp(self):
+ return self.__creation_timestamp
+
def keywords(self):
return self.__keywords
diff --git a/maintainer-timeout.py b/maintainer-timeout.py
index c75edd6..ee096c4 100755
--- a/maintainer-timeout.py
+++ b/maintainer-timeout.py
@@ -2,6 +2,7 @@
# Copyright 2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
+import datetime
import optparse
import bugz.bugzilla
@@ -17,6 +18,7 @@ class MyBugz(bugz.bugzilla.Bugz):
if __name__ == "__main__":
parser = optparse.OptionParser()
+ parser.add_option("--days", dest="days", type=int, default=30, help="Number of days after maintainer timeout occurs.")
(options, args) = parser.parse_args()
if args:
parser.error("unrecognized command-line args")
@@ -31,6 +33,7 @@ if __name__ == "__main__":
for chunk in chunks(raw_bugs, 100):
bugs += [Bug(xml) for xml in bugzilla.get([bug['bugid'] for bug in chunk]).findall("bug")]
for bug in bugs:
+ # Skip bugs where stabilization seems to be already in progress.
if 'STABLEREQ' in bug.keywords():
continue
arch_found = False
@@ -40,12 +43,30 @@ if __name__ == "__main__":
break
if arch_found:
continue
+
+ # Skip bugs with comments, they may indicate objections or problem reports.
if len(bug.comments()) > 1:
continue
+
+ # Skip too recent bugs.
+ if datetime.datetime.now() - bug.creation_timestamp() < datetime.timedelta(days=options.days):
+ continue
+
bug.detect_cpvs()
if len(bug.cpvs()) != 1:
continue
+ target_keywords = set()
cp = portage.versions.cpv_getkey(bug.cpvs()[0])
for cpv in portage.portdb.cp_list(cp):
- print portage.portdb.aux_get(cpv, ['KEYWORDS'])
- print (bug.id_number(), bug.summary(), cp)
+ for keyword in portage.portdb.aux_get(cpv, ['KEYWORDS'])[0].split():
+ if '~' not in keyword and '-' not in keyword:
+ target_keywords.add(keyword)
+ bugzilla.modify(
+ bug.id_number(),
+ comment='Maintainer timeout (%d days). Arches please go ahead.' % options.days,
+ add_cc=['%s@gentoo.org' % k for k in target_keywords],
+ keywords='STABLEREQ')
+ print 'Updated bug #%d (%s). Target KEYWORDS: %s ;-)' % (
+ bug.id_number(),
+ bug.summary(),
+ ', '.join(list(target_keywords)))
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2012-03-09 11:49 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-03-09 11:49 UTC (permalink / raw
To: gentoo-commits
commit: b95113ab4b205b9de68b13ec8f30a8f6c5f1415e
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Fri Mar 9 07:31:36 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Fri Mar 9 07:31:36 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=b95113ab
Improved handling of CVS conflicts.
---
batch-stabilize.py | 21 ++++++++++++++-------
1 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/batch-stabilize.py b/batch-stabilize.py
index e2c4976..db869bb 100755
--- a/batch-stabilize.py
+++ b/batch-stabilize.py
@@ -2,10 +2,12 @@
# Copyright 2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
+import glob
import itertools
import optparse
import os
import re
+import shutil
import subprocess
import sys
@@ -23,7 +25,10 @@ def print_and_log(message, log):
def run_command(args, cwd, log):
try:
- log.write("Running %r in %s...\n" % (args, cwd))
+ message = "Running %r in %s...\n" % (args, cwd)
+ sys.stdout.write(message)
+ log.write(message)
+
cmd = subprocess.Popen(args, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = cmd.communicate()[0]
log.write("Finished with exit code %d\n" % cmd.returncode)
@@ -111,13 +116,15 @@ if __name__ == "__main__":
cvs_path = os.path.join(options.repo, pn)
print_and_log('Working in %s...' % cvs_path, log_file)
- # Remove existing changelog to avoid adding duplicate entries.
- try:
- os.remove(os.path.join(cvs_path, 'ChangeLog'))
- except OSError:
- pass
+ # Remove whole directory to prevent problems with conflicts.
+ if os.path.exists(cvs_path):
+ try:
+ shutil.rmtree(cvs_path)
+ except OSError:
+ print '!!! rmtree %s failed' % cvs_path
+ sys.exit(1)
- if run_command(["cvs", "up"], cvs_path, log_file)[0] != 0:
+ if run_command(["cvs", "up", pn], options.repo, log_file)[0] != 0:
print '!!! cvs up failed'
sys.exit(1)
if run_command(["ekeyword", options.arch, ebuild_name], cvs_path, log_file)[0] != 0:
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2012-03-09 11:49 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-03-09 11:49 UTC (permalink / raw
To: gentoo-commits
commit: 4a2ba0432b825af79fd4348689d3ae9033450b88
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Fri Mar 9 11:49:10 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Fri Mar 9 11:49:10 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=4a2ba043
Avoid duplicating work: remember which bugs have been done.
---
batch-stabilize.py | 27 +++++++++++++++++++++++++--
1 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/batch-stabilize.py b/batch-stabilize.py
index db869bb..877e5dc 100755
--- a/batch-stabilize.py
+++ b/batch-stabilize.py
@@ -6,6 +6,7 @@ import glob
import itertools
import optparse
import os
+import pickle
import re
import shutil
import subprocess
@@ -37,6 +38,10 @@ def run_command(args, cwd, log):
finally:
log.flush()
+def save_state(done_bugs):
+ with open('batch-stabilize.state', 'w') as state_file:
+ pickle.dump(done_bugs, state_file)
+
class MyBugz(bugz.bugzilla.Bugz):
def get_input(self, prompt):
return raw_input(prompt)
@@ -58,6 +63,11 @@ if __name__ == "__main__":
if args:
parser.error("unrecognized command-line args")
+ done_bugs = []
+ if os.path.exists('batch-stabilize.state'):
+ with open('batch-stabilize.state', 'r') as state_file:
+ done_bugs = pickle.load(state_file)
+
url = 'https://bugs.gentoo.org'
print 'You may be prompted for your Gentoo Bugzilla username and password (%s).' % url
bugzilla = MyBugz(url)
@@ -110,6 +120,10 @@ if __name__ == "__main__":
with open('batch-stabilize.log', 'a') as log_file:
for bug_id in stabilization_dict:
+ if bug_id in done_bugs:
+ print_and_log('Skipping bug #%d because it is marked as done.' % bug_id, log_file)
+ continue
+
print_and_log('Working on bug %d...' % bug_id, log_file)
commit_message = "%s stable wrt bug #%d" % (options.arch, bug_id)
for (pn, ebuild_name) in stabilization_dict[bug_id]:
@@ -140,10 +154,11 @@ if __name__ == "__main__":
# It seems that cvs diff returns 1 if there are differences.
if return_code == 0 and not output:
print_and_log('Seems already keyworded, skipping.', log_file)
+ done_bugs.append(bug_id)
+ save_state(done_bugs)
continue
if run_command(["echangelog", commit_message], cvs_path, log_file)[0] != 0:
- print '!!! echangelog failed'
- sys.exit(1)
+ print_and_log('echangelog failed, maybe just the Manifest is being updated; continuing', log_file)
if run_command(["repoman", "manifest"], cvs_path, log_file)[0] != 0:
print '!!! repoman manifest failed'
sys.exit(1)
@@ -162,6 +177,8 @@ if __name__ == "__main__":
if not has_my_arch:
print_and_log('Seems that bugzilla has already been updated.', log_file)
+ done_bugs.append(bug_id)
+ save_state(done_bugs)
continue
print_and_log('Posting automated reply in bugzilla...', log_file)
@@ -181,3 +198,9 @@ if __name__ == "__main__":
status='RESOLVED',
resolution='FIXED')
print_and_log('Succesfully updated bug %d and closed it.' % bug_id, log_file)
+
+ done_bugs.append(bug_id)
+ save_state(done_bugs)
+
+ if os.path.exists('batch-stabilize.state'):
+ os.remove('batch-stabilize.state')
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2012-03-27 15:26 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-03-27 15:26 UTC (permalink / raw
To: gentoo-commits
commit: 588a007bdde5dcb943557d4448a2c317a075763a
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Tue Mar 27 15:26:09 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Tue Mar 27 15:26:09 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=588a007b
Also consider STABLEREQ bugs for maintainer timeout.
Someone cleverly added STABLEREQ keyword to those bugs.
---
maintainer-timeout.py | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/maintainer-timeout.py b/maintainer-timeout.py
index ee096c4..c825f5d 100755
--- a/maintainer-timeout.py
+++ b/maintainer-timeout.py
@@ -34,8 +34,6 @@ if __name__ == "__main__":
bugs += [Bug(xml) for xml in bugzilla.get([bug['bugid'] for bug in chunk]).findall("bug")]
for bug in bugs:
# Skip bugs where stabilization seems to be already in progress.
- if 'STABLEREQ' in bug.keywords():
- continue
arch_found = False
for arch in portage.archlist:
if '%s@gentoo.org' % arch in bug.cc():
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2012-10-08 16:03 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-10-08 16:03 UTC (permalink / raw
To: gentoo-commits
commit: 0b5b0ec58a8551b5fb6ff4386b05a76b7829a0f2
Author: William Hubbs <williamh <AT> gentoo <DOT> org>
AuthorDate: Sun May 6 18:40:04 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Wed May 9 17:19:30 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=0b5b0ec5
Convert batch-stabilize.py to new pybugz interface.
---
batch-stabilize.py | 59 ++++++++++++++++++++++++++-------------------------
1 files changed, 30 insertions(+), 29 deletions(-)
diff --git a/batch-stabilize.py b/batch-stabilize.py
index 877e5dc..bede303 100755
--- a/batch-stabilize.py
+++ b/batch-stabilize.py
@@ -12,7 +12,8 @@ import shutil
import subprocess
import sys
-import bugz.bugzilla
+from bugz.bugzilla import BugzillaProxy
+from common import login
import portage.versions
BUG_REGEX = re.compile("[Bb]ug #?(\d+)")
@@ -42,10 +43,6 @@ def save_state(done_bugs):
with open('batch-stabilize.state', 'w') as state_file:
pickle.dump(done_bugs, state_file)
-class MyBugz(bugz.bugzilla.Bugz):
- def get_input(self, prompt):
- return raw_input(prompt)
-
if __name__ == "__main__":
parser = optparse.OptionParser()
parser.add_option("--arch", dest="arch", help="Gentoo arch to use, e.g. x86, amd64, ...")
@@ -68,10 +65,10 @@ if __name__ == "__main__":
with open('batch-stabilize.state', 'r') as state_file:
done_bugs = pickle.load(state_file)
- url = 'https://bugs.gentoo.org'
- print 'You may be prompted for your Gentoo Bugzilla username and password (%s).' % url
- bugzilla = MyBugz(url)
- bugzilla.auth()
+ url = 'https://bugs.gentoo.org/xmlrpc.cgi'
+ print 'You will be prompted for your Gentoo Bugzilla username and password (%s).' % url
+ bugzilla = BugzillaProxy(url)
+ login(bugzilla)
with open(options.input_filename, "r") as input_file:
stabilization_dict = {}
@@ -165,15 +162,18 @@ if __name__ == "__main__":
if run_command(["repoman", "commit", "-m", commit_message], cvs_path, log_file)[0] != 0:
print '!!! repoman commit failed'
sys.exit(1)
- bug_xml = bugzilla.get(bug_id).find('bug')
+ params = {}
+ params['ids'] = [bug_id]
+ bug_xml = bugzilla.Bug.get(params)['bugs'][0]
has_my_arch = False
has_other_arches = False
- for cc in bug_xml.findall('cc'):
- body, domain = cc.text.split('@', 1)
- if domain == 'gentoo.org' and body == options.arch:
- has_my_arch = True
- if domain == 'gentoo.org' and body in portage.archlist and body != options.arch:
- has_other_arches=True
+ for cc in bug_xml['cc']:
+ body, domain = cc.split('@', 1)
+ if domain == 'gentoo.org':
+ if body == options.arch:
+ has_my_arch = True
+ elif body in portage.archlist:
+ has_other_arches=True
if not has_my_arch:
print_and_log('Seems that bugzilla has already been updated.', log_file)
@@ -184,21 +184,22 @@ if __name__ == "__main__":
print_and_log('Posting automated reply in bugzilla...', log_file)
# We don't close bugs which still have other arches for obvious reasons,
# and security bugs because stabilization is not the last step for them.
- if has_other_arches or 'Security' in bug_xml.find('product').text:
- bugzilla.modify(
- bug_id,
- comment='%s stable' % options.arch,
- remove_cc='%s@gentoo.org' % options.arch)
- print_and_log('Successfully updated bug %d.' % bug_id, log_file)
+ params = {}
+ params['ids'] = [bug_id]
+ params['cc'] = {}
+ params['cc']['remove'] = ['%s@gentoo.org' % options.arch]
+ params['comment'] = {}
+ if has_other_arches or 'Security' in bug_xml['product']:
+ params['comment']['body'] = '%s stable' % options.arch
+ log_msg = 'Successfully updated'
else:
- bugzilla.modify(
- bug_id,
- comment='%s stable, closing' % options.arch,
- remove_cc='%s@gentoo.org' % options.arch,
- status='RESOLVED',
- resolution='FIXED')
- print_and_log('Succesfully updated bug %d and closed it.' % bug_id, log_file)
+ params['comment']['body'] = '%s stable, closing' % options.arch
+ params['status'] = 'RESOLVED'
+ params['resolution'] = 'FIXED'
+ log_msg = 'Successfully updated and closed'
+ bugzilla.Bug.update(params)
+ print_and_log('%s bug %d.' % (log_msg, bug_id), log_file)
done_bugs.append(bug_id)
save_state(done_bugs)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2012-10-08 16:03 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-10-08 16:03 UTC (permalink / raw
To: gentoo-commits
commit: 702f27541b77cfd3878284851dc055872cfab905
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Sat Apr 28 07:44:27 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Sat Apr 28 07:44:27 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=702f2754
Remove --limit option
This will make it possible to file bugs
as packages are considered, not in one batch
at the end.
---
stabilization-candidates.py | 3 ---
1 files changed, 0 insertions(+), 3 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index d4c82b9..3b2b72e 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -21,7 +21,6 @@ if __name__ == "__main__":
parser = optparse.OptionParser()
parser.add_option("--arch", dest="arch", action="append", help="Gentoo arch to use, e.g. x86, amd64, ... Can be passed multiple times.")
parser.add_option("--days", dest="days", type=int, default=30, help="Number of days in the tree after stabilization is possible.")
- parser.add_option("-l", "--limit", dest="limit", type="int", default=-1, help="Limit of filed bugs. Default is no limit.")
parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
parser.add_option("--category", dest="category", help="Portage category filter (default is all categories)")
parser.add_option("--exclude", dest="exclude", help="Regular expression for excluded packages.")
@@ -157,8 +156,6 @@ if __name__ == "__main__":
url = 'http://packages.gentoo.org/package/%s?arches=linux' % urllib.quote(cp)
final_candidates.append((best_candidate, url, maintainer, other_maintainers))
- if options.limit != -1:
- final_candidates = random.sample(final_candidates, min(options.limit, len(final_candidates)))
for x in final_candidates:
best_candidate, url, maintainer, other_maintainers = x
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2012-10-08 16:03 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-10-08 16:03 UTC (permalink / raw
To: gentoo-commits
commit: a6b515fc6fd3bf1800797ec9b75ae2dcd9eca565
Author: William Hubbs <williamh <AT> gentoo <DOT> org>
AuthorDate: Thu Apr 19 14:00:06 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Thu Apr 19 14:00:06 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=a6b515fc
---
stabilization-candidates.py | 48 +++++++++++++++++++++---------------------
1 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 1a7211c..d4c82b9 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -10,14 +10,12 @@ import re
import subprocess
import urllib
-import bugz.bugzilla
+from bugz.bugzilla import BugzillaProxy
from portage.package.ebuild.getmaskingstatus import getmaskingstatus
from portage.xml.metadata import MetaDataXML
import portage.versions
-class MyBugz(bugz.bugzilla.Bugz):
- def get_input(self, prompt):
- return raw_input(prompt)
+from common import login
if __name__ == "__main__":
parser = optparse.OptionParser()
@@ -37,10 +35,10 @@ if __name__ == "__main__":
if args:
parser.error("unrecognized command-line args")
- url = 'https://bugs.gentoo.org'
- print 'You may be prompted for your Gentoo Bugzilla username and password (%s).' % url
- bugzilla = MyBugz(url)
- bugzilla.auth()
+ url = 'https://bugs.gentoo.org/xmlrpc.cgi'
+ print 'You will be prompted for your Gentoo Bugzilla username and password (%s).' % url
+ bugzilla = BugzillaProxy(url)
+ login(bugzilla)
final_candidates = []
now = datetime.datetime.now()
@@ -137,13 +135,16 @@ if __name__ == "__main__":
f.close()
# Do not risk trying to stabilize a package with known bugs.
- bugs = bugzilla.search(cp, status=None)
- if bugs:
+ params = {}
+ params['summary'] = [cp];
+ bugs = bugzilla.Bug.search(params)
+ if len(bugs['bugs']):
continue
# Protection against filing a stabilization bug twice.
- bugs = bugzilla.search(best_candidate)
- if bugs:
+ params['summary'] = [best_candidate]
+ bugs = bugzilla.Bug.search(params)
+ if len(bugs['bugs']):
continue
metadata = MetaDataXML(os.path.join(cvs_path, 'metadata.xml'), '/usr/portage/metadata/herds.xml')
@@ -165,17 +166,16 @@ if __name__ == "__main__":
description = ('Is it OK to stabilize =%s ?\n\n' % best_candidate +
'If so, please CC arches and add STABLEREQ keyword.\n\n' +
'Stabilization of this package has been repoman-checked on the following arches: %s' % ', '.join(options.arch))
- bug_id = bugzilla.post('Gentoo Linux',
- 'Keywording and Stabilization',
- 'Please stabilize =%s' % best_candidate,
- description,
- url=url,
- assigned_to=maintainer,
- cc=other_maintainers,
- severity='enhancement')
- if bug_id == 0:
- print 'Submitting bug for %s failed. :-(' % best_candidate
- else:
- print 'Submitted bug #%d for %s. ;-)' % (bug_id, best_candidate)
+ params['product'] = 'Gentoo Linux'
+ params['version'] = 'unspecified'
+ params['component'] = 'Keywording and Stabilization'
+ params['summary'] = 'Please stabilize =%s' % best_candidate
+ params['description'] = description
+ params['url'] = url
+ params['assigned_to'] = maintainer
+ params['cc'] = other_maintainers
+ params['severity'] = 'enhancement'
+ bug_id = bugzilla.Bug.create(params)['id']
+ print 'Submitted bug #%d for %s. ;-)' % (bug_id, best_candidate)
else:
print (best_candidate, maintainer, other_maintainers)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2012-10-08 16:03 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-10-08 16:03 UTC (permalink / raw
To: gentoo-commits
commit: 535da2a53b24e20444b09f89a6055f89784cfce3
Author: William Hubbs <williamh <AT> gentoo <DOT> org>
AuthorDate: Thu Apr 19 13:58:09 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Thu Apr 19 13:58:09 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=535da2a5
The new python interface to bugzilla does not handle logging in and out
at the lower level; this is now part of the command line interface. As a
result, we need to prompt for a username and password and log in
ourselves. This will be used in the updated arch testing tools.
---
common.py | 22 ++++++++++++++++++++++
1 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/common.py b/common.py
index ad25ad8..16abf70 100644
--- a/common.py
+++ b/common.py
@@ -3,6 +3,7 @@
import cStringIO
import datetime
+import getpass
import re
import portage
@@ -42,6 +43,27 @@ def expand_braces(orig):
return list(set(res))
+def get_input(prompt):
+ return raw_input(prompt)
+
+
+def login(bugzilla):
+ """Authenticate a session.
+ """
+ # prompt for username
+ user = get_input('Bugzilla Username: ')
+
+ # prompt for password
+ password = getpass.getpass()
+
+ # perform login
+ params = {}
+ params['login'] = user
+ params['password'] = password
+ print 'Logging in'
+ bugzilla.User.login(params)
+
+
class Bug:
def __init__(self, xml=None, id_number=None, summary=None, status=None):
if xml is not None:
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2012-10-08 16:03 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-10-08 16:03 UTC (permalink / raw
To: gentoo-commits
commit: f63c885b61c46482781e22fb6f117f110eada79d
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Wed Aug 1 07:15:43 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Wed Aug 1 07:15:43 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=f63c885b
Add default exclusion regex to the script
This makes it harder to forget exclusions people
asked for.
---
stabilization-candidates.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index a5724ff..bf7825e 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -24,7 +24,7 @@ if __name__ == "__main__":
parser.add_option("--days", dest="days", type=int, default=30, help="Number of days in the tree after stabilization is possible.")
parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
parser.add_option("--category", dest="category", help="Portage category filter (default is all categories)")
- parser.add_option("--exclude", dest="exclude", help="Regular expression for excluded packages.")
+ parser.add_option("--exclude", dest="exclude", default=".*(kde|sci|lisp|perl-core|virtual|gnome|ruby).*", help="Regular expression for excluded packages.")
parser.add_option("--file-bugs", dest="file_bugs", action="store_true", default=False, help="File stabilization bugs for detected candidates. Otherwise (default) the candidates are just displayed.")
(options, args) = parser.parse_args()
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
2012-06-04 9:18 [gentoo-commits] proj/arch-tools:new-pybugz " Paweł Hajdan
@ 2012-10-08 16:03 ` Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-10-08 16:03 UTC (permalink / raw
To: gentoo-commits
commit: b619bbaa42d55cb7eb424cecd9b3f0d4a8318917
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Mon Jun 4 09:17:52 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Mon Jun 4 09:17:52 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=b619bbaa
Improve stabilization-candidates (misc updates)
---
stabilization-candidates.py | 52 ++++++++++++++++++++++++------------------
1 files changed, 30 insertions(+), 22 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 7989a84..77a9a74 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -8,6 +8,7 @@ import os.path
import random
import re
import subprocess
+import xmlrpclib
import urllib
from bugz.bugzilla import BugzillaProxy
@@ -91,16 +92,20 @@ if __name__ == "__main__":
best_candidate = candidates[0]
pv = portage.versions.catsplit(best_candidate)[1]
- with open(os.path.join(options.repo, cp, 'ChangeLog')) as changelog_file:
- regex = '\*%s \((.*)\)' % re.escape(pv)
- match = re.search(regex, changelog_file.read())
- if not match:
- print 'error parsing ChangeLog'
- continue
- changelog_date = datetime.datetime.strptime(match.group(1), '%d %b %Y')
- if now - changelog_date < datetime.timedelta(days=options.days):
- print 'not old enough'
- continue
+ try:
+ with open(os.path.join(options.repo, cp, 'ChangeLog')) as changelog_file:
+ regex = '\*%s \((.*)\)' % re.escape(pv)
+ match = re.search(regex, changelog_file.read())
+ if not match:
+ print 'error parsing ChangeLog'
+ continue
+ changelog_date = datetime.datetime.strptime(match.group(1), '%d %b %Y')
+ if now - changelog_date < datetime.timedelta(days=options.days):
+ print 'not old enough'
+ continue
+ except IOError, e:
+ print e
+ continue
keywords = portage.db["/"]["porttree"].dbapi.aux_get(best_candidate, ['KEYWORDS'])[0]
missing_arch = False
@@ -113,18 +118,15 @@ if __name__ == "__main__":
continue
# Do not risk trying to stabilize a package with known bugs.
- params = {}
- params['summary'] = [cp];
- bugs = bugzilla.Bug.search(params)
- if len(bugs['bugs']):
+ bugs = [x for x in bugzilla.Bug.search({'summary': cp})['bugs'] if x['is_open'] and x['severity'] not in ['enhancement', 'QA']]
+ if bugs:
print 'has bugs'
continue
# Protection against filing a stabilization bug twice.
- params['summary'] = [best_candidate]
- bugs = bugzilla.Bug.search(params)
- if len(bugs['bugs']):
- print 'version has closed bugs'
+ bugs = bugzilla.Bug.search({'summary': best_candidate})['bugs']
+ if bugs:
+ print 'version has bugs'
continue
cvs_path = os.path.join(options.repo, cp)
@@ -164,8 +166,10 @@ if __name__ == "__main__":
if options.file_bugs:
description = ('Is it OK to stabilize =%s ?\n\n' % best_candidate +
- 'If so, please CC arches and add STABLEREQ keyword.\n\n' +
- 'Stabilization of this package has been repoman-checked on the following arches: %s' % ', '.join(options.arch))
+ 'If so, please CC all arches which have stable keywords\n\n' +
+ 'for older versions of this package and add STABLEREQ keyword\n\n' +
+ 'to the bug.')
+ params = {}
params['product'] = 'Gentoo Linux'
params['version'] = 'unspecified'
params['component'] = 'Keywording and Stabilization'
@@ -175,7 +179,11 @@ if __name__ == "__main__":
params['assigned_to'] = maintainer
params['cc'] = other_maintainers
params['severity'] = 'enhancement'
- bug_id = bugzilla.Bug.create(params)['id']
- print 'Submitted bug #%d for %s. ;-)' % (bug_id, best_candidate)
+ try:
+ bug_id = bugzilla.Bug.create(params)['id']
+ print 'Submitted bug #%d for %s. ;-)' % (bug_id, best_candidate)
+ except xmlrpclib.Fault, f:
+ print f
+ print 'Failed to submit bug for %s. :-(' % best_candidate
else:
print (best_candidate, maintainer, other_maintainers)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2012-10-08 16:03 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-10-08 16:03 UTC (permalink / raw
To: gentoo-commits
commit: 64ebf043ef6bd7481b3701a6e69735ca618fd2f9
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Wed Aug 1 07:11:49 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Wed Aug 1 07:11:49 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=64ebf043
Fix an exception when best_version was not a string
---
stabilization-candidates.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 77a9a74..a5724ff 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -89,7 +89,7 @@ if __name__ == "__main__":
# Only consider the best version for stabilization.
# It's usually better tested, and often maintainers refuse
# to stabilize anything else, e.g. bug #391607.
- best_candidate = candidates[0]
+ best_candidate = str(candidates[0])
pv = portage.versions.catsplit(best_candidate)[1]
try:
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
2012-08-01 7:28 [gentoo-commits] proj/arch-tools:new-pybugz " Paweł Hajdan
@ 2012-10-08 16:03 ` Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-10-08 16:03 UTC (permalink / raw
To: gentoo-commits
commit: 5ff852b4a383456e6a9be6918f289eaa40cc0f64
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Wed Aug 1 07:28:10 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Wed Aug 1 07:28:10 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=5ff852b4
Also exclude x11 from stabilization candidates.
---
stabilization-candidates.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index bf7825e..3268fdc 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -24,7 +24,7 @@ if __name__ == "__main__":
parser.add_option("--days", dest="days", type=int, default=30, help="Number of days in the tree after stabilization is possible.")
parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
parser.add_option("--category", dest="category", help="Portage category filter (default is all categories)")
- parser.add_option("--exclude", dest="exclude", default=".*(kde|sci|lisp|perl-core|virtual|gnome|ruby).*", help="Regular expression for excluded packages.")
+ parser.add_option("--exclude", dest="exclude", default=".*(kde|sci|lisp|perl-core|virtual|gnome|ruby|x11).*", help="Regular expression for excluded packages.")
parser.add_option("--file-bugs", dest="file_bugs", action="store_true", default=False, help="File stabilization bugs for detected candidates. Otherwise (default) the candidates are just displayed.")
(options, args) = parser.parse_args()
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
2012-08-01 11:08 [gentoo-commits] proj/arch-tools:new-pybugz " Paweł Hajdan
@ 2012-10-08 16:03 ` Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-10-08 16:03 UTC (permalink / raw
To: gentoo-commits
commit: 47a90a979384faa62dac5190aa2515b6e67c3150
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Wed Aug 1 11:07:53 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Wed Aug 1 11:07:53 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=47a90a97
Exclude mono/dotnet from stabilization candidates.
---
stabilization-candidates.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 3268fdc..216e15f 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -24,7 +24,7 @@ if __name__ == "__main__":
parser.add_option("--days", dest="days", type=int, default=30, help="Number of days in the tree after stabilization is possible.")
parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
parser.add_option("--category", dest="category", help="Portage category filter (default is all categories)")
- parser.add_option("--exclude", dest="exclude", default=".*(kde|sci|lisp|perl-core|virtual|gnome|ruby|x11).*", help="Regular expression for excluded packages.")
+ parser.add_option("--exclude", dest="exclude", default=".*(kde|sci|lisp|perl-core|virtual|gnome|ruby|x11|mono|dotnet).*", help="Regular expression for excluded packages.")
parser.add_option("--file-bugs", dest="file_bugs", action="store_true", default=False, help="File stabilization bugs for detected candidates. Otherwise (default) the candidates are just displayed.")
(options, args) = parser.parse_args()
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2012-10-08 16:03 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-10-08 16:03 UTC (permalink / raw
To: gentoo-commits
commit: 44f09a691a30d55a2b6dd98e17cfbd25817690cc
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Wed May 9 17:22:53 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Wed May 9 17:22:53 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=44f09a69
Process stabilization candidates incrementally,
instead of a one big batch at the end.
This helps to file at least some bugs if the script
crashes in the middle.
---
stabilization-candidates.py | 4 ----
1 files changed, 0 insertions(+), 4 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 3b2b72e..04b6dee 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -154,10 +154,6 @@ if __name__ == "__main__":
else:
other_maintainers = []
url = 'http://packages.gentoo.org/package/%s?arches=linux' % urllib.quote(cp)
- final_candidates.append((best_candidate, url, maintainer, other_maintainers))
-
- for x in final_candidates:
- best_candidate, url, maintainer, other_maintainers = x
if options.file_bugs:
description = ('Is it OK to stabilize =%s ?\n\n' % best_candidate +
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
2012-10-08 16:02 [gentoo-commits] proj/arch-tools:new-pybugz " Paweł Hajdan
@ 2012-10-08 16:03 ` Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-10-08 16:03 UTC (permalink / raw
To: gentoo-commits
commit: 08d0025e085923f23e02e4f6009a651d7d7619b7
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Mon Oct 8 16:01:18 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Mon Oct 8 16:01:18 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=08d0025e
More robust commit logic:
- do not overwrite own changes when stabilizing multiple versions of the
same package
- ignore unrelated failures on other arches
---
batch-stabilize.py | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/batch-stabilize.py b/batch-stabilize.py
index bede303..c7b676f 100755
--- a/batch-stabilize.py
+++ b/batch-stabilize.py
@@ -138,6 +138,9 @@ if __name__ == "__main__":
if run_command(["cvs", "up", pn], options.repo, log_file)[0] != 0:
print '!!! cvs up failed'
sys.exit(1)
+ for (pn, ebuild_name) in stabilization_dict[bug_id]:
+ cvs_path = os.path.join(options.repo, pn)
+ print_and_log('Working in %s...' % cvs_path, log_file)
if run_command(["ekeyword", options.arch, ebuild_name], cvs_path, log_file)[0] != 0:
print '!!! ekeyword failed'
sys.exit(1)
@@ -159,7 +162,7 @@ if __name__ == "__main__":
if run_command(["repoman", "manifest"], cvs_path, log_file)[0] != 0:
print '!!! repoman manifest failed'
sys.exit(1)
- if run_command(["repoman", "commit", "-m", commit_message], cvs_path, log_file)[0] != 0:
+ if run_command(["repoman", "commit", "--ignore-arches", "-m", commit_message], cvs_path, log_file)[0] != 0:
print '!!! repoman commit failed'
sys.exit(1)
params = {}
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2012-10-16 16:54 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-10-16 16:54 UTC (permalink / raw
To: gentoo-commits
commit: 9e5f324f7083e932580962d79f3d8c74b675339b
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Tue Oct 16 16:53:56 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Tue Oct 16 16:53:56 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=9e5f324f
Exclude games, requested by mr_bones_.
---
stabilization-candidates.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 55c5314..4ee25d5 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -24,7 +24,7 @@ if __name__ == "__main__":
parser.add_option("--days", dest="days", type=int, default=30, help="Number of days in the tree after stabilization is possible.")
parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
parser.add_option("--category", dest="category", help="Portage category filter (default is all categories)")
- parser.add_option("--exclude", dest="exclude", default=".*(kde-base|sci|lisp|perl-core|virtual|gnome|ruby|x11|mono|dotnet).*", help="Regular expression for excluded packages.")
+ parser.add_option("--exclude", dest="exclude", default=".*(kde-base|sci|lisp|perl-core|virtual|gnome|ruby|x11|mono|dotnet|games).*", help="Regular expression for excluded packages.")
parser.add_option("--file-bugs", dest="file_bugs", action="store_true", default=False, help="File stabilization bugs for detected candidates. Otherwise (default) the candidates are just displayed.")
(options, args) = parser.parse_args()
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2012-10-16 16:54 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2012-10-16 16:54 UTC (permalink / raw
To: gentoo-commits
commit: ee16a77fa55b1ddd2c3b2397e428f06950e1c525
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Tue Oct 16 16:52:43 2012 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Tue Oct 16 16:52:43 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=ee16a77f
Only exclude kde-base, requested by kensington.
---
stabilization-candidates.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 216e15f..55c5314 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -24,7 +24,7 @@ if __name__ == "__main__":
parser.add_option("--days", dest="days", type=int, default=30, help="Number of days in the tree after stabilization is possible.")
parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
parser.add_option("--category", dest="category", help="Portage category filter (default is all categories)")
- parser.add_option("--exclude", dest="exclude", default=".*(kde|sci|lisp|perl-core|virtual|gnome|ruby|x11|mono|dotnet).*", help="Regular expression for excluded packages.")
+ parser.add_option("--exclude", dest="exclude", default=".*(kde-base|sci|lisp|perl-core|virtual|gnome|ruby|x11|mono|dotnet).*", help="Regular expression for excluded packages.")
parser.add_option("--file-bugs", dest="file_bugs", action="store_true", default=False, help="File stabilization bugs for detected candidates. Otherwise (default) the candidates are just displayed.")
(options, args) = parser.parse_args()
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2013-02-28 4:50 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2013-02-28 4:50 UTC (permalink / raw
To: gentoo-commits
commit: c6330c864965ef81f5fe95f2c9d3ef07de66f4ff
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Thu Feb 28 04:49:16 2013 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Thu Feb 28 04:49:16 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=c6330c86
Add xfce to list of stabilization bugs excludes.
---
stabilization-candidates.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 4ee25d5..20dae63 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -24,8 +24,8 @@ if __name__ == "__main__":
parser.add_option("--days", dest="days", type=int, default=30, help="Number of days in the tree after stabilization is possible.")
parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
parser.add_option("--category", dest="category", help="Portage category filter (default is all categories)")
- parser.add_option("--exclude", dest="exclude", default=".*(kde-base|sci|lisp|perl-core|virtual|gnome|ruby|x11|mono|dotnet|games).*", help="Regular expression for excluded packages.")
parser.add_option("--file-bugs", dest="file_bugs", action="store_true", default=False, help="File stabilization bugs for detected candidates. Otherwise (default) the candidates are just displayed.")
+ parser.add_option("--exclude", dest="exclude", default=".*(kde-base|sci|lisp|perl-core|virtual|gnome|ruby|x11|mono|dotnet|games|xfce).*", help="Regular expression for excluded packages.")
(options, args) = parser.parse_args()
if not options.arch:
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2013-02-28 4:50 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2013-02-28 4:50 UTC (permalink / raw
To: gentoo-commits
commit: 3c20e14c939bf0efa495dead6243f8035d699b86
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Thu Feb 28 04:50:06 2013 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Thu Feb 28 04:50:06 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=3c20e14c
Stabilization candidates: split out the bug filing script.
---
file-stabilization-bugs.py | 103 +++++++++++++++++++++++++++++++++++++++++++
stabilization-candidates.py | 66 +++++++++++++---------------
2 files changed, 134 insertions(+), 35 deletions(-)
diff --git a/file-stabilization-bugs.py b/file-stabilization-bugs.py
new file mode 100755
index 0000000..4963937
--- /dev/null
+++ b/file-stabilization-bugs.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python
+# Copyright 2013 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+import glob
+import itertools
+import optparse
+import os
+import pickle
+import re
+import shutil
+import subprocess
+import sys
+import urllib
+import xmlrpclib
+
+from bugz.bugzilla import BugzillaProxy
+from common import login
+import portage.versions
+from portage.xml.metadata import MetaDataXML
+
+def save_state(done_cpvs):
+ with open('file-stabilization-bugs.state', 'w') as state_file:
+ pickle.dump(done_cpvs, state_file)
+
+if __name__ == "__main__":
+ exit_code = 0
+
+ parser = optparse.OptionParser()
+ parser.add_option("-i", "--input", dest="input_filename", default="stabilization-candidates.txt", help="Input filename [default=%default]")
+ parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
+
+ (options, args) = parser.parse_args()
+ if not options.input_filename:
+ parser.error("--input option is required")
+ if not options.repo:
+ parser.error("--repo option is required")
+ if args:
+ parser.error("unrecognized command-line args")
+
+ done_cpvs = []
+ if os.path.exists('file-stabilization-bugs.state'):
+ with open('file-stabilization-bugs.state', 'r') as state_file:
+ done_cpvs = pickle.load(state_file)
+
+ url = 'https://bugs.gentoo.org/xmlrpc.cgi'
+ print 'You will be prompted for your Gentoo Bugzilla username and password (%s).' % url
+ bugzilla = BugzillaProxy(url)
+ login(bugzilla)
+
+ with open(options.input_filename, "r") as input_file:
+ for line in input_file:
+ line = line.strip()
+
+ # Skip empty/whitespace/comment lines.
+ if not line or line.startswith("#"):
+ continue
+
+ cpv = line
+ if cpv in done_cpvs:
+ print 'Skipping %s because it\'s marked as done' % cpv
+ continue
+
+ cp = portage.versions.pkgsplit(cpv)[0]
+
+ cvs_path = os.path.join(options.repo, cp)
+ metadata = MetaDataXML(os.path.join(cvs_path, 'metadata.xml'), '/usr/portage/metadata/herds.xml')
+ maintainer_split = metadata.format_maintainer_string().split(' ', 1)
+ maintainer = maintainer_split[0]
+ if len(maintainer_split) > 1:
+ other_maintainers = maintainer_split[1].split(',')
+ else:
+ other_maintainers = []
+
+ description = ('Is it OK to stabilize =%s ?\n\n' % cpv +
+ 'If so, please CC all arches which have stable keywords\n\n' +
+ 'for older versions of this package and add STABLEREQ keyword\n\n' +
+ 'to the bug.')
+ url = 'http://packages.gentoo.org/package/%s?arches=linux' % urllib.quote(cp)
+ params = {}
+ params['product'] = 'Gentoo Linux'
+ params['version'] = 'unspecified'
+ params['component'] = 'Keywording and Stabilization'
+ params['summary'] = 'Please stabilize =%s' % cpv
+ params['description'] = description
+ params['url'] = url
+ params['assigned_to'] = maintainer
+ params['cc'] = other_maintainers
+ params['severity'] = 'enhancement'
+ try:
+ bug_id = bugzilla.Bug.create(params)['id']
+ print 'Submitted bug #%d for %s. ;-)' % (bug_id, cpv)
+ done_cpvs += cpv
+ save_state(done_cpvs)
+ except xmlrpclib.Fault, f:
+ exit_code = 1
+ print f
+ print 'Failed to submit bug for %s. :-(' % cpv
+
+ if exit_code == 0 and os.path.exists('file-stabilization-bugs.state'):
+ os.remove('file-stabilization-bugs.state')
+
+ sys.exit(exit_code)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 20dae63..615e3b6 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -24,8 +24,8 @@ if __name__ == "__main__":
parser.add_option("--days", dest="days", type=int, default=30, help="Number of days in the tree after stabilization is possible.")
parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
parser.add_option("--category", dest="category", help="Portage category filter (default is all categories)")
- parser.add_option("--file-bugs", dest="file_bugs", action="store_true", default=False, help="File stabilization bugs for detected candidates. Otherwise (default) the candidates are just displayed.")
parser.add_option("--exclude", dest="exclude", default=".*(kde-base|sci|lisp|perl-core|virtual|gnome|ruby|x11|mono|dotnet|games|xfce).*", help="Regular expression for excluded packages.")
+ parser.add_option("-o", "--output", dest="output_filename", default="stabilization-candidates.txt", help="Output filename for generated stabilization candidates list.")
(options, args) = parser.parse_args()
if not options.arch:
@@ -46,8 +46,33 @@ if __name__ == "__main__":
if options.category and not cp.startswith(options.category + "/"):
continue
- if options.exclude and re.match(options.exclude, cp):
+ cvs_path = os.path.join(options.repo, cp)
+ try:
+ metadata = MetaDataXML(os.path.join(cvs_path, 'metadata.xml'), '/usr/portage/metadata/herds.xml')
+ except IOError:
continue
+ maintainer_split = metadata.format_maintainer_string().split(' ', 1)
+ maintainer = maintainer_split[0]
+ if len(maintainer_split) > 1:
+ other_maintainers = maintainer_split[1].split(',')
+ else:
+ other_maintainers = []
+
+ if options.exclude:
+ if re.match(options.exclude, cp):
+ continue
+
+ if re.match(options.exclude, maintainer):
+ continue
+
+ skip = False
+ for m in other_maintainers:
+ if re.match(options.exclude, m):
+ skip = True
+ break
+ if skip:
+ continue
+
best_stable = portage.versions.best(portage.portdb.match(cp))
if not best_stable:
@@ -129,7 +154,6 @@ if __name__ == "__main__":
print 'version has bugs'
continue
- cvs_path = os.path.join(options.repo, cp)
ebuild_name = portage.versions.catsplit(best_candidate)[1] + ".ebuild"
ebuild_path = os.path.join(cvs_path, ebuild_name)
manifest_path = os.path.join(cvs_path, 'Manifest')
@@ -155,35 +179,7 @@ if __name__ == "__main__":
f.write(manifest_contents)
f.close()
- metadata = MetaDataXML(os.path.join(cvs_path, 'metadata.xml'), '/usr/portage/metadata/herds.xml')
- maintainer_split = metadata.format_maintainer_string().split(' ', 1)
- maintainer = maintainer_split[0]
- if len(maintainer_split) > 1:
- other_maintainers = maintainer_split[1].split(',')
- else:
- other_maintainers = []
- url = 'http://packages.gentoo.org/package/%s?arches=linux' % urllib.quote(cp)
-
- if options.file_bugs:
- description = ('Is it OK to stabilize =%s ?\n\n' % best_candidate +
- 'If so, please CC all arches which have stable keywords\n\n' +
- 'for older versions of this package and add STABLEREQ keyword\n\n' +
- 'to the bug.')
- params = {}
- params['product'] = 'Gentoo Linux'
- params['version'] = 'unspecified'
- params['component'] = 'Keywording and Stabilization'
- params['summary'] = 'Please stabilize =%s' % best_candidate
- params['description'] = description
- params['url'] = url
- params['assigned_to'] = maintainer
- params['cc'] = other_maintainers
- params['severity'] = 'enhancement'
- try:
- bug_id = bugzilla.Bug.create(params)['id']
- print 'Submitted bug #%d for %s. ;-)' % (bug_id, best_candidate)
- except xmlrpclib.Fault, f:
- print f
- print 'Failed to submit bug for %s. :-(' % best_candidate
- else:
- print (best_candidate, maintainer, other_maintainers)
+ with open(options.output_filename, 'a') as f:
+ f.write('# %s %s\n' % (maintainer, ', '.join(other_maintainers)))
+ f.write('%s\n' % best_candidate)
+ print (best_candidate, maintainer, other_maintainers)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2013-03-11 21:56 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2013-03-11 21:56 UTC (permalink / raw
To: gentoo-commits
commit: 51d52ff2515084afe5513c3d26ee5cf0cc683f8f
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Sat Mar 9 22:09:32 2013 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Sat Mar 9 22:09:32 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=51d52ff2
Exclude leechcraft from stabilization-candidates.py
---
stabilization-candidates.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 615e3b6..d59c8d2 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -24,7 +24,7 @@ if __name__ == "__main__":
parser.add_option("--days", dest="days", type=int, default=30, help="Number of days in the tree after stabilization is possible.")
parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
parser.add_option("--category", dest="category", help="Portage category filter (default is all categories)")
- parser.add_option("--exclude", dest="exclude", default=".*(kde-base|sci|lisp|perl-core|virtual|gnome|ruby|x11|mono|dotnet|games|xfce).*", help="Regular expression for excluded packages.")
+ parser.add_option("--exclude", dest="exclude", default=".*(kde-base|sci|lisp|perl-core|virtual|gnome|ruby|x11|mono|dotnet|games|xfce|leechcraft).*", help="Regular expression for excluded packages.")
parser.add_option("-o", "--output", dest="output_filename", default="stabilization-candidates.txt", help="Output filename for generated stabilization candidates list.")
(options, args) = parser.parse_args()
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2013-05-19 23:35 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2013-05-19 23:35 UTC (permalink / raw
To: gentoo-commits
commit: 3d2d92a6537bec6be9c39ac113eb88f85faca315
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Sun May 19 23:34:11 2013 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Sun May 19 23:34:11 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=3d2d92a6
Do not put empty lines in the stabilization bug
Reported on gentoo-dev by Jeroen Roovers.
---
file-stabilization-bugs.py | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/file-stabilization-bugs.py b/file-stabilization-bugs.py
index 4963937..6f1bb64 100755
--- a/file-stabilization-bugs.py
+++ b/file-stabilization-bugs.py
@@ -72,9 +72,9 @@ if __name__ == "__main__":
else:
other_maintainers = []
- description = ('Is it OK to stabilize =%s ?\n\n' % cpv +
- 'If so, please CC all arches which have stable keywords\n\n' +
- 'for older versions of this package and add STABLEREQ keyword\n\n' +
+ description = ('Is it OK to stabilize =%s ?\n' % cpv +
+ 'If so, please CC all arches which have stable keywords\n' +
+ 'for older versions of this package and add STABLEREQ keyword\n' +
'to the bug.')
url = 'http://packages.gentoo.org/package/%s?arches=linux' % urllib.quote(cp)
params = {}
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2013-06-22 14:57 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2013-06-22 14:57 UTC (permalink / raw
To: gentoo-commits
commit: a92c88330af1aec3aa9ee58dc497f047129ccd2e
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Fri Jun 21 12:23:48 2013 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Fri Jun 21 12:23:48 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=a92c8833
Apply feedback from gentoo-dev:
- put package name and version first in the summary
(for better sorting of bugs by summary)
- add STABLEREQ keyword at the time of filing the bug
(this needs to be done after creating the bug, limitation
of the Bugzilla API)
---
file-stabilization-bugs.py | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/file-stabilization-bugs.py b/file-stabilization-bugs.py
index 6f1bb64..40bf784 100755
--- a/file-stabilization-bugs.py
+++ b/file-stabilization-bugs.py
@@ -74,14 +74,13 @@ if __name__ == "__main__":
description = ('Is it OK to stabilize =%s ?\n' % cpv +
'If so, please CC all arches which have stable keywords\n' +
- 'for older versions of this package and add STABLEREQ keyword\n' +
- 'to the bug.')
+ 'for older versions of this package.')
url = 'http://packages.gentoo.org/package/%s?arches=linux' % urllib.quote(cp)
params = {}
params['product'] = 'Gentoo Linux'
params['version'] = 'unspecified'
params['component'] = 'Keywording and Stabilization'
- params['summary'] = 'Please stabilize =%s' % cpv
+ params['summary'] = '%s: stabilization request' % cpv
params['description'] = description
params['url'] = url
params['assigned_to'] = maintainer
@@ -92,6 +91,15 @@ if __name__ == "__main__":
print 'Submitted bug #%d for %s. ;-)' % (bug_id, cpv)
done_cpvs += cpv
save_state(done_cpvs)
+ try:
+ params = {}
+ params['ids'] = [bug_id]
+ params['keywords'] = {'set': 'STABLEREQ'}
+ bugzilla.Bug.update(params)
+ except xmlrpclib.Fault, f:
+ exit_code = 1
+ print f
+ print 'Failed to add STABLEREQ keyword for %s. :-/' % cpv
except xmlrpclib.Fault, f:
exit_code = 1
print f
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2013-06-22 15:05 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2013-06-22 15:05 UTC (permalink / raw
To: gentoo-commits
commit: f2329213c9f95b809a704608eaa0270f60c97bba
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Fri Jun 21 12:32:11 2013 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Fri Jun 21 12:32:11 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=f2329213
Use python2 as interpreter
Fixes Gentoo bug #429320 by Pacho Ramos.
---
batch-stabilize.py | 2 +-
bugzilla-viewer.py | 2 +-
file-stabilization-bugs.py | 2 +-
maintainer-timeout.py | 2 +-
reverse-dependencies.py | 2 +-
stabilization-candidates.py | 2 +-
6 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/batch-stabilize.py b/batch-stabilize.py
index c7b676f..2093da5 100755
--- a/batch-stabilize.py
+++ b/batch-stabilize.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
# Copyright 2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
diff --git a/bugzilla-viewer.py b/bugzilla-viewer.py
index 76daabf..05c5dea 100755
--- a/bugzilla-viewer.py
+++ b/bugzilla-viewer.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
# Copyright 2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
diff --git a/file-stabilization-bugs.py b/file-stabilization-bugs.py
index 40bf784..1c5bbe9 100755
--- a/file-stabilization-bugs.py
+++ b/file-stabilization-bugs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
# Copyright 2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
diff --git a/maintainer-timeout.py b/maintainer-timeout.py
index 6287bec..ad5593f 100755
--- a/maintainer-timeout.py
+++ b/maintainer-timeout.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
# Copyright 2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
diff --git a/reverse-dependencies.py b/reverse-dependencies.py
index 4f87139..96233ea 100755
--- a/reverse-dependencies.py
+++ b/reverse-dependencies.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
# Copyright 2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index d59c8d2..8798518 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
# Copyright 2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2014-02-12 7:06 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2014-02-12 7:06 UTC (permalink / raw
To: gentoo-commits
commit: 709e4466eb1a8d3c19d522bb2539a821b133bd76
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Tue Feb 11 18:21:45 2014 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Tue Feb 11 18:21:45 2014 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=709e4466
Fix maintainer-tiemout.py
- adjust search strings for new bug template
- port to new pybugz
---
common.py | 17 ++++++++++----
maintainer-timeout.py | 65 ++++++++++++++++++++++++++++-----------------------
2 files changed, 48 insertions(+), 34 deletions(-)
diff --git a/common.py b/common.py
index 16abf70..cf89eb7 100644
--- a/common.py
+++ b/common.py
@@ -43,6 +43,15 @@ def expand_braces(orig):
return list(set(res))
+def detect_cpvs(text):
+ cpvs = []
+ for cpv_string in list(set([text] + expand_braces(text))):
+ for cpv_candidate in CPV_REGEX.findall(cpv_string):
+ if portage.db["/"]["porttree"].dbapi.cpv_exists(cpv_candidate):
+ cpvs.append(cpv_candidate)
+ return list(set(cpvs))
+
+
def get_input(prompt):
return raw_input(prompt)
@@ -63,6 +72,8 @@ def login(bugzilla):
print 'Logging in'
bugzilla.User.login(params)
+ return user
+
class Bug:
def __init__(self, xml=None, id_number=None, summary=None, status=None):
@@ -91,11 +102,7 @@ class Bug:
def detect_cpvs(self):
if self.__cpvs_detected:
return
- for cpv_string in list(set([self.summary()] + expand_braces(self.summary()))):
- for cpv_candidate in CPV_REGEX.findall(cpv_string):
- if portage.db["/"]["porttree"].dbapi.cpv_exists(cpv_candidate):
- self.__cpvs.append(cpv_candidate)
- self.__cpvs = list(set(self.__cpvs))
+ self.__cpvs = detect_cpvs(self.summary())
self.__cpvs_detected = True
def id_number(self):
diff --git a/maintainer-timeout.py b/maintainer-timeout.py
index ad5593f..ba8c322 100755
--- a/maintainer-timeout.py
+++ b/maintainer-timeout.py
@@ -7,17 +7,16 @@ import optparse
import os.path
import sys
-sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'third_party', 'pybugz-0.9.3'))
-
-import bugz.bugzilla
+from bugz.bugzilla import BugzillaProxy
import portage.versions
-from common import Bug, chunks
+from common import Bug, chunks, login, detect_cpvs
-class MyBugz(bugz.bugzilla.Bugz):
- def get_input(self, prompt):
- return raw_input(prompt)
+def keyword_to_email(keyword):
+ if keyword == 'arm64':
+ keyword = 'arm'
+ return '%s@gentoo.org' % keyword
if __name__ == "__main__":
@@ -27,48 +26,56 @@ if __name__ == "__main__":
if args:
parser.error("unrecognized command-line args")
- url = 'https://bugs.gentoo.org'
- print 'You may be prompted for your Gentoo Bugzilla username and password (%s).' % url
- bugzilla = MyBugz(url, forget=True)
- bugzilla.auth()
+ url = 'https://bugs.gentoo.org/xmlrpc.cgi'
+ print 'You will be prompted for your Gentoo Bugzilla username and password (%s).' % url
+ bugzilla = BugzillaProxy(url)
+ user = login(bugzilla)
- bugs = []
- raw_bugs = bugzilla.search('please stabilize', reporter=bugzilla.user, status=None)
- for chunk in chunks(raw_bugs, 100):
- bugs += [Bug(xml) for xml in bugzilla.get([bug['bugid'] for bug in chunk]).findall("bug")]
+ bugs = bugzilla.Bug.search({'reporter': user, 'summary': ['stabilize', 'stabilization', 'stable'], 'resolution': ''})['bugs']
+ comments = bugzilla.Bug.comments({'ids': [bug['id'] for bug in bugs]})
for bug in bugs:
# Skip bugs where stabilization seems to be already in progress.
arch_found = False
for arch in portage.archlist:
- if '%s@gentoo.org' % arch in bug.cc():
+ if '%s@gentoo.org' % arch in bug['cc']:
arch_found = True
break
if arch_found:
continue
+ # Skip bugs without STABLEREQ keyword.
+ if 'STABLEREQ' not in bug['keywords']:
+ continue
+
# Skip bugs with comments, they may indicate objections or problem reports.
- if len(bug.comments()) > 1:
+ if len(comments['bugs'][str(bug['id'])]['comments']) > 1:
continue
# Skip too recent bugs.
- if datetime.datetime.now() - bug.creation_timestamp() < datetime.timedelta(days=options.days):
+ creation_time = datetime.datetime.strptime(str(bug['creation_time']), '%Y%m%dT%H:%M:%S')
+ if datetime.datetime.now() - creation_time < datetime.timedelta(days=options.days):
continue
- bug.detect_cpvs()
- if len(bug.cpvs()) != 1:
+ cpvs = detect_cpvs(bug['summary'])
+ if len(cpvs) != 1:
continue
+
target_keywords = set()
- cp = portage.versions.cpv_getkey(bug.cpvs()[0])
+ cp = portage.versions.cpv_getkey(cpvs[0])
for cpv in portage.portdb.cp_list(cp):
for keyword in portage.portdb.aux_get(cpv, ['KEYWORDS'])[0].split():
if '~' not in keyword and '-' not in keyword:
target_keywords.add(keyword)
- bugzilla.modify(
- bug.id_number(),
- comment='Maintainer timeout (%d days). Arches please go ahead.' % options.days,
- add_cc=['%s@gentoo.org' % k for k in target_keywords],
- keywords='STABLEREQ')
- print 'Updated bug #%d (%s). Target KEYWORDS: %s ;-)' % (
- bug.id_number(),
- bug.summary(),
+
+ params = {}
+ params['ids'] = [bug['id']]
+ params['cc'] = {}
+ params['cc']['add'] = list(set(keyword_to_email(k) for k in target_keywords))
+ params['comment'] = {}
+ params['comment']['body'] = 'Maintainer timeout (%d days). Arches please go ahead.' % options.days
+
+ bugzilla.Bug.update(params)
+ print 'Updated bug #%s (%s). Target KEYWORDS: %s ;-)' % (
+ bug['id'],
+ bug['summary'],
', '.join(list(target_keywords)))
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2014-04-07 12:40 Samuli Suominen
0 siblings, 0 replies; 59+ messages in thread
From: Samuli Suominen @ 2014-04-07 12:40 UTC (permalink / raw
To: gentoo-commits
commit: adb66a9d3f80f8f660d362ca5c8363cf85102a0d
Author: Samuli Suominen <ssuominen <AT> gentoo <DOT> org>
AuthorDate: Mon Apr 7 12:34:37 2014 +0000
Commit: Samuli Suominen <ssuominen <AT> gentoo <DOT> org>
CommitDate: Mon Apr 7 12:34:37 2014 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=adb66a9d
List packages that have xfce in metadata.xml for skipping. List girara and zathura for skipping, see bug 502714 and gentoo-dev ML for discussions
---
stabilization-candidates.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 8798518..52c88f1 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -24,7 +24,7 @@ if __name__ == "__main__":
parser.add_option("--days", dest="days", type=int, default=30, help="Number of days in the tree after stabilization is possible.")
parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
parser.add_option("--category", dest="category", help="Portage category filter (default is all categories)")
- parser.add_option("--exclude", dest="exclude", default=".*(kde-base|sci|lisp|perl-core|virtual|gnome|ruby|x11|mono|dotnet|games|xfce|leechcraft).*", help="Regular expression for excluded packages.")
+ parser.add_option("--exclude", dest="exclude", default=".*(kde-base|sci|lisp|perl-core|virtual|gnome|ruby|x11|mono|dotnet|games|xfce|xfburn|mousepad|orage|xfbib|thunar|ristretto|pragha|xfmpc|parole|midori|gigolo|rodent|xfwm|girara|zathura|leechcraft).*", help="Regular expression for excluded packages.")
parser.add_option("-o", "--output", dest="output_filename", default="stabilization-candidates.txt", help="Output filename for generated stabilization candidates list.")
(options, args) = parser.parse_args()
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2014-06-14 9:47 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2014-06-14 9:47 UTC (permalink / raw
To: gentoo-commits
commit: 85a5fa0e24d89b5b8a41cc63f4c59e2e46faa4a6
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Sat Jun 14 09:41:35 2014 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Sat Jun 14 09:41:35 2014 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=85a5fa0e
Fix issue in batch-stabilize leading to errors from Bugzilla
xmlrpclib.Fault: <Fault 410: 'You must log in before using this part of
Bugzilla.'>
---
batch-stabilize.py | 3 ++-
common.py | 5 +----
maintainer-timeout.py | 2 +-
3 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/batch-stabilize.py b/batch-stabilize.py
index 2093da5..053cd19 100755
--- a/batch-stabilize.py
+++ b/batch-stabilize.py
@@ -68,7 +68,7 @@ if __name__ == "__main__":
url = 'https://bugs.gentoo.org/xmlrpc.cgi'
print 'You will be prompted for your Gentoo Bugzilla username and password (%s).' % url
bugzilla = BugzillaProxy(url)
- login(bugzilla)
+ user, login_data = login(bugzilla)
with open(options.input_filename, "r") as input_file:
stabilization_dict = {}
@@ -188,6 +188,7 @@ if __name__ == "__main__":
# We don't close bugs which still have other arches for obvious reasons,
# and security bugs because stabilization is not the last step for them.
params = {}
+ params['token'] = login_data['token']
params['ids'] = [bug_id]
params['cc'] = {}
params['cc']['remove'] = ['%s@gentoo.org' % options.arch]
diff --git a/common.py b/common.py
index cf89eb7..578b0e0 100644
--- a/common.py
+++ b/common.py
@@ -69,10 +69,7 @@ def login(bugzilla):
params = {}
params['login'] = user
params['password'] = password
- print 'Logging in'
- bugzilla.User.login(params)
-
- return user
+ return user, bugzilla.User.login(params)
class Bug:
diff --git a/maintainer-timeout.py b/maintainer-timeout.py
index ba8c322..76c7e59 100755
--- a/maintainer-timeout.py
+++ b/maintainer-timeout.py
@@ -29,7 +29,7 @@ if __name__ == "__main__":
url = 'https://bugs.gentoo.org/xmlrpc.cgi'
print 'You will be prompted for your Gentoo Bugzilla username and password (%s).' % url
bugzilla = BugzillaProxy(url)
- user = login(bugzilla)
+ user, login_data = login(bugzilla)
bugs = bugzilla.Bug.search({'reporter': user, 'summary': ['stabilize', 'stabilization', 'stable'], 'resolution': ''})['bugs']
comments = bugzilla.Bug.comments({'ids': [bug['id'] for bug in bugs]})
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2015-01-05 14:41 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2015-01-05 14:41 UTC (permalink / raw
To: gentoo-commits
commit: e484b1da3bd10769d331ab4e914fa45c5660e726
Author: William Hubbs <w.d.hubbs <AT> gmail <DOT> com>
AuthorDate: Tue Dec 30 16:46:24 2014 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Mon Dec 29 14:58:15 2014 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=e484b1da
batch-stabilize: use include-arches option
---
batch-stabilize.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/batch-stabilize.py b/batch-stabilize.py
index 81f97ba..14cd69d 100755
--- a/batch-stabilize.py
+++ b/batch-stabilize.py
@@ -166,7 +166,8 @@ if __name__ == "__main__":
if run_command(["repoman", "manifest"], cvs_path, log_file)[0] != 0:
print('!!! repoman manifest failed')
sys.exit(1)
- if run_command(["repoman", "commit", "--ignore-arches", "-m", commit_message], cvs_path, log_file)[0] != 0:
+ if run_command(["repoman", "commit",
+ "--include-arches", options.arch, "-m", commit_message], cvs_path, log_file)[0] != 0:
print('!!! repoman commit failed')
sys.exit(1)
params = {}
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2015-01-05 14:41 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2015-01-05 14:41 UTC (permalink / raw
To: gentoo-commits
commit: 40f058957e72e82f4e54d2f453c02e51c62f37c5
Author: William Hubbs <w.d.hubbs <AT> gmail <DOT> com>
AuthorDate: Tue Dec 23 16:29:12 2014 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Mon Dec 29 14:57:12 2014 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=40f05895
Fix subprocess handling in batch-stabilize
---
batch-stabilize.py | 22 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/batch-stabilize.py b/batch-stabilize.py
index 155af38..81f97ba 100755
--- a/batch-stabilize.py
+++ b/batch-stabilize.py
@@ -26,19 +26,23 @@ def print_and_log(message, log):
log.flush()
def run_command(args, cwd, log):
- try:
- message = "Running %r in %s...\n" % (args, cwd)
- sys.stdout.write(message)
- log.write(message)
+ message = "Running %r in %s...\n" % (args, cwd)
+ returncode = 0
+ sys.stdout.write(message)
+ log.write(message)
- cmd = subprocess.Popen(args, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
- output = cmd.communicate()[0]
- log.write("Finished with exit code %d\n" % cmd.returncode)
- log.write(output)
- return (cmd.returncode, output)
+ try:
+ output = subprocess.check_output(args, cwd=cwd,
+ stderr=subprocess.STDOUT, universal_newlines=True)
+ except subprocess.CalledProcessError as e:
+ output = e.output
+ returncode = e.returncode
finally:
+ log.write("Finished with exit code %d\n" % returncode)
+ log.write(output)
log.flush()
+ return (returncode, output)
def save_state(done_bugs):
with open('batch-stabilize.state', 'wb') as state_file:
pickle.dump(done_bugs, state_file)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2015-01-05 14:41 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2015-01-05 14:41 UTC (permalink / raw
To: gentoo-commits
commit: 842f3d251d81ffc274fa01a1d9ba9b5794a2d714
Author: William Hubbs <w.d.hubbs <AT> gmail <DOT> com>
AuthorDate: Sat Dec 13 19:33:09 2014 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Mon Dec 29 14:52:27 2014 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/arch-tools.git;a=commit;h=842f3d25
Port most tools to python 3
This commit ports the following tools to python 3.
- common code
- batch-stabilize
- file-stabilization-bugs
- maintainer-timeout
- reverse-dependencies
- stabilization-candidates
This is a list of the changes:
- Remove the dependency on pybugz; these tools now use xmlrpc.client
directly. This is needed because the next release of pybugz does the
same thing; we no longer have a bugzilla module since it was just a
wrapper.
Handle tokens correctly:
- When we log into Bugzilla, we are given a
token we must pass back to it with every command we issue.
- Log out at the end of every session to expire the token.
Fix the state file processing:
- The pickle module handles binary files, not text files, so read and
write the state file in binary mode.
- Add fix_imports=True when reading the state file so a python-2
compatible state file can be read.
- Do not set the URL for a stabilization request
X-Gentoo-Bug: 532054
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=532054
X-Gentoo-Bug: 532368
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=532368
---
batch-stabilize.py | 43 ++++++++++++++++++++----------------
common.py | 4 ++--
file-stabilization-bugs.py | 42 ++++++++++++++++++-----------------
maintainer-timeout.py | 31 ++++++++++++++++++--------
reverse-dependencies.py | 6 ++---
stabilization-candidates.py | 54 ++++++++++++++++++++++++++-------------------
6 files changed, 104 insertions(+), 76 deletions(-)
diff --git a/batch-stabilize.py b/batch-stabilize.py
index 053cd19..155af38 100755
--- a/batch-stabilize.py
+++ b/batch-stabilize.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
# Copyright 2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
@@ -11,8 +11,8 @@ import re
import shutil
import subprocess
import sys
+import xmlrpc.client
-from bugz.bugzilla import BugzillaProxy
from common import login
import portage.versions
@@ -20,7 +20,7 @@ BUG_REGEX = re.compile("[Bb]ug #?(\d+)")
def print_and_log(message, log):
try:
- print message
+ print(message)
log.write(message + '\n')
finally:
log.flush()
@@ -40,7 +40,7 @@ def run_command(args, cwd, log):
log.flush()
def save_state(done_bugs):
- with open('batch-stabilize.state', 'w') as state_file:
+ with open('batch-stabilize.state', 'wb') as state_file:
pickle.dump(done_bugs, state_file)
if __name__ == "__main__":
@@ -62,12 +62,12 @@ if __name__ == "__main__":
done_bugs = []
if os.path.exists('batch-stabilize.state'):
- with open('batch-stabilize.state', 'r') as state_file:
- done_bugs = pickle.load(state_file)
+ with open('batch-stabilize.state', 'rb') as state_file:
+ done_bugs = pickle.load(state_file, fix_imports=True)
url = 'https://bugs.gentoo.org/xmlrpc.cgi'
- print 'You will be prompted for your Gentoo Bugzilla username and password (%s).' % url
- bugzilla = BugzillaProxy(url)
+ print('You will be prompted for your Gentoo Bugzilla username and password (%s).' % url)
+ bugzilla = xmlrpc.client.ServerProxy(url)
user, login_data = login(bugzilla)
with open(options.input_filename, "r") as input_file:
@@ -83,14 +83,14 @@ if __name__ == "__main__":
if line.startswith("#"):
match = BUG_REGEX.search(line, re.IGNORECASE)
if not match:
- print 'Ignoring comment line [%s]...' % line
+ print('Ignoring comment line [%s]...' % line)
continue
else:
bug_id = int(match.group(1))
continue
if bug_id == -1:
- print 'Could not recognize bug id'
+ print('Could not recognize bug id')
sys.exit(1)
# Drop the leading '='.
@@ -109,10 +109,10 @@ if __name__ == "__main__":
for (pn, ebuild_name) in stabilization_dict[bug_id]:
ebuild_path = os.path.join(options.repo, pn, ebuild_name)
if not os.path.exists(ebuild_path):
- print '%s: file does not exist' % ebuild_path
+ print('%s: file does not exist' % ebuild_path)
success = False
if not success:
- print 'Sanity check failed. Please make sure your CVS repo is up to date (cvs up).'
+ print('Sanity check failed. Please make sure your CVS repo is up to date (cvs up).')
sys.exit(1)
with open('batch-stabilize.log', 'a') as log_file:
@@ -132,20 +132,20 @@ if __name__ == "__main__":
try:
shutil.rmtree(cvs_path)
except OSError:
- print '!!! rmtree %s failed' % cvs_path
+ print('!!! rmtree %s failed' % cvs_path)
sys.exit(1)
if run_command(["cvs", "up", pn], options.repo, log_file)[0] != 0:
- print '!!! cvs up failed'
+ print('!!! cvs up failed')
sys.exit(1)
for (pn, ebuild_name) in stabilization_dict[bug_id]:
cvs_path = os.path.join(options.repo, pn)
print_and_log('Working in %s...' % cvs_path, log_file)
if run_command(["ekeyword", options.arch, ebuild_name], cvs_path, log_file)[0] != 0:
- print '!!! ekeyword failed'
+ print('!!! ekeyword failed')
sys.exit(1)
if run_command(["repoman", "manifest"], cvs_path, log_file)[0] != 0:
- print '!!! repoman manifest failed'
+ print('!!! repoman manifest failed')
sys.exit(1)
for (pn, ebuild_name) in stabilization_dict[bug_id]:
cvs_path = os.path.join(options.repo, pn)
@@ -160,12 +160,13 @@ if __name__ == "__main__":
if run_command(["echangelog", commit_message], cvs_path, log_file)[0] != 0:
print_and_log('echangelog failed, maybe just the Manifest is being updated; continuing', log_file)
if run_command(["repoman", "manifest"], cvs_path, log_file)[0] != 0:
- print '!!! repoman manifest failed'
+ print('!!! repoman manifest failed')
sys.exit(1)
if run_command(["repoman", "commit", "--ignore-arches", "-m", commit_message], cvs_path, log_file)[0] != 0:
- print '!!! repoman commit failed'
+ print('!!! repoman commit failed')
sys.exit(1)
params = {}
+ params['Bugzilla_token'] = login_data['token']
params['ids'] = [bug_id]
bug_xml = bugzilla.Bug.get(params)['bugs'][0]
has_my_arch = False
@@ -188,7 +189,7 @@ if __name__ == "__main__":
# We don't close bugs which still have other arches for obvious reasons,
# and security bugs because stabilization is not the last step for them.
params = {}
- params['token'] = login_data['token']
+ params['Bugzilla_token'] = login_data['token']
params['ids'] = [bug_id]
params['cc'] = {}
params['cc']['remove'] = ['%s@gentoo.org' % options.arch]
@@ -209,3 +210,7 @@ if __name__ == "__main__":
if os.path.exists('batch-stabilize.state'):
os.remove('batch-stabilize.state')
+
+ params = {}
+ params['Bugzilla_token'] = login_data['token']
+ bugzilla.User.logout(params)
diff --git a/common.py b/common.py
index 578b0e0..89e4996 100644
--- a/common.py
+++ b/common.py
@@ -1,7 +1,7 @@
# Copyright 2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
-import cStringIO
+import io
import datetime
import getpass
import re
@@ -53,7 +53,7 @@ def detect_cpvs(text):
def get_input(prompt):
- return raw_input(prompt)
+ return input(prompt)
def login(bugzilla):
diff --git a/file-stabilization-bugs.py b/file-stabilization-bugs.py
index 1c5bbe9..f9b170c 100755
--- a/file-stabilization-bugs.py
+++ b/file-stabilization-bugs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
# Copyright 2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
@@ -11,16 +11,14 @@ import re
import shutil
import subprocess
import sys
-import urllib
-import xmlrpclib
+import xmlrpc.client
-from bugz.bugzilla import BugzillaProxy
from common import login
import portage.versions
from portage.xml.metadata import MetaDataXML
def save_state(done_cpvs):
- with open('file-stabilization-bugs.state', 'w') as state_file:
+ with open('file-stabilization-bugs.state', 'wb') as state_file:
pickle.dump(done_cpvs, state_file)
if __name__ == "__main__":
@@ -40,13 +38,13 @@ if __name__ == "__main__":
done_cpvs = []
if os.path.exists('file-stabilization-bugs.state'):
- with open('file-stabilization-bugs.state', 'r') as state_file:
- done_cpvs = pickle.load(state_file)
+ with open('file-stabilization-bugs.state', 'rb') as state_file:
+ done_cpvs = pickle.load(state_file, fix_imports=True)
url = 'https://bugs.gentoo.org/xmlrpc.cgi'
- print 'You will be prompted for your Gentoo Bugzilla username and password (%s).' % url
- bugzilla = BugzillaProxy(url)
- login(bugzilla)
+ print('You will be prompted for your Gentoo Bugzilla username and password (%s).' % url)
+ bugzilla = xmlrpc.client.ServerProxy(url)
+ user, login_data = login(bugzilla)
with open(options.input_filename, "r") as input_file:
for line in input_file:
@@ -58,7 +56,7 @@ if __name__ == "__main__":
cpv = line
if cpv in done_cpvs:
- print 'Skipping %s because it\'s marked as done' % cpv
+ print('Skipping %s because it\'s marked as done' % cpv)
continue
cp = portage.versions.pkgsplit(cpv)[0]
@@ -75,37 +73,41 @@ if __name__ == "__main__":
description = ('Is it OK to stabilize =%s ?\n' % cpv +
'If so, please CC all arches which have stable keywords\n' +
'for older versions of this package.')
- url = 'http://packages.gentoo.org/package/%s?arches=linux' % urllib.quote(cp)
params = {}
+ params['Bugzilla_token'] = login_data['token']
params['product'] = 'Gentoo Linux'
params['version'] = 'unspecified'
params['component'] = 'Keywording and Stabilization'
params['summary'] = '%s: stabilization request' % cpv
params['description'] = description
- params['url'] = url
params['assigned_to'] = maintainer
params['cc'] = other_maintainers
params['severity'] = 'enhancement'
try:
bug_id = bugzilla.Bug.create(params)['id']
- print 'Submitted bug #%d for %s. ;-)' % (bug_id, cpv)
+ print('Submitted bug #%d for %s. ;-)' % (bug_id, cpv))
done_cpvs += cpv
save_state(done_cpvs)
try:
params = {}
+ params['Bugzilla_token'] = login_data['token']
params['ids'] = [bug_id]
params['keywords'] = {'set': 'STABLEREQ'}
bugzilla.Bug.update(params)
- except xmlrpclib.Fault, f:
+ except xmlrpc.client.Fault as f:
exit_code = 1
- print f
- print 'Failed to add STABLEREQ keyword for %s. :-/' % cpv
- except xmlrpclib.Fault, f:
+ print(f)
+ print('Failed to add STABLEREQ keyword for %s. :-/' % cpv)
+ except xmlrpc.client.Fault as f:
exit_code = 1
- print f
- print 'Failed to submit bug for %s. :-(' % cpv
+ print(f)
+ print('Failed to submit bug for %s. :-(' % cpv)
if exit_code == 0 and os.path.exists('file-stabilization-bugs.state'):
os.remove('file-stabilization-bugs.state')
+ params = {}
+ params['Bugzilla_token'] = login_data['token']
+ bugzilla.User.logout(params)
+
sys.exit(exit_code)
diff --git a/maintainer-timeout.py b/maintainer-timeout.py
index 76c7e59..54b4044 100755
--- a/maintainer-timeout.py
+++ b/maintainer-timeout.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
# Copyright 2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
@@ -6,11 +6,11 @@ import datetime
import optparse
import os.path
import sys
+import xmlrpc.client
-from bugz.bugzilla import BugzillaProxy
import portage.versions
-from common import Bug, chunks, login, detect_cpvs
+from common import login, detect_cpvs
def keyword_to_email(keyword):
@@ -27,12 +27,20 @@ if __name__ == "__main__":
parser.error("unrecognized command-line args")
url = 'https://bugs.gentoo.org/xmlrpc.cgi'
- print 'You will be prompted for your Gentoo Bugzilla username and password (%s).' % url
- bugzilla = BugzillaProxy(url)
+ print('You will be prompted for your Gentoo Bugzilla username and password (%s).' % url)
+ bugzilla = xmlrpc.client.ServerProxy(url)
user, login_data = login(bugzilla)
- bugs = bugzilla.Bug.search({'reporter': user, 'summary': ['stabilize', 'stabilization', 'stable'], 'resolution': ''})['bugs']
- comments = bugzilla.Bug.comments({'ids': [bug['id'] for bug in bugs]})
+ params = {}
+ params['Bugzilla_token'] = login_data['token']
+ params['reporter'] = user
+ params['summary'] = ['stabilize', 'stabilization', 'stable']
+ params['resolution'] = ''
+ bugs = bugzilla.Bug.search(params)['bugs']
+ params = {}
+ params['Bugzilla_token'] = login_data['token']
+ params['ids'] = [bug['id'] for bug in bugs]
+ comments = bugzilla.Bug.comments(params)
for bug in bugs:
# Skip bugs where stabilization seems to be already in progress.
arch_found = False
@@ -68,6 +76,7 @@ if __name__ == "__main__":
target_keywords.add(keyword)
params = {}
+ params['Bugzilla_token'] = login_data['token']
params['ids'] = [bug['id']]
params['cc'] = {}
params['cc']['add'] = list(set(keyword_to_email(k) for k in target_keywords))
@@ -75,7 +84,11 @@ if __name__ == "__main__":
params['comment']['body'] = 'Maintainer timeout (%d days). Arches please go ahead.' % options.days
bugzilla.Bug.update(params)
- print 'Updated bug #%s (%s). Target KEYWORDS: %s ;-)' % (
+ print('Updated bug #%s (%s). Target KEYWORDS: %s ;-)' % (
bug['id'],
bug['summary'],
- ', '.join(list(target_keywords)))
+ ', '.join(list(target_keywords))))
+
+ params = {}
+ params['Bugzilla_token'] = login_data['token']
+ bugzilla.User.logout(params)
diff --git a/reverse-dependencies.py b/reverse-dependencies.py
index 96233ea..624b668 100755
--- a/reverse-dependencies.py
+++ b/reverse-dependencies.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
# Copyright 2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
@@ -16,7 +16,7 @@ def process_deps(deps, use=None):
use = []
result = []
for index, x in enumerate(deps):
- if type(x) == types.ListType:
+ if type(x) == list:
continue
elif x == "||": # Any-of.
result.extend(process_deps(deps[index + 1], use))
@@ -82,4 +82,4 @@ if __name__ == "__main__":
output_file.write("#\t%s\n" % ",".join(use_combination))
output_file.write("%s\n" % cp)
elif options.verbose:
- print 'No reverse dependencies for %s' % pn
+ print('No reverse dependencies for %s' % pn)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 52c88f1..d324bdb 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
# Copyright 2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
@@ -8,10 +8,8 @@ import os.path
import random
import re
import subprocess
-import xmlrpclib
-import urllib
+import xmlrpc.client
-from bugz.bugzilla import BugzillaProxy
from portage.package.ebuild.getmaskingstatus import getmaskingstatus
from portage.xml.metadata import MetaDataXML
import portage.versions
@@ -36,9 +34,9 @@ if __name__ == "__main__":
parser.error("unrecognized command-line args")
url = 'https://bugs.gentoo.org/xmlrpc.cgi'
- print 'You will be prompted for your Gentoo Bugzilla username and password (%s).' % url
- bugzilla = BugzillaProxy(url)
- login(bugzilla)
+ print('You will be prompted for your Gentoo Bugzilla username and password (%s).' % url)
+ bugzilla = xmlrpc.client.ServerProxy(url)
+ user, login_data = login(bugzilla)
final_candidates = []
now = datetime.datetime.now()
@@ -77,7 +75,7 @@ if __name__ == "__main__":
best_stable = portage.versions.best(portage.portdb.match(cp))
if not best_stable:
continue
- print 'Working on %s...' % cp,
+ print('Working on %s...' % cp, end=' ')
candidates = []
for cpv in portage.portdb.cp_list(cp):
# Only consider higher versions than best stable.
@@ -100,12 +98,12 @@ if __name__ == "__main__":
continue
# Eliminate hard masked packages among others.
- if getmaskingstatus(cpv) not in [[u'~%s keyword' % arch] for arch in options.arch]:
+ if getmaskingstatus(cpv) not in [['~%s keyword' % arch] for arch in options.arch]:
continue
candidates.append(cpv)
if not candidates:
- print 'no candidates'
+ print('no candidates')
continue
candidates.sort(key=portage.versions.cpv_sort_key())
@@ -122,14 +120,14 @@ if __name__ == "__main__":
regex = '\*%s \((.*)\)' % re.escape(pv)
match = re.search(regex, changelog_file.read())
if not match:
- print 'error parsing ChangeLog'
+ print('error parsing ChangeLog')
continue
changelog_date = datetime.datetime.strptime(match.group(1), '%d %b %Y')
if now - changelog_date < datetime.timedelta(days=options.days):
- print 'not old enough'
+ print('not old enough')
continue
- except IOError, e:
- print e
+ except IOError as e:
+ print(e)
continue
keywords = portage.db["/"]["porttree"].dbapi.aux_get(best_candidate, ['KEYWORDS'])[0]
@@ -139,19 +137,25 @@ if __name__ == "__main__":
missing_arch = True
break
if missing_arch:
- print 'not keyworded ~arch'
+ print('not keyworded ~arch')
continue
# Do not risk trying to stabilize a package with known bugs.
- bugs = [x for x in bugzilla.Bug.search({'summary': cp})['bugs'] if x['is_open'] and x['severity'] not in ['enhancement', 'QA']]
+ params = {}
+ params['Bugzilla_token'] = login_data['token']
+ params['summary'] = cp
+ bugs = [x for x in bugzilla.Bug.search(params)['bugs'] if x['is_open'] and x['severity'] not in ['enhancement', 'QA']]
if bugs:
- print 'has bugs'
+ print('has bugs')
continue
# Protection against filing a stabilization bug twice.
- bugs = bugzilla.Bug.search({'summary': best_candidate})['bugs']
+ params = {}
+ params['Bugzilla_token'] = login_data['token']
+ params['summary'] = best_candidate
+ bugs = bugzilla.Bug.search(params)['bugs']
if bugs:
- print 'version has bugs'
+ print('version has bugs')
continue
ebuild_name = portage.versions.catsplit(best_candidate)[1] + ".ebuild"
@@ -160,8 +164,8 @@ if __name__ == "__main__":
try:
original_contents = open(ebuild_path).read()
manifest_contents = open(manifest_path).read()
- except IOError, e:
- print e
+ except IOError as e:
+ print(e)
continue
try:
for arch in options.arch:
@@ -169,7 +173,7 @@ if __name__ == "__main__":
subprocess.check_output(["repoman", "manifest"], cwd=cvs_path)
subprocess.check_output(["repoman", "full"], cwd=cvs_path)
except subprocess.CalledProcessError:
- print 'repoman error'
+ print('repoman error')
continue
finally:
f = open(ebuild_path, "w")
@@ -182,4 +186,8 @@ if __name__ == "__main__":
with open(options.output_filename, 'a') as f:
f.write('# %s %s\n' % (maintainer, ', '.join(other_maintainers)))
f.write('%s\n' % best_candidate)
- print (best_candidate, maintainer, other_maintainers)
+ print((best_candidate, maintainer, other_maintainers))
+
+ params = {}
+ params['Bugzilla_token'] = login_data['token']
+ bugzilla.User.logout(params)
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2017-07-09 14:42 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2017-07-09 14:42 UTC (permalink / raw
To: gentoo-commits
commit: eed2243011824ddb3525a75409fae1398a11fb11
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Sun Jul 9 14:42:21 2017 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Sun Jul 9 14:42:21 2017 +0000
URL: https://gitweb.gentoo.org/proj/arch-tools.git/commit/?id=eed22430
stabilization-candidates: update for git
stabilization-candidates.py | 24 +++++++++++-------------
1 file changed, 11 insertions(+), 13 deletions(-)
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index d324bdb..2537ab4 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -20,7 +20,7 @@ if __name__ == "__main__":
parser = optparse.OptionParser()
parser.add_option("--arch", dest="arch", action="append", help="Gentoo arch to use, e.g. x86, amd64, ... Can be passed multiple times.")
parser.add_option("--days", dest="days", type=int, default=30, help="Number of days in the tree after stabilization is possible.")
- parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")
+ parser.add_option("--repo", dest="repo", help="Path to portage git repository")
parser.add_option("--category", dest="category", help="Portage category filter (default is all categories)")
parser.add_option("--exclude", dest="exclude", default=".*(kde-base|sci|lisp|perl-core|virtual|gnome|ruby|x11|mono|dotnet|games|xfce|xfburn|mousepad|orage|xfbib|thunar|ristretto|pragha|xfmpc|parole|midori|gigolo|rodent|xfwm|girara|zathura|leechcraft).*", help="Regular expression for excluded packages.")
parser.add_option("-o", "--output", dest="output_filename", default="stabilization-candidates.txt", help="Output filename for generated stabilization candidates list.")
@@ -116,18 +116,16 @@ if __name__ == "__main__":
pv = portage.versions.catsplit(best_candidate)[1]
try:
- with open(os.path.join(options.repo, cp, 'ChangeLog')) as changelog_file:
- regex = '\*%s \((.*)\)' % re.escape(pv)
- match = re.search(regex, changelog_file.read())
- if not match:
- print('error parsing ChangeLog')
- continue
- changelog_date = datetime.datetime.strptime(match.group(1), '%d %b %Y')
- if now - changelog_date < datetime.timedelta(days=options.days):
- print('not old enough')
- continue
- except IOError as e:
- print(e)
+ git_log = subprocess.check_output(
+ ['git', 'log', '--date-order', '--date=short', '--format=%cd', '%s.ebuild' % pv],
+ cwd=os.path.join(options.repo, cp))
+ changelog_date_str = git_log.splitlines()[0].decode('utf-8')
+ changelog_date = datetime.datetime.strptime(changelog_date_str, '%Y-%m-%d')
+ if now - changelog_date < datetime.timedelta(days=options.days):
+ print('not old enough')
+ continue
+ except subprocess.CalledProcessError as ex:
+ print('git error: ' + ex.output)
continue
keywords = portage.db["/"]["porttree"].dbapi.aux_get(best_candidate, ['KEYWORDS'])[0]
^ permalink raw reply related [flat|nested] 59+ messages in thread
* [gentoo-commits] proj/arch-tools:master commit in: /
@ 2017-07-10 20:29 Paweł Hajdan
0 siblings, 0 replies; 59+ messages in thread
From: Paweł Hajdan @ 2017-07-10 20:29 UTC (permalink / raw
To: gentoo-commits
commit: 064b7b3dbf4277b9c57add479a478386504fc0d2
Author: Pawel Hajdan, Jr <phajdan.jr <AT> gentoo <DOT> org>
AuthorDate: Mon Jul 10 20:28:50 2017 +0000
Commit: Paweł Hajdan <phajdan.jr <AT> gentoo <DOT> org>
CommitDate: Mon Jul 10 20:28:50 2017 +0000
URL: https://gitweb.gentoo.org/proj/arch-tools.git/commit/?id=064b7b3d
stabilization-candidates: retry network errors
common.py | 19 +++++++++++++++++++
stabilization-candidates.py | 26 +++++++++++++++++---------
2 files changed, 36 insertions(+), 9 deletions(-)
diff --git a/common.py b/common.py
index 89e4996..8e0c14c 100644
--- a/common.py
+++ b/common.py
@@ -1,10 +1,12 @@
# Copyright 2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
+import functools
import io
import datetime
import getpass
import re
+import time
import portage
@@ -17,6 +19,23 @@ def chunks(iterable, length):
yield iterable[i:i + length]
+def retry(ExceptionToCheck, tries=4, delay=3, backoff=2):
+ def deco_retry(f):
+ @functools.wraps(f)
+ def f_retry(*args, **kwargs):
+ mtries, mdelay = tries, delay
+ while mtries > 1:
+ try:
+ return f(*args, **kwargs)
+ except ExceptionToCheck:
+ time.sleep(mdelay)
+ mtries -= 1
+ mdelay *= backoff
+ return f(*args, **kwargs)
+ return f_retry
+ return deco_retry
+
+
# Snippet from http://bugs.python.org/issue9584
def expand_braces(orig):
r = r'.*(\{.+?[^\\]\})'
diff --git a/stabilization-candidates.py b/stabilization-candidates.py
index 2537ab4..0cedac4 100755
--- a/stabilization-candidates.py
+++ b/stabilization-candidates.py
@@ -7,6 +7,7 @@ import optparse
import os.path
import random
import re
+import socket
import subprocess
import xmlrpc.client
@@ -14,7 +15,7 @@ from portage.package.ebuild.getmaskingstatus import getmaskingstatus
from portage.xml.metadata import MetaDataXML
import portage.versions
-from common import login
+from common import login, retry
if __name__ == "__main__":
parser = optparse.OptionParser()
@@ -139,19 +140,26 @@ if __name__ == "__main__":
continue
# Do not risk trying to stabilize a package with known bugs.
- params = {}
- params['Bugzilla_token'] = login_data['token']
- params['summary'] = cp
- bugs = [x for x in bugzilla.Bug.search(params)['bugs'] if x['is_open'] and x['severity'] not in ['enhancement', 'QA']]
+ @retry(socket.error)
+ def get_package_bugs():
+ params = {}
+ params['Bugzilla_token'] = login_data['token']
+ params['summary'] = cp
+ return [x for x in bugzilla.Bug.search(params)['bugs']
+ if x['is_open'] and x['severity'] not in ['enhancement', 'QA']]
+ bugs = get_package_bugs()
if bugs:
print('has bugs')
continue
# Protection against filing a stabilization bug twice.
- params = {}
- params['Bugzilla_token'] = login_data['token']
- params['summary'] = best_candidate
- bugs = bugzilla.Bug.search(params)['bugs']
+ @retry(socket.error)
+ def get_package_bugs():
+ params = {}
+ params['Bugzilla_token'] = login_data['token']
+ params['summary'] = best_candidate
+ return bugzilla.Bug.search(params)['bugs']
+ bugs = get_package_bugs()
if bugs:
print('version has bugs')
continue
^ permalink raw reply related [flat|nested] 59+ messages in thread
end of thread, other threads:[~2017-07-10 20:29 UTC | newest]
Thread overview: 59+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-05 16:16 [gentoo-commits] proj/arch-tools:master commit in: / Paweł Hajdan
-- strict thread matches above, loose matches on Subject: below --
2017-07-10 20:29 Paweł Hajdan
2017-07-09 14:42 Paweł Hajdan
2015-01-05 14:41 Paweł Hajdan
2015-01-05 14:41 Paweł Hajdan
2015-01-05 14:41 Paweł Hajdan
2014-06-14 9:47 Paweł Hajdan
2014-04-07 12:40 Samuli Suominen
2014-02-12 7:06 Paweł Hajdan
2013-06-22 15:05 Paweł Hajdan
2013-06-22 14:57 Paweł Hajdan
2013-05-19 23:35 Paweł Hajdan
2013-03-11 21:56 Paweł Hajdan
2013-02-28 4:50 Paweł Hajdan
2013-02-28 4:50 Paweł Hajdan
2012-10-16 16:54 Paweł Hajdan
2012-10-16 16:54 Paweł Hajdan
2012-10-08 16:03 Paweł Hajdan
2012-10-08 16:03 Paweł Hajdan
2012-10-08 16:03 Paweł Hajdan
2012-10-08 16:03 Paweł Hajdan
2012-10-08 16:03 Paweł Hajdan
2012-10-08 16:03 Paweł Hajdan
2012-10-08 16:03 Paweł Hajdan
2012-10-08 16:02 [gentoo-commits] proj/arch-tools:new-pybugz " Paweł Hajdan
2012-10-08 16:03 ` [gentoo-commits] proj/arch-tools:master " Paweł Hajdan
2012-08-01 11:08 [gentoo-commits] proj/arch-tools:new-pybugz " Paweł Hajdan
2012-10-08 16:03 ` [gentoo-commits] proj/arch-tools:master " Paweł Hajdan
2012-08-01 7:28 [gentoo-commits] proj/arch-tools:new-pybugz " Paweł Hajdan
2012-10-08 16:03 ` [gentoo-commits] proj/arch-tools:master " Paweł Hajdan
2012-06-04 9:18 [gentoo-commits] proj/arch-tools:new-pybugz " Paweł Hajdan
2012-10-08 16:03 ` [gentoo-commits] proj/arch-tools:master " Paweł Hajdan
2012-03-27 15:26 Paweł Hajdan
2012-03-09 11:49 Paweł Hajdan
2012-03-09 11:49 Paweł Hajdan
2012-02-02 16:48 Paweł Hajdan
2012-01-27 14:55 Paweł Hajdan
2012-01-21 17:05 Paweł Hajdan
2011-12-14 7:23 Paweł Hajdan
2011-12-06 11:14 Paweł Hajdan
2011-12-01 18:56 Paweł Hajdan
2011-12-01 18:47 Paweł Hajdan
2011-12-01 18:47 Paweł Hajdan
2011-11-30 17:38 Paweł Hajdan
2011-11-23 8:59 Paweł Hajdan
2011-11-23 8:59 Paweł Hajdan
2011-11-21 8:34 Paweł Hajdan
2011-11-03 11:00 Paweł Hajdan
2011-10-22 8:18 Paweł Hajdan
2011-10-21 15:15 Paweł Hajdan
2011-10-18 14:05 Paweł Hajdan
2011-10-16 3:51 Paweł Hajdan
2011-10-13 21:59 Paweł Hajdan
2011-10-04 21:46 Paweł Hajdan
2011-09-19 3:09 Paweł Hajdan
2011-08-07 3:26 Paweł Hajdan
2011-06-02 15:41 Paweł Hajdan
2011-06-02 15:38 Paweł Hajdan
2011-05-25 19:51 Paweł Hajdan
2011-05-25 10:32 Paweł Hajdan
2011-05-22 15:31 Paweł Hajdan
2011-05-22 15:16 Paweł Hajdan
2011-05-22 13:36 Paweł Hajdan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox