214
def tarball_name(package, version, format=None):
212
def tarball_name(package, version, component=None, format=None):
215
213
"""Return the name of the .orig.tar.gz for the given package and version.
217
215
:param package: the name of the source package.
218
216
:param version: the upstream version of the package.
217
:param component: Component name (None for base)
219
218
:param format: the format for the tarball. If None then 'gz' will be
220
219
used. You probably want on of 'gz', 'bz2', or 'lzma'.
221
220
:return: a string that is the name of the upstream tarball to use.
223
222
if format is None:
225
return "%s_%s.orig.tar.%s" % (package, str(version), format)
224
name = "%s_%s.orig" % (package, str(version))
225
if component is not None:
226
name += "-" + component
227
return "%s.tar.%s" % (name, format)
229
230
def suite_to_distribution(suite):
347
348
def open_transport(path):
348
"""Obtain an appropriate transport instance for the given path."""
349
base_dir, path = urlutils.split(path)
350
transport = get_transport(base_dir)
351
return (path, transport)
349
"""Obtain an appropriate transport instance for the given path."""
350
base_dir, path = urlutils.split(path)
351
transport = get_transport(base_dir)
352
return (path, transport)
354
355
def open_file_via_transport(filename, transport):
355
"""Open a file using the transport, follow redirects as necessary."""
356
def open_file(transport):
357
return transport.get(filename)
358
def follow_redirection(transport, e, redirection_notice):
359
mutter(redirection_notice)
360
_filename, redirected_transport = open_transport(e.target)
361
return redirected_transport
356
"""Open a file using the transport, follow redirects as necessary."""
357
def open_file(transport):
358
return transport.get(filename)
359
def follow_redirection(transport, e, redirection_notice):
360
mutter(redirection_notice)
361
_filename, redirected_transport = open_transport(e.target)
362
return redirected_transport
363
result = do_catching_redirections(open_file, transport, follow_redirection)
364
result = do_catching_redirections(open_file, transport, follow_redirection)
367
368
def _dget(cls, dsc_location, target_dir):
686
689
return BUILD_TYPE_NORMAL
689
def reconstruct_pristine_tar(dest, delta, dest_filename):
690
"""Reconstruct a pristine tarball from a directory and a delta.
692
:param dest: Directory to pack
693
:param delta: pristine-tar delta
694
:param dest_filename: Destination filename
696
command = ["pristine-tar", "gentar", "-",
697
os.path.abspath(dest_filename)]
699
proc = subprocess.Popen(command, stdin=subprocess.PIPE,
700
cwd=dest, preexec_fn=subprocess_setup,
701
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
703
if e.errno == errno.ENOENT:
704
raise PristineTarError("pristine-tar is not installed")
707
(stdout, stderr) = proc.communicate(delta)
708
if proc.returncode != 0:
709
raise PristineTarError("Generating tar from delta failed: %s" % stdout)
712
def make_pristine_tar_delta(dest, tarball_path):
713
"""Create a pristine-tar delta for a tarball.
715
:param dest: Directory to generate pristine tar delta for
716
:param tarball_path: Path to the tarball
717
:return: pristine-tarball
719
# If tarball_path is relative, the cwd=dest parameter to Popen will make
720
# pristine-tar faaaail. pristine-tar doesn't use the VFS either, so we
721
# assume local paths.
722
tarball_path = osutils.abspath(tarball_path)
723
command = ["pristine-tar", "gendelta", tarball_path, "-"]
725
proc = subprocess.Popen(command, stdout=subprocess.PIPE,
726
cwd=dest, preexec_fn=subprocess_setup,
727
stderr=subprocess.PIPE)
729
if e.errno == errno.ENOENT:
730
raise PristineTarError("pristine-tar is not installed")
733
(stdout, stderr) = proc.communicate()
734
if proc.returncode != 0:
735
raise PristineTarError("Generating delta from tar failed: %s" % stderr)
692
def component_from_orig_tarball(tarball_filename, package, version):
693
tarball_filename = os.path.basename(tarball_filename)
694
prefix = "%s_%s.orig" % (package, version)
695
if not tarball_filename.startswith(prefix):
697
"invalid orig tarball file %s does not have expected prefix %s" % (
698
tarball_filename, prefix))
699
base = tarball_filename[len(prefix):]
700
for ext in (".tar.gz", ".tar.bz2", ".tar.lzma"):
701
if tarball_filename.endswith(ext):
702
base = base[:-len(ext)]
706
"orig tarball file %s has unknown extension" % tarball_filename)
713
raise ValueError("Invalid extra characters in tarball filename %s" %
717
def extract_orig_tarball(tarball_filename, component, target, strip_components=None):
718
"""Extract an orig tarball.
720
:param tarball: Path to the tarball
721
:param component: Component name (or None for top-level)
722
:param target: Target path
723
:param strip_components: Optional number of components to strip
726
if tarball_filename.endswith(".tar.bz2"):
727
tar_args.append('xjf')
728
elif tarball_filename.endswith(".tar.lzma"):
729
tar_args.append('xJf')
731
tar_args.append('xzf')
732
if component is not None:
733
target_path = os.path.join(target, component)
734
os.mkdir(target_path)
737
tar_args.extend([tarball_filename, "-C", target_path])
738
if strip_components is not None:
739
tar_args.extend(["--strip-components", "1"])
740
proc = subprocess.Popen(tar_args, preexec_fn=subprocess_setup)
742
if proc.returncode != 0:
743
raise TarFailed("extract", tarball_filename)
746
def extract_orig_tarballs(tarballs, target, strip_components=None):
747
"""Extract orig tarballs to a directory.
749
:param tarballs: List of tarball filenames
750
:param target: Target directory (must already exist)
752
for tarball_filename, component in tarballs:
753
extract_orig_tarball(tarball_filename, component, target,
754
strip_components=strip_components)