def report_merge(request): pids = get_request_paramter(request, 'ids') if pids is None: return HttpResponse('MERGE ERROR: no report id specified') ids = pids.split(',') if len(ids) < 2: return HttpResponse('MERGE ERROR: at least two report ids need') reports = [] rtype = None tag = None rdir = None fstats = [] fstatlen = 0 stats = [0, 0, 0] diffs = '' logs = '' for i in ids: report = Report.objects.get(id = i) if not report: logevent("MERGE: report [%s], ERROR: report %s does not exists" % (pids, i), False) return HttpResponse('MERGE ERROR: report %s does not exists' % i) if report.mergered != 0: logevent("MERGE: report [%s], ERROR: report %s already merged" % (pids, i), False) return HttpResponse('MERGE ERROR: report %s already merged' % i) if rtype is None: rtype = report.type elif rtype != report.type: logevent("MERGE: report [%s], ERROR: report %s type different" % (pids, i)) return HttpResponse('MERGE ERROR: report %s type different' % i) if tag is None: tag = report.tag elif tag != report.tag: logevent("MERGE: report [%s], ERROR: report %s tag different" % (pids, i)) return HttpResponse('MERGE ERROR:, report %s tag different' % i) if rdir is None: rdir = os.path.dirname(report.file) elif rdir != os.path.dirname(report.file): logevent("MERGE: report [%s], ERROR: report %s dirname different" % (pids, i)) return HttpResponse('MERGE ERROR: report %s dirname different' % i) if report.diff is None or len(report.diff) == 0: logevent("MERGE: report [%s], ERROR: report %s has no patch" % (pids, i)) return HttpResponse('MERGE ERROR: report %s has no patch' % i) reports.append(report) logs += '\n' + report.reportlog lines = report.diff.split('\n') for i in range(len(lines)): if re.search(r" \S+\s+\|\s+\d+\s+[+-]+", lines[i]) != None: fstats.append(lines[i]) if fstatlen < lines[i].find('|'): fstatlen = lines[i].find('|') elif re.search(r"\d+ file[s]* changed", lines[i]) != None: astat = lines[i].split(',') for stat in astat: if re.search(r"\d+ file[s]* changed", stat) != None: num = stat.strip().split(' ')[0] stats[0] += int(num) elif stat.find('insertion') != -1: num = stat.strip().split(' ')[0] stats[1] += int(num) elif stat.find('deletion') != -1: num = stat.strip().split(' ')[0] stats[2] += int(num) else: diffs += '\n'.join(lines[i:]) break for i in range(len(fstats)): append = fstatlen - fstats[i].find('|') fstats[i] = fstats[i].replace('|', ' ' * append + '|') statline = " %d files changed" % stats[0] if stats[1] == 1: statline += ", %d insertion(+)" % stats[1] elif stats[1] != 0: statline += ", %d insertions(+)" % stats[1] if stats[2] == 1: statline += ", %d deletion(-)" % stats[2] elif stats[2] != 0: statline += ", %d deletions(-)" % stats[2] diffs = "%s\n%s\n%s" % ('\n'.join(fstats), statline, diffs) report = Report(tag = tag, file = rdir + '/', diff = diffs, reportlog = logs, type = rtype, status = STATUS_PATCHED, mglist = ','.join(ids)) report.save() user = report.username() email = report.email() formater = PatchFormater(tag.repo.dirname(), rdir, user, email, rtype.ptitle, rtype.pdesc, diffs) report.content = formater.format_patch() report.title = formater.format_title() report.desc = rtype.pdesc report.emails = formater.get_mail_list() report.save() for p in reports: p.mergered = report.id p.save() tag.total -= len(reports) - 1 tag.save() logevent("MERGE: report [%s], SUCCEED: new report id %s" % (pids, report.id), True) return HttpResponse('MERGE SUCCEED: new report id %s' % report.id)