diff --git a/README.md b/README.md index 038361c..79fde47 100644 --- a/README.md +++ b/README.md @@ -1,59 +1,34 @@ -## Набор утилит для автоматической разборки/сборки внешних обработок и отчетов, при помещении (commit) в git +## Набор утилит для автоматической разборки/сборки внешних обработок и отчетов, при помещении (commit) в git [![Join the chat at https://gitter.im/xDrivenDevelopment/precommit1c](https://badges.gitter.im/xDrivenDevelopment/precommit1c.svg)](https://gitter.im/xDrivenDevelopment/precommit1c?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) ### Что к чему ---- * v8files-extractor.os - скрипт для OneScript, получающий список помещаемых файлов при коммите, фильтрующий по расширению только внешние отчёты/обработки и запускающий внешнюю обработку для распаковки этих файлов. Так же позволяет собирать обработки из полученных исходников. -* * 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 перед каждым помещением. Выполняет роль простой запускалки скрипта v8files-extractor.os ### Установка 1. Зависимости: - * OneScript http://oscript.io/ (рекомендуется) - * * или Python 3.3 + * OneScript http://oscript.io/ * установленная платформа 1С:Предприятие 8 * git * в случае запуска из под wine необходим msscriptcontrol - * в случае использования OneScript-версии требуется установка **develop**-версии библиотек [oscript-library]( https://github.com/EvilBeaver/oscript-library) + * Библиотеки [oscript-library]( https://github.com/EvilBeaver/oscript-library) -2. По умолчанию считается, что пути к oscript.exe и/или python.exe и git.exe находятся в переменной path, иначе необходимо указать явный путь в файлах pre-commit (для oscript/python) и pyv8unpack.py (для git) +2. По умолчанию считается, что пути к oscript.exe и git.exe находятся в переменной path, иначе необходимо указать явный путь в файлах pre-commit -3. После скачивания данного репозитория необходимо инициализировать используемые подмодули. +3. После клонирования данного репозитория необходимо инициализировать используемые подмодули. Откройте командую строку и выполните команды: ```cmd cd путь/к/репозиторию/precommit1c git submodule update --init --recursive ``` -4. Путь к платформе находится автоматически в случае стандартной установки 1С. Если необходимо явно указать путь к платформе, то нужно: указать переменную окружения PATH1C c путём к каталогу, в который установлена 1С -``` -set PATH1C = d:\program\ -``` -или создать ini-файл рядом с файлом скрипта pyv8unpack.py или в домашней папке в корне с именем precommit1c.ini и содержанием: -``` -[DEFAULT] -onecplatfrorms = c:\program\1cv8\8.3.5.823\bin\1cv8.exe -``` - -5. Путь хранения исходных текстов разобранных обработок по умолчанию используется как **src** (для обеспечения совместимости со старыми версиями обработки), однако его можно переназначить в ini-файле -``` -[DEFAULT] -source = plugin_source -``` - -6. Флажок, изменяющий корневую папку хранения исходных текстов разобранных обработок по умолчанию используется как корневая папка (для обеспечения совместимости со старыми версиями обработки), однако его можно переназначить в ini-файле. Если изменить флажок на True - в каждой корневой папке внешних обработок будет создан подкаталог текстов разобранных обработок. -``` -[DEFAULT] -source_in_source = False -``` - -7. Наконец, содержимое каталога необходимо скопировать в каталог .git/hooks/ вашего проекта. -> *Примечание:* каталог .git по умолчанию скрыт. - +4. Cодержимое каталога необходимо скопировать в каталог .git/hooks/ вашего проекта. +*Примечание:* каталог .git по умолчанию скрыт. В итоге у вас должна получиться следующая структура каталога: ``` .git\ @@ -63,14 +38,15 @@ source_in_source = False tools ibService v8files-extractor.os - pyv8unpack.py ``` -##Запуск +5. Путь хранения исходных текстов разобранных обработок по умолчанию используется как **src** (для обеспечения совместимости со старыми версиями обработки), однако его можно переназначить в файле `pre-commit` + +## Запуск После установки достаточно для проверки сделать commit для любого файла epf/erf, и в вашем репозитории автоматически должна создаться папка *src*, полностью повторяющая структуру проекта, изменённые или добавленные файлы распакуются в папки с аналогичными наименованиями. -##Командная строка запуска OneScript +## Командная строка запуска OneScript ``` oscript v8files-extractor.os ? @@ -90,38 +66,12 @@ oscript v8files-extractor.os ? Если указан параметр --recursive, скрипт будет рекурсивно искать исходные коды отчетов и обработок в указанном каталоге и собирать их, повторяя структуру каталога ``` -##Командная строка запуска Питона - -``` -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С -``` - -##Ограничения +## Ограничения -Дополнительно необходима настройка git для возможности использования кириллических наименований внешних обработок ```git config --local core.quotepath false``` +Дополнительно необходима настройка git для возможности использования кириллических наименований внешних обработок `git config --local core.quotepath false` Не стоит называть файлы с разным расширением epf и erf одинаковыми именами - каталоги с исходниками создаются только по наименованию без учёта расширения и возможен конфликт имен. -##Что внутри +## Что внутри -Как это работает: v8files-extractor.os/pyv8unpack.py полностью повторяет иерархию папок относительно корня репозитория только в папке SRC (от слова source), для каждой изменённой внешней обработки создаётся своя папка и туда с помощью v8unpack распаковывается помещаемая обработка, с помощью v8reader определяются наименования макетов, форм, модуля обработки и переименовываются, переименования сохраняются в служебном файле renames.txt, те файлы, которые невозможно определить или же носят чисто служебный характер, переносятся в каталог *und* +Как это работает: v8files-extractor.os полностью повторяет иерархию папок относительно корня репозитория только в папке SRC (от слова source), для каждой изменённой внешней обработки создаётся своя папка и туда с помощью v8unpack распаковывается помещаемая обработка, с помощью v8reader определяются наименования макетов, форм, модуля обработки и переименовываются, переименования сохраняются в служебном файле renames.txt, те файлы, которые невозможно определить или же носят чисто служебный характер, переносятся в каталог *und* diff --git a/copy-to-hook.cmd b/copy-to-hook.cmd index 675ae85..bcb45f9 100644 --- a/copy-to-hook.cmd +++ b/copy-to-hook.cmd @@ -6,9 +6,9 @@ xcopy .\ibService .\..\..\.git\hooks\ibService\ /Y /E /F xcopy .\pre-commit .\..\..\.git\hooks\ /Y /F mkdir .\..\..\.git\hooks\v8Reader xcopy .\v8Reader\V8Reader.epf .\..\..\.git\hooks\v8Reader\ /Y /F -xcopy .\pyv8unpack.py .\..\..\.git\hooks\ /Y /F +xcopy .\v8files-extractor.os .\..\..\.git\hooks\ /Y /F mkdir .\..\..\.git\hooks\tools xcopy .\tools\v8unpack.exe .\..\..\.git\hooks\tools\ /Y /F cd .\..\..\ -git config --local core.quotepath false \ No newline at end of file +git config --local core.quotepath false diff --git a/create-links-in-hooks.bat b/create-links-in-hooks.bat index 10a1fdf..6f31b7c 100644 --- a/create-links-in-hooks.bat +++ b/create-links-in-hooks.bat @@ -1,6 +1,6 @@ mklink ".git/hooks/pre-commit" "%~dp0pre-commit" -mklink ".git/hooks/pyv8unpack.py" "%~dp0pyv8unpack.py" +mklink ".git/hooks/v8files-extractor.os" "%~dp0v8files-extractor.os" mklink /J ".git/hooks/ibService" "%~dp0ibService" mklink /J ".git/hooks/v8Reader" "%~dp0v8Reader" mklink /J ".git/hooks/tools" "%~dp0tools" -git config --local core.quotepath false \ No newline at end of file +git config --local core.quotepath false diff --git a/precommit1c.ini.example b/precommit1c.ini.example deleted file mode 100644 index d39e472..0000000 --- a/precommit1c.ini.example +++ /dev/null @@ -1,3 +0,0 @@ -[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 deleted file mode 100644 index 2a7949d..0000000 --- a/pyv8unpack.py +++ /dev/null @@ -1,386 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -import argparse -import logging -import os -import platform -import re -import subprocess -import shutil -import sys -import tempfile - -__version__ = '0.0.3' - -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 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('~'): - try: - 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 - - config = ConfigParser() - config.read_file(source) - break - except IOError: - pass - - 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. - First env, 'PATH1C' - Second env 'PROGRAMFILES' (only Windows) - Third '/opt/1c' (only Linux) - """ - 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 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 {}'.format(cmd)) - - return cmd - - # 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 - - 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') - if program_files is None: - 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 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 {}'.format(cmd)) - - else: - for p in "/opt/1C/v8.3/x86_64", "/opt/1C/v8.3/i386": - if os.path.exists(os.path.join(p, '1cv8')): - return os.path.join(p, '1cv8') - cmd = subprocess.Popen(['which', '1cv8'], stdout=subprocess.PIPE).communicate()[0].strip() - - return cmd - -def get_service_path(suffix): - curdir = os.curdir - if '__file__' in globals(): - curdir = os.path.dirname(os.path.abspath(__file__)) - - hookpath = os.path.join(os.curdir, '.git', 'hooks') - for loc in curdir, os.curdir, hookpath: - found = os.path.join(loc, suffix) - if os.path.exists(found): - log.debug("suffix {} - service path {}".format(suffix, found)) - return found - - return None - - - -def get_list_of_comitted_files(): - """ - 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') - except subprocess.CalledProcessError: - try: - output = subprocess.check_output(['git', 'status', '--porcelain']).decode('utf-8') - except subprocess.CalledProcessError: - print('Error diff files get') - return files - - for result in output.split('\n'): - log.info(result) - if result != '': - match = modified.match(result) - if match: - files.append(match.group('name')) - - return files - - -def decompile(list_of_files, source=None, platform_=None): - """ - Main functions doing be decompile - возвращает list - """ - # List of files to decompile and results decompile - dataprocessor_files = [] - - # set the exit code - exit_code = 0 - - # Find datapocessor files - for filename in list_of_files: - # Check the file extensions - log.debug('File to check {}'.format(filename)) - if filename[-3:] in ['epf', 'erf']: - dataprocessor_files.append(filename) - log.debug('File {}'.format(filename)) - continue - if len(dataprocessor_files) == 0: - exit(exit_code) - - source_dir = source or get_config_param('source') - if source_dir is None: - source_dir = 'src' - - # Получаем флажок того, что исходники располагаются в подпапке источника - 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': - 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() - pathibService = get_service_path('ibService') - pathv8reader = get_service_path(os.path.join('v8Reader', 'V8Reader.epf')) - returnlist = [] - - - for filename in dataprocessor_files: - log.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)) - - # Скопируем сначало просто структуру каталогов - if not os.path.exists(dirsource): - os.makedirs(dirsource) - # Для каждого файла определим новую папку - if source_in_source: - log.debug('{} {}'.format(dirsource, basename)) - newsourcepath = os.path.join(dirsource, basename) - else: - log.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): - log.debug('create new dir {}'.format(newsourcepath)) - os.makedirs(newsourcepath) - else: - shutil.rmtree(newsourcepath, ignore_errors=True) - - log.debug('File to copy {}, new path {}, new file {}'.format(filename, newsourcepath, - os.path.join(newsourcepath, fullbasename))) - - formatstring = format('/C"decompile;pathtocf;{};pathout;{};shutdown;convert-mxl2txt;"'.format(fullpathfile, - newsourcepath)) - base = '/F"' + pathibService + '"' - v8_reader = '/execute"' + pathv8reader + '"' - tempbat = tempfile.mktemp('.bat') - log.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('"{}" {} /DisableStartupMessages {} {}'.format(pathbin1c, base, v8_reader, formatstring))) - temp.close() - result = subprocess.check_call(['cmd.exe', '/C', tempbat]) - assert result == 0, format('Не удалось разобрать обработку {}'.format(fullpathfile)) - if not result == 0: - log.error(format('Не удалось разобрать обработку {}'.format(fullpathfile))) - raise format('Не удалось разобрать обработку {}'.format(fullpathfile)) - returnlist.append(newsourcepath) - log.info('Разобран в {}'.format(newsourcepath)) - - return returnlist - - -def add_to_git(pathlists): - for l in pathlists: - result = subprocess.check_call(['git', 'add', '--all', l]) - if not result == 0: - log.error(result) - exit(result) - -def findexecute(name): - found = [] - ext = '' - searchpath = os.environ.get("PATH", "").split(os.pathsep) - if sys.platform.startswith("win"): - ext = '.exe' - searchpath.insert(0, os.curdir) # implied by Windows shell - - for i in range(len(searchpath)): - dirName = searchpath[i] - # On windows the dirName *could* be quoted, drop the quotes - if sys.platform.startswith("win") and len(dirName) >= 2\ - and dirName[0] == '"' and dirName[-1] == '"': - dirName = dirName[1:-1] - absName = os.path.abspath( - os.path.normpath(os.path.join(dirName, name+ext))) - if os.path.isfile(absName) and not absName in found: - found.append(absName) - - firstpath = "" - if len(found) > 0: firstpath = found[0] - return firstpath - -def compilefromsource(input_, output, ext): - import codecs - - assert input_ is not None, 'Не указан путь к входящему каталогу' - assert output is not None, 'Не указан путь к исходящему файлу' - - extfile = 'epf' if ext == 'auto' else ext - - dirsource = os.path.abspath(os.path.join(os.path.curdir, input_)) - if not os.path.exists(dirsource) or not os.path.isdir(dirsource): - raise Exception('Не существует входящего каталога') - - 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(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('-->') - if len(listline) < 2: - continue - log.debug(l) - new_path = os.path.join(temp_path, listline[0]) - dirname = os.path.dirname(new_path) - if not os.path.exists(dirname): - os.mkdir(dirname) - 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(old_path) - shutil.copy(os.path.normpath(old_path), new_path) - - # Вызовем v8unpack для сборки файла из исходников - temp_file = tempfile.mktemp('.' + extfile) - #unpackpath = findexecute("v8unpack") - #if len(unpackpath) == 0: - # unpackpath = findexecute("unpackv8") - unpackpath = get_service_path(os.path.join('tools', 'v8unpack.exe')) - assert (len(unpackpath) > 0), "path to v8unpack is empty" - log.debug('{} -B "{}" "{}"'.format(unpackpath, '{}'.format(temp_path), temp_file)) - print('{} -B "{}" "{}"'.format(unpackpath, '{}'.format(temp_path), temp_file)) - result = subprocess.check_call([ - unpackpath, - '-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='Путь к каталогу, куда распаковывать') - - args = parser.parse_args() - - log.setLevel(max(3 - args.verbose_count, 0) * 10) - - if args.g is True: - files = get_list_of_comitted_files() - indexes = decompile(files, args.output, args.platform) - if args.index is True: - add_to_git(indexes) - - 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))] - if os.path.isdir(files[0]): - 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) - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/tests/test_compile.py b/tests/test_compile.py deleted file mode 100644 index 6ce3adb..0000000 --- a/tests/test_compile.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -import os -from os import path as path -import pyv8unpack -import shutil -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() - - def tearDown(self): - if os.path.exists(self.tfile): - os.remove(self.tfile) - shutil.rmtree(self.tpath) - - def test_compile_from_source(self): - self.tpath = tempfile.mkdtemp() - 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)) - - def test_decompile(self): - self.tpath = tempfile.mkdtemp() - 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) - - def test_decompile_checkconvertmxl2txt(self): - self.tpath = tempfile.mkdtemp() - file = path.join(path.curdir, 'tests', 'Fixture.epf') - assert pyv8unpack.decompile([file], self.tpath) - tpath = path.join(self.tpath, 'tests', 'Fixture', 'Макеты', "ТабличныйДокумент_mxl.txt") - self.assertTrue(path.exists(tpath), 'Файл не существует {}'.format(tpath)) - - -class TestGitInit(unittest.TestCase): - def setUp(self): - unittest.TestCase.setUp(self) - self.tpath = tempfile.mkdtemp() - self.curdir = os.path.abspath(os.curdir) - - 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') - except subprocess.CalledProcessError: - 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) - os.chdir(self.curdir) - print('cur dir {}'.format(os.curdir)) - - def test_firstadd(self): - file = path.join(self.curdir, 'tests', 'Fixture.epf') - shutil.copy(file, - 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)) - - - - diff --git a/v8Reader b/v8Reader index 6af558b..20a1588 160000 --- a/v8Reader +++ b/v8Reader @@ -1 +1 @@ -Subproject commit 6af558be1980391f45de8fa5b72ef12ee210fae8 +Subproject commit 20a15888f230bf8198daf658857a633a80370379 diff --git a/v8files-extractor.os b/v8files-extractor.os index 10fc6b1..8025e72 100644 --- a/v8files-extractor.os +++ b/v8files-extractor.os @@ -10,6 +10,14 @@ Перем мВозможныеКоманды; Перем ЭтоWindows; +Функция Версия() Экспорт + + Версия = "2.0.0"; + + Возврат "v" + Версия; + +КонецФункции + Функция ВозможныеКоманды() Если мВозможныеКоманды = Неопределено Тогда @@ -27,7 +35,6 @@ Функция ЗапускВКоманднойСтроке() Лог_cmdline = Логирование.ПолучитьЛог("oscript.lib.cmdline"); Лог_cmdline.УстановитьУровень(УровниЛога.Отладка); - // Лог.УстановитьУровень(УровниЛога.Отладка); ВыводПоУмолчанию = Новый ВыводЛогаВКонсоль(); Лог_cmdline.ДобавитьСпособВывода(ВыводПоУмолчанию); @@ -41,6 +48,8 @@ Возврат Ложь; КонецЕсли; + Лог.Информация("precommit1c " + Версия() + Символы.ПС); + Попытка Парсер = Новый ПарсерАргументовКоманднойСтроки(); @@ -122,7 +131,7 @@ ЭтоWindows = Найти(ВРег(СистемнаяИнформация.ВерсияОС), "WINDOWS") > 0; Лог = Логирование.ПолучитьЛог("oscript.app.v8files-extractor"); - Лог.УстановитьУровень(УровниЛога.Отладка); + //Лог.УстановитьУровень(УровниЛога.Отладка); ВыводПоУмолчанию = Новый ВыводЛогаВКонсоль(); Лог.ДобавитьСпособВывода(ВыводПоУмолчанию); @@ -284,6 +293,7 @@ Процедура ВывестиСправку() Сообщить("Утилита сборки/разборки внешних файлов 1С"); + Сообщить(Версия()); Сообщить(" "); Сообщить("Параметры командной строки:"); Сообщить(" --decompile inputPath outputPath"); @@ -527,6 +537,9 @@ СтарыйКаталог = Новый Файл(СтарыйПуть); Если СтарыйКаталог.ЭтоКаталог() Тогда КопироватьСодержимоеКаталога(СтарыйПуть, НовыйПуть); + Если ЭтоПутьКТолстойФорме(НовыйПуть) Тогда + ПереместитьФайл(ОбъединитьПути(НовыйПуть, "module.bsl"), ОбъединитьПути(НовыйПуть, "module")); + КонецЕсли; Иначе КопироватьФайл(СтарыйПуть, НовыйПуть); КонецЕсли; @@ -552,6 +565,15 @@ КонецФункции +Функция ЭтоПутьКТолстойФорме(ПутьКПапке) + + ФайлМодуля = Новый Файл(ОбъединитьПути(ПутьКПапке, "module.bsl")); + ФайлФормы = Новый Файл(ОбъединитьПути(ПутьКПапке, "form")); + + Возврат ФайлМодуля.Существует() И ФайлФормы.Существует(); + +КонецФункции + Функция ПолучитьТипФайлаПоКаталогуИсходников(Знач КаталогИсходников) ПутьКФайлуРут = ОбъединитьПути(КаталогИсходников, "root");