📄 gnatsparse.py
字号:
self.fields["bug_severity"] = "major" self.fields["bug_severity"] = SqlQuote(self.fields["bug_severity"]) self.fields["keywords"] = 0 if keywordids.has_key(self.fields["Class"]): self.fields["keywords"] = self.fields["Class"] self.fields["keywordid"] = keywordids[self.fields["Class"]] self.fields["keywords"] = SqlQuote(self.fields["keywords"]) self.fields["priority"] = "P1" if self.fields.has_key("Severity") and self.fields.has_key("Priority"): severity = self.fields["Severity"] priority = self.fields["Priority"] if severity == "critical": if priority == "high": self.fields["priority"] = "P1" else: self.fields["priority"] = "P2" elif severity == "serious": if priority == "low": self.fields["priority"] = "P4" else: self.fields["priority"] = "P3" else: if priority == "high": self.fields["priority"] = "P4" else: self.fields["priority"] = "P5" self.fields["priority"] = SqlQuote(self.fields["priority"]) state = self.fields["State"] if (state == "open" or state == "analyzed") and self.fields["userid"] != 3: self.fields["bug_status"] = "ASSIGNED" self.fields["resolution"] = "" elif state == "feedback": self.fields["bug_status"] = "WAITING" self.fields["resolution"] = "" elif state == "closed": self.fields["bug_status"] = "CLOSED" if self.fields.has_key("Class"): theclass = self.fields["Class"] if theclass.find("duplicate") != -1: self.fields["resolution"]="DUPLICATE" elif theclass.find("mistaken") != -1: self.fields["resolution"]="INVALID" else: self.fields["resolution"]="FIXED" else: self.fields["resolution"]="FIXED" elif state == "suspended": self.fields["bug_status"] = "SUSPENDED" self.fields["resolution"] = "" elif state == "analyzed" and self.fields["userid"] == 3: self.fields["bug_status"] = "NEW" self.fields["resolution"] = "" else: self.fields["bug_status"] = "UNCONFIRMED" self.fields["resolution"] = "" self.fields["bug_status"] = SqlQuote(self.fields["bug_status"]) self.fields["resolution"] = SqlQuote(self.fields["resolution"]) self.fields["creation_ts"] = "" if self.fields.has_key("Arrival-Date") and self.fields["Arrival-Date"] != "": self.fields["creation_ts"] = unixdate2datetime(self.fields["Arrival-Date"]) self.fields["creation_ts"] = SqlQuote(self.fields["creation_ts"]) self.fields["delta_ts"] = "" if self.fields.has_key("Audit-Trail"): result = lastdatere.findall(self.fields["Audit-Trail"]) result.reverse() if len(result) > 0: self.fields["delta_ts"] = unixdate2timestamp(result[0]) if self.fields["delta_ts"] == "": if self.fields.has_key("Arrival-Date") and self.fields["Arrival-Date"] != "": self.fields["delta_ts"] = unixdate2timestamp(self.fields["Arrival-Date"]) self.fields["delta_ts"] = SqlQuote(self.fields["delta_ts"]) self.fields["short_desc"] = SqlQuote(self.fields["Synopsis"]) if self.fields.has_key("Reply-To") and self.fields["Reply-To"] != "": self.fields["reporter"] = get_userid(self.fields["Reply-To"]) elif self.fields.has_key("Mail-Header"): result = re.search(r"""From .*?([\w.]+@[\w.]+)""", self.fields["Mail-Header"]) if result: self.fields["reporter"] = get_userid(result.group(1)) else: self.fields["reporter"] = get_userid(gnats_username) else: self.fields["reporter"] = get_userid(gnats_username) long_desc = self.fields["Description"] long_desc2 = "" for field in ["Release", "Environment", "How-To-Repeat"]: if self.fields.has_key(field) and self.fields[field] != "": long_desc += ("\n\n%s:\n" % field) + self.fields[field] if self.fields.has_key("Fix") and self.fields["Fix"] != "": long_desc2 = "Fix:\n" + self.fields["Fix"] if self.need_unformatted == 1 and self.fields["Unformatted"] != "": long_desc += "\n\nUnformatted:\n" + self.fields["Unformatted"] if long_desc != "": self.long_descs.append((self.bug_id, self.fields["reporter"], self.fields["creation_ts"], SqlQuote(long_desc))) if long_desc2 != "": self.long_descs.append((self.bug_id, self.fields["reporter"], self.fields["creation_ts"], SqlQuote(long_desc2))) for field in ["gcchost", "gccbuild", "gcctarget"]: self.fields[field] = SqlQuote(self.fields[field]) self.fields["version"] = "" if self.fields["Release"] != "": self.fields["version"] = convert_gccver_to_ver (self.fields["Release"]) self.fields["version"] = SqlQuote(self.fields["version"]) self.fields["product"] = SqlQuote("gcc") self.fields["component"] = "invalid" if self.fields.has_key("Category"): self.fields["component"] = self.fields["Category"] self.fields["component"] = SqlQuote(self.fields["component"]) self.fields["target_milestone"] = "---" if self.fields["version"].find("3.4") != -1: self.fields["target_milestone"] = "3.4" self.fields["target_milestone"] = SqlQuote(self.fields["target_milestone"]) if self.fields["userid"] == 2: self.fields["userid"] = "\'NULL\'"class GNATSbug(object): """ Represents a single GNATS PR """ def __init__(self, filename): self.attachments = [] self.has_unformatted_attach = 0 fp = open (filename) self.fields = self.parse_pr(fp.xreadlines()) self.bug_id = int(self.fields["Number"]) if self.fields.has_key("Unformatted"): self.find_gnatsweb_attachments() if self.fields.has_key("How-To-Repeat"): self.find_regular_attachments("How-To-Repeat") if self.fields.has_key("Fix"): self.find_regular_attachments("Fix") def get_attacher(fields): if fields.has_key("Reply-To") and fields["Reply-To"] != "": return get_userid(fields["Reply-To"]) else: result = None if fields.has_key("Mail-Header"): result = re.search(r"""From .*?([\w.]+\@[\w.]+)""", fields["Mail-Header"]) if result is not None: reporter = get_userid(result.group(1)) else: reporter = get_userid(gnats_username) get_attacher = staticmethod(get_attacher) def find_regular_attachments(self, which): fields = self.fields while re.search("^begin [0-7]{3}", fields[which], re.DOTALL | re.MULTILINE): outfp = cStringIO.StringIO() infp = cStringIO.StringIO(fields[which]) filename, start, end = specialuu.decode(infp, outfp, quiet=0) fields[which]=fields[which].replace(fields[which][start:end], "See attachments for %s\n" % filename) self.attachments.append((filename, outfp.getvalue(), self.get_attacher(fields))) def decode_gnatsweb_attachment(self, attachment): result = re.split(r"""\n\n""", attachment, 1) if len(result) == 1: return -1 envelope, body = result envelope = uselessre.split(envelope) envelope.pop(0) # Turn the list of key, value into a dict of key => value attachinfo = dict([(envelope[i], envelope[i+1]) for i in xrange(0,len(envelope),2)]) for x in attachinfo.keys(): attachinfo[x] = attachinfo[x].rstrip() if (attachinfo.has_key("Content-Type") == 0) or \ (attachinfo.has_key("Content-Disposition") == 0): raise ValueError, "Unable to parse file attachment" result = dispositionre.search(attachinfo["Content-Disposition"]) filename = result.group(2) filename = re.sub(".*/","", filename) filename = re.sub(".*\\\\","", filename) attachinfo["filename"]=filename result = re.search("""(\S+);.*""", attachinfo["Content-Type"]) if result is not None: attachinfo["Content-Type"] = result.group(1) if attachinfo.has_key("Content-Transfer-Encoding"): if attachinfo["Content-Transfer-Encoding"] == "base64": attachinfo["data"] = base64.decodestring(body) else: attachinfo["data"]=body return (attachinfo["filename"], attachinfo["data"], self.get_attacher(self.fields)) def find_gnatsweb_attachments(self): fields = self.fields attachments = re.split(attachment_delimiter, fields["Unformatted"]) fields["Unformatted"] = attachments.pop(0) for attachment in attachments: result = self.decode_gnatsweb_attachment (attachment) if result != -1: self.attachments.append(result) self.has_unformatted_attach = 1 def parse_pr(lines): #fields = {"envelope":[]} fields = {"envelope":array.array("c")} hdrmulti = "envelope" for line in lines: line = line.rstrip('\n') line += '\n' result = gnatfieldre.search(line) if result is None: if hdrmulti != "": if fields.has_key(hdrmulti): #fields[hdrmulti].append(line) fields[hdrmulti].fromstring(line) else: #fields[hdrmulti] = [line] fields[hdrmulti] = array.array("c", line) continue hdr, arg = result.groups() ghdr = "*not valid*" result = fieldnamere.search(hdr) if result != None: ghdr = result.groups()[0] if ghdr in fieldnames: if multilinefields.has_key(ghdr): hdrmulti = ghdr #fields[ghdr] = [""] fields[ghdr] = array.array("c") else: hdrmulti = "" #fields[ghdr] = [arg] fields[ghdr] = array.array("c", arg) elif hdrmulti != "": #fields[hdrmulti].append(line) fields[hdrmulti].fromstring(line) if hdrmulti == "envelope" and \ (hdr == "Reply-To" or hdr == "From" \ or hdr == "X-GNATS-Notify"): arg = fix_email_addrs(arg) #fields[hdr] = [arg] fields[hdr] = array.array("c", arg) if fields.has_key("Reply-To") and len(fields["Reply-To"]) > 0: fields["Reply-To"] = fields["Reply-To"] else: fields["Reply-To"] = fields["From"] if fields.has_key("From"): del fields["From"] if fields.has_key("X-GNATS-Notify") == 0: fields["X-GNATS-Notify"] = array.array("c") #fields["X-GNATS-Notify"] = "" for x in fields.keys(): fields[x] = fields[x].tostring() #fields[x] = "".join(fields[x]) for x in fields.keys(): if multilinefields.has_key(x): fields[x] = fields[x].rstrip() return fields parse_pr = staticmethod(parse_pr)load_index("%s/gnats-adm/index" % gnats_db_dir)load_categories("%s/gnats-adm/categories" % gnats_db_dir)load_responsible("%s/gnats-adm/responsible" % gnats_db_dir)get_userid(gnats_username)get_userid(unassigned_username)for x in pr_list: print "Processing %s..." % x a = GNATSbug ("%s/%s" % (gnats_db_dir, x)) b = Bugzillabug(a)write_non_bug_tables()outfile.close()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -