mirror of
https://github.com/moparisthebest/pacman
synced 2024-12-23 16:28:50 -05:00
671224b64c
Actually use python commands to generate the filelist instead of os.system calls that don't necessarily work everywhere. Noticed when running "make check" on FreeBSD where the tar program is actually bsdtar. Signed-off-by: Dan McGee <dan@archlinux.org>
200 lines
6.1 KiB
Python
Executable File
200 lines
6.1 KiB
Python
Executable File
#! /usr/bin/python
|
|
#
|
|
# Copyright (c) 2006 by Aurelien Foret <orelien@chez.com>
|
|
#
|
|
# 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 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.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
|
# USA.
|
|
|
|
|
|
import os
|
|
import tempfile
|
|
import stat
|
|
import shutil
|
|
|
|
from util import *
|
|
|
|
|
|
class pmpkg:
|
|
"""Package object.
|
|
|
|
Object holding data from an ArchLinux package.
|
|
"""
|
|
|
|
def __init__(self, name, version = "1.0-1"):
|
|
self.path = "" #the path of the generated package
|
|
# desc
|
|
self.name = name
|
|
self.version = version
|
|
self.desc = ""
|
|
self.groups = []
|
|
self.url = ""
|
|
self.license = []
|
|
self.arch = ""
|
|
self.builddate = ""
|
|
self.installdate = ""
|
|
self.packager = ""
|
|
self.size = 0
|
|
self.csize = 0
|
|
self.reason = 0
|
|
self.md5sum = "" # sync only
|
|
self.replaces = [] # sync only (will be moved to depends)
|
|
self.force = 0 # sync only (will be moved to depends)
|
|
# depends
|
|
self.depends = []
|
|
self.requiredby = [] # local only
|
|
self.conflicts = []
|
|
self.provides = []
|
|
# files
|
|
self.files = []
|
|
self.backup = []
|
|
# install
|
|
self.install = {
|
|
"pre_install": "",
|
|
"post_install": "",
|
|
"pre_remove": "",
|
|
"post_remove": "",
|
|
"pre_upgrade": "",
|
|
"post_upgrade": ""
|
|
}
|
|
self.checksum = {
|
|
"desc": "",
|
|
"depends": "",
|
|
"files": "",
|
|
"install": ""
|
|
}
|
|
self.mtime = {
|
|
"desc": (0, 0, 0),
|
|
"depends": (0, 0, 0),
|
|
"files": (0, 0, 0),
|
|
"install": (0, 0, 0)
|
|
}
|
|
|
|
def __str__(self):
|
|
s = ["%s" % self.fullname()]
|
|
s.append("description: %s" % self.desc)
|
|
s.append("url: %s" % self.url)
|
|
s.append("depends: %s" % " ".join(self.depends))
|
|
s.append("files: %s" % " ".join(self.files))
|
|
s.append("reason: %d" % self.reason)
|
|
return "\n".join(s)
|
|
|
|
def fullname(self):
|
|
"""Long name of a package.
|
|
|
|
Returns a string formatted as follows: "pkgname-pkgver".
|
|
"""
|
|
return "%s-%s" % (self.name, self.version)
|
|
|
|
def filename(self):
|
|
"""File name of a package, including its extension.
|
|
|
|
Returns a string formatted as follows: "pkgname-pkgver.PKG_EXT_PKG".
|
|
"""
|
|
return "%s%s" % (self.fullname(), PM_EXT_PKG)
|
|
|
|
def install_files(self, root):
|
|
"""Install files in the filesystem located under "root".
|
|
|
|
Files are created with content generated automatically.
|
|
"""
|
|
[mkfile(os.path.join(root, f), f) for f in self.files]
|
|
|
|
def makepkg(self, path):
|
|
"""Creates an ArchLinux package archive.
|
|
|
|
A package archive is generated in the location 'path', based on the data
|
|
from the object.
|
|
"""
|
|
self.path = os.path.join(path, self.filename())
|
|
|
|
curdir = os.getcwd()
|
|
tmpdir = tempfile.mkdtemp()
|
|
os.chdir(tmpdir)
|
|
|
|
# Generate package file system
|
|
for f in self.files:
|
|
mkfile(f, f)
|
|
self.size += os.stat(getfilename(f))[stat.ST_SIZE]
|
|
|
|
# .PKGINFO
|
|
data = ["pkgname = %s" % self.name]
|
|
data.append("pkgver = %s" % self.version)
|
|
data.append("pkgdesc = %s" % self.desc)
|
|
data.append("url = %s" % self.url)
|
|
data.append("builddate = %s" % self.builddate)
|
|
data.append("packager = %s" % self.packager)
|
|
data.append("size = %s" % self.size)
|
|
if self.arch:
|
|
data.append("arch = %s" % self.arch)
|
|
for i in self.license:
|
|
data.append("license = %s" % i)
|
|
for i in self.replaces:
|
|
data.append("replaces = %s" % i)
|
|
for i in self.groups:
|
|
data.append("group = %s" % i)
|
|
for i in self.depends:
|
|
data.append("depend = %s" % i)
|
|
for i in self.conflicts:
|
|
data.append("conflict = %s" % i)
|
|
for i in self.provides:
|
|
data.append("provides = %s" % i)
|
|
for i in self.backup:
|
|
data.append("backup = %s" % i)
|
|
mkfile(".PKGINFO", "\n".join(data))
|
|
targets = ".PKGINFO"
|
|
|
|
# .INSTALL
|
|
empty = 1
|
|
if len(self.install.values()) > 0:
|
|
empty = 0
|
|
if not empty:
|
|
mkinstallfile(".INSTALL", self.install)
|
|
targets += " .INSTALL"
|
|
|
|
# .FILELIST
|
|
if self.files:
|
|
# generate a filelist
|
|
filelist = []
|
|
current = ""
|
|
for path, dirs, files in os.walk("."):
|
|
# we have to strip the './' portion from the path
|
|
# and add a newline to each entry.
|
|
current = os.path.join(path, "")[2:]
|
|
if len(current) != 0:
|
|
filelist.append(current + "\n")
|
|
for file in files:
|
|
# skip .PKGINFO, etc.
|
|
if(not file.startswith(".")):
|
|
filelist.append(os.path.join(path, file)[2:] + "\n")
|
|
f = open('.FILELIST', 'w')
|
|
f.writelines(filelist)
|
|
f.close()
|
|
targets += " .FILELIST *"
|
|
|
|
#safely create the dir
|
|
mkdir(os.path.dirname(self.path))
|
|
|
|
# Generate package archive
|
|
os.system("tar zcf %s %s" % (self.path, targets))
|
|
|
|
os.chdir(curdir)
|
|
shutil.rmtree(tmpdir)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
pkg = pmpkg("dummy")
|
|
print pkg
|
|
# vim: set ts=4 sw=4 et:
|