New functions

master3.3
Mike Hiretsky 12 years ago
parent 07c2b6019a
commit 16b1944821

@ -37,7 +37,7 @@ from operator import lt, le, eq, ne, ge, gt
from utils.common import _error, _warning from utils.common import _error, _warning
from utils.text import _toUNICODE, convertStrListDict from utils.text import _toUNICODE, convertStrListDict
from utils.portage import isPkgInstalled from utils.portage import isPkgInstalled,reVerSplitToPV
from utils.content import PkgContents from utils.content import PkgContents
from utils.files import (getModeFile, listDirectory,removeDir, typeFile, from utils.files import (getModeFile, listDirectory,removeDir, typeFile,
scanDirectory, scanDirectory,
@ -47,7 +47,28 @@ from datavars import DataVarsError
from calculate.lib.cl_lang import setLocalTranslate from calculate.lib.cl_lang import setLocalTranslate
setLocalTranslate('cl_lib3',sys.modules[__name__]) setLocalTranslate('cl_lib3',sys.modules[__name__])
class TemplatesError(Exception): class TemplatesInterrupt(Exception):
"""
Interrupt templates appling
"""
EXIT,ABORT=1,2
def __init__(self,*args):
self.message = args[0]
self.args = args
def __str__(self):
return str(self.message)
def isExit(self): return self.isInterrupt() and self.args[1] == self.EXIT
def isAbort(self): return self.isInterrupt() and self.args[1] == self.ABORT
def status(self): return self.args[1] if self.isInterrupt() else 0
def isInterrupt(self): return len(self.args)>1
class TemplatesError(TemplatesInterrupt):
""" """
Error on templates appling Error on templates appling
""" """
@ -2186,7 +2207,7 @@ class _file(_error):
except: except:
try: try:
if os.path.isdir(nameFileConfig): if os.path.isdir(nameFileConfig):
self.setWarning(_("unable to open the directory as file:") self.printWARNING(_("unable to open the directory as file:")
+ nameFileConfig) + nameFileConfig)
return False return False
F_CONF = open(nameFileConfig, "w+") F_CONF = open(nameFileConfig, "w+")
@ -3016,6 +3037,101 @@ class templateFunction(_error, _warning, _shareTemplate, _shareTermsFunction):
textTemplateTmp[resS.end():] textTemplateTmp[resS.end():]
return textTemplateTmp return textTemplateTmp
def funcPrint(self,funArgv, resS, localVars, textTemplateTmp, nameTemp):
"""
Вывод успешного сообщения
"""
self.printSUCCESS(_(funArgv))
textTemplateTmp = textTemplateTmp[:resS.start()] + \
textTemplateTmp[resS.end():]
return textTemplateTmp
def funcWarning(self,funArgv, resS, localVars, textTemplateTmp, nameTemp):
"""
Вывод сообщения с предупреждением
"""
self.printWARNING(_(funArgv))
textTemplateTmp = textTemplateTmp[:resS.start()] + \
textTemplateTmp[resS.end():]
return textTemplateTmp
def funcError(self,funArgv, resS, localVars, textTemplateTmp, nameTemp):
"""
Вывод сообщения с ошибкой
"""
self.printERROR(_(funArgv))
textTemplateTmp = textTemplateTmp[:resS.start()] + \
textTemplateTmp[resS.end():]
return textTemplateTmp
def funcExit(self,funArgv, resS, localVars, textTemplateTmp, nameTemp):
"""
Вывод сообщения с ошибкой
"""
self.printSUCCESS(_(funArgv))
raise TemplatesInterrupt(_("Applying was stop"),TemplatesInterrupt.EXIT)
def funcBreak(self,funArgv, resS, localVars, textTemplateTmp, nameTemp):
"""
Вывод сообщения с ошибкой
"""
self.printERROR(_(funArgv))
raise TemplatesInterrupt(_("Applying was interrupted"),
TemplatesInterrupt.ABORT)
def getElogTimestamp(self):
# Получаем время модификации конфигурационного файла
curTime = self.getTimeFile(self.fileConfigIni)
nameLocVar = "update.timestamp"
if self.timeIni != curTime:
# читаем переменные из файла
self.prevDictIni = self.loadVarsIni(self.fileConfigIni)
self.currDictIni= {}
self.currDictIni.update(self.prevDictIni)
self.timeIni = self.getTimeFile(self.fileConfigIni)
if nameLocVar in self.currDictIni.keys():
if self.currDictIni[nameLocVar] is None:
return 0
else:
val = self.currDictIni[nameLocVar].encode("UTF-8")
if val.isdigit():
return int(val)
return 0
def funcElog(self,funArgv, resS, localVars, textTemplateTmp, nameTemp):
"""Function for work with emerge.log"""
funArgv = funArgv.strip()
rePkg = re.compile(r'completed emerge \(\d+ of \d+\) (\S+)\s',re.S)
logFile = '/var/log/emerge.log'
replace = ""
if funArgv:
lastTimestamp = self.getElogTimestamp()
skip = True
for line in reversed(list(readLinesFile(logFile))):
timestamp,op,info = line.partition(':')
if timestamp.isdigit() and lastTimestamp and \
int(timestamp) < lastTimestamp:
break
match = rePkg.search(info)
if match and match.group(1).startswith(funArgv):
pkgInfo = reVerSplitToPV(match.group(1))
if "{CATEGORY}/{PN}".format(**pkgInfo) == funArgv:
replace = pkgInfo['PVR']
break
else:
# get last timestamp
replace = readFile(logFile).rpartition(
'\n')[2].lpartition(':')[0]
textTemplateTmp = textTemplateTmp[:resS.start()] + replace + \
textTemplateTmp[resS.end():]
return textTemplateTmp
def funcConfirm(self,funArgv, resS, localVars, textTemplateTmp, nameTemp):
res = self.askConfirm(_(funArgv))
textTemplateTmp = textTemplateTmp[:resS.start()] + res + \
textTemplateTmp[resS.end():]
return textTemplateTmp
def loadVarsIni(self, iniFileName): def loadVarsIni(self, iniFileName):
""" Читает файл fileName """ Читает файл fileName
создает и заполняет переменные на основе этого файла создает и заполняет переменные на основе этого файла
@ -3274,9 +3390,9 @@ class templateFunction(_error, _warning, _shareTemplate, _shareTermsFunction):
return textTemplateTmp return textTemplateTmp
def funcBelong(self, funArgv, resS, localVars, textTemplateTmp, nameTemp): def funcBelong(self, funArgv, resS, localVars, textTemplateTmp, nameTemp):
self.setWarning( self.printWARNING(_("Function '{funcname}' used by {template} "
_("Function '{funcname}' used by {template} is deprecated and will be removed in the future").format( "is deprecated and will be removed in the future"
funcname="belong",template=nameTemp)) ).format(funcname="belong",template=nameTemp))
replace = "" replace = ""
return textTemplateTmp[:resS.start()] + replace +\ return textTemplateTmp[:resS.start()] + replace +\
textTemplateTmp[resS.end():] textTemplateTmp[resS.end():]
@ -3664,11 +3780,13 @@ class Template(_file,_terms,_warning,xmlShare,templateFormat,_shareTemplate):
def __init__(self, objVar, servDir=False, dirsFilter=[], filesFilter=[], def __init__(self, objVar, servDir=False, dirsFilter=[], filesFilter=[],
cltObj=True, cltFilter=True, printWarning=True, cltObj=True, cltFilter=True, printWarning=True,
printSUCCESS=lambda x:x,printWARNING=lambda x:x, printSUCCESS=lambda x:x,printWARNING=lambda x:x,
printERROR=lambda x:x): printERROR=lambda x:x,askConfirm=lambda x:x):
self.changedFiles = ChangedFiles() self.changedFiles = ChangedFiles()
self.printSUCCESS = printSUCCESS self.printSUCCESS = printSUCCESS
self.printERROR = printERROR self.printERROR = printERROR
self.printWARNING = printWARNING self.printWARNING = printWARNING
self.askConfirm = askConfirm
self.stop = 0
self.cltObj = None self.cltObj = None
self.functObj = None self.functObj = None
# Предупреждения # Предупреждения
@ -3730,6 +3848,7 @@ re.M|re.S)
self.functObj.printSUCCESS = self.printSUCCESS self.functObj.printSUCCESS = self.printSUCCESS
self.functObj.printWARNING = self.printWARNING self.functObj.printWARNING = self.printWARNING
self.functObj.printERROR = self.printERROR self.functObj.printERROR = self.printERROR
self.functObj.askConfirm = self.askConfirm
# Метод применения функций к шаблонам # Метод применения функций к шаблонам
self.applyFuncTemplate = self.functObj.applyFuncTemplate self.applyFuncTemplate = self.functObj.applyFuncTemplate
# Объект для определения типа файла шаблона # Объект для определения типа файла шаблона
@ -3741,7 +3860,8 @@ re.M|re.S)
# Объект templateClt # Объект templateClt
self.cltObj = templateClt(self.objVar,printSUCCESS=self.printSUCCESS, self.cltObj = templateClt(self.objVar,printSUCCESS=self.printSUCCESS,
printERROR=self.printERROR, printERROR=self.printERROR,
printWARNING=self.printWARNING) printWARNING=self.printWARNING,
askConfirm=self.askConfirm)
elif cltObj: elif cltObj:
# Объект templateClt # Объект templateClt
self.cltObj = cltObj self.cltObj = cltObj
@ -3797,18 +3917,18 @@ gettext -d cl_template "$*"
p.write(code) p.write(code)
p.pipe.stdin.close() p.pipe.stdin.close()
for line in p.readByLine(): for line in p.readByLine():
self.printSUCCESS(line) self.printSUCCESS(line.strip())
p.pipe.wait() p.pipe.wait()
if p.success(): if p.success():
self.executedFiles.append((code,execPath)) self.executedFiles.append((code,execPath))
if p.readerr(): if p.readerr():
for line in p.readerr().split('\n'): for line in p.readerr().split('\n'):
self.printWARNING(line) self.printWARNING(line.strip())
return True return True
else: else:
if p.readerr(): if p.readerr():
for line in p.readerr().split('\n'): for line in p.readerr().split('\n'):
self.printERROR(line) self.printERROR(line.strip())
return False return False
def __octToInt(self, strOct): def __octToInt(self, strOct):
@ -4129,11 +4249,7 @@ gettext -d cl_template "$*"
if skipDirs or skipTemplates: if skipDirs or skipTemplates:
# print warning # print warning
from cl_print import color_print from cl_print import color_print
printObj = color_print() self.printWARNING(_("No conditions for checking the value of variable"
setWARNING = lambda x: self.setWarning(x) and\
self.printWarning and\
printObj.printWARNING(x)
setWARNING(_("No conditions for checking the value of variable"
" 'cl_name'")) " 'cl_name'"))
skipDirTemplates = [] skipDirTemplates = []
for skipDir in skipDirs: for skipDir in skipDirs:
@ -4156,7 +4272,7 @@ gettext -d cl_template "$*"
setWARNING("# Calculate cl_name==calculate-install") setWARNING("# Calculate cl_name==calculate-install")
return skipDirs + skipTemplates return skipDirs + skipTemplates
def applyTemplates(self,progress=True,execute=True): def applyTemplates(self,progress=True,rerun=True):
"""Применяет шаблоны к конфигурационным файлам""" """Применяет шаблоны к конфигурационным файлам"""
def createDictTemplates(path, prefix, dictTemplates): def createDictTemplates(path, prefix, dictTemplates):
@ -4245,8 +4361,8 @@ gettext -d cl_template "$*"
for dirTemplate in dirsTemplatesExists: for dirTemplate in dirsTemplatesExists:
if self.scanningTemplates(dirTemplate, if self.scanningTemplates(dirTemplate,
skipTemplates=skipTemplates) is False: skipTemplates=skipTemplates) is False:
return False break
if self.cltObj: if self.cltObj and not self.stop:
# Созданные директории # Созданные директории
self.cltObj.createdDirs = self.createdDirs self.cltObj.createdDirs = self.createdDirs
# Примененные файлы # Примененные файлы
@ -4279,11 +4395,19 @@ gettext -d cl_template "$*"
if not filename in self.cltObj.filterApplyTemplates: if not filename in self.cltObj.filterApplyTemplates:
self.cltObj.filterApplyTemplates[filename] = [] self.cltObj.filterApplyTemplates[filename] = []
self.cltObj.filterApplyTemplates[filename].append(pkg) self.cltObj.filterApplyTemplates[filename].append(pkg)
if not self.cltObj.applyTemplates(): for filename,pkgs in self.changedFiles.data.items():
return False if not filename in self.cltObj.filterApplyTemplates:
if (self.objVar.Get('cl_merge_pkg') or \ self.cltObj.filterApplyTemplates[filename] = []
pkgs = filter(lambda x:not x in \
self.cltObj.filterApplyTemplates[filename],
map(lambda x:x[0],pkgs))
self.cltObj.filterApplyTemplates[filename].extend(pkgs)
self.cltObj.applyTemplates()
self.stop = self.stop or self.cltObj.stop
if not self.stop and ((self.objVar.Get('cl_merge_pkg') or \
self.objVar.Get('cl_action') == "sync") and \ self.objVar.Get('cl_action') == "sync") and \
self.objVar.Get('cl_merge_pkg_new'): self.objVar.Get('cl_merge_pkg_new')):
self.objVar.Set('cl_root_path', self.objVar.Set('cl_root_path',
self.objVar.Get('cl_root_path_next'),force=True) self.objVar.Get('cl_root_path_next'),force=True)
self.recalculateBaseDir() self.recalculateBaseDir()
@ -4297,12 +4421,12 @@ gettext -d cl_template "$*"
createdDirs = self.createdDirs createdDirs = self.createdDirs
filesApply = self.filesApply filesApply = self.filesApply
self.changeMergePackage(self.objVar.Get('cl_merge_pkg')) self.changeMergePackage(self.objVar.Get('cl_merge_pkg'))
self.applyTemplates(execute=False) self.applyTemplates(rerun=False)
createdDirs.extend(self.createdDirs) createdDirs.extend(self.createdDirs)
filesApply.extend(self.filesApply) filesApply.extend(self.filesApply)
self.filesApply = filesApply self.filesApply = filesApply
self.createdDirs = createdDirs self.createdDirs = createdDirs
if execute: if rerun and self.stop != TemplatesInterrupt.ABORT:
if self.cltObj: if self.cltObj:
self.queueExecute.extend(self.cltObj.queueExecute) self.queueExecute.extend(self.cltObj.queueExecute)
for processor,text,nameTemplate in self.queueExecute: for processor,text,nameTemplate in self.queueExecute:
@ -4372,8 +4496,12 @@ gettext -d cl_template "$*"
optNextDir) optNextDir)
if ret is False: if ret is False:
break break
except TemplatesError as e: except TemplatesInterrupt as e:
self.printWARNING(str(e)) if e.isInterrupt():
self.stop = e.status()
return False
else:
self.printWARNING(str(e))
finally: finally:
self.objVar.defaultModule = prevModule self.objVar.defaultModule = prevModule
self.functObj.currentBelong = prevBelong self.functObj.currentBelong = prevBelong
@ -4428,8 +4556,8 @@ gettext -d cl_template "$*"
if createdDirs: if createdDirs:
self.createdDirs += createdDirs self.createdDirs += createdDirs
if os.path.isfile(pathDir): if os.path.isfile(pathDir):
self.setWarning(_("{dirpath} is a file").format(dirpath=pathDir)) self.printWARNING(_("{dirpath} is a file").format(dirpath=pathDir))
self.setWarning(_("templates in {tempath} are skipped" self.printWARNING(_("templates in {tempath} are skipped"
).format(tempath=path)) ).format(tempath=path))
return None return None
if objHeadDir: if objHeadDir:
@ -5636,12 +5764,17 @@ class scanDirectoryClt:
self.filterApplyTemplates.keys() or self.hasBelong(absPath): self.filterApplyTemplates.keys() or self.hasBelong(absPath):
prevDefault = self.objVar.defaultModule prevDefault = self.objVar.defaultModule
if not self.processingFile(absPath, prefix): if not self.processingFile(absPath, prefix):
ret = False return False
self.objVar.defaultModule = prevDefault self.objVar.defaultModule = prevDefault
elif stat.S_ISDIR(statInfo): elif stat.S_ISDIR(statInfo):
ret = self.scanningTemplates(absPath, prefix, True) if not self.scanningTemplates(absPath, prefix, True):
except TemplatesError as e: return False
self.printWARNING(str(e)) except TemplatesInterrupt as e:
if e.isInterrupt():
self.stop = e.status()
return False
else:
self.printWARNING(str(e))
return True return True
class templateClt(scanDirectoryClt, Template): class templateClt(scanDirectoryClt, Template):
@ -5780,7 +5913,7 @@ class templateClt(scanDirectoryClt, Template):
# Обрабатываем шаблоны # Обрабатываем шаблоны
for dirTemplate in dirsTemplates: for dirTemplate in dirsTemplates:
if self.scanningTemplates(dirTemplate, self._chrootDir) is False: if self.scanningTemplates(dirTemplate, self._chrootDir) is False:
return False break
return (self.createdDirs, self.filesApply) return (self.createdDirs, self.filesApply)
class iniParser(_error, templateFormat): class iniParser(_error, templateFormat):

@ -25,4 +25,4 @@ class VariableClVer(ReadonlyVariable):
""" """
Package version Package version
""" """
value = "3.1.2" value = "3.1.3"

Loading…
Cancel
Save