diff --git a/tools/ebuild2pisi.py b/tools/ebuild2pisi.py new file mode 100644 index 00000000..eba907ad --- /dev/null +++ b/tools/ebuild2pisi.py @@ -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=''' + + + + + + %(packagename)s + %(homepage)s + + PACKAGER + PACKAGER_EMAIL + + %(license)s + category + component + %(description)s + %(description)s + %(archiveUri)s + +%(patches)s + + +%(buildDep)s + + + + %(updateDate)s + %(updateVersion)s + %(updateRelease)s + + + + + + %(packagename)s + +%(runDep)s + + +FILES + + + + +''' + +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"+dep+"" + + 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+"" + + 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)