#!/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 = """
%(package)s
%(homepage)s
%(packager_name)s
%(packager_email)s
GPL-2
app:gui
%(summary)s
%(description)s
%(archive)s
%(package)s
%(runtimedeps)s
/usr/bin
%(date)s
0.3
First release
%(packager_name)s
%(packager_email)s
"""
componentsTemplate = """
%(name)s
%(local_name)s
%(summary)s
%(description)s
system
Joe Packager
joe@pardus.org.tr
"""
componentTemplate = """
%(name)s
"""
actionsTemplate = """
from pisi.actionsapi import pisitools
WorkDir = "skeleton"
def install():
pisitools.dobin("skeleton.py")
pisitools.rename("/usr/bin/skeleton.py", "%s")
"""
distributionTemplate = """
%(sourcename)s
%(version)s
%(description)s
Core
%(obsoletes)s
"""
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 += " %s\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 += " %s\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 = "\n "
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 += " \n\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"])