another milestone: allow external .tbz2 installs

git-svn-id: http://svn.sabayonlinux.org/projects/entropy/trunk@643 cd1c1023-2f26-0410-ae45-c471fc1f0318
This commit is contained in:
(no author)
2007-11-08 21:40:16 +00:00
parent 7d5466c0b4
commit df42682d14
5 changed files with 63 additions and 20 deletions
+2 -1
View File
@@ -2,8 +2,9 @@ TODO list:
CLIENT:
- add external triggerable hooks support
- include more triggers
- allow .tbz2 separate install
- finalize smartapps tool
- use depgraph generation function to generate dependencies
- installPackages should pull conflicts depends too
Project Status:
+4 -1
View File
@@ -40,13 +40,15 @@ def print_help():
print_info(" \t"+blue("status")+brown("\t\t show respositories status"))
print_info(" \t"+blue("search")+brown("\t\t search a package trough repositories"))
print_info(" \t"+blue("world")+brown("\t\t update system with the latest available packages"))
print_info(" \t\t"+red("--ask")+"\t\t\t ask before making any changes")
print_info(" \t\t"+red("--fetch")+"\t\t\t just download packages without doing the install")
print_info(" \t\t"+red("--pretend")+"\t\t just show what would be done")
print_info(" \t\t"+red("--verbose")+"\t\t show more details about what's going on")
print_info(" \t\t"+red("--replay")+"\t\t reinstall all the packages and their dependencies")
print_info(" \t"+blue("install")+brown("\t\t install one or more packages"))
print_info(" \t"+blue("install")+brown("\t\t install one or more packages or .tbz2"))
print_info(" \t\t"+red("--ask")+"\t\t\t ask before making any changes")
print_info(" \t\t"+red("--pretend")+"\t\t just show what would be done")
print_info(" \t\t"+red("--fetch")+"\t\t\t just download packages without doing the install")
@@ -55,6 +57,7 @@ def print_help():
print_info(" \t\t"+red("--deep")+"\t\t\t analyze dependencies deeply")
print_info(" \t\t"+red("--verbose")+"\t\t show more details about what's going on")
print_info(" \t\t"+red("--configfiles")+"\t\t also remove old configuration files [use with care]")
print_info(" \t"+blue("remove")+brown("\t\t remove one or more packages"))
print_info(" \t\t"+red("--deep")+"\t\t\t also pull unused dependencies where depends list is empty")
print_info(" \t\t"+red("--configfiles")+"\t\t also remove configuration files")
+41 -11
View File
@@ -29,8 +29,8 @@ from entropyConstants import *
from clientConstants import *
from outputTools import *
from remoteTools import downloadData, getOnlineContent
from entropyTools import unpackGzip, unpackBzip2, compareMd5, bytesIntoHuman, askquestion, getRandomNumber, isjustname, dep_getkey, compareVersions as entropyCompareVersions, filterDuplicatedEntries, extractDuplicatedEntries, uncompressTarBz2, extractXpak, applicationLockCheck, countdown, isRoot, spliturl, remove_tag, dep_striptag, md5sum, allocateMaskedFile, istextfile, isnumber
from databaseTools import etpDatabase, openRepositoryDatabase, openClientDatabase
from entropyTools import unpackGzip, unpackBzip2, compareMd5, bytesIntoHuman, askquestion, getRandomNumber, isjustname, dep_getkey, compareVersions as entropyCompareVersions, filterDuplicatedEntries, extractDuplicatedEntries, uncompressTarBz2, extractXpak, applicationLockCheck, countdown, isRoot, spliturl, remove_tag, dep_striptag, md5sum, allocateMaskedFile, istextfile, isnumber, extractEdb
from databaseTools import etpDatabase, openRepositoryDatabase, openClientDatabase, openGenericDatabase
import triggerTools
import confTools
import dumpTools
@@ -373,7 +373,7 @@ def fetchRepositoryIfNotAvailable(reponame):
@ exit errors:
-1 => repository cannot be fetched online
'''
def atomMatch(atom, caseSentitive = True, matchSlot = None, matchBranches = (), xcache = True): # no one seems to use matchBranches :D
def atomMatch(atom, caseSentitive = True, matchSlot = None, matchBranches = (), xcache = True):
if xcache:
cached = atomMatchCache.get(atom)
@@ -1314,7 +1314,10 @@ def installPackage(infoDict):
contentCache[x] = 1
# unpack and install
pkgpath = etpConst['entropyworkdir']+"/"+package
if infoDict['repository'].endswith(".tbz2"):
pkgpath = etpRepositories[infoDict['repository']]['pkgpath']
else:
pkgpath = etpConst['entropyworkdir']+"/"+package
unpackDir = etpConst['entropyunpackdir']+"/"+package
if os.path.isdir(unpackDir):
os.system("rm -rf "+unpackDir)
@@ -1732,6 +1735,7 @@ def package(options):
equoRequestReplay = False
rc = 0
_myopts = []
mytbz2paths = []
for opt in myopts:
if (opt == "--ask"):
equoRequestAsk = True
@@ -1754,7 +1758,10 @@ def package(options):
elif (opt == "--replay"):
equoRequestReplay = True
else:
_myopts.append(opt)
if opt[-5:] == ".tbz2" and os.access(opt,os.R_OK):
mytbz2paths.append(opt)
else:
_myopts.append(opt)
myopts = _myopts
if (options[0] == "deptest"):
@@ -1762,9 +1769,9 @@ def package(options):
rc, garbage = dependenciesTest(quiet = equoRequestQuiet, ask = equoRequestAsk, pretend = equoRequestPretend)
elif (options[0] == "install"):
if len(myopts) > 0:
if (myopts) or (mytbz2paths):
loadCaches()
rc, status = installPackages(myopts, ask = equoRequestAsk, pretend = equoRequestPretend, verbose = equoRequestVerbose, deps = equoRequestDeps, emptydeps = equoRequestEmptyDeps, onlyfetch = equoRequestOnlyFetch, deepdeps = equoRequestDeep, configFiles = equoRequestConfigFiles)
rc, status = installPackages(myopts, ask = equoRequestAsk, pretend = equoRequestPretend, verbose = equoRequestVerbose, deps = equoRequestDeps, emptydeps = equoRequestEmptyDeps, onlyfetch = equoRequestOnlyFetch, deepdeps = equoRequestDeep, configFiles = equoRequestConfigFiles, tbz2 = mytbz2paths)
else:
print_error(red(" Nothing to do."))
rc = 127
@@ -2101,7 +2108,7 @@ def worldUpdate(ask = False, pretend = False, verbose = False, onlyfetch = False
clientDbconn.closeDB()
return 0,0
def installPackages(packages = [], atomsdata = [], ask = False, pretend = False, verbose = False, deps = True, emptydeps = False, onlyfetch = False, deepdeps = False, configFiles = False):
def installPackages(packages = [], atomsdata = [], ask = False, pretend = False, verbose = False, deps = True, emptydeps = False, onlyfetch = False, deepdeps = False, configFiles = False, tbz2 = []):
# check if I am root
if (not isRoot()) and (not pretend):
@@ -2114,6 +2121,28 @@ def installPackages(packages = [], atomsdata = [], ask = False, pretend = False,
foundAtoms = []
for package in packages:
foundAtoms.append([package,atomMatch(package)])
if tbz2:
for pkg in tbz2:
# create a repository for each database
basefile = os.path.basename(pkg)
if os.path.isdir(etpConst['entropyunpackdir']+"/"+basefile[:-5]):
shutil.rmtree(etpConst['entropyunpackdir']+"/"+basefile[:-5])
os.makedirs(etpConst['entropyunpackdir']+"/"+basefile[:-5])
dbfile = extractEdb(pkg,dbpath = etpConst['entropyunpackdir']+"/"+basefile[:-5]+"/packages.db")
# add dbfile
etpRepositories[basefile] = {}
etpRepositories[basefile]['description'] = "Dynamic database from "+basefile
etpRepositories[basefile]['packages'] = []
etpRepositories[basefile]['dbpath'] = os.path.dirname(dbfile)
etpRepositories[basefile]['pkgpath'] = os.path.realpath(pkg) # extra info added
etpRepositories[basefile]['configprotect'] = set()
etpRepositories[basefile]['configprotectmask'] = set()
mydbconn = openGenericDatabase(dbfile)
# read all idpackages
myidpackages = mydbconn.listAllIdpackages() # all branches admitted from external files
for myidpackage in myidpackages:
foundAtoms.append([pkg,(int(myidpackage),basefile)])
mydbconn.closeDB()
# filter packages not found
_foundAtoms = []
@@ -2431,9 +2460,10 @@ def installPackages(packages = [], atomsdata = [], ask = False, pretend = False,
steps = []
# download
if (actionQueue[pkgatom]['fetch'] < 0):
steps.append("fetch")
steps.append("checksum")
if not repository.endswith(".tbz2"):
if (actionQueue[pkgatom]['fetch'] < 0):
steps.append("fetch")
steps.append("checksum")
# differential remove list
if (actionQueue[pkgatom]['removeidpackage'] != -1):
+12 -5
View File
@@ -523,12 +523,20 @@ def openClientDatabase(xcache = True):
'''
@description: open the entropy server database and returns the pointer. This function must be used only by reagent or activator
@output: database pointer or, -1 if error
@output: database pointer
'''
def openServerDatabase(readOnly = True, noUpload = True):
conn = etpDatabase(readOnly = readOnly, dbFile = etpConst['etpdatabasefilepath'], noUpload = noUpload)
return conn
'''
@description: open a generic client database and returns the pointer.
@output: database pointer
'''
def openGenericDatabase(dbfile):
conn = etpDatabase(readOnly = False, dbFile = dbfile, clientDatabase = True, dbname = "generic", xcache = False)
return conn
# this class simply describes the current database status
# FIXME: need a rewrite? simply using dicts, perhaps?
class databaseStatus:
@@ -2781,11 +2789,10 @@ class etpDatabase:
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE name = "'+name+'" and version = "'+version+'" and idcategory = '+str(idcat)+branchstring)
else:
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE LOWER(name) = "'+name.lower()+'" and version = "'+version+'" and idcategory = '+str(idcat)+branchstring)
if (self.xcache):
self.storeSearchCache((name,version,category,branch,sensitive),'searchPackagesByNameAndVersionAndCategory',results)
results = self.cursor.fetchall()
if (self.xcache):
self.storeSearchCache((name,version,category,branch,sensitive),'searchPackagesByNameAndVersionAndCategory',results)
return results
def listAllPackages(self):
+4 -2
View File
@@ -211,10 +211,11 @@ def aggregateEdb(tbz2file,dbfile):
f.flush()
f.close()
def extractEdb(tbz2file):
def extractEdb(tbz2file, dbpath = None):
entropyLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"extractEdb: called -> "+tbz2file)
old = open(tbz2file,"rb")
dbpath = tbz2file[:-5]+".db"
if not dbpath:
dbpath = tbz2file[:-5]+".db"
db = open(dbpath,"wb")
# position old to the end
@@ -241,6 +242,7 @@ def extractEdb(tbz2file):
db.flush()
db.close()
old.close()
return dbpath
# This function creates the .md5 file related to the given package file