Add mirror support to pull-lp-source

This commit is contained in:
Stefano Rivera 2010-12-24 12:00:03 +02:00
parent 088341fa7c
commit 0d51908f40
6 changed files with 95 additions and 37 deletions

View File

@ -78,6 +78,8 @@ The default value for \fB\-\-debian\-mirror\fR.
The default value for \fB\-\-debsec\-mirror\fR. The default value for \fB\-\-debsec\-mirror\fR.
.SH SEE ALSO .SH SEE ALSO
.BR debdiff (1),
.BR dget (1),
.BR pull\-debian\-source (1), .BR pull\-debian\-source (1),
.BR ubuntu\-dev\-tools (5) .BR ubuntu\-dev\-tools (5)

View File

@ -52,6 +52,9 @@ package\-wide variable.
The default value for \fB\-\-mirror\fR. The default value for \fB\-\-mirror\fR.
.SH SEE ALSO .SH SEE ALSO
.BR dget (1),
.BR pull\-debian\-debdiff (1),
.BR pull\-lp\-source (1),
.BR ubuntu\-dev\-tools (5) .BR ubuntu\-dev\-tools (5)
.SH AUTHOR .SH AUTHOR

View File

@ -4,7 +4,7 @@
pull\-lp\-source \- download a source package from Launchpad pull\-lp\-source \- download a source package from Launchpad
.SH SYNOPSIS .SH SYNOPSIS
.B pull\-lp\-source \fR[\fB\-h\fR]\fB <\fBsource package\fR> [\fItarget release\fR] .B pull\-lp\-source \fR[\fIoptions\fR]\fB <\fBsource package\fR> [\fItarget release\fR]
.SH DESCRIPTION .SH DESCRIPTION
\fBpull\-lp\-source\fR downloads and extracts the latest version of \fBpull\-lp\-source\fR downloads and extracts the latest version of
@ -15,21 +15,52 @@ version in that release will be downloaded instead.
.SH OPTIONS .SH OPTIONS
Listed below are the command line options for pull\-lp\-source: Listed below are the command line options for pull\-lp\-source:
.TP .TP
.B \-h, \-\-help
Display a help message and exit.
.TP
.B <source package> .B <source package>
This is the source package that you would like to be downloaded from Launchpad. This is the source package that you would like to be downloaded from Launchpad.
.TP .TP
.B [target release] .B [target release]
This is the release that you would like the source package to be downloaded from. This is the release that you would like the source package to be downloaded from.
This value defaults to the current development release. This value defaults to the current development release.
.SH ENVIRONMENT VARIABLES
.TP .TP
.BR \-h ", " \-\-help
Display a help message and exit.
.TP
.B \-m \fIUBUNTU_MIRROR\fR, \fB\-\-mirror\fR=\fIUBUNTU_MIRROR\fR
Use the specified Ubuntu mirror.
Should be in the form \fBhttp://archive.ubuntu.com/ubuntu\fR.
If the package isn't found on this mirror, \fBpull\-lp\-source\fR will
fall back to Launchpad, as its name implies.
.TP
.B \-\-no\-conf
Do not read any configuration files, or configuration from environment
variables.
.SH ENVIRONMENT
All of the \fBCONFIGURATION VARIABLES\fR below are also supported as
environment variables.
Variables in the environment take precedence to those in configuration
files.
.TP
.B
DIST DIST
Specifies the default target. Specifies the default target.
.SH CONFIGURATION VARIABLES
The following variables can be set in the environment or in
.BR ubuntu\-dev\-tools (5)
configuration files.
In each case, the script\-specific variable takes precedence over the
package\-wide variable.
.TP
.BR PULL_LP_SOURCE_UBUNTU_MIRROR ", " UBUNTUTOOLS_UBUNTU_MIRROR
The default value for \fB\-\-mirror\fR.
.SH SEE ALSO
.BR dget (1),
.BR pull\-debian\-source (1),
.BR pull\-debian\-debdiff (1),
.BR ubuntu\-dev\-tools (5)
.SH AUTHOR .SH AUTHOR
.PP .PP
\fBpull\-lp\-source\fR and this manual page were written by Iain Lane \fBpull\-lp\-source\fR and this manual page were written by Iain Lane

