diff --git a/pym/cl_template.py b/pym/cl_template.py
index a290d33..268d620 100644
--- a/pym/cl_template.py
+++ b/pym/cl_template.py
@@ -301,7 +301,8 @@ class fileHeader(_terms):
# Тип вставки шаблона
typeAppend = ""
# Возможные типы вставки шаблонов
- _fileAppend = "join", "before", "after", "replace", "remove", "skip"
+ _fileAppend = "join", "before", "after", "replace", "remove", "skip",\
+ "patch"
# Интерпретатор (#!/bin/bash) (#!/usr/bin/python)
execStr = ""
# Символ комментария
@@ -419,7 +420,7 @@ class fileHeader(_terms):
def _getType(self):
"""Выдать тип файла"""
- if self.params.has_key("format"):
+ if "format" in self.params:
return self.params["format"]
else:
return "raw"
@@ -432,6 +433,9 @@ class fileHeader(_terms):
else:
if self.fileType != "raw" and self.fileType != "bin" and\
self.fileType != "":
+ if "format" in self.params and self.params["format"] == "patch":
+ self.params["append"] = "patch"
+ return "patch"
self.params["append"] = "join"
return "join"
self.params["append"] = "replace"
@@ -4336,6 +4340,34 @@ re.M|re.S)
if objHeadNew.fileType:
formatTemplate = objHeadNew.fileType
typeAppendTemplate = objHeadNew.typeAppend
+ if formatTemplate == "patch":
+ if typeAppendTemplate != "patch":
+ self.setError(\
+ _("False option append=%(type)s in template %(file)s")\
+ %{"type":typeAppendTemplate,"file":nameFileTemplate})
+ return False
+ # создаем объект формата шаблона
+ objTempl = self.getFormatObj(formatTemplate, self.textTemplate)
+ if not objTempl:
+ self.setError(\
+ _("Incorrect header parmeter format=%s in template")\
+ %formatTemplate + " " + nameFileTemplate)
+ return False
+ if objHeadOld and objHeadOld.body:
+ self.textConfig = objHeadOld.body
+ # обработка конфигурационного файла
+ self.textTemplate = objTempl.processingFile(self.textConfig)
+ if objTempl.getError():
+ self.setError(_("False template") + ": " +\
+ nameFileTemplate)
+ return False
+ if objHeadNew.execStr:
+ self.textConfig = objHeadNew.execStr+title+\
+ self.textTemplate
+ else:
+ self.textConfig = title + self.textTemplate
+ self.saveConfFile()
+ return filesApply
# Создаем объект в случае параметра format в заголовке
if (typeAppendTemplate == "replace" or\
typeAppendTemplate == "before" or\
diff --git a/pym/format/patch.py b/pym/format/patch.py
new file mode 100644
index 0000000..91dbde4
--- /dev/null
+++ b/pym/format/patch.py
@@ -0,0 +1,106 @@
+#-*- coding: utf-8 -*-
+
+# Copyright 2008-2010 Calculate Ltd. http://www.calculate-linux.org
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import sys, re
+import xml.dom.minidom
+from cl_utils import _error
+# Перевод cообщений модуля
+from cl_lang import lang
+tr = lang()
+tr.setLocalDomain('cl_lib')
+tr.setLanguage(sys.modules[__name__])
+
+
+class patch(_error):
+ """Класс для замены, добавления, удаления, строк в файле"""
+ # root нода
+ rootNode = False
+ # Документ
+ doc = False
+ # Текст шаблона
+ text = ""
+
+ def __init__(self, text):
+ self.text = text
+ # Создаем XML документ
+ self.doc = self.textToXML()
+ if self.doc:
+ self.rootNode = self.doc.documentElement
+
+ def textToXML(self):
+ """Создание из текста XML документа
+ Храним xml в своем формате
+ """
+ if not self.text.strip():
+ self.text = ''
+ text = '\n%s'\
+ %self.text
+ try:
+ self.doc = xml.dom.minidom.parseString(text)
+ except:
+ return False
+ return self.doc
+
+ def processingFile(self, textConfigFile):
+ """Обработка конфигурационного файла"""
+ if not self.doc:
+ self.setError(_("Can not convert text template in XML"))
+ return False
+ retTextConfigFile = textConfigFile
+ tags = ["reg", "text"]
+ dataList = []
+ tagsIndex = 0
+ for node in self.rootNode.childNodes:
+ if node.nodeType==node.ELEMENT_NODE:
+ if not node.tagName == tags[tagsIndex]:
+ self.setError(_("Incorrect text template"))
+ return False
+ if tagsIndex == 1:
+ tagsIndex = 0
+ else:
+ tagsIndex += 1
+ # регулярное выражение
+ if node.tagName == "reg":
+ if node.firstChild:
+ reText = node.firstChild.nodeValue
+ else:
+ self.setError(\
+ _("Incorrect text template ''"))
+ return False
+ if not reText.strip():
+ self.setError(\
+ _("Incorrect text template '%s'")\
+ %reText)
+ return False
+ try:
+ regex = re.compile(reText)
+ except:
+ self.setError(\
+ _("Incorrect text template '%s'")\
+ %reText)
+
+ return False
+ elif node.tagName == "text" and regex:
+ if node.firstChild:
+ text = node.firstChild.nodeValue
+ else:
+ text = ""
+ dataList.append((regex, text))
+ regex = False
+ for regex, text in dataList:
+ # Замены в тексте конфигурационного файла
+ retTextConfigFile = regex.sub(text, retTextConfigFile)
+ return retTextConfigFile