mirror of
https://git.launchpad.net/ubuntu-dev-tools
synced 2025-03-12 23:51:08 +00:00
Whitespace -> PEP-8
This commit is contained in:
parent
04eb3ada8b
commit
b78b21f43e
684
pbuilder-dist
684
pbuilder-dist
@ -12,12 +12,12 @@
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
#
|
||||
# See file /usr/share/common-licenses/GPL for more details.
|
||||
#
|
||||
# ##################################################################
|
||||
@ -35,351 +35,363 @@ from sys import exit, argv, stderr
|
||||
|
||||
import ubuntutools.misc
|
||||
|
||||
debian_distros = ['etch', 'lenny', 'squeeze', 'sid', 'stable', \
|
||||
'testing', 'unstable', 'experimental']
|
||||
debian_distros = ['etch', 'lenny', 'squeeze', 'sid', 'stable', 'testing',
|
||||
'unstable', 'experimental']
|
||||
|
||||
class pbuilder_dist:
|
||||
|
||||
def __init__(self, builder):
|
||||
|
||||
# Base directory where pbuilder will put all the files it creates.
|
||||
self.base = None
|
||||
|
||||
# Name of the operation which pbuilder should perform.
|
||||
self.operation = None
|
||||
|
||||
# Wheter additional components should be used or not. That is,
|
||||
# 'universe' and 'multiverse' for Ubuntu chroots and 'contrib'
|
||||
# and 'non-free' for Debian.
|
||||
self.extra_components = True
|
||||
|
||||
# File where the log of the last operation will be saved.
|
||||
self.logfile = None
|
||||
|
||||
# System architecture
|
||||
self.system_architecture = None
|
||||
|
||||
# Build architecture
|
||||
self.build_architecture = None
|
||||
|
||||
# System's distribution
|
||||
self.system_distro = None
|
||||
|
||||
# Target distribution
|
||||
self.target_distro = None
|
||||
|
||||
# This is an identificative string which will either take the form
|
||||
# 'distribution' or 'distribution-architecture'.
|
||||
self.chroot_string = None
|
||||
|
||||
# Authentication method
|
||||
self.auth = 'sudo'
|
||||
|
||||
# Builder
|
||||
self.builder = builder
|
||||
|
||||
# Ensure that the used builder is installed
|
||||
paths = set(os.environ['PATH'].split(':'))
|
||||
paths |= set(('/sbin', '/usr/sbin', '/usr/local/sbin'))
|
||||
if not any(os.path.exists(os.path.join(p, builder)) for p in paths):
|
||||
print >> stderr, 'Error: Could not find "%s".' % builder
|
||||
exit(1)
|
||||
|
||||
##############################################################
|
||||
|
||||
self.base = os.path.expanduser(os.environ.get('PBUILDFOLDER', '~/pbuilder/'))
|
||||
|
||||
if not os.path.isdir(self.base):
|
||||
try:
|
||||
os.makedirs(self.base)
|
||||
except os.OSError:
|
||||
print >> stderr, ('Error: Cannot create base directory "%s"'
|
||||
% self.base)
|
||||
exit(1)
|
||||
|
||||
if 'PBUILDAUTH' in os.environ:
|
||||
self.auth = os.environ['PBUILDAUTH']
|
||||
|
||||
self.system_architecture = ubuntutools.misc.host_architecture()
|
||||
self.system_distro = ubuntutools.misc.system_distribution()
|
||||
if not self.system_architecture or not self.system_distro:
|
||||
exit(1)
|
||||
|
||||
self.target_distro = self.system_distro
|
||||
|
||||
##############################################################
|
||||
|
||||
def set_target_distro(self, distro):
|
||||
""" pbuilder_dist.set_target_distro(distro) -> None
|
||||
|
||||
Check if the given target distribution name is correct, if it
|
||||
isn't know to the system ask the user for confirmation before
|
||||
proceeding, and finally either save the value into the appropiate
|
||||
variable or finalize pbuilder-dist's execution.
|
||||
|
||||
"""
|
||||
|
||||
if not distro.isalpha():
|
||||
print >> stderr, ('Error: "%s" is an invalid distribution codename.'
|
||||
% distro)
|
||||
exit(1)
|
||||
|
||||
if not os.path.isfile(os.path.join('/usr/share/debootstrap/scripts/', distro)):
|
||||
if os.path.isdir('/usr/share/debootstrap/scripts/'):
|
||||
# Debian experimental doesn't have a debootstrap file but
|
||||
# should work nevertheless.
|
||||
if distro not in debian_distros:
|
||||
answer = ask('Warning: Unknown distribution "%s". Do you ' \
|
||||
'want to continue [y/N]? ' % distro)
|
||||
if answer not in ('y', 'Y'):
|
||||
exit(0)
|
||||
else:
|
||||
print >> stderr, 'Please install package "debootstrap".'
|
||||
exit(1)
|
||||
|
||||
self.target_distro = distro
|
||||
|
||||
def set_operation(self, operation):
|
||||
""" pbuilder_dist.set_operation -> None
|
||||
|
||||
Check if the given string is a valid pbuilder operation and
|
||||
depending on this either save it into the appropiate variable
|
||||
or finalize pbuilder-dist's execution.
|
||||
|
||||
"""
|
||||
|
||||
arguments = ('create', 'update', 'build', 'clean', 'login', 'execute')
|
||||
|
||||
if operation not in arguments:
|
||||
if operation.endswith('.dsc'):
|
||||
if os.path.isfile(operation):
|
||||
self.operation = 'build'
|
||||
return [operation]
|
||||
else:
|
||||
print >> stderr, 'Error: Could not find file "%s".' % operation
|
||||
exit(1)
|
||||
else:
|
||||
print >> stderr, 'Error: "%s" is not a recognized argument.' % operation
|
||||
print >> stderr, 'Please use one of these: %s.' % ', '.join(arguments)
|
||||
exit(1)
|
||||
else:
|
||||
self.operation = operation
|
||||
return []
|
||||
|
||||
def get_command(self, remaining_arguments = None):
|
||||
""" pbuilder_dist.get_command -> string
|
||||
|
||||
Generate the pbuilder command which matches the given configuration
|
||||
and return it as a string.
|
||||
|
||||
"""
|
||||
|
||||
if not self.build_architecture:
|
||||
self.chroot_string = self.target_distro
|
||||
self.build_architecture = self.system_architecture
|
||||
else:
|
||||
self.chroot_string = self.target_distro + '-' + self.build_architecture
|
||||
|
||||
prefix = os.path.join(self.base, self.chroot_string)
|
||||
result = '%s_result/' % prefix
|
||||
|
||||
if not self.logfile and self.operation != 'login':
|
||||
self.logfile = os.path.normpath('%s/last_operation.log' % result)
|
||||
|
||||
if not os.path.isdir(result):
|
||||
try:
|
||||
os.makedirs(result)
|
||||
except os.OSError:
|
||||
print >> stderr, ('Error: Cannot create results directory "%s"'
|
||||
% result)
|
||||
exit(1)
|
||||
|
||||
if self.builder == 'pbuilder':
|
||||
base = '--basetgz "%s-base.tgz"' % prefix
|
||||
elif self.builder == 'cowbuilder':
|
||||
base = '--basepath "%s-base.cow"' % prefix
|
||||
else:
|
||||
print >> stderr, 'Error: Unrecognized builder "%s".' % self.builder
|
||||
exit(1)
|
||||
|
||||
arguments = [
|
||||
'--%s' % self.operation,
|
||||
base,
|
||||
'--distribution', self.target_distro,
|
||||
'--buildresult', result,
|
||||
'--aptcache', '/var/cache/apt/archives/',
|
||||
'--override-config',
|
||||
]
|
||||
def __init__(self, builder):
|
||||
|
||||
if self.logfile:
|
||||
arguments += ['--logfile', self.logfile]
|
||||
|
||||
if os.path.exists('/var/cache/archive/'):
|
||||
arguments += ['--bindmounts', '/var/cache/archive/']
|
||||
# Base directory where pbuilder will put all the files it creates.
|
||||
self.base = None
|
||||
|
||||
localrepo = '/var/cache/archive/' + self.target_distro
|
||||
if os.path.exists(localrepo):
|
||||
arguments += [
|
||||
'--othermirror ',
|
||||
'deb file:///var/cache/archive/ %s/' % self.target_distro,
|
||||
]
|
||||
|
||||
if self.target_distro in debian_distros:
|
||||
arguments += ['--mirror', 'http://ftp.debian.org/debian']
|
||||
# work around bug #599695
|
||||
arguments += [
|
||||
'--debootstrapopts',
|
||||
'--keyring=/usr/share/keyrings/debian-archive-keyring.gpg',
|
||||
]
|
||||
components = 'main'
|
||||
if self.extra_components:
|
||||
components += ' contrib non-free'
|
||||
else:
|
||||
if self.build_architecture in ('amd64', 'i386'):
|
||||
arguments += ['--mirror', 'http://archive.ubuntu.com/ubuntu/']
|
||||
elif self.build_architecture == 'powerpc' and self.target_distro == 'dapper':
|
||||
arguments += ['--mirror', 'http://archive.ubuntu.com/ubuntu/']
|
||||
else:
|
||||
arguments += ['--mirror',
|
||||
'http://ports.ubuntu.com/ubuntu-ports/']
|
||||
components = 'main restricted'
|
||||
if self.extra_components:
|
||||
components += ' universe multiverse'
|
||||
# Name of the operation which pbuilder should perform.
|
||||
self.operation = None
|
||||
|
||||
arguments += ['--components', components]
|
||||
|
||||
if self.build_architecture != self.system_architecture:
|
||||
arguments += ['--debootstrapopts',
|
||||
'--arch=' + self.build_architecture]
|
||||
|
||||
apt_conf_dir = os.path.join(self.base, 'etc/%s/apt.conf' % self.target_distro)
|
||||
if os.path.exists(apt_conf_dir):
|
||||
arguments += ['--aptconfdir', apt_conf_dir]
|
||||
|
||||
# Append remaining arguments
|
||||
if remaining_arguments:
|
||||
arguments.extend(remaining_arguments)
|
||||
|
||||
# Export the distribution and architecture information to the
|
||||
# environment so that it is accessible to ~/.pbuilderrc (LP: #628933).
|
||||
return [
|
||||
self.auth,
|
||||
'ARCH=' + self.build_architecture,
|
||||
'DIST=' + self.target_distro,
|
||||
self.builder,
|
||||
] + arguments
|
||||
# Wheter additional components should be used or not. That is,
|
||||
# 'universe' and 'multiverse' for Ubuntu chroots and 'contrib'
|
||||
# and 'non-free' for Debian.
|
||||
self.extra_components = True
|
||||
|
||||
# File where the log of the last operation will be saved.
|
||||
self.logfile = None
|
||||
|
||||
# System architecture
|
||||
self.system_architecture = None
|
||||
|
||||
# Build architecture
|
||||
self.build_architecture = None
|
||||
|
||||
# System's distribution
|
||||
self.system_distro = None
|
||||
|
||||
# Target distribution
|
||||
self.target_distro = None
|
||||
|
||||
# This is an identificative string which will either take the form
|
||||
# 'distribution' or 'distribution-architecture'.
|
||||
self.chroot_string = None
|
||||
|
||||
# Authentication method
|
||||
self.auth = 'sudo'
|
||||
|
||||
# Builder
|
||||
self.builder = builder
|
||||
|
||||
# Ensure that the used builder is installed
|
||||
paths = set(os.environ['PATH'].split(':'))
|
||||
paths |= set(('/sbin', '/usr/sbin', '/usr/local/sbin'))
|
||||
if not any(os.path.exists(os.path.join(p, builder)) for p in paths):
|
||||
print >> stderr, 'Error: Could not find "%s".' % builder
|
||||
exit(1)
|
||||
|
||||
##############################################################
|
||||
|
||||
self.base = os.path.expanduser(os.environ.get('PBUILDFOLDER',
|
||||
'~/pbuilder/'))
|
||||
|
||||
if not os.path.isdir(self.base):
|
||||
try:
|
||||
os.makedirs(self.base)
|
||||
except os.OSError:
|
||||
print >> stderr, ('Error: Cannot create base directory "%s"'
|
||||
% self.base)
|
||||
exit(1)
|
||||
|
||||
if 'PBUILDAUTH' in os.environ:
|
||||
self.auth = os.environ['PBUILDAUTH']
|
||||
|
||||
self.system_architecture = ubuntutools.misc.host_architecture()
|
||||
self.system_distro = ubuntutools.misc.system_distribution()
|
||||
if not self.system_architecture or not self.system_distro:
|
||||
exit(1)
|
||||
|
||||
self.target_distro = self.system_distro
|
||||
|
||||
##############################################################
|
||||
|
||||
def set_target_distro(self, distro):
|
||||
""" pbuilder_dist.set_target_distro(distro) -> None
|
||||
|
||||
Check if the given target distribution name is correct, if it
|
||||
isn't know to the system ask the user for confirmation before
|
||||
proceeding, and finally either save the value into the appropiate
|
||||
variable or finalize pbuilder-dist's execution.
|
||||
|
||||
"""
|
||||
|
||||
if not distro.isalpha():
|
||||
print >> stderr, ('Error: "%s" is an invalid distribution codename.'
|
||||
% distro)
|
||||
exit(1)
|
||||
|
||||
if not os.path.isfile(os.path.join('/usr/share/debootstrap/scripts/',
|
||||
distro)):
|
||||
if os.path.isdir('/usr/share/debootstrap/scripts/'):
|
||||
# Debian experimental doesn't have a debootstrap file but
|
||||
# should work nevertheless.
|
||||
if distro not in debian_distros:
|
||||
answer = ask(('Warning: Unknown distribution "%s". Do you '
|
||||
'want to continue [y/N]? ') % distro)
|
||||
if answer not in ('y', 'Y'):
|
||||
exit(0)
|
||||
else:
|
||||
print >> stderr, 'Please install package "debootstrap".'
|
||||
exit(1)
|
||||
|
||||
self.target_distro = distro
|
||||
|
||||
def set_operation(self, operation):
|
||||
""" pbuilder_dist.set_operation -> None
|
||||
|
||||
Check if the given string is a valid pbuilder operation and
|
||||
depending on this either save it into the appropiate variable
|
||||
or finalize pbuilder-dist's execution.
|
||||
|
||||
"""
|
||||
|
||||
arguments = ('create', 'update', 'build', 'clean', 'login', 'execute')
|
||||
|
||||
if operation not in arguments:
|
||||
if operation.endswith('.dsc'):
|
||||
if os.path.isfile(operation):
|
||||
self.operation = 'build'
|
||||
return [operation]
|
||||
else:
|
||||
print >> stderr, ('Error: Could not find file "%s".'
|
||||
% operation)
|
||||
exit(1)
|
||||
else:
|
||||
print >> stderr, (
|
||||
'Error: "%s" is not a recognized argument.\n'
|
||||
'Please use one of these: %s.'
|
||||
) % (operation, ', '.join(arguments))
|
||||
exit(1)
|
||||
else:
|
||||
self.operation = operation
|
||||
return []
|
||||
|
||||
def get_command(self, remaining_arguments = None):
|
||||
""" pbuilder_dist.get_command -> string
|
||||
|
||||
Generate the pbuilder command which matches the given configuration
|
||||
and return it as a string.
|
||||
|
||||
"""
|
||||
|
||||
if not self.build_architecture:
|
||||
self.chroot_string = self.target_distro
|
||||
self.build_architecture = self.system_architecture
|
||||
else:
|
||||
self.chroot_string = (self.target_distro + '-'
|
||||
+ self.build_architecture)
|
||||
|
||||
prefix = os.path.join(self.base, self.chroot_string)
|
||||
result = '%s_result/' % prefix
|
||||
|
||||
if not self.logfile and self.operation != 'login':
|
||||
self.logfile = os.path.normpath('%s/last_operation.log' % result)
|
||||
|
||||
if not os.path.isdir(result):
|
||||
try:
|
||||
os.makedirs(result)
|
||||
except os.OSError:
|
||||
print >> stderr, ('Error: Cannot create results directory "%s"'
|
||||
% result)
|
||||
exit(1)
|
||||
|
||||
if self.builder == 'pbuilder':
|
||||
base = '--basetgz "%s-base.tgz"' % prefix
|
||||
elif self.builder == 'cowbuilder':
|
||||
base = '--basepath "%s-base.cow"' % prefix
|
||||
else:
|
||||
print >> stderr, 'Error: Unrecognized builder "%s".' % self.builder
|
||||
exit(1)
|
||||
|
||||
arguments = [
|
||||
'--%s' % self.operation,
|
||||
base,
|
||||
'--distribution', self.target_distro,
|
||||
'--buildresult', result,
|
||||
'--aptcache', '/var/cache/apt/archives/',
|
||||
'--override-config',
|
||||
]
|
||||
|
||||
if self.logfile:
|
||||
arguments += ['--logfile', self.logfile]
|
||||
|
||||
if os.path.exists('/var/cache/archive/'):
|
||||
arguments += ['--bindmounts', '/var/cache/archive/']
|
||||
|
||||
localrepo = '/var/cache/archive/' + self.target_distro
|
||||
if os.path.exists(localrepo):
|
||||
arguments += [
|
||||
'--othermirror ',
|
||||
'deb file:///var/cache/archive/ %s/' % self.target_distro,
|
||||
]
|
||||
|
||||
if self.target_distro in debian_distros:
|
||||
arguments += ['--mirror', 'http://ftp.debian.org/debian']
|
||||
# work around bug #599695
|
||||
arguments += [
|
||||
'--debootstrapopts',
|
||||
'--keyring=/usr/share/keyrings/debian-archive-keyring.gpg',
|
||||
]
|
||||
components = 'main'
|
||||
if self.extra_components:
|
||||
components += ' contrib non-free'
|
||||
else:
|
||||
if self.build_architecture in ('amd64', 'i386'):
|
||||
arguments += ['--mirror', 'http://archive.ubuntu.com/ubuntu/']
|
||||
elif (self.build_architecture == 'powerpc'
|
||||
and self.target_distro == 'dapper'):
|
||||
arguments += ['--mirror', 'http://archive.ubuntu.com/ubuntu/']
|
||||
else:
|
||||
arguments += ['--mirror',
|
||||
'http://ports.ubuntu.com/ubuntu-ports/']
|
||||
components = 'main restricted'
|
||||
if self.extra_components:
|
||||
components += ' universe multiverse'
|
||||
|
||||
arguments += ['--components', components]
|
||||
|
||||
if self.build_architecture != self.system_architecture:
|
||||
arguments += ['--debootstrapopts',
|
||||
'--arch=' + self.build_architecture]
|
||||
|
||||
apt_conf_dir = os.path.join(self.base,
|
||||
'etc/%s/apt.conf' % self.target_distro)
|
||||
if os.path.exists(apt_conf_dir):
|
||||
arguments += ['--aptconfdir', apt_conf_dir]
|
||||
|
||||
# Append remaining arguments
|
||||
if remaining_arguments:
|
||||
arguments.extend(remaining_arguments)
|
||||
|
||||
# Export the distribution and architecture information to the
|
||||
# environment so that it is accessible to ~/.pbuilderrc (LP: #628933).
|
||||
return [
|
||||
self.auth,
|
||||
'ARCH=' + self.build_architecture,
|
||||
'DIST=' + self.target_distro,
|
||||
self.builder,
|
||||
] + arguments
|
||||
|
||||
def ask(question):
|
||||
""" ask(question) -> string
|
||||
|
||||
Ask the given question and return the answer. Also catch
|
||||
KeyboardInterrupt (Ctrl+C) and EOFError (Ctrl+D) exceptions and
|
||||
immediately return None if one of those is found.
|
||||
|
||||
"""
|
||||
|
||||
try:
|
||||
answer = raw_input(question)
|
||||
except (KeyboardInterrupt, EOFError):
|
||||
print
|
||||
answer = None
|
||||
|
||||
return answer
|
||||
""" ask(question) -> string
|
||||
|
||||
Ask the given question and return the answer. Also catch
|
||||
KeyboardInterrupt (Ctrl+C) and EOFError (Ctrl+D) exceptions and
|
||||
immediately return None if one of those is found.
|
||||
|
||||
"""
|
||||
|
||||
try:
|
||||
answer = raw_input(question)
|
||||
except (KeyboardInterrupt, EOFError):
|
||||
print
|
||||
answer = None
|
||||
|
||||
return answer
|
||||
|
||||
def help(exit_code = 0):
|
||||
""" help() -> None
|
||||
|
||||
Print a help message for pbuilder-dist, and exit with the given code.
|
||||
|
||||
"""
|
||||
|
||||
print 'See man pbuilder-dist for more information.'
|
||||
|
||||
exit(exit_code)
|
||||
""" help() -> None
|
||||
|
||||
Print a help message for pbuilder-dist, and exit with the given code.
|
||||
|
||||
"""
|
||||
|
||||
print 'See man pbuilder-dist for more information.'
|
||||
|
||||
exit(exit_code)
|
||||
|
||||
def main():
|
||||
""" main() -> None
|
||||
|
||||
This is pbuilder-dist's main function. It creates a pbuilder_dist
|
||||
object, modifies all necessary settings taking data from the
|
||||
executable's name and command line options and finally either ends
|
||||
the script and runs pbuilder itself or exists with an error message.
|
||||
|
||||
"""
|
||||
|
||||
script_name = os.path.basename(argv[0])
|
||||
parts = script_name.split('-')
|
||||
|
||||
# Copy arguments into another list for save manipulation
|
||||
args = argv[1:]
|
||||
|
||||
if '-' in script_name and (parts[0] != 'pbuilder' and \
|
||||
parts[0] != 'cowbuilder') or len(parts) > 3:
|
||||
print >> stderr, 'Error: "%s" is not a valid name for a "pbuilder-dist" executable.' % script_name
|
||||
exit(1)
|
||||
|
||||
if len(args) < 1:
|
||||
print >> stderr, 'Insufficient number of arguments.'
|
||||
help(1)
|
||||
|
||||
if args[0] in ('-h', '--help', 'help'):
|
||||
help(0)
|
||||
|
||||
app = pbuilder_dist(parts[0])
|
||||
|
||||
if len(parts) > 1 and parts[1] != 'dist' and '.' not in parts[1]:
|
||||
app.set_target_distro(parts[1])
|
||||
else:
|
||||
app.set_target_distro(args.pop(0))
|
||||
|
||||
if len(parts) > 2:
|
||||
requested_arch = parts[2]
|
||||
elif len(args) > 0 and args[0] in ("alpha", "amd64", "arm", "armeb",
|
||||
"armel", "i386", "lpia", "m68k", "mips", "mipsel", "powerpc", "ppc64",
|
||||
"sh4", "sh4eb", "sparc", "sparc64"):
|
||||
requested_arch = args.pop(0)
|
||||
else:
|
||||
requested_arch = None
|
||||
|
||||
if requested_arch:
|
||||
app.build_architecture = requested_arch
|
||||
# For some foreign architectures we need to use qemu
|
||||
if requested_arch != app.system_architecture and (app.system_architecture,
|
||||
requested_arch) not in [("amd64", "i386"), ("amd64", "lpia"),
|
||||
("arm", "armel"), ("armel", "arm"), ("i386", "lpia"), ("lpia", "i386"),
|
||||
("powerpc", "ppc64"), ("ppc64", "powerpc"), ("sparc", "sparc64"),
|
||||
("sparc64", "sparc")]:
|
||||
args.append('--debootstrap qemu-debootstrap')
|
||||
|
||||
if 'mainonly' in argv or '--main-only' in argv:
|
||||
app.extra_components = False
|
||||
if 'mainonly' in argv:
|
||||
args.remove('mainonly')
|
||||
else:
|
||||
args.remove('--main-only')
|
||||
|
||||
if len(args) < 1:
|
||||
print >> stderr, 'Insufficient number of arguments.'
|
||||
help(1)
|
||||
|
||||
# Parse the operation
|
||||
args = app.set_operation(args.pop(0)) + args
|
||||
|
||||
if app.operation == 'build' and not '.dsc' in ' '.join(args):
|
||||
print >> stderr, 'Error: You have to specify a .dsc file if you want to build.'
|
||||
exit(1)
|
||||
|
||||
# Execute the pbuilder command
|
||||
if not '--debug-echo' in args:
|
||||
p = subprocess.Popen(app.get_command(args))
|
||||
exit(p.wait())
|
||||
else:
|
||||
print app.get_command([arg for arg in args if arg != '--debug-echo'])
|
||||
""" main() -> None
|
||||
|
||||
This is pbuilder-dist's main function. It creates a pbuilder_dist
|
||||
object, modifies all necessary settings taking data from the
|
||||
executable's name and command line options and finally either ends
|
||||
the script and runs pbuilder itself or exists with an error message.
|
||||
|
||||
"""
|
||||
|
||||
script_name = os.path.basename(argv[0])
|
||||
parts = script_name.split('-')
|
||||
|
||||
# Copy arguments into another list for save manipulation
|
||||
args = argv[1:]
|
||||
|
||||
if ('-' in script_name and parts[0] not in ('pbuilder', 'cowbuilder')
|
||||
or len(parts) > 3):
|
||||
print >> stderr, ('Error: "%s" is not a valid name for a '
|
||||
'"pbuilder-dist" executable.') % script_name
|
||||
exit(1)
|
||||
|
||||
if len(args) < 1:
|
||||
print >> stderr, 'Insufficient number of arguments.'
|
||||
help(1)
|
||||
|
||||
if args[0] in ('-h', '--help', 'help'):
|
||||
help(0)
|
||||
|
||||
app = pbuilder_dist(parts[0])
|
||||
|
||||
if len(parts) > 1 and parts[1] != 'dist' and '.' not in parts[1]:
|
||||
app.set_target_distro(parts[1])
|
||||
else:
|
||||
app.set_target_distro(args.pop(0))
|
||||
|
||||
if len(parts) > 2:
|
||||
requested_arch = parts[2]
|
||||
elif len(args) > 0 and args[0] in (
|
||||
'alpha', 'amd64', 'arm', 'armeb', 'armel', 'i386', 'lpia', 'm68k',
|
||||
'mips', 'mipsel', 'powerpc', 'ppc64', 'sh4', 'sh4eb', 'sparc',
|
||||
'sparc64'):
|
||||
requested_arch = args.pop(0)
|
||||
else:
|
||||
requested_arch = None
|
||||
|
||||
if requested_arch:
|
||||
app.build_architecture = requested_arch
|
||||
# For some foreign architectures we need to use qemu
|
||||
if (requested_arch != app.system_architecture
|
||||
and (app.system_architecture, requested_arch) not in [
|
||||
('amd64', 'i386'), ('amd64', 'lpia'), ('arm', 'armel'),
|
||||
('armel', 'arm'), ('i386', 'lpia'), ('lpia', 'i386'),
|
||||
('powerpc', 'ppc64'), ('ppc64', 'powerpc'),
|
||||
('sparc', 'sparc64'), ('sparc64', 'sparc')]):
|
||||
args.append('--debootstrap qemu-debootstrap')
|
||||
|
||||
if 'mainonly' in argv or '--main-only' in argv:
|
||||
app.extra_components = False
|
||||
if 'mainonly' in argv:
|
||||
args.remove('mainonly')
|
||||
else:
|
||||
args.remove('--main-only')
|
||||
|
||||
if len(args) < 1:
|
||||
print >> stderr, 'Insufficient number of arguments.'
|
||||
help(1)
|
||||
|
||||
# Parse the operation
|
||||
args = app.set_operation(args.pop(0)) + args
|
||||
|
||||
if app.operation == 'build' and not '.dsc' in ' '.join(args):
|
||||
print >> stderr, ('Error: You have to specify a .dsc file if you want '
|
||||
'to build.')
|
||||
exit(1)
|
||||
|
||||
# Execute the pbuilder command
|
||||
if not '--debug-echo' in args:
|
||||
p = subprocess.Popen(app.get_command(args)))
|
||||
exit(p.wait())
|
||||
else:
|
||||
print app.get_command([arg for arg in args if arg != '--debug-echo'])
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
try:
|
||||
main()
|
||||
except KeyboardInterrupt:
|
||||
print >> stderr, 'Manually aborted.'
|
||||
exit(1)
|
||||
|
||||
try:
|
||||
main()
|
||||
except KeyboardInterrupt:
|
||||
print >> stderr, 'Manually aborted.'
|
||||
exit(1)
|
||||
|
Loading…
x
Reference in New Issue
Block a user