diff --git a/TODO b/TODO index 61521e7fb..8aefeea85 100644 --- a/TODO +++ b/TODO @@ -2,7 +2,6 @@ TODO list - server-side: write a ncurses interface to manage entropy database + spm interface + GLSA - split RDEPEND and PDEPEND (*) - add i18n support - - log messages from portage doebuild() calls - Community repositories - implement notice board - implement configuration files snapshot tool diff --git a/libraries/databaseTools.py b/libraries/databaseTools.py index 6b6abe1ad..e3935f2cc 100644 --- a/libraries/databaseTools.py +++ b/libraries/databaseTools.py @@ -3381,6 +3381,7 @@ class etpDatabase: self.createLicensedataIndex() self.createLicensesIndex() self.createConfigProtectReferenceIndex() + self.createMessagesIndex() def createNeededIndex(self): if self.indexing: @@ -3388,6 +3389,10 @@ class etpDatabase: self.cursor.execute('CREATE INDEX IF NOT EXISTS neededindex_idneeded ON needed ( idneeded )') self.commitChanges() + def createMessagesIndex(self): + if self.indexing: + self.cursor.execute('CREATE INDEX IF NOT EXISTS messagesindex ON messages ( idpackage )') + def createUseflagsIndex(self): if self.indexing: self.cursor.execute('CREATE INDEX IF NOT EXISTS useflagsindex ON useflagsreference ( flagname )') @@ -3554,7 +3559,7 @@ class etpDatabase: self.cursor.execute('UPDATE baseinfo SET trigger = 0') def createMessagesTable(self): - self.cursor.execute("CREATE TABLE messages ( idpackage INTEGER, message VARCHAR);") + self.cursor.execute("CREATE TABLE messages ( idpackage INTEGER, message VARCHAR );") def createEclassesTable(self): self.cursor.execute('DROP TABLE IF EXISTS eclasses;') diff --git a/libraries/entropy.py b/libraries/entropy.py index 58ac29a96..15edf1730 100644 --- a/libraries/entropy.py +++ b/libraries/entropy.py @@ -55,10 +55,6 @@ class EquoInterface(TextInterface): self.repoDbCache = {} self.securityCache = {} self.spmCache = {} - #self.stdout = fakeoutfile(sys.stdout.fileno()) - #self.stderr = fakeoutfile(sys.stderr.fileno()) - #self.stdout.connect_progress(self.updateProgress) - #self.stderr.connect_progress(self.updateProgress) self.clientLog = LogFile(level = etpConst['equologlevel'],filename = etpConst['equologfile'], header = "[client]") import dumpTools @@ -4478,6 +4474,11 @@ class PackageInterface: # we don't care if cleanupPackage fails since it's not critical return 0 + def logmessages_step(self): + for msg in self.infoDict['messages']: + self.Entropy.clientLog.write(">>> "+msg) + return 0 + def messages_step(self): self.error_on_not_prepared() # get messages @@ -4628,6 +4629,9 @@ class PackageInterface: elif step == "showmessages": rc = self.messages_step() + elif step == "logmessages": + rc = self.logmessages_step() + elif step == "cleanup": self.xterm_title += ' Cleaning: '+self.infoDict['atom'] self.Entropy.setTitle(self.xterm_title) @@ -4868,6 +4872,8 @@ class PackageInterface: self.infoDict['steps'].append("postinstall") if not etpConst['gentoo-compat']: # otherwise gentoo triggers will show that self.infoDict['steps'].append("showmessages") + else: + self.infoDict['steps'].append("logmessages") self.infoDict['steps'].append("cleanup") self.infoDict['triggers']['install'] = dbconn.getTriggerInfo(idpackage) @@ -8333,105 +8339,6 @@ class PackageMaskingParser: self.__removeRepoCache(repoid = repoid) self.__saveFileMtime(maskfile,mtimefile) -class fakeoutfile: - """ - A general purpose fake output file object. - """ - - def __init__(self, fn): - self.fn = fn - self.updateProgress = None - self.text_written = [] - - def close(self): - pass - - def flush(self): - self.close() - - def fileno(self): - return self.fn - - def isatty(self): - return False - - def read(self, a): - return '' - - def readline(self): - return '' - - def readlines(self): - return [] - - def connect_progress(self, f): - self.updateProgress = f - - def write(self, s): - os.write(self.fn,s) - self.text_written.append(s) - # cut at 1024 entries - if len(self.text_written) > 1024: - self.text_written = self.text_written[-1024:] - if self.updateProgress: - self.updateProgress(s) - - def write_line(self, s): - self.write(s) - - def writelines(self, l): - for s in l: - self.write(s) - - def seek(self, a): - raise IOError, (29, 'Illegal seek') - - def tell(self): - raise IOError, (29, 'Illegal seek') - - def truncate(self): - self.tell() - -class fakeinfile: - """ - A general purpose fake input file object. - """ - def __init__(self, fn): - self.fn = fn - - def close(self): - pass - - flush = close - - def fileno(self): - return self.fn - - def isatty(self): - return False - - def read(self, a): - return self.readline() - - def readline(self): - return os.read(self.fn,2048) - - def readlines(self): return [] - - def write(self, s): - return None - - def writelines(self, l): - return None - - def seek(self, a): - raise IOError, (29, 'Illegal seek') - - def tell(self): - raise IOError, (29, 'Illegal seek') - - truncate = tell - class Callable: def __init__(self, anycallable): self.__call__ = anycallable @@ -10100,6 +10007,33 @@ class LogFile: except: pass + def flush(self): + self.logFile.flush() + + def fileno(self): + return self.getFile() + + def isatty(self): + return False + + def read(self, a): + return '' + + def readline(self): + return '' + + def readlines(self): + return [] + + def seek(self, a): + return self.logFile.seek(a) + + def tell(self): + return self.logFile.tell() + + def truncate(self): + return self.logFile.truncate() + def open (self, file = None): if type(file) == type("hello"): try: @@ -10112,7 +10046,7 @@ class LogFile: self.logFile = sys.stderr def getFile (self): - return self.logFile.fileno () + return self.logFile.fileno() def __call__(self, format, *args): self.handler (format % args) @@ -10128,6 +10062,13 @@ class LogFile: if self.level >= level and not etpUi['nolog']: self.handler(self.getTimeDateHeader()+messagetype+' '+self.header+' '+message) + def write(self, s): + self.handler(s) + + def writelines(self, lst): + for s in lst: + self.write(s) + def getTimeDateHeader(self): return time.strftime('[%X %x %Z] ')