Tek bir ebuild'i PSPEC haline getiriyor. Patch'leri de almaya çalışıyor.

Çağlar:
portage2pisi yerine bunu kullanalım mı? Tüm overlay deposunu bir anda çevirmek
büyük ihtimal ile istemeyeceğiz. Bu otomatik araçlar adam gibi bir PSPEC
yazamayacaklar, mutlaka el ile müdahale gerekecek zaten.
Bu tek bir dosya ve kullanımı diğerine göre daha basit sanırım. Ne dersin?
This commit is contained in:
Barış Metin
2005-07-03 14:23:07 +00:00
parent 96a3960c18
commit fe5ac2cdbf
+182
View File
@@ -0,0 +1,182 @@
#!/usr/bin/python
import sys
import re
import datetime
sys.path.insert(0, "/usr/lib/portage/pym")
import portage
PSPEC_TEMPLATE='''<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE PISI SYSTEM "http://www.uludag.org.tr/projeler/pisi/pisi-spec.dtd">
<PISI>
<Source>
<Name>%(packagename)s</Name>
<Homepage>%(homepage)s</Homepage>
<Packager>
<Name>PACKAGER</Name>
<Email>PACKAGER_EMAIL</Email>
</Packager>
<License>%(license)s</License>
<IsA>category</IsA>
<PartOf>component</PartOf>
<Summary xml:lang="en">%(description)s</Summary>
<Description xml:lang="en">%(description)s</Description>
<Archive type="%(archiveType)s" sha1sum="SUM">%(archiveUri)s</Archive>
<Patches>
%(patches)s
</Patches>
<BuildDependencies>
%(buildDep)s
</BuildDependencies>
<History>
<Update>
<Date>%(updateDate)s</Date>
<Version>%(updateVersion)s</Version>
<Release>%(updateRelease)s</Release>
</Update>
</History>
</Source>
<Package>
<Name>%(packagename)s</Name>
<RuntimeDependencies>
%(runDep)s
</RuntimeDependencies>
<Files>
FILES
</Files>
</Package>
</PISI>
'''
def packageVersion(pkg):
if len(pkg) > 1:
parts = portage.catpkgsplit(pkg)
if parts == None:
return ""
if parts[3] != 'r0':
version = parts[2] + "-" + parts[3]
else:
version = parts[2]
return version
else:
return False
def getArchiveType(uri):
if uri.endswith("gz"):
return "targz"
elif uri.endswith("bz2"):
return "tarbz2"
elif uri.endswith("tar"):
return "tar"
elif uri.endswith("zip"):
return "zip"
return "UNKNOWN_TYPE"
def getDepString(deps):
depString = "Dependencies should be reformated and check for correctness"
for dep in portage.flatten(portage.tokenize(deps)):
depString += "\n\t\t<Dependency>"+dep+"</Dependency>"
return depString
def getPatches(filename, pkgName, version):
fileObj = open(filename)
patchList=[]
# ebuild variables
rc = re.compile
dispatcher = {
rc("\$\{FILESDIR\}"): "",
rc('"'): "",
rc('^/'): "",
rc("\$\{P\}|\$\{PF\}"): "-".join([pkgName,version]),
rc("\$\{PN\}"): pkgName
}
patched = False
for line in fileObj:
line = line.strip()
if line.startswith('#'):
continue
p = rc("\Aepatch ").search(line)
if not p:
p = rc("\Apatch ").search(line)
if p:
patched = True
line = line[p.end():]
for r in dispatcher.keys():
m = r.search(line)
while m:
line = line[:m.start()] + dispatcher[r] + line[m.end():]
m = r.search(line)
patchList.append(line)
patchString = "Patches should be checked for correctness"
for patch in patchList:
patchString += "\n\t\t<Patch>"+patch+"</Patch>"
return patchString
def main(ebuild):
dict = {}
db = portage.portdb
getKeys = lambda x: db.aux_get(ebuild, [x])
getKey = lambda x: getKeys(x)[0]
dict["homepage"] = getKey("HOMEPAGE")
dict["archiveUri"] = getKey("SRC_URI").split()[0]
dict["archiveType"] = getArchiveType(dict["archiveUri"])
dict["packagename"] = portage.catpkgsplit(ebuild)[1]
dict["license"] = getKey("LICENSE")
dict["description"] = getKey("DESCRIPTION")
dict["updateDate"] = datetime.date.today()
# version & release
if '-' in packageVersion(ebuild):
(version, release) = packageVersion(ebuild).split("-")
release = release.replace("r","")
else:
version = packageVersion(ebuild)
release = ''
dict["updateVersion"] = version
dict["updateRelease"] = release
# buildDep & runDep
deps = getKeys("DEPEND")
dict["buildDep"] = getDepString(deps)
dict["runDep"] = getDepString(getKeys("RDEPEND"))
# patches
dict["patches"] = getPatches(db.findname(ebuild),
dict["packagename"],
dict["updateVersion"])
print PSPEC_TEMPLATE % dict
if __name__ == "__main__":
usage = """Usage:
PORTDIR=/path/to/portage/overlay %s category/ebuild
Example:
PORTDIR=/trunk/ %s app-admin/fam-2.7.0-r2
You don't have to define PORTDIR if you are converting a package from
the main portage repository.
"""
try:
ebuild = sys.argv[1]
except:
print usage
sys.exit(1)
main(ebuild)