diff --git a/README.md b/README.md index 83e1e7b..e58be5c 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,45 @@ -## Набор утилит для автоматической разборки/сборки внешних обработок и отчетов, при помещении(commit) в git. +## Набор утилит для автоматической разборки/сборки внешних обработок и отчетов, при помещении (commit) в git ### Что к чему ---- -* pyv8unpack.py - python скрипт, получающий список помещаемых файлов при коммите, фильтрующий по расширению только внешние обработки/отчеты и запускающий внешнюю обработку для распаковки этих файлов. -* [V8Reader.epf](http://infostart.ru/public/106310/) - внешняя обработка 1С, которая с помощью [v8unpack](http://svn2.assembla.com/svn/V8Unpack/track/) разбирает внешние обработки, определяет нормальные наименования для каталогов форм, файлов модулей объектов и т.д. и раскладывает их в нормальную структуру папок. +* pyv8unpack.py - Python-скрипт, получающий список помещаемых файлов при коммите, фильтрующий по расширению только внешние отчёты/обработки и запускающий внешнюю обработку для распаковки этих файлов. +* [V8Reader.epf](http://infostart.ru/public/106310/) - внешняя обработка 1С, которая с помощью [v8unpack](http://svn2.assembla.com/svn/V8Unpack/track/) разбирает внешние обработки, определяет нормальные наименования для каталогов форм, файлов модулей объектов и т. д. и раскладывает их в нормальную структуру папок. * ibService - сервисная база данных на 1С для запуска V8Reader.epf -* pre-commit - собственно командный файл, вызываемый git перед каждым помещением. Выполняет роль простой запускалки скрипта pyv8unpack.py +* pre-commit - собственно командный файл, вызываемый git перед каждым помещением. Выполняет роль простой запускалки скрипта pyv8unpack.py ### Установка 1. Зависимости: - * python 3.3 - * установленная платформа 1С предприятия. + * Python 3.3 + * установленная платформа 1С:Предприятия * git - * в случае запуска из под wine необходим и msscriptcontrol. + * в случае запуска из под wine необходим msscriptcontrol -2. По умолчанию считается, что пути к python.exe и git.exe находятса в переменной path, иначе необходимо указать явный путь в файлах pre-commit(для python) и pyv8unpack.py(для git) +2. По умолчанию считается, что пути к python.exe и git.exe находятся в переменной path, иначе необходимо указать явный путь в файлах pre-commit (для python) и pyv8unpack.py (для git) -3. Путь к платформе находит автоматически, в случаии стандатной установки 1С. Если необходимо указать явно путь к платформе, необходимо: Указать переменную окружения PATH1C c путем к каталогу, где установленна 1С +3. Путь к платформе находится автоматически в случае стандартной установки 1С. Если необходимо явно указать путь к платформе, то нужно: указать переменную окружения PATH1C c путём к каталогу, в который установлена 1С ``` set PATH1C = d:\program\ ``` -или создать файл ini рядом с файлом скрипта pyv8unpack.py или в домашней папке в корне, с именем precommit1c.ini и содеражнием: +или создать ini-файл рядом с файлом скрипта pyv8unpack.py или в домашней папке в корне с именем precommit1c.ini и содержанием: ``` [DEFAULT] onecplatfrorms = c:\program\1cv8\8.3.5.823\bin\1cv8.exe ``` -4. Путь хранения исходных текстово разобранных обработок поумолчанию используется как **src** (для обеспечения совместимости со старыми версиями обработки), однако его можно переназначить в ini файле +4. Путь хранения исходных текстов разобранных обработок по умолчанию используется как **src** (для обеспечения совместимости со старыми версиями обработки), однако его можно переназначить в ini-файле ``` [DEFAULT] source = plugin_source ``` -5. Флажок изменеяющий корневую папку хранения исходных текстово разобранных обработок поумолчанию используется как корневая папка (для обеспечения совместимости со старыми версиями обработки), однако его можно переназначить в ini файле. Если изменить флажок на True - в каждой корневой папаке внешних обработок будет создан подкаталог текстово разобранных обработок. +5. Флажок, изменяющий корневую папку хранения исходных текстов разобранных обработок по умолчанию используется как корневая папка (для обеспечения совместимости со старыми версиями обработки), однако его можно переназначить в ini-файле. Если изменить флажок на True - в каждой корневой папке внешних обработок будет создан подкаталог текстов разобранных обработок. ``` [DEFAULT] source_in_source = False ``` -6. Наконец содержимое каталога необходимо скопировать в каталог .git/hooks/ вашего проекта. +6. Наконец, содержимое каталога необходимо скопировать в каталог .git/hooks/ вашего проекта. > *Примечание:* каталог .git по умолчанию скрыт. ``` @@ -53,7 +53,32 @@ source_in_source = False ##Запуск -После установки достаточно для проверки сделать commit для любого файла epf/erf, и в вашем репозитарии автоматически должна создаться папка *src*, повторяющая полностью структуру проекта, измененные или добавленные файлы распакуются в папки с аналогичным наименованием. +После установки достаточно для проверки сделать commit для любого файла epf/erf, и в вашем репозитории автоматически должна создаться папка *src*, полностью повторяющая структуру проекта, изменённые или добавленные файлы распакуются в папки с аналогичными наименованиями. + +##Командная строка запуска + +``` +python pyv8unpack.py [-h] [--version] [-v] [--index] [--g] [--compile] + [--type TYPE] [--platform PLATFORM] + [inputPath] [output] + +Утилита для автоматической распаковки внешних обработок + +positional arguments: + inputPath Путь к файлам, необходимым для распаковки + output Путь к каталогу, куда распаковывать + +optional arguments: + -h, --help Show this help message and exit + --version Show program's version number and exit + -v, --verbose Increases log verbosity for each occurence + --index Добавляем в индекс исходники + --g Запустить чтение индекса из git и определить список + файлов для разбора + --compile Собрать внешний отчёт/обработку + --type TYPE Тип файла для сборки epf, erf. По умолчанию авто epf + --platform PLATFORM Путь к платформе 1С +``` ##Командная строка запуска @@ -82,8 +107,8 @@ optional arguments: ##Ограничения -Не стоит называть файлы с разным расширением epf и erf одинаковыми именами - каталоги с исходниками создаются только по наименованию без учета расширения и возможен конфликт имен. -Дополнительно необходима настройка git для возможности использования кирилических наименований внешних обработок ```git config --local core.quotepath false``` +Не стоит называть файлы с разным расширением epf и erf одинаковыми именами - каталоги с исходниками создаются только по наименованию без учёта расширения и возможен конфликт имен. +Дополнительно необходима настройка git для возможности использования кириллических наименований внешних обработок ```git config --local core.quotepath false``` ##Что внутри -Как это работает: pyv8unpack.py повторяет полностью иерархию папок относительно корня репозитария только в папке SRC(от слова source), для каждой измененной внешней обработки создается своя папка и туда с помощью v8unpack распаковывается помещаемая обработка, с помощью v8reader определяются наименования макетов, форм, модуля обработки и переименовываются, переименования сохраняются в служебном файле renames.txt, те файлы, которые невозможно определить или же носят чисто служебный характер, переносятся в каталог *und* +Как это работает: pyv8unpack.py полностью повторяет иерархию папок относительно корня репозитория только в папке SRC (от слова source), для каждой изменённой внешней обработки создаётся своя папка и туда с помощью v8unpack распаковывается помещаемая обработка, с помощью v8reader определяются наименования макетов, форм, модуля обработки и переименовываются, переименования сохраняются в служебном файле renames.txt, те файлы, которые невозможно определить или же носят чисто служебный характер, переносятся в каталог *und* diff --git a/create-links-in-hooks.bat b/create-links-in-hooks.bat new file mode 100644 index 0000000..da86749 --- /dev/null +++ b/create-links-in-hooks.bat @@ -0,0 +1,5 @@ +mklink ".git/hooks/pre-commit" "%~dp0pre-commit" +mklink ".git/hooks/pyv8unpack.py" "%~dp0pyv8unpack.py" +mklink /J ".git/hooks/ibService" "%~dp0ibService" +mklink /J ".git/hooks/v8Reader" "%~dp0v8Reader" +git config --local core.quotepath false \ No newline at end of file diff --git a/pre-commit b/pre-commit index baf4c9c..3acd561 100644 --- a/pre-commit +++ b/pre-commit @@ -1,4 +1,3 @@ #!/bin/sh - echo "Start hooks before commit for v8unpack erf and epf" python.exe .git/hooks/pyv8unpack.py --g --index diff --git a/precommit1c.ini.example b/precommit1c.ini.example index 1b0dd0d..d39e472 100644 --- a/precommit1c.ini.example +++ b/precommit1c.ini.example @@ -1,3 +1,3 @@ -[DEFAULT] -onecplatfrorms = D:\environ\onec\1cv8\8.3.4.465\bin\1cv8.exe -source = plugin_source +[default] +onec_platform=D:\environ\onec\1cv8\8.3.4.465\bin\1cv8.exe +source=plugin_source diff --git a/pyv8unpack.py b/pyv8unpack.py index 4ada69f..5b8afae 100644 --- a/pyv8unpack.py +++ b/pyv8unpack.py @@ -1,40 +1,36 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- - +import argparse +import logging import os -import sys +import platform +import re import subprocess import shutil -import logging +import sys import tempfile -import re -import platform -import argparse -from subprocess import PIPE -__version__ = "0.0.3" +__version__ = '0.0.3' -logging.basicConfig(level=logging.INFO) # DEBUG => print ALL msgs -log = logging.getLogger("pyv8unpack") +logging.basicConfig(level=logging.INFO) # DEBUG => print ALL msgs +log = logging.getLogger('pyv8unpack') modified = re.compile('^(?:M|A)(\s+)(?P.*)') def get_config_param(param): - ''' - parse config file and find in them source dir - ''' - + """ + Parse config file and find source dir in it + """ curdir = os.curdir if '__file__' in globals(): curdir = os.path.dirname(os.path.abspath(__file__)) - config = None - for loc in curdir, os.curdir, os.path.expanduser("~"): + for loc in curdir, os.curdir, os.path.expanduser('~'): try: - with open(os.path.join(loc, "precommit1c.ini")) as source: - if sys.version_info<(3,0,0): + with open(os.path.join(loc, 'precommit1c.ini')) as source: + if sys.version_info < (3, 0, 0): from ConfigParser import ConfigParser # @NoMove @UnusedImport else: from configparser import ConfigParser @@ -45,87 +41,82 @@ def get_config_param(param): except IOError: pass - if not config is None and config.has_option("DEFAULT", param): - value = config.get("DEFAULT", param) + if config is not None and config.has_option('default', param): + value = config.get('default', param) return value - return None def get_path_to_1c(): """ - get path to 1c binary. - fist env, "PATH1C" - two env "PROGRAMFILES" on windows - three /opt/1c - only linux - + Get path to 1c binary. + First env, 'PATH1C' + Second env 'PROGRAMFILES' (only Windows) + Third '/opt/1c' (only Linux) """ - - cmd = os.getenv("PATH1C") - if not cmd is None: - cmd = os.path.join(cmd, "1cv8") + cmd = os.getenv('PATH1C') + if cmd is not None: + cmd = os.path.join(cmd, '1cv8') maxversion = max(list(filter((lambda x: '8.' in x), os.listdir(cmd)))) if maxversion is None: - raise Exception("not found verion dirs") - cmd = os.path.join(cmd, maxversion+os.path.sep+"bin"+os.path.sep+"1cv8.exe") + raise Exception('Not found version dirs') + cmd = os.path.join(cmd, maxversion + os.path.sep + 'bin' + os.path.sep + '1cv8.exe') if not os.path.isfile(cmd): - raise Exception("file not found %s" % (cmd)) + raise Exception('File not found {}'.format(cmd)) return cmd - #read config - + # Read config curdir = os.curdir if '__file__' in globals(): curdir = os.path.dirname(os.path.abspath(__file__)) + onec_platform_config = get_config_param('onec_platform') + if onec_platform_config is not None: + return onec_platform_config - onecplatfrorm_config = get_config_param("onecplatfrorm") - if not onecplatfrorm_config is None: - return onecplatfrorm_config - - if platform.system() == "Darwin": - raise Exception("MacOS not run 1C") - elif platform.system() == "Windows": - program_files = os.getenv("PROGRAMFILES(X86)") + if platform.system() == 'Darwin': + raise Exception('MacOS not run 1C') + elif platform.system() == 'Windows': + program_files = os.getenv('PROGRAMFILES(X86)') if program_files is None: - #FIXME: проверить архетиктуру. - program_files = os.getenv("PROGRAMFILES") + # fixme Проверить архитектуру + program_files = os.getenv('PROGRAMFILES') if program_files is None: - raise "path to Program files not found"; - cmd = os.path.join(program_files, "1cv8") + raise Exception('Path to "Program files" not found') + cmd = os.path.join(program_files, '1cv8') maxversion = max(list(filter((lambda x: '8.' in x), os.listdir(cmd)))) if maxversion is None: - raise Exception("not found verion dirs") - cmd = os.path.join(cmd, maxversion + os.path.sep + "bin"+os.path.sep+"1cv8.exe") + raise Exception('Not found version dirs') + cmd = os.path.join(cmd, maxversion + os.path.sep + 'bin' + os.path.sep + '1cv8.exe') if not os.path.isfile(cmd): - raise Exception("file not found %s" % (cmd)) + raise Exception('File not found {}'.format(cmd)) else: - cmd = subprocess.Popen(["which", "1cv8"], stdout=PIPE).communicate()[0].strip() + cmd = subprocess.Popen(['which', '1cv8'], stdout=subprocess.PIPE).communicate()[0].strip() return cmd + def get_list_of_comitted_files(): """ - Retun a list of files abouts to be decompile + Return the list of files to be decompiled """ files = [] output = [] try: - output = subprocess.check_output(['git','diff-index', '--name-status', '--cached','HEAD'] - ).decode("utf-8") + output = subprocess.check_output(['git', 'diff-index', '--name-status', '--cached', 'HEAD']).decode('utf-8') except subprocess.CalledProcessError: try: - output = subprocess.check_output(['git', 'status', '--porcelain']).decode("utf-8") + output = subprocess.check_output(['git', 'status', '--porcelain']).decode('utf-8') except subprocess.CalledProcessError: - print("Error diff files get") + print('Error diff files get') return files - for result in output.split("\n"): + for result in output.split('\n'): logging.info(result) if result != '': match = modified.match(result) @@ -134,205 +125,184 @@ def get_list_of_comitted_files(): return files -def decompile(list_of_files, source=None, platform=None): + +def decompile(list_of_files, source=None, platform_=None): """ Main functions doing be decompile возвращает list """ - - #list of files to decompile and results decompile + # List of files to decompile and results decompile dataprocessor_files = [] - #set the exit code + # set the exit code exit_code = 0 - #Find datapocessor files + # Find datapocessor files for filename in list_of_files: - #Check the file extensions - logging.debug("file to check %s" % filename) + # Check the file extensions + logging.debug('File to check {}'.format(filename)) if filename[-3:] in ['epf', 'erf']: dataprocessor_files.append(filename) - logging.debug("file %s" % filename) + logging.debug('File {}'.format(filename)) continue if len(dataprocessor_files) == 0: exit(exit_code) - source_dir = source or get_config_param("source") + source_dir = source or get_config_param('source') if source_dir is None: - source_dir = "src" + source_dir = 'src' - #получаем флажок того, что исходники располагаются в подпапке источника - source_in_source = get_config_param("source_in_source") + # Получаем флажок того, что исходники располагаются в подпапке источника + source_in_source = get_config_param('source_in_source') if source_in_source is None: source_in_source = False else: - if source_in_source == "True": + if source_in_source == 'True': source_in_source = True else: source_in_source = False - + dirsource = os.path.abspath(os.path.join(os.path.curdir, source_dir)) curabsdirpath = os.path.abspath(os.path.curdir) - pathbin1c = platform or get_path_to_1c() + pathbin1c = platform_ or get_path_to_1c() returnlist = [] for filename in dataprocessor_files: - logging.info("file %s" % filename) - + logging.info('File {}'.format(filename)) + fullpathfile = os.path.abspath(filename) basename = os.path.splitext(os.path.basename(filename))[0] fullbasename = os.path.basename(filename) newdirname = os.path.dirname(filename) - #если исходники в подпаке источника, меняем путь + # Если исходники в подпапке источника, меняем путь if source_in_source: - dirsource = os.path.abspath(os.path.join(os.path.curdir, newdirname, source_dir)) + dirsource = os.path.abspath(os.path.join(os.path.curdir, newdirname, source_dir)) - - #Скопируем сначало просто структуру каталогов. + # Скопируем сначало просто структуру каталогов if not os.path.exists(dirsource): os.makedirs(dirsource) - #для каждого файла определим новую папку. + # Для каждого файла определим новую папку if source_in_source: - logging.debug("{} {}".format(dirsource, basename)) - newsourcepath = os.path.join(dirsource, basename) - else: - logging.debug("{} {} {}".format(dirsource, newdirname, basename)) - newsourcepath = os.path.join(dirsource, newdirname, basename) - - if(os.path.isabs(newdirname)): + logging.debug('{} {}'.format(dirsource, basename)) + newsourcepath = os.path.join(dirsource, basename) + else: + logging.debug('{} {} {}'.format(dirsource, newdirname, basename)) + newsourcepath = os.path.join(dirsource, newdirname, basename) + + if os.path.isabs(newdirname): newsourcepath = os.path.join(dirsource, basename) if not os.path.exists(newsourcepath): - logging.debug("create new dir %s" % newsourcepath) + logging.debug('create new dir {}'.format(newsourcepath)) os.makedirs(newsourcepath) else: shutil.rmtree(newsourcepath, ignore_errors=True) - logging.debug("file to copy %s, new path %s, new file %s" - % (filename, newsourcepath, os.path.join(newsourcepath, fullbasename)) - ) + logging.debug('File to copy {}, new path {}, new file {}'.format(filename, newsourcepath, + os.path.join(newsourcepath, fullbasename))) - formatstring = format('/C"decompile;pathtocf;%s;pathout;%s;ЗавершитьРаботуПосле;"' % (fullpathfile, newsourcepath)) - base = '/F"'+os.path.join(curabsdirpath,".git", "hooks","ibService")+'"' - V8Reader = '/execute"'+os.path.join(curabsdirpath,".git", "hooks", "v8Reader", "V8Reader.epf")+'"' - tempbat = tempfile.mktemp(".bat") - logging.debug("formatstring is %s , base is %s, V8Reader is %s, temp \ - is %s" % (formatstring, base, V8Reader, tempbat)) + formatstring = format('/C"decompile;pathtocf;{};pathout;{};ЗавершитьРаботуПосле;"'.format(fullpathfile, + newsourcepath)) + base = '/F"' + os.path.join(curabsdirpath, '.git', 'hooks', 'ibService') + '"' + v8_reader = '/execute"' + os.path.join(curabsdirpath, '.git', 'hooks', 'v8Reader', 'V8Reader.epf') + '"' + tempbat = tempfile.mktemp('.bat') + logging.debug('Formatstring is {} , base is {}, V8Reader is {}, temp is {}'.format(formatstring, + base, v8_reader, tempbat)) with open(tempbat, 'w', encoding='cp866') as temp: temp.write('@echo off\n') - temp.write(format('"%s" %s /DisableStartupMessages %s %s' % (pathbin1c, - base, V8Reader, formatstring)) - ) + temp.write(format('"{}" {} /DisableStartupMessages {} {}'.format(pathbin1c, base, v8_reader, formatstring))) temp.close() result = subprocess.check_call(['cmd.exe', '/C', tempbat]) - assert result == 0, format("Не удалось разобрать\ - обработку %s" % (fullpathfile)) + assert result == 0, format('Не удалось разобрать обработку {}'.format(fullpathfile)) if not result == 0: - logging.error(format("Не удалось разобрать \ - обработку %s" % (fullpathfile))) - raise format("Не удалось разобрать\ - обработку %s" % (fullpathfile)) + logging.error(format('Не удалось разобрать обработку {}'.format(fullpathfile))) + raise format('Не удалось разобрать обработку {}'.format(fullpathfile)) returnlist.append(newsourcepath) - logging.info("Разобран в %s" % (newsourcepath)) + logging.info('Разобран в {}'.format(newsourcepath)) return returnlist -def add_to_git(pathlists): +def add_to_git(pathlists): for l in pathlists: result = subprocess.check_call(['git', 'add', '--all', l]) if not result == 0: logging.error(result) exit(result) -def compilefromsource(input, output, ext): + +def compilefromsource(input_, output, ext): import codecs - assert not input is None, "Не указан путь к входящему каталогу" - assert not output is None, "Не указан путь к исходящему файлу" + assert input_ is not None, 'Не указан путь к входящему каталогу' + assert output is not None, 'Не указан путь к исходящему файлу' - extfile = "epf" if ext == "auto" else ext + extfile = 'epf' if ext == 'auto' else ext - dirsource = os.path.abspath(os.path.join(os.path.curdir, input)) + dirsource = os.path.abspath(os.path.join(os.path.curdir, input_)) if not os.path.exists(dirsource) or not os.path.isdir(dirsource): - raise "Не существует входящего каталога" + raise Exception('Не существует входящего каталога') - renamesFile = os.path.join(dirsource, "renames.txt") - if not os.path.exists(renamesFile): - raise "Не существует файла {}".format(renamesFile) - tempPath = tempfile.mkdtemp() + renames_file = os.path.join(dirsource, 'renames.txt') + if not os.path.exists(renames_file): + raise 'Не существует файла {}'.format(renames_file) + temp_path = tempfile.mkdtemp() - with codecs.open(renamesFile, "rb", encoding='utf-8') as r: + with codecs.open(renames_file, 'rb', encoding='utf-8') as r: lines = r.read() lines = lines.split('\r\n') for l in lines: if l.startswith(u'\ufeff'): l = l[1:] - listline = l.split("-->") + listline = l.split('-->') if len(listline) < 2: continue log.debug(l) - newPath = os.path.join(tempPath, listline[0]) - dirname = os.path.dirname(newPath) + new_path = os.path.join(temp_path, listline[0]) + dirname = os.path.dirname(new_path) if not os.path.exists(dirname): os.mkdir(dirname) - oldPath = os.path.join(dirsource, - listline[1].replace( - "\\", os.path.sep) - ) - - if os.path.isdir(oldPath): - #tempFile = tempfile.mkstemp() - newPath = os.path.join(tempPath, listline[0]) - shutil.copytree(oldPath, newPath) + old_path = os.path.join(dirsource, listline[1].replace('\\', os.path.sep)) + + if os.path.isdir(old_path): + new_path = os.path.join(temp_path, listline[0]) + shutil.copytree(old_path, new_path) else: - log.debug(oldPath) - shutil.copy( - os.path.normpath(oldPath), - newPath - ) - - #вызовем v8unpack, для сборки файла из исходников. - tempFile = tempfile.mktemp("."+extfile) - log.debug('unpackv8 -B "{}" "{}"'.format('{}'.format(tempPath), tempFile)) - result = subprocess.check_call( - ['unpackv8', - '-B', - '{}'.format(tempPath), - tempFile] - ) - - log.debug("copy from {} to {}".format(tempFile, output)) - assert result == 0, "Не удалось упаковать каталог {}".format(tempPath) - shutil.move(tempFile, output) + log.debug(old_path) + shutil.copy(os.path.normpath(old_path), new_path) + + # Вызовем v8unpack для сборки файла из исходников + temp_file = tempfile.mktemp('.' + extfile) + log.debug('unpackv8 -B "{}" "{}"'.format('{}'.format(temp_path), temp_file)) + result = subprocess.check_call([ + 'unpackv8', + '-B', + '{}'.format(temp_path), # fixme + temp_file + ]) + + log.debug('Copy from {} to {}'.format(temp_file, output)) + assert result == 0, 'Не удалось упаковать каталог {}'.format(temp_path) + shutil.move(temp_file, output) return output -def main(): - parser = argparse.ArgumentParser(description="Утилита \ - для автоматической распаковки внешних обработок") - parser.add_argument("--version", action="version", - version="%(prog)s {}".format(__version__)) - parser.add_argument("-v", "--verbose", dest="verbose_count", - action="count", default=0, - help="increases log verbosity for each occurence.") - parser.add_argument("--index", action="store_true", - default=False, help="Добавляем в индекс исходники") - parser.add_argument("--g", action="store_true", default=False, - help="Запуситить чтение индекса из git и определить\ - список файлов для разбора") - parser.add_argument("--compile", action="store_true", default=False, - help = "Собрать внешний файл/обработку") - parser.add_argument("--type", action="store", default="auto", - help="Тип файла для сборки epf, erf. По умолчанию авто epf") - parser.add_argument("--platform", action="store", help="Путь \ - к платформе 1С") - parser.add_argument("inputPath", nargs="?", help="Путь к \ - файлам необходимым для распаковки") - parser.add_argument("output", nargs="?", help="Путь к \ - каталогу, куда распаковывать") +def main(): + parser = argparse.ArgumentParser(description='Утилита для автоматической распаковки внешних обработок') + parser.add_argument('--version', action='version', version='%(prog)s {}'.format(__version__)) + parser.add_argument('-v', '--verbose', dest='verbose_count', action='count', default=0, + help='Increases log verbosity for each occurence.') + parser.add_argument('--index', action='store_true', default=False, help='Добавляем в индекс исходники') + parser.add_argument('--g', action='store_true', default=False, + help='Запустить чтение индекса из git и определить список файлов для разбора') + parser.add_argument('--compile', action='store_true', default=False, help='Собрать внешний файл/обработку') + parser.add_argument('--type', action='store', default='auto', + help='Тип файла для сборки epf, erf. По умолчанию авто epf') + parser.add_argument('--platform', action='store', help='Путь к платформе 1С') + parser.add_argument('inputPath', nargs='?', help='Путь к файлам необходимым для распаковки') + parser.add_argument('output', nargs='?', help='Путь к каталогу, куда распаковывать') args = parser.parse_args() @@ -344,26 +314,23 @@ def main(): if args.index is True: add_to_git(indexes) - if(args.compile): + if args.compile: compilefromsource(args.inputPath, args.output, args.type) if args.inputPath is not None: - files = [os.path.abspath( - os.path.join(os.path.curdir, args.inputPath))] + files = [os.path.abspath(os.path.join(os.path.curdir, args.inputPath))] if os.path.isdir(files[0]): - rootDir = os.path.abspath( - os.path.join(os.path.curdir, args.inputPath)); - files=[] - for dirName, subdirList, fileList in os.walk(rootDir): - absdir = dirName[len(rootDir)+1:] + root_dir = os.path.abspath(os.path.join(os.path.curdir, args.inputPath)) + files = [] + for dirName, subdirList, fileList in os.walk(root_dir): + absdir = dirName[len(root_dir) + 1:] if '.git' in subdirList: subdirList.remove('.git') if 'src' in subdirList: subdirList.remove('src') for fname in fileList: - files.append(os.path.join(absdir,fname)) - - decompile( - files, args.output, args.platform) + files.append(os.path.join(absdir, fname)) + + decompile(files, args.output, args.platform) if __name__ == '__main__': diff --git a/tests/test_compile.py b/tests/test_compile.py index 398434a..b6e2c85 100644 --- a/tests/test_compile.py +++ b/tests/test_compile.py @@ -1,112 +1,94 @@ -import unittest -import pyv8unpack -from os import path as path +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- import os -import tempfile +from os import path as path +import pyv8unpack import shutil -from pathlib import Path import subprocess +import tempfile +import unittest class TestV8Unpack(unittest.TestCase): - def setUp(self): - unittest.TestCase.setUp(self) self.tpath = tempfile.mkdtemp() self.tfile = tempfile.mktemp() - - pathIb = path.join(path.curdir, ".git", "hooks", "ibService") - if (path.exists(pathIb)): - shutil.rmtree(pathIb) - shutil.copytree(path.join(path.curdir, "ibService"), - pathIb) - os.mkdir(path.join(path.curdir, ".git", "hooks", "v8Reader")) - shutil.copy(path.join(path.curdir, "v8Reader", "V8Reader.epf"), - path.join(path.curdir, ".git", "hooks", "v8Reader", "V8Reader.epf")) - - def tearDown(self): + path_ib = path.join(path.curdir, '.git', 'hooks', 'ibService') + if path.exists(path_ib): + shutil.rmtree(path_ib) + shutil.copytree(path.join(path.curdir, 'ibService'), path_ib) + os.mkdir(path.join(path.curdir, '.git', 'hooks', 'v8Reader')) + shutil.copy(path.join(path.curdir, 'v8Reader', 'V8Reader.epf'), path.join(path.curdir, '.git', 'hooks', + 'v8Reader', 'V8Reader.epf')) + + def tearDown(self): if os.path.exists(self.tfile): os.remove(self.tfile) shutil.rmtree(self.tpath) - shutil.rmtree(path.join(path.curdir, ".git", "hooks", "ibService")) - os.remove(path.join(path.curdir, ".git", "hooks", "v8Reader", "V8Reader.epf")) - shutil.rmtree(path.join(path.curdir, ".git", "hooks", "v8Reader")) - + shutil.rmtree(path.join(path.curdir, '.git', 'hooks', 'ibService')) + os.remove(path.join(path.curdir, '.git', 'hooks', 'v8Reader', 'V8Reader.epf')) + shutil.rmtree(path.join(path.curdir, '.git', 'hooks', 'v8Reader')) def test_compile_from_source(self): - self.tpath = tempfile.mkdtemp() - file = path.join(path.curdir, "tests", "Fixture.epf") + file = path.join(path.curdir, 'tests', 'Fixture.epf') assert pyv8unpack.decompile([file], self.tpath) - tpath = path.join(self.tpath, "tests", "Fixture") - assert pyv8unpack.compilefromsource(tpath, self.tfile, "epf") == self.tfile - self.assertTrue(path.exists(self.tfile), "Собранный файл не существует {}".format(self.tfile)) - + tpath = path.join(self.tpath, 'tests', 'Fixture') + assert pyv8unpack.compilefromsource(tpath, self.tfile, 'epf') == self.tfile + self.assertTrue(path.exists(self.tfile), 'Собранный файл не существует {}'.format(self.tfile)) def test_decompile(self): - self.tpath = tempfile.mkdtemp() - file = path.join(path.curdir, "tests", "Fixture.epf") + file = path.join(path.curdir, 'tests', 'Fixture.epf') assert pyv8unpack.decompile([file], self.tpath) - + def test_decompile_checkfullpath(self): - self.tpath = tempfile.mkdtemp() - file = path.join(path.curdir, "tests", "Fixture.epf") - assert pyv8unpack.decompile([file], self.tpath); + file = path.join(path.curdir, 'tests', 'Fixture.epf') + assert pyv8unpack.decompile([file], self.tpath) class TestGitInit(unittest.TestCase): - def setUp(self): unittest.TestCase.setUp(self) self.tpath = tempfile.mkdtemp() - self.curdir = os.path.abspath(os.curdir); + self.curdir = os.path.abspath(os.curdir) - print("cur dir {}, temp path {}".format(self.curdir, self.tpath)) + print('Cur dir {}, temp path {}'.format(self.curdir, self.tpath)) os.chdir(self.tpath) - + try: - output = subprocess.check_output(['git','init', self.tpath] - ).decode("utf-8") + output = subprocess.check_output(['git', 'init', self.tpath]).decode('utf-8') except subprocess.CalledProcessError: - print("Error diff files get: trace %s" % subprocess.CalledProcessError.output) - - pathIb = path.join(self.tpath, ".git", "hooks", "ibService") - if (path.exists(pathIb)): - shutil.rmtree(pathIb) - shutil.copytree(path.join(self.curdir, "ibService"), - pathIb) - os.mkdir(path.join(self.tpath, ".git", "hooks", "v8Reader")) - shutil.copy(path.join(self.curdir, "v8Reader", "V8Reader.epf"), - path.join(self.tpath, ".git", "hooks", "v8Reader", "V8Reader.epf")) - shutil.copy(path.join(self.curdir,"pre-commit"), - path.join(self.tpath, ".git", "hooks", "pre-commit")) - shutil.copy(path.join(self.curdir,"pyv8unpack.py"), - path.join(self.tpath, ".git", "hooks", "pyv8unpack.py")) - + print('Error diff files get: trace %s' % subprocess.CalledProcessError.output) + + path_ib = path.join(self.tpath, '.git', 'hooks', 'ibService') + if path.exists(path_ib): + shutil.rmtree(path_ib) + shutil.copytree(path.join(self.curdir, 'ibService'), path_ib) + os.mkdir(path.join(self.tpath, '.git', 'hooks', 'v8Reader')) + shutil.copy(path.join(self.curdir, 'v8Reader', 'V8Reader.epf'), path.join(self.tpath, '.git', 'hooks', + 'v8Reader', 'V8Reader.epf')) + shutil.copy(path.join(self.curdir, 'pre-commit'), path.join(self.tpath, '.git', 'hooks', 'pre-commit')) + shutil.copy(path.join(self.curdir, 'pyv8unpack.py'), path.join(self.tpath, '.git', 'hooks', 'pyv8unpack.py')) def tearDown(self): - - #shutil.rmtree(self.tpath) + # shutil.rmtree(self.tpath) os.chdir(self.curdir) - print("cur dir {}".format(os.curdir)) + print('cur dir {}'.format(os.curdir)) def test_firstadd(self): - file = path.join(self.curdir, "tests", "Fixture.epf") + file = path.join(self.curdir, 'tests', 'Fixture.epf') shutil.copy(file, - path.join(self.tpath, "Fixture.epf")) - + path.join(self.tpath, 'Fixture.epf')) - output = subprocess.check_output(['git','add', "-A", "."] - ).decode("utf-8") - print("output {}".format(output)) - output = subprocess.check_output(['git','commit', "-m", "'init commit'"] - ).decode("utf-8") - print("output {}".format(output)) + output = subprocess.check_output(['git', 'add', '-A', '.']).decode('utf-8') + print('Output {}'.format(output)) + output = subprocess.check_output(['git', 'commit', '-m', '"init commit"']).decode('utf-8') + print('Output {}'.format(output))