mirror of
https://git.launchpad.net/ubuntu-dev-tools
synced 2025-05-10 08:21:29 +00:00
sponsor-patch: Add support for UDD.
This commit is contained in:
parent
4bd431e1bc
commit
b0b4faca50
196
sponsor-patch
196
sponsor-patch
@ -22,6 +22,7 @@ import optparse
|
|||||||
import os
|
import os
|
||||||
import pwd
|
import pwd
|
||||||
import re
|
import re
|
||||||
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import urllib
|
import urllib
|
||||||
@ -59,6 +60,9 @@ class BugTask(object):
|
|||||||
dsc_file = filename
|
dsc_file = filename
|
||||||
return os.path.join(os.getcwd(), dsc_file)
|
return os.path.join(os.getcwd(), dsc_file)
|
||||||
|
|
||||||
|
def get_branch_link(self):
|
||||||
|
return "lp:" + self.project + "/" + self.get_series() + "/" + self.package
|
||||||
|
|
||||||
def get_long_info(self):
|
def get_long_info(self):
|
||||||
return "Bug task: " + str(self.bug_task) + "\n" + \
|
return "Bug task: " + str(self.bug_task) + "\n" + \
|
||||||
"Package: " + str(self.package) + "\n" + \
|
"Package: " + str(self.package) + "\n" + \
|
||||||
@ -146,6 +150,9 @@ class Patch(object):
|
|||||||
changed_files = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]
|
changed_files = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]
|
||||||
self.changed_files = filter(lambda l: l != "", changed_files.split("\n"))
|
self.changed_files = filter(lambda l: l != "", changed_files.split("\n"))
|
||||||
|
|
||||||
|
def get_name(self):
|
||||||
|
return self.patch_file
|
||||||
|
|
||||||
def get_strip_level(self):
|
def get_strip_level(self):
|
||||||
strip_level = None
|
strip_level = None
|
||||||
if self.is_debdiff():
|
if self.is_debdiff():
|
||||||
@ -307,40 +314,50 @@ def ask_for_manual_fixing():
|
|||||||
print "Abort."
|
print "Abort."
|
||||||
sys.exit(USER_ABORT)
|
sys.exit(USER_ABORT)
|
||||||
|
|
||||||
def main(script_name, bug_number, build, edit, keyid, upload, verbose=False):
|
def get_patch_or_branch(bug):
|
||||||
if "SPONSOR_PATCH_WORKDIR" in os.environ:
|
patch = None
|
||||||
# FIXME: add command line parameter
|
branch = None
|
||||||
workdir = os.path.abspath(os.environ["SPONSOR_PATCH_WORKDIR"])
|
|
||||||
if not os.path.isdir(workdir):
|
|
||||||
os.makedirs(workdir)
|
|
||||||
Print.command(["cd", workdir])
|
|
||||||
os.chdir(workdir)
|
|
||||||
else:
|
|
||||||
workdir = os.getcwd()
|
|
||||||
|
|
||||||
script_name = os.path.basename(sys.argv[0])
|
|
||||||
launchpad = launchpadlib.launchpad.Launchpad.login_anonymously(script_name, "production")
|
|
||||||
bug = launchpad.bugs[bug_number]
|
|
||||||
|
|
||||||
attached_patches = filter(lambda a: a.type == "Patch", bug.attachments)
|
attached_patches = filter(lambda a: a.type == "Patch", bug.attachments)
|
||||||
if len(attached_patches) == 0:
|
linked_branches = map(lambda b: b.branch, bug.linked_branches)
|
||||||
|
if len(attached_patches) == 0 and len(linked_branches) == 0:
|
||||||
if len(bug.attachments) == 0:
|
if len(bug.attachments) == 0:
|
||||||
Print.error("No attachment found on bug #%i." % (bug_number))
|
Print.error("No attachment and no linked branch found on bug #%i." % \
|
||||||
|
(bug.id))
|
||||||
else:
|
else:
|
||||||
Print.error(("No attached patch found. Go to https://launchpad.net/bugs/%i"
|
Print.error(("No attached patch and no linked branch found. Go to"
|
||||||
" and mark an attachment as patch.") % (bug_number))
|
" https://launchpad.net/bugs/%i and mark an attachment as"
|
||||||
|
" patch.") % (bug.id))
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
if len(attached_patches) > 1:
|
elif len(attached_patches) == 1 and len(linked_branches) == 0:
|
||||||
Print.normal("https://launchpad.net/bugs/%i has %i patches attached:" % \
|
|
||||||
(bug_number, len(attached_patches)))
|
|
||||||
for i in xrange(len(attached_patches)):
|
|
||||||
print "%i) %s" % (i + 1, attached_patches[i].title)
|
|
||||||
selected = input_number("Which patch do you want to download",
|
|
||||||
1, len(attached_patches), len(attached_patches))
|
|
||||||
patch = attached_patches[selected - 1]
|
|
||||||
else:
|
|
||||||
patch = attached_patches[0]
|
patch = attached_patches[0]
|
||||||
|
elif len(attached_patches) == 0 and len(linked_branches) == 1:
|
||||||
|
branch = linked_branches[0].bzr_identity
|
||||||
|
else:
|
||||||
|
if len(attached_patches) == 0:
|
||||||
|
Print.normal("https://launchpad.net/bugs/%i has %i branches linked:" % \
|
||||||
|
(bug.id, len(linked_branches)))
|
||||||
|
elif len(linked_branches) == 0:
|
||||||
|
Print.normal("https://launchpad.net/bugs/%i has %i patches attached:" % \
|
||||||
|
(bug.id, len(attached_patches)))
|
||||||
|
else:
|
||||||
|
Print.normal("https://launchpad.net/bugs/%i has %i branch(es) linked and %i patch(es) attached:" % \
|
||||||
|
(bug.id, len(linked_branches), len(attached_patches)))
|
||||||
|
i = 0
|
||||||
|
for linked_branch in linked_branches:
|
||||||
|
i += 1
|
||||||
|
print "%i) %s" % (i, linked_branch.display_name)
|
||||||
|
for attached_patch in attached_patches:
|
||||||
|
i += 1
|
||||||
|
print "%i) %s" % (i, attached_patch.title)
|
||||||
|
selected = input_number("Which branch or patch do you want to download",
|
||||||
|
1, i, i)
|
||||||
|
if selected <= len(linked_branches):
|
||||||
|
branch = linked_branches[selected - 1].bzr_identity
|
||||||
|
else:
|
||||||
|
patch = attached_patches[selected - len(linked_branches) - 1]
|
||||||
|
return (patch, branch)
|
||||||
|
|
||||||
|
def download_patch(patch):
|
||||||
patch_file = re.sub(" ", "_", patch.title)
|
patch_file = re.sub(" ", "_", patch.title)
|
||||||
if not reduce(lambda r, x: r or patch.title.endswith(x), (".debdiff", ".diff", ".patch"), False):
|
if not reduce(lambda r, x: r or patch.title.endswith(x), (".debdiff", ".diff", ".patch"), False):
|
||||||
Print.info("Patch %s does not have a proper file extension." % (patch.title))
|
Print.info("Patch %s does not have a proper file extension." % (patch.title))
|
||||||
@ -350,7 +367,80 @@ def main(script_name, bug_number, build, edit, keyid, upload, verbose=False):
|
|||||||
f = open(patch_file, "w")
|
f = open(patch_file, "w")
|
||||||
f.write(patch.data.open().read())
|
f.write(patch.data.open().read())
|
||||||
f.close()
|
f.close()
|
||||||
patch = Patch(patch_file)
|
return Patch(patch_file)
|
||||||
|
|
||||||
|
def download_branch(branch):
|
||||||
|
dir_name = os.path.basename(branch)
|
||||||
|
if os.path.isdir(dir_name):
|
||||||
|
shutil.rmtree(dir_name)
|
||||||
|
cmd = ["bzr", "branch", branch]
|
||||||
|
Print.command(cmd)
|
||||||
|
if subprocess.call(cmd) != 0:
|
||||||
|
Print.error("Failed to download branch %s." % (branch))
|
||||||
|
sys.exit(1)
|
||||||
|
return dir_name
|
||||||
|
|
||||||
|
def merge_branch(branch):
|
||||||
|
edit = False
|
||||||
|
cmd = ["bzr", "merge", branch]
|
||||||
|
Print.command(cmd)
|
||||||
|
if subprocess.call(cmd) != 0:
|
||||||
|
Print.error("Failed to merge branch %s." % (branch))
|
||||||
|
ask_for_manual_fixing()
|
||||||
|
edit = True
|
||||||
|
return edit
|
||||||
|
|
||||||
|
def extract_source(dsc_file, verbose=False):
|
||||||
|
cmd = ["dpkg-source", "-x", dsc_file]
|
||||||
|
if not verbose:
|
||||||
|
cmd.insert(1, "-q")
|
||||||
|
Print.command(cmd)
|
||||||
|
if subprocess.call(cmd) != 0:
|
||||||
|
Print.error("Extraction of %s failed." % (os.path.basename(dsc_file)))
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def apply_patch(task, patch):
|
||||||
|
edit = False
|
||||||
|
if patch.is_debdiff():
|
||||||
|
cmd = ["patch", "--merge", "--force", "-p", str(patch.get_strip_level()),
|
||||||
|
"-i", patch.full_path]
|
||||||
|
Print.command(cmd)
|
||||||
|
if subprocess.call(cmd) != 0:
|
||||||
|
Print.error("Failed to apply debdiff %s to %s %s." % \
|
||||||
|
(patch.get_name(), task.package, task.get_version()))
|
||||||
|
if not edit:
|
||||||
|
ask_for_manual_fixing()
|
||||||
|
edit = True
|
||||||
|
else:
|
||||||
|
# FIXME: edit-patch needs a non-interactive mode
|
||||||
|
# https://launchpad.net/bugs/612566
|
||||||
|
cmd = ["edit-patch", patch.full_path]
|
||||||
|
Print.command(cmd)
|
||||||
|
if subprocess.call(cmd) != 0:
|
||||||
|
Print.error("Failed to apply diff %s to %s %s." % \
|
||||||
|
(patch.get_name(), task.package, task.get_version()))
|
||||||
|
if not edit:
|
||||||
|
ask_for_manual_fixing()
|
||||||
|
edit = True
|
||||||
|
return edit
|
||||||
|
|
||||||
|
def main(script_name, bug_number, build, edit, keyid, upload, verbose=False):
|
||||||
|
if "SPONSOR_PATCH_WORKDIR" in os.environ:
|
||||||
|
# FIXME: add command line parameter
|
||||||
|
workdir = os.path.abspath(os.environ["SPONSOR_PATCH_WORKDIR"])
|
||||||
|
if not os.path.isdir(workdir):
|
||||||
|
os.makedirs(workdir)
|
||||||
|
# FIXME: Print nice error message on failure
|
||||||
|
Print.command(["cd", workdir])
|
||||||
|
os.chdir(workdir)
|
||||||
|
else:
|
||||||
|
workdir = os.getcwd()
|
||||||
|
|
||||||
|
script_name = os.path.basename(sys.argv[0])
|
||||||
|
launchpad = launchpadlib.launchpad.Launchpad.login_anonymously(script_name, "production")
|
||||||
|
bug = launchpad.bugs[bug_number]
|
||||||
|
|
||||||
|
(patch, branch) = get_patch_or_branch(bug)
|
||||||
|
|
||||||
bug_tasks = map(lambda x: BugTask(x, launchpad), bug.bug_tasks)
|
bug_tasks = map(lambda x: BugTask(x, launchpad), bug.bug_tasks)
|
||||||
ubuntu_tasks = filter(lambda x: x.is_ubuntu_task(), bug_tasks)
|
ubuntu_tasks = filter(lambda x: x.is_ubuntu_task(), bug_tasks)
|
||||||
@ -378,48 +468,32 @@ def main(script_name, bug_number, build, edit, keyid, upload, verbose=False):
|
|||||||
task = ubuntu_tasks[selected - 1]
|
task = ubuntu_tasks[selected - 1]
|
||||||
Print.info("Selected Ubuntu task: %s" % (task.get_short_info()))
|
Print.info("Selected Ubuntu task: %s" % (task.get_short_info()))
|
||||||
|
|
||||||
|
dsc_file = task.download_source()
|
||||||
|
assert os.path.isfile(dsc_file), "%s does not exist." % (dsc_file)
|
||||||
|
|
||||||
|
if patch:
|
||||||
|
patch = download_patch(patch)
|
||||||
|
|
||||||
Print.info("Ubuntu package: %s" % (task.package))
|
Print.info("Ubuntu package: %s" % (task.package))
|
||||||
if task.is_merge():
|
if task.is_merge():
|
||||||
Print.info("The task is a merge request.")
|
Print.info("The task is a merge request.")
|
||||||
|
|
||||||
dsc_file = task.download_source()
|
extract_source(dsc_file, verbose)
|
||||||
assert os.path.isfile(dsc_file), "%s does not exist." % (dsc_file)
|
|
||||||
|
|
||||||
# extract source
|
|
||||||
cmd = ["dpkg-source", "-x", dsc_file]
|
|
||||||
if not verbose:
|
|
||||||
cmd.insert(1, "-q")
|
|
||||||
Print.command(cmd)
|
|
||||||
if subprocess.call(cmd) != 0:
|
|
||||||
Print.error("Extraction of %s failed." % (os.path.basename(dsc_file)))
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# change directory
|
# change directory
|
||||||
directory = task.package + '-' + task.get_version().upstream_version
|
directory = task.package + '-' + task.get_version().upstream_version
|
||||||
Print.command(["cd", directory])
|
Print.command(["cd", directory])
|
||||||
os.chdir(directory)
|
os.chdir(directory)
|
||||||
|
|
||||||
if patch.is_debdiff():
|
edit |= apply_patch(task, patch)
|
||||||
cmd = ["patch", "--merge", "--force", "-p", str(patch.get_strip_level()),
|
elif branch:
|
||||||
"-i", patch.full_path]
|
branch_dir = download_branch(task.get_branch_link())
|
||||||
Print.command(cmd)
|
|
||||||
if subprocess.call(cmd) != 0:
|
# change directory
|
||||||
Print.error("Failed to apply debdiff %s to %s %s." % \
|
Print.command(["cd", branch_dir])
|
||||||
(patch_file, task.package, task.get_version()))
|
os.chdir(branch_dir)
|
||||||
if not edit:
|
|
||||||
ask_for_manual_fixing()
|
edit |= merge_branch(branch)
|
||||||
edit = True
|
|
||||||
else:
|
|
||||||
# FIXME: edit-patch needs a non-interactive mode
|
|
||||||
# https://launchpad.net/bugs/612566
|
|
||||||
cmd = ["edit-patch", patch.full_path]
|
|
||||||
Print.command(cmd)
|
|
||||||
if subprocess.call(cmd) != 0:
|
|
||||||
Print.error("Failed to apply diff %s to %s %s." % \
|
|
||||||
(patch_file, task.package, task.get_version()))
|
|
||||||
if not edit:
|
|
||||||
ask_for_manual_fixing()
|
|
||||||
edit = True
|
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
if edit:
|
if edit:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user