package: Implement common methods to read/create pisi files
This commit is contained in:
+117
-17
@@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 2005 - 2007, TUBITAK/UEKAE
|
# Copyright (C) 2005-2010, TUBITAK/UEKAE
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify it under
|
# This program is free software; you can redistribute it and/or modify it under
|
||||||
# the terms of the GNU General Public License as published by the Free
|
# the terms of the GNU General Public License as published by the Free
|
||||||
@@ -27,6 +27,7 @@ import pisi.files
|
|||||||
import pisi.util as util
|
import pisi.util as util
|
||||||
import fetcher
|
import fetcher
|
||||||
|
|
||||||
|
|
||||||
class Error(pisi.Error):
|
class Error(pisi.Error):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -34,7 +35,26 @@ class Error(pisi.Error):
|
|||||||
class Package:
|
class Package:
|
||||||
"""PiSi Package Class provides access to a pisi package (.pisi
|
"""PiSi Package Class provides access to a pisi package (.pisi
|
||||||
file)."""
|
file)."""
|
||||||
def __init__(self, packagefn, mode='r'):
|
|
||||||
|
formats = ("1.0", "1.1", "1.2")
|
||||||
|
default_format = "1.2"
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def archive_name_and_format(package_format):
|
||||||
|
if package_format == "1.2":
|
||||||
|
archive_format = "tarxz"
|
||||||
|
archive_suffix = ctx.const.xz_suffix
|
||||||
|
elif package_format == "1.1":
|
||||||
|
archive_format = "tarlzma"
|
||||||
|
archive_suffix = ctx.const.lzma_suffix
|
||||||
|
else:
|
||||||
|
# "1.0" format does not have an archive
|
||||||
|
return (None, None)
|
||||||
|
|
||||||
|
archive_name = ctx.const.install_tar + archive_suffix
|
||||||
|
return archive_name, archive_format
|
||||||
|
|
||||||
|
def __init__(self, packagefn, mode='r', format=None):
|
||||||
self.filepath = packagefn
|
self.filepath = packagefn
|
||||||
url = pisi.uri.URI(packagefn)
|
url = pisi.uri.URI(packagefn)
|
||||||
|
|
||||||
@@ -42,6 +62,26 @@ class Package:
|
|||||||
self.fetch_remote_file(url)
|
self.fetch_remote_file(url)
|
||||||
|
|
||||||
self.impl = archive.ArchiveZip(self.filepath, 'zip', mode)
|
self.impl = archive.ArchiveZip(self.filepath, 'zip', mode)
|
||||||
|
self.install_archive = None
|
||||||
|
|
||||||
|
if mode == "r":
|
||||||
|
self.metadata = self.get_metadata()
|
||||||
|
format = self.metadata.package.packageFormat
|
||||||
|
|
||||||
|
# Many of the old packages do not contain format information
|
||||||
|
# because of a bug in old Pisi versions. This is a workaround
|
||||||
|
# to guess their package format.
|
||||||
|
if format is None:
|
||||||
|
archive_name = ctx.const.install_tar + ctx.const.lzma_suffix
|
||||||
|
if self.impl.has_file(archive_name):
|
||||||
|
format = "1.1"
|
||||||
|
else:
|
||||||
|
format = "1.0"
|
||||||
|
|
||||||
|
self.format = format or Package.default_format
|
||||||
|
|
||||||
|
if self.format not in Package.formats:
|
||||||
|
raise Error(_("Unsupported package format: %s") % format)
|
||||||
|
|
||||||
def fetch_remote_file(self, url):
|
def fetch_remote_file(self, url):
|
||||||
dest = ctx.config.cached_packages_dir()
|
dest = ctx.config.cached_packages_dir()
|
||||||
@@ -63,10 +103,83 @@ class Package:
|
|||||||
"""Add a file or directory to package"""
|
"""Add a file or directory to package"""
|
||||||
self.impl.add_to_archive(fn, an)
|
self.impl.add_to_archive(fn, an)
|
||||||
|
|
||||||
|
def add_to_install(self, name, arcname=None):
|
||||||
|
"""Add the file 'name' to the install archive"""
|
||||||
|
|
||||||
|
if arcname is None:
|
||||||
|
arcname = name
|
||||||
|
|
||||||
|
if self.format == "1.0":
|
||||||
|
arcname = util.join_path("install", arcname)
|
||||||
|
self.add_to_package(name, arcname)
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.install_archive is None:
|
||||||
|
archive_name, archive_format = \
|
||||||
|
self.archive_name_and_format(self.format)
|
||||||
|
pkg_dir = "-".join((self.metadata.package.name,
|
||||||
|
self.metadata.package.version,
|
||||||
|
self.metadata.package.release))
|
||||||
|
self.install_archive_path = util.join_path(ctx.config.tmp_dir(),
|
||||||
|
pkg_dir,
|
||||||
|
archive_name)
|
||||||
|
ctx.build_leftover = self.install_archive_path
|
||||||
|
self.install_archive = archive.ArchiveTar(
|
||||||
|
self.install_archive_path,
|
||||||
|
archive_format)
|
||||||
|
|
||||||
|
self.install_archive.add_to_archive(name, arcname)
|
||||||
|
|
||||||
|
def add_metadata_xml(self, path):
|
||||||
|
self.metadata = pisi.metadata.MetaData()
|
||||||
|
self.metadata.read(path)
|
||||||
|
|
||||||
|
self.add_to_package(path, ctx.const.metadata_xml)
|
||||||
|
|
||||||
|
def add_files_xml(self, path):
|
||||||
|
self.files = pisi.files.Files()
|
||||||
|
self.files.read(path)
|
||||||
|
|
||||||
|
self.add_to_package(path, ctx.const.files_xml)
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
"""Close the package archive"""
|
"""Close the package archive"""
|
||||||
|
if self.install_archive:
|
||||||
|
self.install_archive.close()
|
||||||
|
arcpath = self.install_archive_path
|
||||||
|
arcname = os.path.basename(arcpath)
|
||||||
|
self.add_to_package(arcpath, arcname)
|
||||||
|
|
||||||
self.impl.close()
|
self.impl.close()
|
||||||
|
|
||||||
|
if self.install_archive:
|
||||||
|
os.unlink(self.install_archive_path)
|
||||||
|
ctx.build_leftover = None
|
||||||
|
|
||||||
|
def get_install_archive(self):
|
||||||
|
if self.format == "1.2":
|
||||||
|
archive_format = "tarxz"
|
||||||
|
archive_suffix = ctx.const.xz_suffix
|
||||||
|
elif self.format == "1.1":
|
||||||
|
archive_format = "tarlzma"
|
||||||
|
archive_suffix = ctx.const.lzma_suffix
|
||||||
|
else:
|
||||||
|
# "1.0" format does not have an archive
|
||||||
|
return
|
||||||
|
|
||||||
|
archive_name = ctx.const.install_tar + archive_suffix
|
||||||
|
|
||||||
|
if not self.impl.has_file(archive_name):
|
||||||
|
return
|
||||||
|
|
||||||
|
archive_file = self.impl.open(archive_name)
|
||||||
|
tar = archive.ArchiveTar(fileobj=archive_file,
|
||||||
|
arch_type=archive_format,
|
||||||
|
no_same_permissions=False,
|
||||||
|
no_same_owner=False)
|
||||||
|
|
||||||
|
return tar
|
||||||
|
|
||||||
def extract(self, outdir):
|
def extract(self, outdir):
|
||||||
"""Extract entire package contents to directory"""
|
"""Extract entire package contents to directory"""
|
||||||
self.extract_dir('', outdir) # means package root
|
self.extract_dir('', outdir) # means package root
|
||||||
@@ -119,22 +232,9 @@ class Package:
|
|||||||
ctx.ui.notify(pisi.ui.desktopfile, desktopfile=tarinfo.name)
|
ctx.ui.notify(pisi.ui.desktopfile, desktopfile=tarinfo.name)
|
||||||
|
|
||||||
|
|
||||||
# TODO: Read metadata to get package format
|
tar = self.get_install_archive()
|
||||||
|
|
||||||
archive_name = None
|
if tar:
|
||||||
if self.impl.has_file(ctx.const.install_tar_xz):
|
|
||||||
archive_name = ctx.const.install_tar_xz
|
|
||||||
archive_format = "tarxz"
|
|
||||||
elif self.impl.has_file(ctx.const.install_tar_lzma):
|
|
||||||
archive_name = ctx.const.install_tar_lzma
|
|
||||||
archive_format = "tarlzma"
|
|
||||||
|
|
||||||
if archive_name:
|
|
||||||
archive_file = self.impl.open(archive_name)
|
|
||||||
tar = archive.ArchiveTar(fileobj=archive_file,
|
|
||||||
arch_type=archive_format,
|
|
||||||
no_same_permissions=False,
|
|
||||||
no_same_owner=False)
|
|
||||||
tar.unpack_dir(outdir, callback=callback)
|
tar.unpack_dir(outdir, callback=callback)
|
||||||
else:
|
else:
|
||||||
self.extract_dir_flat('install', outdir)
|
self.extract_dir_flat('install', outdir)
|
||||||
|
|||||||
Reference in New Issue
Block a user