mirror of
https://git.launchpad.net/ubuntu-dev-tools
synced 2025-03-13 08:01:09 +00:00
* pbuilder-dist:
- Refactor to use subprocess.popen instead of os.system (LP: #398974) - Catch OSErrors when creating directories (LP: #671067) - Set HOME so pbuilder reads .pbuilderrc - Add bidirectional workarounds for LP: #599695 (pbuilder uses the host apt keyring). Complain if the target's keyring isn't installed. * Use dpkg-vendor in ubuntutools.misc.system_distribution(), cache result.
This commit is contained in:
commit
84e2835686
9
debian/changelog
vendored
9
debian/changelog
vendored
@ -13,6 +13,13 @@ ubuntu-dev-tools (0.107) UNRELEASED; urgency=low
|
|||||||
- Add --sort-binary-packages and --keep-first (LP: #681119)
|
- Add --sort-binary-packages and --keep-first (LP: #681119)
|
||||||
* grab-merge, syncpackage: Export DEB_VENDOR=Ubuntu when unpacking source
|
* grab-merge, syncpackage: Export DEB_VENDOR=Ubuntu when unpacking source
|
||||||
packages. 3.0 (quilt) has optional per-vendor patch series.
|
packages. 3.0 (quilt) has optional per-vendor patch series.
|
||||||
|
* pbuilder-dist:
|
||||||
|
- Refactor to use subprocess.popen instead of os.system (LP: #398974)
|
||||||
|
- Catch OSErrors when creating directories (LP: #671067)
|
||||||
|
- Set HOME so pbuilder reads .pbuilderrc
|
||||||
|
- Add bidirectional workarounds for LP: #599695 (pbuilder uses the host
|
||||||
|
apt keyring). Complain if the target's keyring isn't installed.
|
||||||
|
* Use dpkg-vendor in ubuntutools.misc.system_distribution(), cache result.
|
||||||
|
|
||||||
[ Benjamin Drung ]
|
[ Benjamin Drung ]
|
||||||
* wrap-and-sort: Remove duplicate items from sorted lists.
|
* wrap-and-sort: Remove duplicate items from sorted lists.
|
||||||
@ -27,7 +34,7 @@ ubuntu-dev-tools (0.107) UNRELEASED; urgency=low
|
|||||||
* submittodebian: Encourage sending multiple independent pieces of the
|
* submittodebian: Encourage sending multiple independent pieces of the
|
||||||
Ubuntu patch in separate bug reports.
|
Ubuntu patch in separate bug reports.
|
||||||
|
|
||||||
-- Daniel Holbach <daniel.holbach@ubuntu.com> Tue, 30 Nov 2010 11:55:24 +0100
|
-- Stefano Rivera <stefanor@ubuntu.com> Thu, 02 Dec 2010 09:36:48 +0200
|
||||||
|
|
||||||
ubuntu-dev-tools (0.106) experimental; urgency=low
|
ubuntu-dev-tools (0.106) experimental; urgency=low
|
||||||
|
|
||||||
|
261
pbuilder-dist
261
pbuilder-dist
@ -2,7 +2,8 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 2007-2010 Siegfried-A. Gevatter <rainct@ubuntu.com>
|
# Copyright (C) 2007-2010 Siegfried-A. Gevatter <rainct@ubuntu.com>
|
||||||
# With some changes by Iain Lane <iain@orangesquash.org.uk>
|
# With some changes by Iain Lane <iain@orangesquash.org.uk>,
|
||||||
|
# Stefano Rivera <stefanor@ubuntu.com>
|
||||||
# Based upon pbuilder-dist-simple by Jamin Collins and Jordan Mantha.
|
# Based upon pbuilder-dist-simple by Jamin Collins and Jordan Mantha.
|
||||||
#
|
#
|
||||||
# ##################################################################
|
# ##################################################################
|
||||||
@ -17,7 +18,7 @@
|
|||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# See file /usr/share/common-licenses/GPL for more details.
|
# See file /usr/share/common-licenses/GPL-2 for more details.
|
||||||
#
|
#
|
||||||
# ##################################################################
|
# ##################################################################
|
||||||
#
|
#
|
||||||
@ -28,18 +29,17 @@
|
|||||||
# configurations. For example, a symlink called pbuilder-hardy will assume
|
# configurations. For example, a symlink called pbuilder-hardy will assume
|
||||||
# that the target distribution is always meant to be Ubuntu Hardy.
|
# that the target distribution is always meant to be Ubuntu Hardy.
|
||||||
|
|
||||||
import sys
|
|
||||||
import os
|
import os
|
||||||
|
import subprocess
|
||||||
|
from sys import exit, argv, stderr
|
||||||
|
|
||||||
import ubuntutools.misc
|
import ubuntutools.misc
|
||||||
|
|
||||||
debian_distros = ['etch', 'lenny', 'squeeze', 'sid', 'stable', \
|
debian_distros = ['etch', 'lenny', 'squeeze', 'sid', 'stable', 'testing',
|
||||||
'testing', 'unstable', 'experimental']
|
'unstable', 'experimental']
|
||||||
|
|
||||||
class pbuilder_dist:
|
class pbuilder_dist:
|
||||||
|
|
||||||
def __init__(self, builder):
|
def __init__(self, builder):
|
||||||
|
|
||||||
# Base directory where pbuilder will put all the files it creates.
|
# Base directory where pbuilder will put all the files it creates.
|
||||||
self.base = None
|
self.base = None
|
||||||
|
|
||||||
@ -77,20 +77,24 @@ class pbuilder_dist:
|
|||||||
self.builder = builder
|
self.builder = builder
|
||||||
|
|
||||||
# Ensure that the used builder is installed
|
# Ensure that the used builder is installed
|
||||||
for file in os.environ['PATH'].split(':'):
|
paths = set(os.environ['PATH'].split(':'))
|
||||||
if os.path.exists(os.path.join(file, builder)):
|
paths |= set(('/sbin', '/usr/sbin', '/usr/local/sbin'))
|
||||||
builder = ''
|
if not any(os.path.exists(os.path.join(p, builder)) for p in paths):
|
||||||
break
|
print >> stderr, 'Error: Could not find "%s".' % builder
|
||||||
if builder:
|
exit(1)
|
||||||
print 'Error: Could not find "%s".' % builder
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
self.base = os.path.expanduser(os.environ.get('PBUILDFOLDER', '~/pbuilder/'))
|
self.base = os.path.expanduser(os.environ.get('PBUILDFOLDER',
|
||||||
|
'~/pbuilder/'))
|
||||||
|
|
||||||
if not os.path.exists(self.base):
|
if not os.path.isdir(self.base):
|
||||||
|
try:
|
||||||
os.makedirs(self.base)
|
os.makedirs(self.base)
|
||||||
|
except os.OSError:
|
||||||
|
print >> stderr, ('Error: Cannot create base directory "%s"'
|
||||||
|
% self.base)
|
||||||
|
exit(1)
|
||||||
|
|
||||||
if 'PBUILDAUTH' in os.environ:
|
if 'PBUILDAUTH' in os.environ:
|
||||||
self.auth = os.environ['PBUILDAUTH']
|
self.auth = os.environ['PBUILDAUTH']
|
||||||
@ -102,12 +106,6 @@ class pbuilder_dist:
|
|||||||
|
|
||||||
self.target_distro = self.system_distro
|
self.target_distro = self.system_distro
|
||||||
|
|
||||||
##############################################################
|
|
||||||
|
|
||||||
def __getitem__(self, name):
|
|
||||||
|
|
||||||
return getattr(self, name)
|
|
||||||
|
|
||||||
def set_target_distro(self, distro):
|
def set_target_distro(self, distro):
|
||||||
""" pbuilder_dist.set_target_distro(distro) -> None
|
""" pbuilder_dist.set_target_distro(distro) -> None
|
||||||
|
|
||||||
@ -115,25 +113,25 @@ class pbuilder_dist:
|
|||||||
isn't know to the system ask the user for confirmation before
|
isn't know to the system ask the user for confirmation before
|
||||||
proceeding, and finally either save the value into the appropiate
|
proceeding, and finally either save the value into the appropiate
|
||||||
variable or finalize pbuilder-dist's execution.
|
variable or finalize pbuilder-dist's execution.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not distro.isalpha():
|
if not distro.isalpha():
|
||||||
print 'Error: «%s» is an invalid distribution codename.' % distro
|
print >> stderr, ('Error: "%s" is an invalid distribution codename.'
|
||||||
sys.exit(1)
|
% distro)
|
||||||
|
exit(1)
|
||||||
|
|
||||||
if not os.path.isfile(os.path.join('/usr/share/debootstrap/scripts/', distro)):
|
if not os.path.isfile(os.path.join('/usr/share/debootstrap/scripts/',
|
||||||
|
distro)):
|
||||||
if os.path.isdir('/usr/share/debootstrap/scripts/'):
|
if os.path.isdir('/usr/share/debootstrap/scripts/'):
|
||||||
# Debian experimental doesn't have a debootstrap file but
|
# Debian experimental doesn't have a debootstrap file but
|
||||||
# should work nevertheless.
|
# should work nevertheless.
|
||||||
if distro not in debian_distros:
|
if distro not in debian_distros:
|
||||||
answer = ask('Warning: Unknown distribution «%s». Do you ' \
|
answer = ask(('Warning: Unknown distribution "%s". Do you '
|
||||||
'want to continue [y/N]? ' % distro)
|
'want to continue [y/N]? ') % distro)
|
||||||
if answer not in ('y', 'Y'):
|
if answer not in ('y', 'Y'):
|
||||||
sys.exit(0)
|
exit(0)
|
||||||
else:
|
else:
|
||||||
print 'Please install package "debootstrap".'
|
print >> stderr, 'Please install package "debootstrap".'
|
||||||
sys.exit(1)
|
exit(1)
|
||||||
|
|
||||||
self.target_distro = distro
|
self.target_distro = distro
|
||||||
|
|
||||||
@ -143,9 +141,7 @@ class pbuilder_dist:
|
|||||||
Check if the given string is a valid pbuilder operation and
|
Check if the given string is a valid pbuilder operation and
|
||||||
depending on this either save it into the appropiate variable
|
depending on this either save it into the appropiate variable
|
||||||
or finalize pbuilder-dist's execution.
|
or finalize pbuilder-dist's execution.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
arguments = ('create', 'update', 'build', 'clean', 'login', 'execute')
|
arguments = ('create', 'update', 'build', 'clean', 'login', 'execute')
|
||||||
|
|
||||||
if operation not in arguments:
|
if operation not in arguments:
|
||||||
@ -154,12 +150,15 @@ class pbuilder_dist:
|
|||||||
self.operation = 'build'
|
self.operation = 'build'
|
||||||
return [operation]
|
return [operation]
|
||||||
else:
|
else:
|
||||||
print 'Error: Could not find file «%s».' % operation
|
print >> stderr, ('Error: Could not find file "%s".'
|
||||||
sys.exit(1)
|
% operation)
|
||||||
|
exit(1)
|
||||||
else:
|
else:
|
||||||
print 'Error: «%s» is not a recognized argument.' % operation
|
print >> stderr, (
|
||||||
print 'Please use one of those: ' + ', '.join(arguments) + '.'
|
'Error: "%s" is not a recognized argument.\n'
|
||||||
sys.exit(1)
|
'Please use one of these: %s.'
|
||||||
|
) % (operation, ', '.join(arguments))
|
||||||
|
exit(1)
|
||||||
else:
|
else:
|
||||||
self.operation = operation
|
self.operation = operation
|
||||||
return []
|
return []
|
||||||
@ -169,14 +168,13 @@ class pbuilder_dist:
|
|||||||
|
|
||||||
Generate the pbuilder command which matches the given configuration
|
Generate the pbuilder command which matches the given configuration
|
||||||
and return it as a string.
|
and return it as a string.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not self.build_architecture:
|
if not self.build_architecture:
|
||||||
self.chroot_string = self.target_distro
|
self.chroot_string = self.target_distro
|
||||||
self.build_architecture = self.system_architecture
|
self.build_architecture = self.system_architecture
|
||||||
else:
|
else:
|
||||||
self.chroot_string = '%(target_distro)s-%(build_architecture)s' % self
|
self.chroot_string = (self.target_distro + '-'
|
||||||
|
+ self.build_architecture)
|
||||||
|
|
||||||
prefix = os.path.join(self.base, self.chroot_string)
|
prefix = os.path.join(self.base, self.chroot_string)
|
||||||
result = '%s_result/' % prefix
|
result = '%s_result/' % prefix
|
||||||
@ -185,87 +183,108 @@ class pbuilder_dist:
|
|||||||
self.logfile = os.path.normpath('%s/last_operation.log' % result)
|
self.logfile = os.path.normpath('%s/last_operation.log' % result)
|
||||||
|
|
||||||
if not os.path.isdir(result):
|
if not os.path.isdir(result):
|
||||||
# Create the results directory, if it doesn't exist.
|
try:
|
||||||
os.makedirs(result)
|
os.makedirs(result)
|
||||||
|
except os.OSError:
|
||||||
if self.builder == 'pbuilder':
|
print >> stderr, ('Error: Cannot create results directory "%s"'
|
||||||
base = '--basetgz "%s-base.tgz"' % prefix
|
% result)
|
||||||
elif self.builder == 'cowbuilder':
|
exit(1)
|
||||||
base = '--basepath "%s-base.cow"' % prefix
|
|
||||||
else:
|
|
||||||
print 'Error: Unrecognized builder "%s".' % self.builder
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
arguments = [
|
arguments = [
|
||||||
'--%s' % self.operation,
|
'--%s' % self.operation,
|
||||||
base,
|
'--distribution', self.target_distro,
|
||||||
'--distribution "%(target_distro)s"' % self,
|
'--buildresult', result,
|
||||||
'--buildresult "%s"' % result,
|
'--aptcache', '/var/cache/apt/archives/',
|
||||||
'--aptcache "/var/cache/apt/archives/"',
|
|
||||||
'--override-config',
|
'--override-config',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if self.builder == 'pbuilder':
|
||||||
|
arguments += ['--basetgz', prefix + '-base.tgz']
|
||||||
|
elif self.builder == 'cowbuilder':
|
||||||
|
arguments += ['--basepath', prefix + '-base.cow']
|
||||||
|
else:
|
||||||
|
print >> stderr, 'Error: Unrecognized builder "%s".' % self.builder
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
|
||||||
if self.logfile:
|
if self.logfile:
|
||||||
arguments.append('--logfile %s' % self.logfile)
|
arguments += ['--logfile', self.logfile]
|
||||||
|
|
||||||
if os.path.exists('/var/cache/archive/'):
|
if os.path.exists('/var/cache/archive/'):
|
||||||
arguments.append('--bindmounts "/var/cache/archive/"')
|
arguments += ['--bindmounts', '/var/cache/archive/']
|
||||||
|
|
||||||
localrepo = '/var/cache/archive/%(target_distro)s' % self
|
localrepo = '/var/cache/archive/' + self.target_distro
|
||||||
if os.path.exists(localrepo):
|
if os.path.exists(localrepo):
|
||||||
arguments.append('--othermirror ' +\
|
arguments += [
|
||||||
'"deb file:///var/cache/archive/ %(target_distro)s/"' % self)
|
'--othermirror ',
|
||||||
|
'deb file:///var/cache/archive/ %s/' % self.target_distro,
|
||||||
|
]
|
||||||
|
|
||||||
if self.target_distro in debian_distros:
|
if self.target_distro in debian_distros:
|
||||||
arguments.append('--mirror "ftp://ftp.debian.org/debian"')
|
arguments += ['--mirror', 'http://ftp.debian.org/debian']
|
||||||
# work around bug #599695
|
|
||||||
arguments.append('--debootstrapopts --keyring=/usr/share/keyrings/debian-archive-keyring.gpg')
|
|
||||||
components = 'main'
|
components = 'main'
|
||||||
if self.extra_components:
|
if self.extra_components:
|
||||||
components += ' contrib non-free'
|
components += ' contrib non-free'
|
||||||
else:
|
else:
|
||||||
if self.build_architecture in ('amd64', 'i386'):
|
if self.build_architecture in ('amd64', 'i386'):
|
||||||
arguments.append('--mirror "http://archive.ubuntu.com/ubuntu/"')
|
arguments += ['--mirror', 'http://archive.ubuntu.com/ubuntu/']
|
||||||
elif self.build_architecture == 'powerpc' and self.target_distro == 'dapper':
|
elif (self.build_architecture == 'powerpc'
|
||||||
arguments.append('--mirror "http://archive.ubuntu.com/ubuntu/"')
|
and self.target_distro == 'dapper'):
|
||||||
|
arguments += ['--mirror', 'http://archive.ubuntu.com/ubuntu/']
|
||||||
else:
|
else:
|
||||||
arguments.append('--mirror "http://ports.ubuntu.com/ubuntu-ports/"')
|
arguments += ['--mirror',
|
||||||
|
'http://ports.ubuntu.com/ubuntu-ports/']
|
||||||
components = 'main restricted'
|
components = 'main restricted'
|
||||||
if self.extra_components:
|
if self.extra_components:
|
||||||
components += ' universe multiverse'
|
components += ' universe multiverse'
|
||||||
|
|
||||||
arguments.append('--components "%s"' % components)
|
# Work around LP:#599695
|
||||||
|
if (ubuntutools.misc.system_distribution() == 'Debian'
|
||||||
|
and self.target_distro not in debian_distros):
|
||||||
|
if not os.path.exists(
|
||||||
|
'/usr/share/keyrings/ubuntu-archive-keyring.gpg'):
|
||||||
|
print >> stderr, 'Error: ubuntu-keyring not installed'
|
||||||
|
exit(1)
|
||||||
|
arguments += [
|
||||||
|
'--debootstrapopts',
|
||||||
|
'--keyring=/usr/share/keyrings/ubuntu-archive-keyring.gpg',
|
||||||
|
]
|
||||||
|
elif (ubuntutools.misc.system_distribution() == 'Ubuntu'
|
||||||
|
and self.target_distro in debian_distros):
|
||||||
|
if not os.path.exists(
|
||||||
|
'/usr/share/keyrings/debian-archive-keyring.gpg'):
|
||||||
|
print >> stderr, 'Error: debian-archive-keyring not installed'
|
||||||
|
exit(1)
|
||||||
|
arguments += [
|
||||||
|
'--debootstrapopts',
|
||||||
|
'--keyring=/usr/share/keyrings/debian-archive-keyring.gpg',
|
||||||
|
]
|
||||||
|
|
||||||
|
arguments += ['--components', components]
|
||||||
|
|
||||||
if self.build_architecture != self.system_architecture:
|
if self.build_architecture != self.system_architecture:
|
||||||
arguments.append('--debootstrapopts --arch="%(build_architecture)s"' % self)
|
arguments += ['--debootstrapopts',
|
||||||
|
'--arch=' + self.build_architecture]
|
||||||
|
|
||||||
apt_conf_dir = os.path.join(self.base, 'etc/%(target_distro)s/apt.conf' % self)
|
apt_conf_dir = os.path.join(self.base,
|
||||||
|
'etc/%s/apt.conf' % self.target_distro)
|
||||||
if os.path.exists(apt_conf_dir):
|
if os.path.exists(apt_conf_dir):
|
||||||
arguments.append('--aptconfdir "%s"' % apt_conf_dir)
|
arguments += ['--aptconfdir', apt_conf_dir]
|
||||||
|
|
||||||
# Append remaining arguments
|
# Append remaining arguments
|
||||||
if remaining_arguments:
|
if remaining_arguments:
|
||||||
arguments.extend(remaining_arguments)
|
arguments.extend(remaining_arguments)
|
||||||
|
|
||||||
def quote(argument):
|
|
||||||
""" quote(argument) -> string
|
|
||||||
|
|
||||||
Try to guess any missing quotes around the arguments so that
|
|
||||||
their meaning doesn't get lost (see LP: #398989).
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
if argument.startswith('--'):
|
|
||||||
if '=' in argument:
|
|
||||||
return '%s="%s"' % tuple(argument.split('=', 1))
|
|
||||||
return argument
|
|
||||||
return '"%s"' % argument
|
|
||||||
|
|
||||||
# Export the distribution and architecture information to the
|
# Export the distribution and architecture information to the
|
||||||
# environment so that it is accessible to ~/.pbuilderrc (LP: #628933).
|
# environment so that it is accessible to ~/.pbuilderrc (LP: #628933).
|
||||||
return '%s ARCH="%s" DIST="%s" /usr/sbin/%s %s' % (self.auth,
|
return [
|
||||||
self.build_architecture, self.target_distro, self.builder,
|
self.auth,
|
||||||
' '.join(map(quote, arguments)))
|
'HOME=' + os.path.expanduser('~'),
|
||||||
|
'ARCH=' + self.build_architecture,
|
||||||
|
'DIST=' + self.target_distro,
|
||||||
|
self.builder,
|
||||||
|
] + arguments
|
||||||
|
|
||||||
|
|
||||||
def ask(question):
|
def ask(question):
|
||||||
""" ask(question) -> string
|
""" ask(question) -> string
|
||||||
@ -273,9 +292,7 @@ def ask(question):
|
|||||||
Ask the given question and return the answer. Also catch
|
Ask the given question and return the answer. Also catch
|
||||||
KeyboardInterrupt (Ctrl+C) and EOFError (Ctrl+D) exceptions and
|
KeyboardInterrupt (Ctrl+C) and EOFError (Ctrl+D) exceptions and
|
||||||
immediately return None if one of those is found.
|
immediately return None if one of those is found.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
answer = raw_input(question)
|
answer = raw_input(question)
|
||||||
except (KeyboardInterrupt, EOFError):
|
except (KeyboardInterrupt, EOFError):
|
||||||
@ -288,12 +305,10 @@ def help(exit_code = 0):
|
|||||||
""" help() -> None
|
""" help() -> None
|
||||||
|
|
||||||
Print a help message for pbuilder-dist, and exit with the given code.
|
Print a help message for pbuilder-dist, and exit with the given code.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
print 'See man pbuilder-dist for more information.'
|
print 'See man pbuilder-dist for more information.'
|
||||||
|
|
||||||
sys.exit(exit_code)
|
exit(exit_code)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
""" main() -> None
|
""" main() -> None
|
||||||
@ -302,22 +317,21 @@ def main():
|
|||||||
object, modifies all necessary settings taking data from the
|
object, modifies all necessary settings taking data from the
|
||||||
executable's name and command line options and finally either ends
|
executable's name and command line options and finally either ends
|
||||||
the script and runs pbuilder itself or exists with an error message.
|
the script and runs pbuilder itself or exists with an error message.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
script_name = os.path.basename(argv[0])
|
||||||
script_name = os.path.basename(sys.argv[0])
|
|
||||||
parts = script_name.split('-')
|
parts = script_name.split('-')
|
||||||
|
|
||||||
# Copy arguments into another list for save manipulation
|
# Copy arguments into another list for save manipulation
|
||||||
args = sys.argv[1:]
|
args = argv[1:]
|
||||||
|
|
||||||
if '-' in script_name and (parts[0] != 'pbuilder' and \
|
if ('-' in script_name and parts[0] not in ('pbuilder', 'cowbuilder')
|
||||||
parts[0] != 'cowbuilder') or len(parts) > 3:
|
or len(parts) > 3):
|
||||||
print 'Error: «%s» is not a valid name for a «pbuilder-dist» executable.' % script_name
|
print >> stderr, ('Error: "%s" is not a valid name for a '
|
||||||
sys.exit(1)
|
'"pbuilder-dist" executable.') % script_name
|
||||||
|
exit(1)
|
||||||
|
|
||||||
if len(args) < 1:
|
if len(args) < 1:
|
||||||
print 'Insufficient number of arguments.'
|
print >> stderr, 'Insufficient number of arguments.'
|
||||||
help(1)
|
help(1)
|
||||||
|
|
||||||
if args[0] in ('-h', '--help', 'help'):
|
if args[0] in ('-h', '--help', 'help'):
|
||||||
@ -332,9 +346,10 @@ def main():
|
|||||||
|
|
||||||
if len(parts) > 2:
|
if len(parts) > 2:
|
||||||
requested_arch = parts[2]
|
requested_arch = parts[2]
|
||||||
elif len(args) > 0 and args[0] in ("alpha", "amd64", "arm", "armeb",
|
elif len(args) > 0 and args[0] in (
|
||||||
"armel", "i386", "lpia", "m68k", "mips", "mipsel", "powerpc", "ppc64",
|
'alpha', 'amd64', 'arm', 'armeb', 'armel', 'i386', 'lpia', 'm68k',
|
||||||
"sh4", "sh4eb", "sparc", "sparc64"):
|
'mips', 'mipsel', 'powerpc', 'ppc64', 'sh4', 'sh4eb', 'sparc',
|
||||||
|
'sparc64'):
|
||||||
requested_arch = args.pop(0)
|
requested_arch = args.pop(0)
|
||||||
else:
|
else:
|
||||||
requested_arch = None
|
requested_arch = None
|
||||||
@ -342,42 +357,42 @@ def main():
|
|||||||
if requested_arch:
|
if requested_arch:
|
||||||
app.build_architecture = requested_arch
|
app.build_architecture = requested_arch
|
||||||
# For some foreign architectures we need to use qemu
|
# For some foreign architectures we need to use qemu
|
||||||
if requested_arch != app.system_architecture and (app.system_architecture,
|
if (requested_arch != app.system_architecture
|
||||||
requested_arch) not in [("amd64", "i386"), ("amd64", "lpia"),
|
and (app.system_architecture, requested_arch) not in [
|
||||||
("arm", "armel"), ("armel", "arm"), ("i386", "lpia"), ("lpia", "i386"),
|
('amd64', 'i386'), ('amd64', 'lpia'), ('arm', 'armel'),
|
||||||
("powerpc", "ppc64"), ("ppc64", "powerpc"), ("sparc", "sparc64"),
|
('armel', 'arm'), ('i386', 'lpia'), ('lpia', 'i386'),
|
||||||
("sparc64", "sparc")]:
|
('powerpc', 'ppc64'), ('ppc64', 'powerpc'),
|
||||||
args.append('--debootstrap qemu-debootstrap')
|
('sparc', 'sparc64'), ('sparc64', 'sparc')]):
|
||||||
|
args += ['--debootstrap', 'qemu-debootstrap']
|
||||||
|
|
||||||
if 'mainonly' in sys.argv or '--main-only' in sys.argv:
|
if 'mainonly' in argv or '--main-only' in argv:
|
||||||
app.extra_components = False
|
app.extra_components = False
|
||||||
if 'mainonly' in sys.argv:
|
if 'mainonly' in argv:
|
||||||
args.remove('mainonly')
|
args.remove('mainonly')
|
||||||
else:
|
else:
|
||||||
args.remove('--main-only')
|
args.remove('--main-only')
|
||||||
|
|
||||||
if len(args) < 1:
|
if len(args) < 1:
|
||||||
print 'Insufficient number of arguments.'
|
print >> stderr, 'Insufficient number of arguments.'
|
||||||
help(1)
|
help(1)
|
||||||
|
|
||||||
# Parse the operation
|
# Parse the operation
|
||||||
args = app.set_operation(args.pop(0)) + args
|
args = app.set_operation(args.pop(0)) + args
|
||||||
|
|
||||||
if app.operation == 'build' and not '.dsc' in ' '.join(args):
|
if app.operation == 'build' and '.dsc' not in ' '.join(args):
|
||||||
print 'Error: You have to specify a .dsc file if you want to build.'
|
print >> stderr, ('Error: You have to specify a .dsc file if you want '
|
||||||
sys.exit(1)
|
'to build.')
|
||||||
|
exit(1)
|
||||||
|
|
||||||
# Execute the pbuilder command
|
# Execute the pbuilder command
|
||||||
if not '--debug-echo' in args:
|
if not '--debug-echo' in args:
|
||||||
sys.exit(os.system(app.get_command(args)))
|
exit(subprocess.call(app.get_command(args)))
|
||||||
else:
|
else:
|
||||||
print app.get_command((args)).replace(
|
print app.get_command([arg for arg in args if arg != '--debug-echo'])
|
||||||
' --debug-echo', '')
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
||||||
try:
|
try:
|
||||||
main()
|
main()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
print 'Manually aborted.'
|
print >> stderr, 'Manually aborted.'
|
||||||
sys.exit(1)
|
exit(1)
|
||||||
|
@ -26,36 +26,36 @@ from subprocess import Popen, PIPE
|
|||||||
|
|
||||||
from ubuntutools.lp.udtexceptions import PocketDoesNotExistError
|
from ubuntutools.lp.udtexceptions import PocketDoesNotExistError
|
||||||
|
|
||||||
|
_system_distribution = None
|
||||||
def system_distribution():
|
def system_distribution():
|
||||||
""" system_distro() -> string
|
""" system_distro() -> string
|
||||||
|
|
||||||
Detect the system's distribution and return it as a string. If the
|
Detect the system's distribution and return it as a string. If the
|
||||||
name of the distribution can't be determined, print an error message
|
name of the distribution can't be determined, print an error message
|
||||||
and return None.
|
and return None.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
# We try to avoid calling the "lsb_release" as looking up the value
|
global _system_distribution
|
||||||
# directly is faster. However, Debian doesn't have /etc/lsb-release
|
if _system_distribution is None:
|
||||||
# so we need to fallback to the former there.
|
try:
|
||||||
if os.path.isfile('/etc/lsb-release'):
|
if os.path.isfile('/usr/bin/dpkg-vendor'):
|
||||||
for line in open('/etc/lsb-release'):
|
p = Popen(('dpkg-vendor', '--query', 'vendor'), stdout=PIPE)
|
||||||
line = line.strip()
|
|
||||||
if line.startswith('DISTRIB_CODENAME'):
|
|
||||||
return line[17:]
|
|
||||||
else:
|
else:
|
||||||
import commands
|
p = Popen(('lsb_release', '-cs'), stdout=PIPE)
|
||||||
output = commands.getoutput('lsb_release -cs')
|
output = p.communicate()[0]
|
||||||
if output:
|
except OSError:
|
||||||
return output
|
|
||||||
print 'Error: Could not determine what distribution you are running.'
|
print 'Error: Could not determine what distribution you are running.'
|
||||||
return None
|
return None
|
||||||
|
if p.returncode != 0:
|
||||||
|
print 'Error determininng system distribution'
|
||||||
|
return None
|
||||||
|
_system_distribution = output.strip()
|
||||||
|
return _system_distribution
|
||||||
|
|
||||||
def host_architecture():
|
def host_architecture():
|
||||||
""" host_architecture -> string
|
""" host_architecture -> string
|
||||||
|
|
||||||
Detect the host's architecture and return it as a string. If the
|
Detect the host's architecture and return it as a string. If the
|
||||||
architecture can't be determined, print an error message and return None.
|
architecture can't be determined, print an error message and return None.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
arch = Popen(['dpkg', '--print-architecture'], stdout=PIPE, \
|
arch = Popen(['dpkg', '--print-architecture'], stdout=PIPE, \
|
||||||
@ -73,7 +73,6 @@ def readlist(filename, uniq=True):
|
|||||||
|
|
||||||
Read a list of words from the indicated file. If 'uniq' is True, filter
|
Read a list of words from the indicated file. If 'uniq' is True, filter
|
||||||
out duplicated words.
|
out duplicated words.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not os.path.isfile(filename):
|
if not os.path.isfile(filename):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user