From 1776ef0fd993670c6e26cce76e90eb63f63bb140 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Mon, 21 Mar 2016 17:07:36 +0300 Subject: [PATCH 01/11] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20v8reader.=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- v8Reader | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v8Reader b/v8Reader index 6af558b..20a1588 160000 --- a/v8Reader +++ b/v8Reader @@ -1 +1 @@ -Subproject commit 6af558be1980391f45de8fa5b72ef12ee210fae8 +Subproject commit 20a15888f230bf8198daf658857a633a80370379 From 77d27bf8e8ee64446a4929660bcb134ad2759a28 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Mon, 21 Mar 2016 22:32:10 +0300 Subject: [PATCH 02/11] =?UTF-8?q?=D0=9F=D1=80=D0=B8=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BF=D0=B8=D0=BB=D1=8F=D1=86=D0=B8=D0=B8=20=D0=BE=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BE=D0=B1=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BD=D0=BE=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B8=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20module.bsl=20->=20?= =?UTF-8?q?module?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v8reader для удобства раскладывает файлы в расширение bsl. v8unpack, которым производится сборка, требует эти файлы без расширения --- v8files-extractor.os | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/v8files-extractor.os b/v8files-extractor.os index 10fc6b1..e7e1616 100644 --- a/v8files-extractor.os +++ b/v8files-extractor.os @@ -527,6 +527,9 @@ СтарыйКаталог = Новый Файл(СтарыйПуть); Если СтарыйКаталог.ЭтоКаталог() Тогда КопироватьСодержимоеКаталога(СтарыйПуть, НовыйПуть); + Если ЭтоПутьКТолстойФорме(НовыйПуть) Тогда + ПереместитьФайл(ОбъединитьПути(НовыйПуть, "module.bsl"), ОбъединитьПути(НовыйПуть, "module")); + КонецЕсли; Иначе КопироватьФайл(СтарыйПуть, НовыйПуть); КонецЕсли; @@ -552,6 +555,15 @@ КонецФункции +Функция ЭтоПутьКТолстойФорме(ПутьКПапке) + + ФайлМодуля = Новый Файл(ОбъединитьПути(ПутьКПапке, "module.bsl")); + ФайлФормы = Новый Файл(ОбъединитьПути(ПутьКПапке, "form")); + + Возврат ФайлМодуля.Существует() И ФайлФормы.Существует(); + +КонецФункции + Функция ПолучитьТипФайлаПоКаталогуИсходников(Знач КаталогИсходников) ПутьКФайлуРут = ОбъединитьПути(КаталогИсходников, "root"); From b4f102aabe6f9ebd5ee8ea2626a6bc714ab4f34a Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 22 Mar 2016 16:51:53 +0300 Subject: [PATCH 03/11] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 55 +++++++++++++------------------------------------------ 1 file changed, 13 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 038361c..ea291ef 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,26 @@ -## Набор утилит для автоматической разборки/сборки внешних обработок и отчетов, при помещении (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) + * **develop**-версия библиотек [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 @@ -33,7 +31,7 @@ git submodule update --init --recursive ``` set PATH1C = d:\program\ ``` -или создать ini-файл рядом с файлом скрипта pyv8unpack.py или в домашней папке в корне с именем precommit1c.ini и содержанием: +или создать ini-файл рядом с файлом скрипта v8files-extractor.os или в домашней папке в корне с именем precommit1c.ini и содержанием: ``` [DEFAULT] onecplatfrorms = c:\program\1cv8\8.3.5.823\bin\1cv8.exe @@ -63,14 +61,13 @@ source_in_source = False tools ibService v8files-extractor.os - pyv8unpack.py ``` -##Запуск +## Запуск После установки достаточно для проверки сделать commit для любого файла epf/erf, и в вашем репозитории автоматически должна создаться папка *src*, полностью повторяющая структуру проекта, изменённые или добавленные файлы распакуются в папки с аналогичными наименованиями. -##Командная строка запуска OneScript +## Командная строка запуска OneScript ``` oscript v8files-extractor.os ? @@ -90,38 +87,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* From 15ac375310975f27bb443053159c0a22b6539a24 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 22 Mar 2016 17:22:59 +0300 Subject: [PATCH 04/11] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=BF=D0=B8=D1=82=D0=BE=D0=BD=D0=BE-=D1=84=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D1=8B.=20=D0=91=D0=B0=D1=82=D0=BD=D0=B8=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D1=8B=20=D0=BD?= =?UTF-8?q?=D0=B0=20os-=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- copy-to-hook.cmd | 4 +- create-links-in-hooks.bat | 4 +- pyv8unpack.py | 386 -------------------------------------- tests/test_compile.py | 91 --------- 4 files changed, 4 insertions(+), 481 deletions(-) delete mode 100644 pyv8unpack.py delete mode 100644 tests/test_compile.py 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/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)) - - - - From 528c6bd029224e3a7c1a4d4ae3d62dd862e51d22 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 22 Mar 2016 17:35:51 +0300 Subject: [PATCH 05/11] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- v8files-extractor.os | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/v8files-extractor.os b/v8files-extractor.os index e7e1616..1bf369e 100644 --- a/v8files-extractor.os +++ b/v8files-extractor.os @@ -10,6 +10,14 @@ Перем мВозможныеКоманды; Перем ЭтоWindows; +Функция ПолучитьВерсию() Экспорт + + Версия = "2.0.0"; + + Возврат "v" + Версия; + +КонецФункции + Функция ВозможныеКоманды() Если мВозможныеКоманды = Неопределено Тогда @@ -41,6 +49,8 @@ Возврат Ложь; КонецЕсли; + Лог.Информация("precommit1c " + ПолучитьВерсию() + Символы.ПС); + Попытка Парсер = Новый ПарсерАргументовКоманднойСтроки(); @@ -284,6 +294,7 @@ Процедура ВывестиСправку() Сообщить("Утилита сборки/разборки внешних файлов 1С"); + Сообщить(ПолучитьВерсию()); Сообщить(" "); Сообщить("Параметры командной строки:"); Сообщить(" --decompile inputPath outputPath"); From b568e306dec5c720a72f7d4d43d7c0e832f3c763 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 22 Mar 2016 17:36:15 +0300 Subject: [PATCH 06/11] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=B2=D0=BE=D0=B4=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B4=D0=BE?= =?UTF-8?q?=D1=87=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BB=D0=BE=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- v8files-extractor.os | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/v8files-extractor.os b/v8files-extractor.os index 1bf369e..8393668 100644 --- a/v8files-extractor.os +++ b/v8files-extractor.os @@ -35,7 +35,6 @@ Функция ЗапускВКоманднойСтроке() Лог_cmdline = Логирование.ПолучитьЛог("oscript.lib.cmdline"); Лог_cmdline.УстановитьУровень(УровниЛога.Отладка); - // Лог.УстановитьУровень(УровниЛога.Отладка); ВыводПоУмолчанию = Новый ВыводЛогаВКонсоль(); Лог_cmdline.ДобавитьСпособВывода(ВыводПоУмолчанию); @@ -132,7 +131,7 @@ ЭтоWindows = Найти(ВРег(СистемнаяИнформация.ВерсияОС), "WINDOWS") > 0; Лог = Логирование.ПолучитьЛог("oscript.app.v8files-extractor"); - Лог.УстановитьУровень(УровниЛога.Отладка); + //Лог.УстановитьУровень(УровниЛога.Отладка); ВыводПоУмолчанию = Новый ВыводЛогаВКонсоль(); Лог.ДобавитьСпособВывода(ВыводПоУмолчанию); From 3a118a88ef2f177681843858aef546ca9089f652 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 22 Mar 2016 17:47:58 +0300 Subject: [PATCH 07/11] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=D0=92=D0=B5=D1=80=D1=81=D0=B8=D1=8E=20->=20=D0=92?= =?UTF-8?q?=D0=B5=D1=80=D1=81=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- v8files-extractor.os | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v8files-extractor.os b/v8files-extractor.os index 8393668..a91ac2a 100644 --- a/v8files-extractor.os +++ b/v8files-extractor.os @@ -10,7 +10,7 @@ Перем мВозможныеКоманды; Перем ЭтоWindows; -Функция ПолучитьВерсию() Экспорт +Функция Версия() Экспорт Версия = "2.0.0"; From 3a4b81902c6e51657743cd811a2f03249db733a3 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 23 Mar 2016 00:26:28 +0300 Subject: [PATCH 08/11] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D1=83=D1=8E=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80?= =?UTF-8?q?=D0=BC=D0=B0=D1=86=D0=B8=D1=8E=20=D0=BE=20precommit.ini.=20?= =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B2=D0=B8=D0=BD=D1=83=D0=BB=20?= =?UTF-8?q?=D0=BF=D1=83=D0=BD=D0=BA=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 29 ++++------------------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index ea291ef..9d2c15b 100644 --- a/README.md +++ b/README.md @@ -27,31 +27,8 @@ cd путь/к/репозиторию/precommit1c git submodule update --init --recursive ``` -4. Путь к платформе находится автоматически в случае стандартной установки 1С. Если необходимо явно указать путь к платформе, то нужно: указать переменную окружения PATH1C c путём к каталогу, в который установлена 1С -``` -set PATH1C = d:\program\ -``` -или создать ini-файл рядом с файлом скрипта v8files-extractor.os или в домашней папке в корне с именем 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,6 +40,8 @@ source_in_source = False v8files-extractor.os ``` +5. Путь хранения исходных текстов разобранных обработок по умолчанию используется как **src** (для обеспечения совместимости со старыми версиями обработки), однако его можно переназначить в файле `pre-commit` + ## Запуск После установки достаточно для проверки сделать commit для любого файла epf/erf, и в вашем репозитории автоматически должна создаться папка *src*, полностью повторяющая структуру проекта, изменённые или добавленные файлы распакуются в папки с аналогичными наименованиями. From faab9b018be5ad4365d837a6e5dd2da087e490f9 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 23 Mar 2016 00:31:09 +0300 Subject: [PATCH 09/11] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=20=D1=81?= =?UTF-8?q?=D0=B0=D0=BC=20precommit.ini?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- precommit1c.ini.example | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 precommit1c.ini.example 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 From cb9c2e6665257033b06657f57039c7652a9a7d56 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 23 Mar 2016 12:22:31 +0300 Subject: [PATCH 10/11] =?UTF-8?q?=D0=94=D0=BB=D1=8F=20oscript-library=20?= =?UTF-8?q?=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20=D0=BD=D0=B5=20=D0=BD?= =?UTF-8?q?=D1=83=D0=B6=D0=BD=D0=B0=20develop-=D0=B2=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Необходимая функциональность уже включена в мастер --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9d2c15b..79fde47 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ * установленная платформа 1С:Предприятие 8 * git * в случае запуска из под wine необходим msscriptcontrol - * **develop**-версия библиотек [oscript-library]( https://github.com/EvilBeaver/oscript-library) + * Библиотеки [oscript-library]( https://github.com/EvilBeaver/oscript-library) 2. По умолчанию считается, что пути к oscript.exe и git.exe находятся в переменной path, иначе необходимо указать явный путь в файлах pre-commit From 92205e002b0aeecbeb8e33909a396ad0d9e5f0f3 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 23 Mar 2016 16:14:42 +0300 Subject: [PATCH 11/11] =?UTF-8?q?=D0=92=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20-?= =?UTF-8?q?=20=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B8=D1=82=D1=8C=D0=92=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- v8files-extractor.os | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/v8files-extractor.os b/v8files-extractor.os index a91ac2a..8025e72 100644 --- a/v8files-extractor.os +++ b/v8files-extractor.os @@ -48,7 +48,7 @@ Возврат Ложь; КонецЕсли; - Лог.Информация("precommit1c " + ПолучитьВерсию() + Символы.ПС); + Лог.Информация("precommit1c " + Версия() + Символы.ПС); Попытка @@ -293,7 +293,7 @@ Процедура ВывестиСправку() Сообщить("Утилита сборки/разборки внешних файлов 1С"); - Сообщить(ПолучитьВерсию()); + Сообщить(Версия()); Сообщить(" "); Сообщить("Параметры командной строки:"); Сообщить(" --decompile inputPath outputPath");