Pekala, bu büyük bir commit...
Daha önce bahsettiğimiz config sınıfının bir instance'ının tüm süreç tarafından kullanılması esasına dayanıyor. Config yerine bir "context/bağlam" yaratılıyor ve tüm sabit(constant) ve değişken yapılandırma seçenekleri (PSPEC dosyası da dahil olmak üzere) bu bağlam üzerinden taşınıyor. Biraz daha düzenleme gelecek. Çalışan bir sürüm çıkarttığım için commit ediyorum.
This commit is contained in:
+4
-1
@@ -46,8 +46,11 @@ def main():
|
||||
else:
|
||||
pspec = args[0]
|
||||
|
||||
# What we need to do first is create a context with our specfile
|
||||
ctx = pisi.config.Context(pspec)
|
||||
|
||||
# don't do the real job here. this is just a CLI!
|
||||
pb = PisiBuild(pspec)
|
||||
pb = PisiBuild(ctx)
|
||||
pb.build()
|
||||
|
||||
|
||||
|
||||
+11
-11
@@ -9,14 +9,13 @@ import tarfile
|
||||
import zipfile
|
||||
|
||||
#pisi modules
|
||||
import config
|
||||
import util
|
||||
|
||||
class ArchiveBase(object):
|
||||
def __init__(self, type, fileName):
|
||||
self.type = type
|
||||
self.fileName = fileName
|
||||
self.filePath = config.archives_dir() + '/' + self.fileName
|
||||
def __init__(self, ctx):
|
||||
self.type = ctx.spec.source.archiveType
|
||||
self.fileName = os.path.basename(ctx.spec.source.archiveUri)
|
||||
self.filePath = ctx.archives_dir() + '/' + self.fileName
|
||||
|
||||
def unpack(self, targetDir):
|
||||
self.targetDir = targetDir
|
||||
@@ -27,8 +26,8 @@ class ArchiveBase(object):
|
||||
os.makedirs(self.targetDir)
|
||||
|
||||
class ArchiveTarFile(ArchiveBase):
|
||||
def __init__(self, type, fileName):
|
||||
super(ArchiveTarFile, self).__init__(type, fileName)
|
||||
def __init__(self, ctx):
|
||||
super(ArchiveTarFile, self).__init__(ctx)
|
||||
|
||||
def unpack(self, targetDir):
|
||||
super(ArchiveTarFile, self).unpack(targetDir)
|
||||
@@ -49,8 +48,8 @@ class ArchiveTarFile(ArchiveBase):
|
||||
tar.close()
|
||||
|
||||
class ArchiveZip(ArchiveBase):
|
||||
def __init__(self, type, fileName):
|
||||
super(ArchiveZip, self).__init__(type, fileName)
|
||||
def __init__(self, ctx):
|
||||
super(ArchiveZip, self).__init__(ctx)
|
||||
|
||||
def unpack(self, targetDir):
|
||||
super(ArchiveZip, self).unpack(targetDir)
|
||||
@@ -86,7 +85,7 @@ class ArchiveZip(ArchiveBase):
|
||||
class Archive:
|
||||
"""Unpack magic for Archive files..."""
|
||||
|
||||
def __init__(self, type, fileName):
|
||||
def __init__(self, ctx):
|
||||
"""accepted archive types:
|
||||
targz, tarbz2, zip, tar"""
|
||||
|
||||
@@ -97,7 +96,8 @@ class Archive:
|
||||
'zip': ArchiveZip
|
||||
}
|
||||
|
||||
self.archive = actions.get(type)(type, fileName)
|
||||
type = ctx.spec.source.archiveType
|
||||
self.archive = actions.get(type)(ctx)
|
||||
|
||||
def unpack(self, targetDir):
|
||||
self.archive.unpack(targetDir)
|
||||
|
||||
+12
-24
@@ -5,13 +5,11 @@
|
||||
# python standard library
|
||||
import os
|
||||
|
||||
from specfile import SpecFile
|
||||
from fetcher import Fetcher
|
||||
from archive import Archive
|
||||
|
||||
# import pisipackage
|
||||
import util
|
||||
import config
|
||||
import ui
|
||||
|
||||
class PisiBuildError(Exception):
|
||||
@@ -28,17 +26,11 @@ def displayProgress(pd):
|
||||
|
||||
class PisiBuild:
|
||||
"""PisiBuild class, provides the package build and creation routines"""
|
||||
def __init__(self, pspecfile):
|
||||
self.pspecfile = pspecfile
|
||||
spec = SpecFile()
|
||||
spec.read(pspecfile)
|
||||
spec.verify() # check pspec integrity
|
||||
|
||||
self.work_dir = config.build_work_dir(spec.source.name,
|
||||
spec.source.version,
|
||||
spec.source.release)
|
||||
def __init__(self, context):
|
||||
self.ctx = context
|
||||
self.work_dir = self.ctx.build_work_dir()
|
||||
|
||||
self.spec = spec
|
||||
self.spec = self.ctx.spec
|
||||
|
||||
def build(self):
|
||||
ui.info("Building PISI source package: %s\n" % self.spec.source.name)
|
||||
@@ -46,23 +38,23 @@ class PisiBuild:
|
||||
ui.info("Fetching source from: %s\n" % self.spec.source.archiveUri)
|
||||
self.fetchArchive(displayProgress)
|
||||
ui.info("Source archive is stored: %s/%s\n"
|
||||
%(config.archives_dir(), self.spec.source.archiveName))
|
||||
%(self.ctx.archives_dir(), self.spec.source.archiveName))
|
||||
|
||||
self.solveBuildDependencies()
|
||||
|
||||
ui.info("Unpacking archive...")
|
||||
targetDir = self.unpackArchive()
|
||||
ui.info(" unpacked (%s)\n" % targetDir)
|
||||
self.unpackArchive()
|
||||
ui.info(" unpacked (%s)\n" % self.ctx.build_work_dir())
|
||||
|
||||
# applyPatches()
|
||||
|
||||
self.actionScript = open( os.path.dirname( self.pspecfile ) + '/' + 'actions' ).read()
|
||||
self.actionScript = open( os.path.dirname( self.ctx.pspecfile ) + '/' + 'actions' ).read()
|
||||
|
||||
# FIXME: It's wrong to assume that unpacked archive
|
||||
# will create a name-version top-level directory.
|
||||
# Archive module should give the exact location.
|
||||
# (from the assumption is evil dept.)
|
||||
os.chdir( config.build_work_dir( self.spec.source.name, self.spec.source.version, self.spec.source.release ) + "/" + self.spec.source.name + "-" + self.spec.source.version)
|
||||
os.chdir( self.ctx.build_work_dir() + "/" + self.spec.source.name + "-" + self.spec.source.version)
|
||||
locals = globals = {}
|
||||
|
||||
try:
|
||||
@@ -79,10 +71,9 @@ class PisiBuild:
|
||||
self.installSource( locals )
|
||||
|
||||
def fetchArchive(self, percentHook=None):
|
||||
"""fetch an archive and store to config.archives_dir()
|
||||
"""fetch an archive and store to ctx.archives_dir()
|
||||
using fether.Fetcher"""
|
||||
fetch = Fetcher(self.spec.source.archiveUri,
|
||||
self.spec.source.archiveName)
|
||||
fetch = Fetcher(self.ctx)
|
||||
|
||||
# check if source already cached
|
||||
destpath = fetch.filedest + "/" + fetch.filename
|
||||
@@ -104,10 +95,7 @@ class PisiBuild:
|
||||
pass
|
||||
|
||||
def unpackArchive(self):
|
||||
type = self.spec.source.archiveType
|
||||
fileName = self.spec.source.archiveName
|
||||
|
||||
archive = Archive(type, fileName)
|
||||
archive = Archive(self.ctx)
|
||||
archive.unpack(self.work_dir)
|
||||
|
||||
def applyPatches(self):
|
||||
|
||||
+82
-26
@@ -1,40 +1,96 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# PISI configuration (static and dynamic)
|
||||
|
||||
lib_dir_suffix = "/var/lib/pisi"
|
||||
db_dir_suffix = "/var/db/pisi"
|
||||
archives_dir_suffix = "/var/cache/pisi/archives"
|
||||
tmp_dir_suffix = "/var/tmp/pisi"
|
||||
from specfile import SpecFile
|
||||
|
||||
# directory suffixes for build
|
||||
# I'm not comfortable with these and accompanying functions,
|
||||
# but could find a cleaner way for now.
|
||||
build_work_dir_suffix = "/work"
|
||||
build_install_dir_suffix = "/install"
|
||||
class Constants:
|
||||
"""Pisi constants"""
|
||||
class __const:
|
||||
"""Constant members implementation"""
|
||||
class ConstError(TypeError):
|
||||
pass
|
||||
|
||||
def __setattr__(self, name, value):
|
||||
if self.__dict__.has_key(name):
|
||||
raise self.ConstError, "Can't rebind constant: %s" % name
|
||||
# Binding an attribute once to a const is available
|
||||
self.__dict__[name] = value
|
||||
|
||||
def __delattr__(self, name):
|
||||
if self.__dict__.has_key(name):
|
||||
raise self.ConstError, "Can't unbind constant: %s" % name
|
||||
# we don't have an attribute by this name
|
||||
raise NameError, name
|
||||
|
||||
c = __const()
|
||||
|
||||
def __init__(self):
|
||||
self.c.lib_dir_suffix = "/var/lib/pisi"
|
||||
self.c.db_dir_suffix = "/var/db/pisi"
|
||||
self.c.archives_dir_suffix = "/var/cache/pisi/archives"
|
||||
self.c.tmp_dir_suffix = "/var/tmp/pisi"
|
||||
|
||||
# directory suffixes for build
|
||||
self.c.build_work_dir_suffix = "/work"
|
||||
self.c.build_install_dir_suffix = "/install"
|
||||
|
||||
def __getattr__(self, attr):
|
||||
return getattr(self.c, attr)
|
||||
|
||||
def __setattr__(self, attr, value):
|
||||
return setattr(self.c, attr, value)
|
||||
|
||||
|
||||
destdir = '' # install default to root by default
|
||||
class Context(object):
|
||||
"""Config/Context Singleton"""
|
||||
class __impl:
|
||||
def __init__(self):
|
||||
self.const = Constants()
|
||||
# self.c.destdir = '' # install default to root by default
|
||||
self.const.destdir = './tmp' # only for ALPHA
|
||||
# the idea is that destdir can be set with --destdir=...
|
||||
|
||||
destdir = './tmp' # only for ALPHA
|
||||
def _specFile(self, pspecfile):
|
||||
self.pspecfile = pspecfile
|
||||
spec = SpecFile()
|
||||
spec.read(pspecfile)
|
||||
spec.verify() # check pspec integrity
|
||||
|
||||
# the idea is that destdir can be set with --destdir=...
|
||||
self.spec = spec
|
||||
|
||||
def lib_dir():
|
||||
return destdir + lib_dir_suffix
|
||||
def lib_dir(self):
|
||||
return self.const.destdir + self.const.lib_dir_suffix
|
||||
|
||||
def db_dir():
|
||||
return destdir + db_dir_suffix
|
||||
def db_dir(self):
|
||||
return self.const.destdir + self.const.db_dir_suffix
|
||||
|
||||
def archives_dir():
|
||||
return destdir + archives_dir_suffix
|
||||
def archives_dir(self):
|
||||
return self.const.destdir + self.const.archives_dir_suffix
|
||||
|
||||
def tmp_dir(self):
|
||||
return self.const.destdir + self.const.tmp_dir_suffix
|
||||
|
||||
def build_work_dir(self):
|
||||
packageDir = self.spec.source.name + '-' \
|
||||
+ self.spec.source.version + '-' + self.spec.source.release
|
||||
|
||||
def tmp_dir():
|
||||
return destdir + tmp_dir_suffix
|
||||
return self.const.destdir + self.const.tmp_dir_suffix \
|
||||
+ '/' + packageDir + self.const.build_work_dir_suffix
|
||||
|
||||
def build_work_dir(packageName, version, release):
|
||||
packageDir = packageName + '-' + version + '-' + release
|
||||
return destdir + tmp_dir_suffix + '/' + packageDir + build_work_dir_suffix
|
||||
def build_install_dir(self):
|
||||
packageDir = self.spec.source.name + '-' \
|
||||
+ self.spec.source.version + '-' + self.spec.source.release
|
||||
|
||||
def build_install_dir(packageName, version, release):
|
||||
packageDir = packageName + '-' + version + '-' + release
|
||||
return destdir + tmp_dir_suffix + '/' + packageDir + build_install_dir_suffix
|
||||
return self.const.destdir + self.const.tmp_dir_suffix \
|
||||
+ '/' + packageDir + self.const.build_install_dir_suffix
|
||||
|
||||
__instance = __impl()
|
||||
|
||||
def __init__(self, pspecfile):
|
||||
self.__instance._specFile(pspecfile)
|
||||
|
||||
def __getattr__(self, attr):
|
||||
return getattr(self.__instance, attr)
|
||||
|
||||
def __setattr__(self, attr, value):
|
||||
return setattr(self.__instance, attr, value)
|
||||
|
||||
+4
-5
@@ -11,7 +11,6 @@ from sys import exit
|
||||
from sys import stderr
|
||||
|
||||
# pisi modules
|
||||
import config
|
||||
import util
|
||||
|
||||
class FetchError (Exception):
|
||||
@@ -19,9 +18,9 @@ class FetchError (Exception):
|
||||
|
||||
class Fetcher:
|
||||
"""Yet another Pisi tool for fetching files from various sources.."""
|
||||
def __init__(self, uri, fileName):
|
||||
self.uri = uri
|
||||
self.filedest = config.archives_dir()
|
||||
def __init__(self, ctx):
|
||||
self.uri = ctx.spec.source.archiveUri
|
||||
self.filedest = ctx.archives_dir()
|
||||
util.check_dir(self.filedest)
|
||||
self.scheme = "file"
|
||||
self.netloc = ""
|
||||
@@ -33,7 +32,7 @@ class Fetcher:
|
||||
from string import split
|
||||
u = urlparse.urlparse(self.uri)
|
||||
self.scheme, self.netloc, self.filepath = u[0], u[1], u[2]
|
||||
self.filename = fileName
|
||||
self.filename = os.path.basename(self.uri)
|
||||
|
||||
def fetch (self):
|
||||
"""Return value: Fetched file's full path.."""
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
|
||||
<!DOCTYPE PSPEC SYSTEM
|
||||
"http://www.uludag.org.tr/projeler/pisi/pisi-spec.dtd">
|
||||
|
||||
<PSPEC>
|
||||
|
||||
<Source>
|
||||
<Name>sandbox</Name>
|
||||
<Homepage>http://cekirdek.uludag.org.tr/~meren/</Homepage>
|
||||
<Packager>
|
||||
<Name>Meral</Name>
|
||||
<Email>meren@uludag.org.tr</Email>
|
||||
</Packager>
|
||||
<License>As-Is</License>
|
||||
<Archive archType="zip" md5sum="2ac9dfd81c07a91019d628268fee6ce1">
|
||||
http://cekirdek.uludag.org.tr/~meren/sandbox.zip
|
||||
</Archive>
|
||||
<History>
|
||||
<Update>
|
||||
<Date>06/15/2005</Date>
|
||||
<Version>0.1</Version>
|
||||
<Release>1</Release>
|
||||
</Update>
|
||||
</History>
|
||||
</Source>
|
||||
|
||||
<Package>
|
||||
<Name>sandbox</Name>
|
||||
<Summary lang="tr">Bla</Summary>
|
||||
<Category>temprorary:zip</Category>
|
||||
</Package>
|
||||
</PSPEC>
|
||||
@@ -4,24 +4,21 @@ from os.path import exists as pathexists
|
||||
from os.path import basename, islink
|
||||
|
||||
from pisi import archive
|
||||
from pisi import specfile
|
||||
from pisi import fetcher
|
||||
from pisi import util
|
||||
from pisi import config
|
||||
|
||||
class ArchiveFileTestCase(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.spec = specfile.SpecFile()
|
||||
self.spec.read("samples/popt.pspec")
|
||||
|
||||
# def setUp(self):
|
||||
# pass
|
||||
|
||||
def testUnpackTar(self):
|
||||
targetDir = config.build_work_dir(self.spec.source.name,
|
||||
self.spec.source.version,
|
||||
self.spec.source.release)
|
||||
achv = archive.Archive(self.spec.source.archiveType,
|
||||
self.spec.source.archiveName)
|
||||
ctx = config.Context("samples/popt.pspec")
|
||||
|
||||
targetDir = ctx.build_work_dir()
|
||||
achv = archive.Archive(ctx)
|
||||
|
||||
assert self.spec.source.archiveType == "targz"
|
||||
assert ctx.spec.source.archiveType == "targz"
|
||||
|
||||
# unpacking is trivial with Archive()
|
||||
achv.unpack(targetDir)
|
||||
@@ -38,16 +35,15 @@ class ArchiveFileTestCase(unittest.TestCase):
|
||||
"171545adab7b51ebf6ec5575d3000a95")
|
||||
|
||||
def testUnpackZip(self):
|
||||
# first, we need to fetch a zip file
|
||||
uri = "http://cekirdek.uludag.org.tr/~meren/sandbox.zip"
|
||||
filename = basename(uri)
|
||||
fetch = fetcher.Fetcher(uri, filename)
|
||||
ctx = config.Context("samples/sandbox.pspec")
|
||||
fetch = fetcher.Fetcher(ctx)
|
||||
fetch.fetch()
|
||||
|
||||
# imaginary name, version and release for our test zip file
|
||||
targetDir = config.build_work_dir("sandbox", "0.1", "1")
|
||||
targetDir = ctx.build_work_dir()
|
||||
|
||||
achv = archive.Archive("zip", filename)
|
||||
assert ctx.spec.source.archiveType == "zip"
|
||||
|
||||
achv = archive.Archive(ctx)
|
||||
achv.unpack(targetDir)
|
||||
|
||||
assert pathexists(targetDir + "/sandbox")
|
||||
|
||||
@@ -3,23 +3,21 @@ import unittest
|
||||
import os
|
||||
|
||||
from pisi import fetcher
|
||||
from pisi import specfile
|
||||
from pisi import util
|
||||
from pisi import config
|
||||
|
||||
class FetcherTestCase(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.spec = specfile.SpecFile()
|
||||
self.spec.read("samples/popt.pspec")
|
||||
self.ctx = config.Context("samples/popt.pspec")
|
||||
|
||||
self.fetch = fetcher.Fetcher(self.spec.source.archiveUri,
|
||||
self.spec.source.archiveName)
|
||||
self.fetch = fetcher.Fetcher(self.ctx)
|
||||
|
||||
def testFetch(self):
|
||||
self.fetch.fetch()
|
||||
destpath = self.fetch.filedest + "/" + self.fetch.filename
|
||||
if os.access(destpath, os.R_OK):
|
||||
self.assertEqual(util.md5_file(destpath),
|
||||
self.spec.source.archiveMD5)
|
||||
self.ctx.spec.source.archiveMD5)
|
||||
|
||||
|
||||
suite = unittest.makeSuite(FetcherTestCase)
|
||||
|
||||
Reference in New Issue
Block a user