Files
2010-07-15 12:18:38 +00:00

289 lines
8.8 KiB
Python
Executable File

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright (C) 2007-2010, TUBITAK/UEKAE
#
# 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.
#
# Please read the COPYING file.
import os
import shutil
import time
pspecTemplate = """<?xml version="1.0" ?>
<!DOCTYPE PISI SYSTEM "http://www.pardus.org.tr/projeler/pisi/pisi-spec.dtd">
<PISI>
<Source>
<Name>%(package)s</Name>
<Homepage>%(homepage)s</Homepage>
<Packager>
<Name>%(packager_name)s</Name>
<Email>%(packager_email)s</Email>
</Packager>
<License>GPL-2</License>
<IsA>app:gui</IsA>
<Summary>%(summary)s</Summary>
<Description>%(description)s</Description>
<Archive sha1sum="%(sha1sum)s" type="targz">%(archive)s</Archive>
</Source>
<Package>
<Name>%(package)s</Name>
<RuntimeDependencies>
%(runtimedeps)s
</RuntimeDependencies>
<Files>
<Path fileType="data">/usr/bin</Path>
</Files>
</Package>
<History>
<Update release="1">
<Date>%(date)s</Date>
<Version>0.3</Version>
<Comment>First release</Comment>
<Name>%(packager_name)s</Name>
<Email>%(packager_email)s</Email>
</Update>
</History>
</PISI>
"""
componentsTemplate = """
<Component>
<Name>%(name)s</Name>
<LocalName>%(local_name)s</LocalName>
<Summary>%(summary)s</Summary>
<Description>%(description)s</Description>
<Group>system</Group>
<Packager>
<Name>Joe Packager</Name>
<Email>joe@pardus.org.tr</Email>
</Packager>
</Component>
"""
componentTemplate = """
<PISI>
<Name>%(name)s</Name>
</PISI>
"""
actionsTemplate = """
from pisi.actionsapi import pisitools
WorkDir = "skeleton"
def install():
pisitools.dobin("skeleton.py")
pisitools.rename("/usr/bin/skeleton.py", "%s")
"""
distributionTemplate = """
<PISI>
<SourceName>%(sourcename)s</SourceName>
<Version>%(version)s</Version>
<Description>%(description)s</Description>
<Type>Core</Type>
<Obsoletes>
%(obsoletes)s
</Obsoletes>
</PISI>
"""
class Component:
def __init__(self, name):
self.name = name
def get_comp_template(self, subcomp):
return componentTemplate % {"name": subcomp}
def get_comp_path(self):
return "/".join(self.name.split("."))
def create(self):
component_path = self.get_comp_path()
if not os.path.exists(component_path):
os.makedirs(component_path)
cur_dir = os.getcwd()
cur_comp = ''
for subcomp in self.name.split("."):
os.chdir(subcomp)
if not cur_comp:
cur_comp = subcomp
else:
cur_comp = ".".join([cur_comp, subcomp])
open("component.xml", "w").write(self.get_comp_template(cur_comp))
os.chdir(cur_dir)
class Package:
def __init__(self, name, partof, deps):
self.name = name
self.partof = partof
self.deps = deps
self.component = Component(self.partof)
def get_spec_template(self):
package = self.name
homepage = "www.pardus.org.tr"
packager_name = "Joe Packager"
packager_email = "joe@pardus.org.tr"
summary = "%s is a very useful package" % self.name
description = "%s is a very useful package that is known for its usefulness." % self.name
sha1sum = "cc64dfa6e068fe1f6fb68a635878b1ea21acfac7"
archive = "http://cekirdek.uludag.org.tr/~faik/pisi/skeleton.tar.gz"
date = time.strftime("%Y-%m-%d")
partof = self.partof
runtimedeps = ""
for dep in self.deps:
runtimedeps += " <Dependency>%s</Dependency>\n" % dep
return pspecTemplate % locals()
def create(self):
self.component.create()
cur_dir = os.getcwd()
os.chdir(self.component.get_comp_path())
os.makedirs(self.name)
os.chdir(self.name)
open("pspec.xml", "w").write(self.get_spec_template())
open("actions.py", "w").write(actionsTemplate % self.name)
os.chdir(cur_dir)
class PackageFactory:
def getPackage(self, name, runtimeDeps = [], component = "system.base"):
return Package(name, component, runtimeDeps)
def getPackageBundle(self, component, *packages):
pkgs = []
for pkg in packages:
pkgs.append(Package(pkg, component, []))
return pkgs
class Repository:
def __init__(self, name, version, packages, obsoletes):
self.name = name
self.version = version
self.packages = packages
self.obsoletes = obsoletes
def get_dist_template(self):
obsoletes = ""
for obs in self.obsoletes:
obsoletes += " <Package>%s</Package>\n" % obs
return distributionTemplate % {"sourcename": "Pardus",
"version": self.version,
"description":self.name,
"obsoletes":obsoletes}
def create(self):
cur_dir = os.getcwd()
os.makedirs(self.name)
os.chdir(self.name)
open("distribution.xml", "w").write(self.get_dist_template())
for pkg in self.packages:
pkg.create()
self.create_components_xml()
os.chdir(cur_dir)
def create_components_xml(self):
xml_content = "<PISI>\n <Components>"
for root, dirs, files in os.walk("."):
if "component.xml" in files:
component = root[2:].replace("/", ".")
xml_content += componentsTemplate \
% {"name": component,
"local_name": component,
"summary": component,
"description": component}
xml_content += " </Components>\n</PISI>\n"
open("components.xml", "w").write(xml_content)
class Pardus2007Repo(Repository):
def __init__(self):
Repository.__init__(self, "pardus-2007", "2007", [], ["wengophone", "rar"])
def create(self):
pf = PackageFactory()
self.packages = [
# system.base
pf.getPackage("bash"),
pf.getPackage("curl", ["libidn", "zlib", "openssl"]),
pf.getPackage("shadow", ["db4","pam", "cracklib"]),
pf.getPackage("jpeg"),
# applications.network
pf.getPackage("ncftp", [], "applications.network"),
pf.getPackage("bogofilter", ["gsl"], "applications.network"),
pf.getPackage("gsl", [], "applications.network"),
]
# system.base
self.packages.extend(pf.getPackageBundle("system.base", "libidn", "zlib", "openssl", "db4", "pam", "cracklib"))
# applications.network
self.packages.extend(pf.getPackageBundle("applications.network", "ethtool", "nfdump"))
Repository.create(self)
class Contrib2007Repo(Repository):
def __init__(self):
Repository.__init__(self, "contrib-2007", "2007", [], ["xara"])
def create(self):
pf = PackageFactory()
self.packages = [
# applications.network
pf.getPackage("lynx", [], "applications.network"),
pf.getPackage("ctorrent", ["openssl"], "applications.network"),
pf.getPackage("lft", ["libpcap"], "applications.network"),
pf.getPackage("libpcap", [], "applications.network"),
]
# applications.util
self.packages.extend(pf.getPackageBundle("applications.util", "iat", "rpl", "cpulimit"))
Repository.create(self)
class BuildFarm:
def create_index(self, repo):
binrepo = "%s-bin" % repo
shutil.copy("%s/distribution.xml" % repo, binrepo)
os.system("pisi index %s --skip-signing -o %s/pisi-index.xml" % (repo, repo))
os.system("pisi index --skip-sources --skip-signing -o %s/pisi-index.xml %s %s" % (binrepo, binrepo, repo))
def build(self, repos):
for repo in repos:
binrepo = "%s-bin" % repo
os.mkdir(binrepo)
for root, dirs, files in os.walk(repo):
if "pspec.xml" in files:
os.system("pisi build %s/%s -O %s" % (root, "pspec.xml", binrepo))
self.create_index(repo)
if __name__ == "__main__":
Pardus2007Repo().create()
Contrib2007Repo().create()
BuildFarm().build(["pardus-2007", "contrib-2007", "repo1", "repo2"])