The template type conflict solver is implemented. The cl_ignore_files variable is added.

packages
Иванов Денис 4 years ago
parent 85d7744ef0
commit 7be62270e6

@ -4,6 +4,7 @@ import os
import re import re
import stat import stat
import shutil import shutil
import fnmatch
import copy import copy
from pprint import pprint from pprint import pprint
from ..utils.files import join_paths from ..utils.files import join_paths
@ -501,12 +502,14 @@ class DirectoryProcessor:
debug_mode=False): debug_mode=False):
self.action = action self.action = action
self.debug_mode = debug_mode self.debug_mode = debug_mode
self.cl_chroot_path = datavars_module.main.cl_chroot_path
self.without_execution = without_execution self.without_execution = without_execution
self.datavars_module = datavars_module self.datavars_module = datavars_module
self.output = output_module self.output = output_module
self.cl_chroot_path = datavars_module.main.cl_chroot_path
self.cl_ignore_files = self.get_cl_ignore_files()
self.template_action = TemplateAction(output_module=self.output, self.template_action = TemplateAction(output_module=self.output,
chroot_path=self.cl_chroot_path) chroot_path=self.cl_chroot_path)
@ -536,6 +539,17 @@ class DirectoryProcessor:
self.packages_to_merge = [] self.packages_to_merge = []
self.packages_file_trees = {} self.packages_file_trees = {}
def get_cl_ignore_files(self):
if 'cl_ignore_files' in self.datavars_module.main:
cl_ignore_files = self.datavars_module.main.cl_ignore_files
cl_ignore_files_list = []
for pattern in cl_ignore_files.split(','):
cl_ignore_files_list.append(pattern.strip())
return cl_ignore_files_list
else:
return []
def process_template_directories(self): def process_template_directories(self):
# Проходим каталоги из main.cl_template.path # Проходим каталоги из main.cl_template.path
@ -613,6 +627,14 @@ class DirectoryProcessor:
return base_directory, directories_queue return base_directory, directories_queue
def check_file_name(self, filename: str):
'''Метод для проверки соответствия имени файла содержимому переменной
main.cl_ignore_files.'''
for pattern in self.cl_ignore_files:
if not fnmatch.fnmatch(filename, pattern):
return False
return True
def walk_directory_tree(self, current_directory_path, target_path, def walk_directory_tree(self, current_directory_path, target_path,
directory_parameters, directory_tree={}): directory_parameters, directory_tree={}):
template_files = [] template_files = []
@ -629,11 +651,14 @@ class DirectoryProcessor:
self.template_engine.change_directory(current_directory_path) self.template_engine.change_directory(current_directory_path)
for node in entries: for node in entries:
# Временное, вместо этого добавить переменную ignore_files. if self.check_file_name(node.name):
if node.name.endswith('.swp'):
continue continue
if node.is_dir(): if node.is_symlink():
self.output.set_warning('symlink: {} is ignored'.
format(node.path))
continue
elif node.is_dir():
template_directories.append(node.path) template_directories.append(node.path)
elif node.is_file(): elif node.is_file():
template_files.append(node.name) template_files.append(node.name)
@ -675,14 +700,12 @@ class DirectoryProcessor:
if self.fill_trees and self.check_package_and_action( if self.fill_trees and self.check_package_and_action(
directory_parameters, directory_parameters,
current_directory_path, current_directory_path,
DIR,
directory_tree=directory_tree): directory_tree=directory_tree):
current_target_path = os.path.join(current_target_path, current_target_path = os.path.join(current_target_path,
directory_name) directory_name)
elif self.fill_trees and self.check_package_and_action( elif self.fill_trees and self.check_package_and_action(
directory_parameters, directory_parameters,
current_directory_path, current_directory_path):
DIR):
current_target_path = os.path.join(current_target_path, current_target_path = os.path.join(current_target_path,
directory_name) directory_name)
else: else:
@ -711,7 +734,6 @@ class DirectoryProcessor:
if not self.check_package_and_action( if not self.check_package_and_action(
directory_parameters, directory_parameters,
current_directory_path, current_directory_path,
DIR,
directory_tree=directory_tree): directory_tree=directory_tree):
# Обновляем дерево директорий для данного пакета. # Обновляем дерево директорий для данного пакета.
if (directory_tree[directory_name] is None and if (directory_tree[directory_name] is None and
@ -788,13 +810,13 @@ class DirectoryProcessor:
if self.fill_trees and not self.check_package_and_action( if self.fill_trees and not self.check_package_and_action(
directory_parameters, directory_parameters,
template_path, FILE, template_path,
directory_tree=directory_tree[directory_name]): directory_tree=directory_tree[directory_name]):
continue continue
elif not self.fill_trees and not self.check_package_and_action( elif not self.fill_trees and not self.check_package_and_action(
directory_parameters, directory_parameters,
template_path, FILE): template_path):
continue continue
# Если есть параметр merge добавляем в список # Если есть параметр merge добавляем в список
@ -864,7 +886,7 @@ class DirectoryProcessor:
return return
def check_package_and_action(self, parameters, template_path, def check_package_and_action(self, parameters, template_path,
template_type, directory_tree=None): directory_tree=None):
if parameters.append != 'skip': if parameters.append != 'skip':
if not parameters.action: if not parameters.action:
self.output.set_warning( self.output.set_warning(

@ -12,7 +12,7 @@ parameter_1 = {{ vars_1.value_1 }}
!parameter_2 !parameter_2
''' '''
backup_template_text = '''{% calculate append = 'join' -%} backup_template_text = '''{% calculate append = 'join', format = 'samba' -%}
[section one] [section one]
parameter_1 = value parameter_1 = value
parameter_2 = value_2 parameter_2 = value_2
@ -37,23 +37,87 @@ class TemplateActionError(Exception):
pass pass
class TargetFile: class TemplateTypeConflict(Exception):
pass
class TemplateWrapper:
type_checks = {DIR: os.path.isdir, type_checks = {DIR: os.path.isdir,
FILE: os.path.isfile, FILE: os.path.isfile}
LINK: os.path.islink}
def __init__(self, target_file_path, template_type, package=None): def __init__(self, target_file_path, parameters, template_type,
self._file_path = target_file_path template_text=''):
self._package = package self._target_path = target_file_path
if not os.path.exists(target_file_path): self.parameters = parameters
pass
self.template_type = template_type
self.template_text = template_text
self.remove_original = False
# Если по этому пути что-то есть -- проверяем конфликты.
if os.path.exists(target_file_path):
for file_type, checker in self.type_checks.items():
if checker(target_path):
self.target_type = file_type
break
self.target_is_link = os.path.islink(target_path)
else:
self.target_type = None
self.check_conflicts(self)
def check_conflicts(self):
'''Проверка конфликтов типов.'''
if self.parameters.append == 'link':
if self.parameters.force:
self.remove_original = True
return
elif self.target_type == DIR:
raise TemplateTypeConflict(
"The target is a directory while the"
" template has append = 'link'.")
else:
raise TemplateTypeConflict(
"The target is a file while the"
" template has append = 'link'.")
if self.template_type == DIR:
if self.parameters.force:
self.remove_original = True
return
elif self.target_type == FILE:
raise TemplateTypeConflict("The target is a file while the"
" template is a directory.")
elif self.target_is_link and self.target_type == DIR:
self._target_path = os.readlink(self._target_path)
return
else:
return
if self.template_type == FILE:
if self.parameters.force:
if self.target_type == DIR:
self.remove_original = True
return
elif self.target_is_link and self.target_type == FILE:
self._target_path = os.readlink(self._target_path)
return
else:
return
elif self.target_type == FILE:
return
else:
raise TemplateTypeConflict("The target file is a directory"
" while the template is a file.")
def check_conflicts(self, parameters): def append_template():
pass pass
class TemplateActionDraft: class TemplateExecutor:
def __init__(self, datavars_module=Variables(), chroot_path='/'): def __init__(self, datavars_module=Variables(), chroot_path='/'):
self.datavars_module = datavars_module self.datavars_module = datavars_module
@ -73,21 +137,20 @@ class TemplateActionDraft:
self.formats_classes = ParametersProcessor.available_formats self.formats_classes = ParametersProcessor.available_formats
def use_directory_template(self, target_path, parameters): def use_template(self, target_path, parameters, template_type,
template_text=''):
print('Template parameters:') print('Template parameters:')
parameters.print_parameters_for_debug() parameters.print_parameters_for_debug()
self.template_parameters = parameters try:
self.directory_appends[self.template_parameters.append](target_path) template_object = TemplateWrapper(target_path, parameters,
template_type,
def use_file_template(self, target_path, parameters, template_text=''): template_text=template_text)
print('Template parameters:') except TemplateTypeConflict as error:
parameters.print_parameters_for_debug() pass
self.template_parameters = parameters
self.template_text = template_text
self.file_appends[self.template_parameters.append](target_path) self.directory_appends[template_object.parameters.append](
template_object)
def _append_join_directory(self, target_path): def _append_join_directory(self, target_path):
print("append = 'join'") print("append = 'join'")
@ -222,6 +285,9 @@ class TemplateActionDraft:
print('RESULT:') print('RESULT:')
print(original_object.document_text) print(original_object.document_text)
with open(target_path, 'w') as target_file:
target_file.write(original_object.document_text)
def _append_clear_file(self, target_path): def _append_clear_file(self, target_path):
print("append = 'clear'") print("append = 'clear'")
try: try:
@ -233,13 +299,22 @@ class TemplateActionDraft:
return False return False
# Применение основного шаблона:
template_engine.process_template_from_string(template_text, FILE) template_engine.process_template_from_string(template_text, FILE)
template_parameters = template_engine.parameters template_parameters = template_engine.parameters
template_text = template_engine.template_text template_text = template_engine.template_text
template_action_obj = TemplateActionDraft(datavars_module=DATAVARS_MODULE, template_action_obj = TemplateExecutor(datavars_module=DATAVARS_MODULE,
chroot_path=CHROOT_PATH) chroot_path=CHROOT_PATH)
result = template_action_obj.use_file_template(target_path, result = template_action_obj.use_file_template(target_path,
template_parameters, template_parameters,
template_text=template_text) template_text=template_text)
print('MAIN TEST TEMPLATE IS USED')
# Применение шаблона бэкапа:
template_engine.process_template_from_string(backup_template_text, FILE)
result = template_action_obj.use_file_template(
target_path,
template_engine.parameters,
template_text=template_engine.template_text)
print('BACKUP TEMPLATE IS USED')

@ -35,7 +35,8 @@ main = Variables({'cl_template_path':
'templates'), 'templates'),
os.path.join(TEST_ROOT_PATH, os.path.join(TEST_ROOT_PATH,
'var/calculate/templates')), 'var/calculate/templates')),
'cl_chroot_path': TEST_ROOT_PATH}) 'cl_chroot_path': TEST_ROOT_PATH,
'cl_ignore_files': '*.swp'})
test = ({'test_root': TEST_ROOT_PATH}) test = ({'test_root': TEST_ROOT_PATH})

@ -1,5 +1,5 @@
[section one] [section one]
parameter_1 = value parameter_1 = value
parameter_2 = value_2
[section two] [section two]
parameter_3 = value_3 parameter_3 = value_3

Loading…
Cancel
Save