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)