View File

@ -32,35 +32,24 @@ except ImportError:
from ubuntutools.config import UDTConfig from ubuntutools.config import UDTConfig
from ubuntutools.logger import Logger from ubuntutools.logger import Logger
from ubuntutools.misc import dsc_name, dsc_url
DEFAULT_DEBIAN_MIRROR = 'http://ftp.debian.org/debian' DEFAULT_DEBIAN_MIRROR = 'http://ftp.debian.org/debian'
DEFAULT_DEBSEC_MIRROR = 'http://security.debian.org' DEFAULT_DEBSEC_MIRROR = 'http://security.debian.org'
opts = None opts = None
def dsc_name(package, version):
"Return the source package dsc filename for the given package"
if ':' in version:
version = version.split(':', 1)[1]
return '%s_%s.dsc' % (package, version)
def build_url(mirror, package, version):
"Build a source package URL"
group = package[:4] if package.startswith('lib') else package[0]
fn = dsc_name(package, version)
# TODO: Not all packages are main :)
# Practically this is fine, as it'll be found on snapshot, but still ugly.
return os.path.join(mirror, 'pool', 'main', group, package, fn)
def pull(package, version, unpack=False): def pull(package, version, unpack=False):
"Download Debian source package version version" "Download Debian source package version version"
urls = [] urls = []
# TODO: Not all packages are main :)
# Practically this is fine, as it'll be found on snapshot, but still ugly.
if opts.debsec_mirror and opts.debsec_mirror != DEFAULT_DEBSEC_MIRROR: if opts.debsec_mirror and opts.debsec_mirror != DEFAULT_DEBSEC_MIRROR:
urls.append(build_url(opts.debsec_mirror, package, version)) urls.append(dsc_url(opts.debsec_mirror, 'main', package, version))
urls.append(build_url(DEFAULT_DEBSEC_MIRROR, package, version)) urls.append(dsc_url(DEFAULT_DEBSEC_MIRROR, 'main', package, version))
if opts.debian_mirror and opts.debian_mirror != DEFAULT_DEBIAN_MIRROR: if opts.debian_mirror and opts.debian_mirror != DEFAULT_DEBIAN_MIRROR:
urls.append(build_url(opts.debian_mirror, package, version)) urls.append(dsc_url(opts.debian_mirror, 'main', package, version))
urls.append(build_url(DEFAULT_DEBIAN_MIRROR, package, version)) urls.append(dsc_url(DEFAULT_DEBIAN_MIRROR, 'main', package, version))
for url in urls: for url in urls:
cmd = ('dget', '-u' + 'x' if unpack else 'd', url) cmd = ('dget', '-u' + 'x' if unpack else 'd', url)

View File

