mirror of
https://git.launchpad.net/ubuntu-dev-tools
synced 2025-03-16 01:21:07 +00:00
syncpackage:
- Show changes to be synced when performing native syncs. - Support --bug (extra bugs to be closed by the sync) with native syncs. (Bugs are closed one individually, via the API, post-sync)
This commit is contained in:
commit
a3378ee9fc
7
debian/changelog
vendored
7
debian/changelog
vendored
@ -15,7 +15,12 @@ ubuntu-dev-tools (0.129) UNRELEASED; urgency=low
|
|||||||
- lp-set-dup
|
- lp-set-dup
|
||||||
- lp-shell
|
- lp-shell
|
||||||
|
|
||||||
-- Jelmer Vernooij <jelmer@debian.org> Thu, 01 Sep 2011 19:38:53 +0200
|
[ Stefano Rivera ]
|
||||||
|
* syncpackage: Show changes to be synced when performing native syncs.
|
||||||
|
* syncpackage: Support --bug (extra bugs to be closed by the sync) with
|
||||||
|
native syncs. (Bugs are closed one individually, via the API, post-sync)
|
||||||
|
|
||||||
|
-- Stefano Rivera <stefanor@debian.org> Sat, 03 Sep 2011 21:04:38 +0200
|
||||||
|
|
||||||
ubuntu-dev-tools (0.128) unstable; urgency=low
|
ubuntu-dev-tools (0.128) unstable; urgency=low
|
||||||
|
|
||||||
|
69
syncpackage
69
syncpackage
@ -35,11 +35,13 @@ from lazr.restfulclient.errors import HTTPError
|
|||||||
from ubuntutools.archive import (DebianSourcePackage, UbuntuSourcePackage,
|
from ubuntutools.archive import (DebianSourcePackage, UbuntuSourcePackage,
|
||||||
DownloadError)
|
DownloadError)
|
||||||
from ubuntutools.config import UDTConfig, ubu_email
|
from ubuntutools.config import UDTConfig, ubu_email
|
||||||
|
from ubuntutools.requestsync.common import getDebianChangelog
|
||||||
from ubuntutools.requestsync.mail import (getDebianSrcPkg
|
from ubuntutools.requestsync.mail import (getDebianSrcPkg
|
||||||
as requestsync_mail_getDebianSrcPkg)
|
as requestsync_mail_getDebianSrcPkg)
|
||||||
from ubuntutools.requestsync.lp import getDebianSrcPkg, getUbuntuSrcPkg
|
from ubuntutools.requestsync.lp import getDebianSrcPkg, getUbuntuSrcPkg
|
||||||
from ubuntutools.lp import udtexceptions
|
from ubuntutools.lp import udtexceptions
|
||||||
from ubuntutools.lp.lpapicache import Distribution, Launchpad
|
from ubuntutools.lp.lpapicache import (Distribution, Launchpad,
|
||||||
|
SourcePackagePublishingHistory)
|
||||||
from ubuntutools.misc import split_release_pocket
|
from ubuntutools.misc import split_release_pocket
|
||||||
from ubuntutools.question import YesNoQuestion
|
from ubuntutools.question import YesNoQuestion
|
||||||
from ubuntutools import subprocess
|
from ubuntutools import subprocess
|
||||||
@ -100,7 +102,7 @@ def add_fixed_bugs(changes, bugs):
|
|||||||
|
|
||||||
changes = [l for l in changes.split("\n") if l.strip() != ""]
|
changes = [l for l in changes.split("\n") if l.strip() != ""]
|
||||||
# Remove duplicates
|
# Remove duplicates
|
||||||
bugs = set(bugs)
|
bugs = set(str(bug) for bug in bugs)
|
||||||
|
|
||||||
for i in xrange(len(changes)):
|
for i in xrange(len(changes)):
|
||||||
if changes[i].startswith("Launchpad-Bugs-Fixed:"):
|
if changes[i].startswith("Launchpad-Bugs-Fixed:"):
|
||||||
@ -308,7 +310,7 @@ def fetch_source_pkg(package, dist, version, component, ubuntu_release, mirror):
|
|||||||
return DebianSourcePackage(package, version.full_version, component,
|
return DebianSourcePackage(package, version.full_version, component,
|
||||||
mirrors=mirrors)
|
mirrors=mirrors)
|
||||||
|
|
||||||
def copy(src_pkg, release, simulate=False, force=False):
|
def copy(src_pkg, release, bugs, simulate=False, force=False):
|
||||||
"""Copy a source package from Debian to Ubuntu using the Launchpad API."""
|
"""Copy a source package from Debian to Ubuntu using the Launchpad API."""
|
||||||
ubuntu = Distribution('ubuntu')
|
ubuntu = Distribution('ubuntu')
|
||||||
debian_archive = Distribution('debian').getArchive()
|
debian_archive = Distribution('debian').getArchive()
|
||||||
@ -321,10 +323,12 @@ def copy(src_pkg, release, simulate=False, force=False):
|
|||||||
|
|
||||||
# Ensure that the provided Debian version actually exists.
|
# Ensure that the provided Debian version actually exists.
|
||||||
try:
|
try:
|
||||||
debian_archive.getPublishedSources(
|
debian_spph = SourcePackagePublishingHistory(
|
||||||
source_name=src_pkg.source,
|
debian_archive.getPublishedSources(
|
||||||
version=src_pkg.version.full_version,
|
source_name=src_pkg.source,
|
||||||
exact_match=True)[0]
|
version=src_pkg.version.full_version,
|
||||||
|
exact_match=True)[0]
|
||||||
|
)
|
||||||
except IndexError:
|
except IndexError:
|
||||||
Logger.error('Debian version %s does not exist!', src_pkg.version)
|
Logger.error('Debian version %s does not exist!', src_pkg.version)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
@ -342,6 +346,7 @@ def copy(src_pkg, release, simulate=False, force=False):
|
|||||||
ubuntu_pkg.version, src_pkg.version)
|
ubuntu_pkg.version, src_pkg.version)
|
||||||
|
|
||||||
ubuntu_version = Version(ubuntu_pkg.version.full_version)
|
ubuntu_version = Version(ubuntu_pkg.version.full_version)
|
||||||
|
base_version = ubuntu_version.get_related_debian_version()
|
||||||
if not force and ubuntu_version.is_modified_in_ubuntu():
|
if not force and ubuntu_version.is_modified_in_ubuntu():
|
||||||
Logger.error('--force is required to discard Ubuntu changes.')
|
Logger.error('--force is required to discard Ubuntu changes.')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
@ -354,9 +359,15 @@ def copy(src_pkg, release, simulate=False, force=False):
|
|||||||
'mismatch. A fake sync using --no-lp is required.')
|
'mismatch. A fake sync using --no-lp is required.')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
except udtexceptions.PackageNotFoundException:
|
except udtexceptions.PackageNotFoundException:
|
||||||
|
base_version = Version('~')
|
||||||
Logger.normal('Source %s -> %s/%s: not in Ubuntu, new version %s',
|
Logger.normal('Source %s -> %s/%s: not in Ubuntu, new version %s',
|
||||||
src_pkg.source, ubuntu_series, ubuntu_pocket,
|
src_pkg.source, ubuntu_series, ubuntu_pocket,
|
||||||
src_pkg.version)
|
src_pkg.version)
|
||||||
|
|
||||||
|
changes = getDebianChangelog(debian_spph, base_version).strip()
|
||||||
|
if changes:
|
||||||
|
Logger.normal("New Changes:\n%s", changes)
|
||||||
|
|
||||||
if simulate:
|
if simulate:
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -380,6 +391,16 @@ def copy(src_pkg, release, simulate=False, force=False):
|
|||||||
|
|
||||||
Logger.normal('Request succeeded; you should get an e-mail once it is '
|
Logger.normal('Request succeeded; you should get an e-mail once it is '
|
||||||
'processed.')
|
'processed.')
|
||||||
|
bugs = sorted(set(bugs))
|
||||||
|
if bugs:
|
||||||
|
Logger.normal("Launchpad bugs to be closed: %s",
|
||||||
|
', '.join(str(bug) for bug in bugs))
|
||||||
|
Logger.normal('Please wait for the sync to be successful before '
|
||||||
|
'closing bugs.')
|
||||||
|
answer = YesNoQuestion().ask("Close bugs", "yes")
|
||||||
|
if answer == "yes":
|
||||||
|
close_bugs(bugs, src_pkg.source, src_pkg.version.full_version,
|
||||||
|
changes)
|
||||||
|
|
||||||
def is_blacklisted(query):
|
def is_blacklisted(query):
|
||||||
""""Determine if package "query" is in the sync blacklist
|
""""Determine if package "query" is in the sync blacklist
|
||||||
@ -419,6 +440,29 @@ def is_blacklisted(query):
|
|||||||
applicable_comments.append(comment)
|
applicable_comments.append(comment)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def close_bugs(bugs, package, version, changes):
|
||||||
|
"""Close the correct task on all bugs, with changes"""
|
||||||
|
ubuntu = Launchpad.distributions['ubuntu']
|
||||||
|
message = ("This bug was fixed in the package %s - %s"
|
||||||
|
"\n\n---------------\n%s" % (
|
||||||
|
package, version, changes))
|
||||||
|
for bug in bugs:
|
||||||
|
bug = Launchpad.bugs[bug]
|
||||||
|
if bug.duplicate_of is not None:
|
||||||
|
bug = bug.duplicate_of
|
||||||
|
for task in bug.bug_tasks:
|
||||||
|
target = task.target
|
||||||
|
if target == ubuntu or (target.name == package and
|
||||||
|
getattr(target, 'distribution', None) == ubuntu):
|
||||||
|
if task.status != 'Fix Released':
|
||||||
|
Logger.normal("Closed bug %s", task.web_link)
|
||||||
|
task.status = 'Fix Released'
|
||||||
|
task.lp_save()
|
||||||
|
bug.newMessage(content=message)
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
Logger.error(u"Cannot find any tasks on LP: #%i to close.", bug.id)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
usage = "%prog [options] <.dsc URL/path or package name>"
|
usage = "%prog [options] <.dsc URL/path or package name>"
|
||||||
epilog = "See %s(1) for more info." % os.path.basename(sys.argv[0])
|
epilog = "See %s(1) for more info." % os.path.basename(sys.argv[0])
|
||||||
@ -496,10 +540,10 @@ def main():
|
|||||||
parser.error('Multiple .dsc URLs/paths or package names specified: '
|
parser.error('Multiple .dsc URLs/paths or package names specified: '
|
||||||
+ ', '.join(args))
|
+ ', '.join(args))
|
||||||
|
|
||||||
invalid_bug_numbers = [bug for bug in options.bugs if not bug.isdigit()]
|
try:
|
||||||
if len(invalid_bug_numbers) > 0:
|
options.bugs = map(int, options.bugs)
|
||||||
parser.error('Invalid bug number(s) specified: '
|
except TypeError:
|
||||||
+ ', '.join(invalid_bug_numbers))
|
parser.error('Invalid bug number(s) specified.')
|
||||||
|
|
||||||
if options.component not in (None, "main", "contrib", "non-free"):
|
if options.component not in (None, "main", "contrib", "non-free"):
|
||||||
parser.error('%s is not a valid Debian component. '
|
parser.error('%s is not a valid Debian component. '
|
||||||
@ -560,7 +604,8 @@ def main():
|
|||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if options.lp:
|
if options.lp:
|
||||||
copy(src_pkg, options.release, options.simulate, options.force)
|
copy(src_pkg, options.release, options.bugs, options.simulate,
|
||||||
|
options.force)
|
||||||
else:
|
else:
|
||||||
os.environ['DEB_VENDOR'] = 'Ubuntu'
|
os.environ['DEB_VENDOR'] = 'Ubuntu'
|
||||||
sync_dsc(src_pkg, options.dist, options.release, options.uploader_name,
|
sync_dsc(src_pkg, options.dist, options.release, options.uploader_name,
|
||||||
|
@ -38,9 +38,11 @@ def raw_input_exit_on_ctrlc(*args, **kwargs):
|
|||||||
print '\nAbort requested. No sync request filed.'
|
print '\nAbort requested. No sync request filed.'
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
# TODO: Move this into requestsync.mail, and implement an LP version
|
||||||
|
# when LP: #833384 is fixed
|
||||||
def getDebianChangelog(srcpkg, version):
|
def getDebianChangelog(srcpkg, version):
|
||||||
'''
|
'''
|
||||||
Return the new changelog entries upto 'version'.
|
Return the new changelog entries since 'version'.
|
||||||
'''
|
'''
|
||||||
pkgname = srcpkg.getPackageName()
|
pkgname = srcpkg.getPackageName()
|
||||||
pkgversion = srcpkg.getVersion()
|
pkgversion = srcpkg.getVersion()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user