コード例 #1
0
ファイル: report.py プロジェクト: petersenna/dpatch
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)
コード例 #2
0
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)