@ -3,10 +3,8 @@
# pull-lp-source -- pull a source package from Launchpad # pull-lp-source -- pull a source package from Launchpad
# Basic usage: pull-lp-source <source package> [<release>] # Basic usage: pull-lp-source <source package> [<release>]
# #
# Copyright (C) 2008 Iain Lane <iain@orangesquash.org.uk> # Copyright (C) 2008, Iain Lane <iain@orangesquash.org.uk>,
# # 2010, Stefano Rivera <stefanor@ubuntu.com>
# BackportFromLP class taken from prevu tool, which is:
# Copyright (C) 2006 John Dong <jdong@ubuntu.com>
# #
# ################################################################## # ##################################################################
# #
@ -31,25 +29,36 @@ import subprocess
import urllib import urllib
from optparse import OptionParser from optparse import OptionParser
# ubuntu-dev-tools modules. from ubuntutools.config import UDTConfig
from ubuntutools.logger import Logger
from ubuntutools.lp.lpapicache import Distribution, Launchpad from ubuntutools.lp.lpapicache import Distribution, Launchpad
from ubuntutools.lp.udtexceptions import (SeriesNotFoundException, from ubuntutools.lp.udtexceptions import (SeriesNotFoundException,
PackageNotFoundException, PocketDoesNotExistError) PackageNotFoundException, PocketDoesNotExistError)
from ubuntutools.misc import splitReleasePocket from ubuntutools.misc import splitReleasePocket, dsc_name, dsc_url
if not os.path.exists("/usr/bin/dget"): if not os.path.exists("/usr/bin/dget"):
print "E: dget is not installed - please install the 'devscripts' package" \ print ("E: dget is not installed - please install the 'devscripts' package"
" and rerun this script again." " and rerun this script again.")
sys.exit(1) sys.exit(1)
if __name__ == '__main__': if __name__ == '__main__':
usage = "Usage: %prog <package> [release]" usage = "Usage: %prog <package> [release]"
optParser = OptionParser(usage) optParser = OptionParser(usage)
optParser.add_option('-m', '--mirror', metavar='UBUNTU_MIRROR',
dest='ubuntu_mirror',
help='Preferred Ubuntu mirror '
'(default: Launchpad)')
optParser.add_option('--no-conf',
dest='no_conf', default=False, action='store_true',
help="Don't read config files or environment "
"variables")
(options, args) = optParser.parse_args() (options, args) = optParser.parse_args()
if not args: if not args:
optParser.print_help() optParser.error("Must specify package name")
sys.exit(1)
config = UDTConfig(options.no_conf)
if options.ubuntu_mirror is None:
options.ubuntu_mirror = config.get_value('UBUNTU_MIRROR')
# Login anonymously to LP # Login anonymously to LP
Launchpad.login_anonymously() Launchpad.login_anonymously()
@ -73,6 +82,16 @@ if __name__ == '__main__':
print 'E: %s' % e print 'E: %s' % e
sys.exit(1) sys.exit(1)
if options.ubuntu_mirror:
url = dsc_url(options.ubuntu_mirror, spph.getComponent(), package,
spph.getVersion())
cmd = ('dget', '-xu', url)
Logger.command(cmd)
r = subprocess.call(cmd)
if r == 0:
Logger.normal("Success!")
sys.exit(0)
dsc_url = [url for url in spph.sourceFileUrls() if url.endswith('.dsc')] dsc_url = [url for url in spph.sourceFileUrls() if url.endswith('.dsc')]
assert dsc_url, 'No .dsc file found' assert dsc_url, 'No .dsc file found'

View File

@ -1,8 +1,9 @@
# #
# misc.py - misc functions for the Ubuntu Developer Tools scripts. # misc.py - misc functions for the Ubuntu Developer Tools scripts.
# #
# Copyright (C) 2008 Jonathan Davies <jpds@ubuntu.com> # Copyright (C) 2008, Jonathan Davies <jpds@ubuntu.com>,
# Copyright (C) 2008-2009 Siegfried-Angel Gevatter Pujals <rainct@ubuntu.com> # 2008-2009, Siegfried-Angel Gevatter Pujals <rainct@ubuntu.com>,
# 2010, Stefano Rivera <stefanor@ubuntu.com>
# #
# ################################################################## # ##################################################################
# #
@ -22,6 +23,7 @@
# Modules. # Modules.
import os import os
import os.path
from subprocess import Popen, PIPE from subprocess import Popen, PIPE
from ubuntutools.lp.udtexceptions import PocketDoesNotExistError from ubuntutools.lp.udtexceptions import PocketDoesNotExistError
@ -116,3 +118,15 @@ def splitReleasePocket(release):
pocket) pocket)
return (release, pocket) return (release, pocket)
def dsc_name(package, version):
"Return the source package dsc filename for the given package"
if ':' in version:
version = version.split(':', 1)[1]
return '%s_%s.dsc' % (package, version)
def dsc_url(mirror, component, package, version):
"Build a source package URL"
group = package[:4] if package.startswith('lib') else package[0]
fn = dsc_name(package, version)
return os.path.join(mirror, 'pool', component, group, package, fn)