added packages search function

git-svn-id: http://svn.sabayonlinux.org/projects/entropy/trunk@194 cd1c1023-2f26-0410-ae45-c471fc1f0318
This commit is contained in:
lxnay
2007-03-25 23:44:15 +00:00
parent fe5575093a
commit a9d985286f
5 changed files with 130 additions and 7 deletions
+3 -1
View File
@@ -3,6 +3,7 @@ TODO list (for developers only):
- activator should care about the removal of the old packages
- build() and world(), on enzyme, add the support for whitelist+cron
- build(), on enzyme, add license blacklist (packages that cannot be shipped in a binary form)
- enzyme, add search module?
- Sabayon Linux USE flags: remove all server related use flags
Project Status:
@@ -15,4 +16,5 @@ Project Status:
Features plan:
- distcc support to enzyme
- enzyme: distcc support
- activator: add stable/ repository and the cron-aware module that moves files from the unstable/default repo to the stable one.
+5
View File
@@ -74,6 +74,7 @@ def print_help():
entropyTools.print_info(" \t\t "+entropyTools.red("--sync-back")+"\t\t sync between Entropy Portage Tree and the official one")
entropyTools.print_info(" \t\t "+entropyTools.red("--only-sync-back")+"\t only sync between Entropy Portage Tree and the official one")
entropyTools.print_info(" \t\t "+entropyTools.red("--no-overlay-sync")+"\t disable automatic overlays sync")
entropyTools.print_info(" \t"+entropyTools.green(entropyTools.bold("search"))+entropyTools.yellow("\t\t to search a package inside the Entropy Portage repository"))
entropyTools.print_info(" \t"+entropyTools.green(entropyTools.bold("cleanup"))+entropyTools.yellow("\t\t to clean temporary files"))
options = sys.argv[1:]
@@ -128,6 +129,10 @@ if (options[0] == "build"):
if (options[0] == "uninstall"):
enzymeTools.uninstall(options[1:])
sys.exit(0)
# search tool
if (options[0] == "search"):
enzymeTools.search(options[1:])
sys.exit(0)
# cleanup tool
if (options[0] == "cleanup"):
entropyTools.cleanup(options[1:])
+2
View File
@@ -70,6 +70,7 @@ ETP_RANDOM = str(random.random())[2:7]
ETP_TMPFILE = "/.random-"+ETP_RANDOM+".tmp"
ETP_REPODIR = "/repository"+"/"+ETP_ARCH_CONST
ETP_PORTDIR = "/portage"
ETP_DISTFILESDIR = "/distfiles"
ETP_DBDIR = "/database"+"/"+ETP_ARCH_CONST
ETP_UPLOADDIR = "/upload"+"/"+ETP_ARCH_CONST
ETP_STOREDIR = "/store"+"/"+ETP_ARCH_CONST
@@ -90,6 +91,7 @@ etpConst = {
'packagesstoredir': ETP_DIR+ETP_STOREDIR, # etpConst['packagesstoredir'] --> directory where .tbz2 files are stored waiting for being processed by reagent
'packagessuploaddir': ETP_DIR+ETP_UPLOADDIR, # etpConst['packagessuploaddir'] --> directory where .tbz2 files are stored waiting for being uploaded to our main mirror
'portagetreedir': ETP_DIR+ETP_PORTDIR, # directory where is stored our local portage tree
'distfilesdir': ETP_DIR+ETP_PORTDIR+ETP_DISTFILESDIR, # directory where our sources are downloaded
'overlaysdir': ETP_DIR+ETP_PORTDIR+"/local/layman", # directory where overlays are stored
'overlays': "", # variable PORTDIR_OVERLAY
'overlaysconffile': ETP_CONF_DIR+"/layman.cfg", # layman configuration file
+82 -3
View File
@@ -23,6 +23,7 @@
def initializePortageTree():
portage.settings.unlock()
portage.settings['PORTDIR'] = etpConst['portagetreedir']
portage.settings['DISTDIR'] = etpConst['distfilesdir']
portage.settings['PORTDIR_OVERLAY'] = etpConst['overlays']
portage.settings.lock()
portage.portdb.__init__(etpConst['portagetreedir'])
@@ -32,6 +33,7 @@ import os
from entropyConstants import *
os.environ['PORTDIR'] = etpConst['portagetreedir']
os.environ['PORTDIR_OVERLAY'] = etpConst['overlays']
os.environ['DISTDIR'] = etpConst['distfilesdir']
import portage
import portage_const
from portage_dep import isvalidatom, isspecific, isjustname, dep_getkey, dep_getcpv
@@ -74,6 +76,13 @@ def getBestAtom(atom):
except ValueError:
return "!!conflicts"
# same as above but includes masked ebuilds
def getBestMaskedAtom(atom):
atoms = portage.portdb.xmatch("match-all",str(atom))
# find the best
from portage_versions import best
return best(atoms)
# I need a valid complete atom...
def calculateFullAtomsDependencies(atoms, deep = False, extraopts = ""):
# in order... thanks emerge :-)
@@ -255,6 +264,40 @@ def collectBinaryFilesForInstalledPackage(atom):
def getEbuildDbPath(atom):
return portage.db['/']['vartree'].getebuildpath(atom)
def getEbuildTreePath(atom):
if atom.startswith("="):
atom = atom[1:]
rc = portage.portdb.findname(atom)
if rc != "":
return rc
else:
return None
def getPackageDownloadSize(atom):
if atom.startswith("="):
atom = atom[1:]
ebuild = getEbuildTreePath(atom)
if (ebuild is not None):
import portage_manifest
dirname = os.path.dirname(ebuild)
manifest = portage_manifest.Manifest(dirname, portage.settings["DISTDIR"])
fetchlist = portage.portdb.getfetchlist(atom, portage.settings, all=True)[1]
summary = [0,0]
try:
summary[0] = manifest.getDistfilesSize(fetchlist)
counter = str(summary[0]/1024)
filler=len(counter)
while (filler > 3):
filler-=3
counter=counter[:filler]+","+counter[filler:]
summary[0]=counter+" kB"
except KeyError, e:
return "N/A"
return summary[0]
else:
return "N/A"
def getInstalledAtoms(atom):
rc = portage.db['/']['vartree'].dep_match(str(atom))
if (rc != []):
@@ -787,11 +830,47 @@ class activatorFTP:
def closeFTPConnection(self):
self.ftpconn.quit()
# FIXME: add upload/delete/mv commands
# ------ END: activator tools ------
def packageSearch(keyword):
SearchDirs = []
# search in etpConst['portagetreedir']
# and in overlays after etpConst['overlays']
# fill the list
portageRootDir = etpConst['portagetreedir']
if not portageRootDir.endswith("/"):
portageRootDir = portageRootDir+"/"
ScanningDirectories = []
ScanningDirectories.append(portageRootDir)
for dir in etpConst['overlays'].split():
if (not dir.endswith("/")):
dir = dir+"/"
if os.path.isdir(dir):
ScanningDirectories.append(dir)
for directoryTree in ScanningDirectories:
treeList = os.listdir(directoryTree)
_treeList = []
# filter unwanted dirs
for dir in treeList:
if (dir.find("-") != -1) and os.path.isdir(directoryTree+dir):
_treeList.append(directoryTree+dir)
treeList = _treeList
for dir in treeList:
subdirs = os.listdir(dir)
for sub in subdirs:
if (not sub.startswith(".")) and (sub.find(keyword) != -1):
if os.path.isdir(dir+"/"+sub):
reldir = re.subn(directoryTree,"", dir+"/"+sub)[0]
SearchDirs.append(reldir)
# filter dupies
SearchDirs = list(set(SearchDirs))
return SearchDirs
# get a list, returns a sorted list
def alphaSorter(seq):
def stripter(s, goodchrs):
+38 -3
View File
@@ -132,9 +132,6 @@ def sync(options):
def build(atoms):
# FIXME: add USE flags management:
# packages with new USE flags must be pulled in
# unless --ignore-new-use-flags is specified
enzymeRequestVerbose = False
enzymeRequestForceRepackage = False
@@ -842,3 +839,41 @@ def uninstall(options):
print_warning(yellow(" *** ")+red("Please use --verbose and retry to see what was wrong. Continuing..."))
else:
print_info(green(" * ")+bold(atom)+" worked out successfully.")
def search(atoms):
# filter any --starting package
_atoms = []
for atom in atoms:
if (not atom.startswith("--")):
_atoms.append(atom)
keywords = _atoms
print
for keyword in keywords:
results = packageSearch(keyword)
for result in results:
# get latest version available
masked = ""
latestVersion = getBestAtom(result)
if (latestVersion == ""):
latestVersion = getBestMaskedAtom(result)
masked = " "+bold("[")+red("MASKED")+bold("]")
# get installed version
installedVer = getInstalledAtom(result)
# get Homepage
pkgHomepage = getPackageVar(latestVersion,'HOMEPAGE')
# get Description
pkgDescription = getPackageVar(latestVersion,'DESCRIPTION')
# get License
pkgLicense = getPackageVar(latestVersion,'LICENSE')
# format the output string
print_info(green(" * ")+bold(result))
print_info(red("\t Latest version available: ")+blue(latestVersion)+masked)
print_info(red("\t Latest version installed: ")+green(str(installedVer)))
print_info(red("\t Download size: ")+yellow(getPackageDownloadSize(latestVersion)))
print_info(red("\t Homepage: ")+darkred(pkgHomepage))
print_info(red("\t Description: ")+pkgDescription)
print_info(red("\t License: ")+bold(pkgLicense))
print