view bzpatch.py @ 25:cf3583d9bf07

fixed bool bug
author Atul Varma <avarma@mozilla.com>
date Wed, 14 Jul 2010 17:22:25 -0700
parents 09817175c9aa
children 8d0d0339d878
line wrap: on
line source

#! /usr/bin/env python

import sys
import datetime
import base64

import bugzilla

def strip_patch_header(patch):
    """
    >>> strip_patch_header('#HG blarg\\n\\ndiff --git\\n')
    'diff --git\\n'

    >>> strip_patch_header('sup')
    'sup'

    >>> print strip_patch_header('diff --git\\n'
    ...                          'bleh\\n'
    ...                          'diff --git\\n'
    ...                          'yo')
    diff --git
    bleh
    diff --git
    yo
    """

    if patch.startswith('diff'):
        return patch
    index = patch.find('\ndiff')
    if index == -1:
        return patch
    return patch[index+1:]

def make_patch_header(real_name, email, bug_id, summary):
    """
    >>> print make_patch_header('Bob', 'bob@foo.com', 5, 'yo')
    # HG changeset patch
    # User Bob <bob@foo.com>
    Bug 5 - yo
    """

    lines = ['# HG changeset patch',
             '# User %s <%s>' % (real_name, email),
             'Bug %d - %s' % (bug_id, summary)]
    return '\n'.join(lines)

def make_patch(patch, real_name, email, bug_id, summary):
    """
    >>> print make_patch('hi', 'Bob', 'bob@foo.com', 5, 'yo')
    # HG changeset patch
    # User Bob <bob@foo.com>
    Bug 5 - yo
    <BLANKLINE>
    hi
    """

    patch = strip_patch_header(patch)
    header = make_patch_header(real_name, email, bug_id, summary)
    return '\n'.join([header, '', patch])

def get_patch_from_attachment(attachment):
    return make_patch(patch=attachment.data,
                      real_name=attachment.attacher.real_name,
                      email=attachment.attacher.email,
                      bug_id=attachment.bug.id,
                      summary=attachment.bug.summary)

def get_patch(bug):
    def cmp_lastcreated(a, b):
        return cmp(a.creation_time, b.creation_time)

    patches = [patch for patch in bug.attachments
               if patch.is_patch and not patch.is_obsolete]
    patches.sort(cmp_lastcreated)

    most_recent_patch = patches[-1]

    return get_patch_from_attachment(most_recent_patch)

def post_patch(bzapi, bug, patch, description):
    """
    >>> bzapi = MockBugzillaApi({'username': 'avarma@mozilla.com'})
    >>> bzapi.request.mock_returns = TEST_USER_SEARCH_RESULT
    >>> bug = bugzilla.Bug(TEST_BUG, bzapi)
    >>> print post_patch(bzapi, bug, 'o hai', 'my patch')
    Called bzapi.request(
        'GET',
        '/user',
        query_args={'match': u'avarma@mozilla.com'})
    Called bzapi.request(
        'POST',
        '/bug/558680/attachment',
        body={'is_obsolete': False, 'flags': [], 'description': 'my patch', 'content_type': 'text/plain', 'encoding': 'base64', 'file_name': 'bug-558680-patch.diff', 'is_patch': True, 'data': 'IyBIRyBjaGFuZ2VzZXQgcGF0Y2gKIyBVc2VyIEF0dWwgVmFybWEgWzphdHVsXSA8YXZhcm1hQG1vemlsbGEuY29tPgpCdWcgNTU4NjgwIC0gSGVyZSBpcyBhIHN1bW1hcnkKCm8gaGFp', 'is_private': False, 'size': 105})
    # HG changeset patch
    # User Atul Varma [:atul] <avarma@mozilla.com>
    Bug 558680 - Here is a summary
    <BLANKLINE>
    o hai
    """

    full_patch = make_patch(patch=patch,
                            real_name=bzapi.current_user.real_name,
                            email=bzapi.current_user.email,
                            bug_id=bug.id,
                            summary=bug.summary)
    bzapi.attachments.post(bug_id=bug.id,
                           contents=full_patch,
                           filename="bug-%d-patch.diff" % bug.id,
                           description=description,
                           content_type='text/plain',
                           is_patch=True)
    return full_patch

if __name__ == '__main__':
    if len(sys.argv) < 3:
        print "usage: %s <post|get> <bug-id> [desc]" % sys.argv[0]
        sys.exit(1)

    cmd = sys.argv[1]

    if cmd not in ['get', 'post']:
        print "unrecognized command: %s" % cmd
        sys.exit(1)

    try:
        bug_id = int(sys.argv[2])
    except ValueError:
        print "not a valid bug id: %s" % sys.argv[2]
        sys.exit(1)

    if cmd == 'post' and len(sys.argv) < 4:
        print "patch description required."
        sys.exit(1)

    bzapi = bugzilla.BugzillaApi()
    bug = bzapi.bugs.get(bug_id)

    if cmd == 'get':
        sys.stdout.write(get_patch(bug))
    else:
        post_patch(bzapi=bzapi,
                   bug=bug,
                   patch=sys.stdin.read(),
                   description=sys.argv[3])