OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 20 Июнь, 2025 18:40

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Суббота, 06 Февраль, 2010 22:21 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Под контролем изменений в составных документах я имею в виду систему заплаток и выявления изменений. В мире Unix принято пользоваться такими утилитами, как patch и diff.

Каким образом можно автоматизировать изменения в исходных текстах программ составных документов?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 06 Февраль, 2010 22:26 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
F9 (Compare Texts).

И не злоупотреблять вариантами.

Стремится к схеме "один модуль - только один его вариант". Вариативность - в разные модули реализации.

И т.п.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 07 Февраль, 2010 07:26 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
Вариативность - в разные модули реализации.
Кстати, да.
Это, вместе с F9, по-моему, заметно нейтрализует пользу от SVN.

(Всё хочется найти убойный аргумент, чтобы не заморачиваться с этими дурами.)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 07 Февраль, 2010 09:01 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2461
Откуда: Россия, Томск
Роман М. писал(а):
Каким образом можно автоматизировать изменения в исходных текстах программ составных документов?
С точки зрения утилит diff/patch текстовый файл состоит из последовательности строк, идущих в определённом порядке одна за другой. Помимо данного порядка строки между собой никак не связаны, то есть любую строку можно заменить на любую другую последовательность строк, в том числе пустую (естественно, замена эта совершается по воле пользователя). Утилита diff сравнивает два файла (ДО и ПОСЛЕ) и создаёт последовательность команд (ПАТЧ) по удалению и замене строк, выполнение которых переводит файл из состояния ДО в состояние ПОСЛЕ. Эту последовательность команд в автоматическом режиме умеет выполнять утилита patch.

В качестве примера ситуации, когда строки между собой связаны и автоматическая работа утилит невозможна, можно привести следующий формат: пусть в текстовом файле первая строка содержит общее количество строк в файле. Это нарушает требование взаимной независимости строк: удаление любой нижележащей строки должно автоматически приводить к изменению содержимого первой строки. В случае с odc-файлами вместо такой первой строки есть бинарный заголовок файла, в котором хранятся, в том числе, атрибуты текста. Например, если есть выделение жирным, то в заголовке записано что-то типа "символы с 15 по 29 выделить жирным". Соответственно, независимости нет: если добавить строку текста в начало, позиции должны сместиться.

Выхода я вижу три:
- создавать собственные утилиты diff/patch с собственным форматом командного файла;
- создать конвертеры, приводящие odc в некий текстовый формат без межстрочных зависимостей;
- отбрасывать форматирование и считать, что важен только сам текст (форматирование можно делать автоматическое при импорте в текстовую модель, но остаётся вопрос, что делать с командерами, складками и прочими вьюшками).

Для первого случая может быть интересной вот какая идея. Представить odc-документ не как статичное содержание, а как последовательность команд по его созданию. Команды такие реально уже есть, они используются в механизмах undo/redo. Интересно, что при этом откроется возможность сохранить файл, выйти из программы, затем через год открыть его и отменить последнее действие. Собственно, для этого-то и нужны системы контроля версий.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 07 Февраль, 2010 10:02 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Александр Ильин писал(а):
Выхода я вижу три:
- создавать собственные утилиты diff/patch с собственным форматом командного файла;
...
Для первого случая может быть интересной вот какая идея. Представить odc-документ не как статичное содержание, а как последовательность команд по его созданию. Команды такие реально уже есть, они используются в механизмах undo/redo. Интересно, что при этом откроется возможность сохранить файл, выйти из программы, затем через год открыть его и отменить последнее действие. Собственно, для этого-то и нужны системы контроля версий.

Просто сделать компонент по типу StdStamps, и к нему две команды - начать запись изменений и завершить запись, причём перед записью принудительно требовать краткое описание вносимых изменений.

Тут есть два момента:
1. Хранить изменения придётся внутри документа (ради простоты и гарантированной корректности пары документ-изменения), что со временем приведёт к его распуханию
2. Не очень понятно как обрабатывать вложенные документы, особенно текстовые


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 07 Февраль, 2010 16:02 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Насчёт сравнения текстов в составных документах хочу добавить, что на мой взгляд, нехорошо, что стиль и формат текста - неотъемлемая часть исходных текстов. Я бы предложил следущий вариант развития составного документа:

Первая часть
Собственно, голый текст. Безо всяких атрибутов текста и встроенных "вьюшек".

Вторая часть
Являются дополнительными элементами для исходного текста. Наподобие оформления.
Атрибуты и встроенные "вьюшки" текста.

Имея такой формат, можно оперировать над текстами, не вдаваясь в подробности оформления. Вообще, следует отделить исходные тексты от оформления. То ли выделить маркерами начала-конца исходного текста, а может и отделить в особый формат файла, потому как наряду с положительными свойствами составных документов, встречаются всяческие проблемы, нетипичные для простых текстовых файлов.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 07 Февраль, 2010 18:16 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Info21 писал(а):
Илья Ермаков писал(а):
Вариативность - в разные модули реализации.
Кстати, да.
Это, вместе с F9, по-моему, заметно нейтрализует пользу от SVN.

(Всё хочется найти убойный аргумент, чтобы не заморачиваться с этими дурами.)


Мы практически не используем версионные фишки СВН-а. Т.е. всегда идёт только верхняя версия "из стопки".
Основное, в чём пока заменить нечем, - коллективная работа с хранилищем, страховка от одновременных изменений, и т.п.
Когда хранилищ за 20 штук по разным работам, то руками не наобновляешься с какой-нибудь сетевой папки. Одно дело дать утром одну команду update по всем хранилищам, а другое - руками откуда-то забирать и выяснять, что там кто сделал...

Плюс, конечно, как-то страхует сам факт наличия всей истории изменений. Пару раз было нужно откатывать на одно изменение назад.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Diff & Patch
СообщениеДобавлено: Среда, 10 Февраль, 2010 10:29 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Решил пойти по первому пути, предложенного Александром Ильиным.

Представляю общему вниманию черновой вариант технического описания (spec) программ для создания системы контроля изменений в составных документах Блэкбокса.
Первоначальной задачей считаю необходимым обсудить детали технического описания, а затем уже можно приступать к реализации.

Приветствуются любые конструктивные замечания.

Diff-patch.odc


Последний раз редактировалось Роман М. Четверг, 11 Февраль, 2010 15:00, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Diff & Patch
СообщениеДобавлено: Среда, 10 Февраль, 2010 13:51 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Я бы сделал несколько иначе:

патч-файл состоит из блоков. Каждый блок имеет заголовок вида
[0] INTEGER - Тег блока. Просто метка, удостоверяющая что это действительно блок - примитивный контроль целостности
[4] INTEGER - Длина блока (или адрес следующего)
[8] INTEGER - тип блока
[12] ... - данные блока

Таким образом мы унифицируем обращение с файлом, и в принципе сможем сводить несколько патчей в один файл или хранить их в самом целевом документе - всё будет выглядеть единообразно.

Первым в файле должен быть блок специального типа "заголовок". Пока для заголовка видится три обязательных поля:
1. Хеш-сумма файла, к которому применим патч
2. Описание патча.
3. Дата-время патча.

Потом нужно учесть особенности составных документов, а именно - вложенные элементы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Февраль, 2010 14:49 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
1. Я также имел в виду заголовок со служебной информацией в начале файла, а не заголовок блока.
2. Что насчёт количества блоков в заголовке?
3. Подробнее, что такое тег-метка блока. Откуда его получают?
4. Пока не представляю каким образом можно объединять заплатки от разных файлов в один файл. Хотелось бы понять, как понимать "хранить их в самом целевом документе"? Пока лишь есть идея закодировать файл-заплатку с помощью StdCoder, чтобы можно было обмениваться "патчами" через веб.
5. Кроме всего, встроенные элементы тоже должны обрабатываться. Только вот задача определять разницу между старым и новым... Картинки, OLE-объекты, ... - всех их нужно уметь сравнивать. Тут, по ходу, надо смотреть описание ODC.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Февраль, 2010 15:09 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Я фактически предлагаю отказаться от файла и перейти к потоку блоков. Процедура применения патча будет работать именно с этим потоком, не важно откуда полученным. Прочитали блок "начало патча" - поехали. Количество блоков в заголовке - а зачем? Тогда уж просто иметь ещё блок типа "конец патча" с контрольной суммой оного.

Такой подход позволит объединять патчи для нескольких документов в один файл, надо только с заголовочным блоком определиться.

Как объединять. В блоке "начало патча" кроме контрольной суммы указываем ещё и имя файла. Тогда diff сможет по списку файлов сформировать такой патч-файл:
[НАЧАЛО ПАТЧА (файл: file1.odc)]
[ВСТАВКА тут данные что и куда вставили]
[ИЗМЕНЕНИЕ тут данные что и как изменили]
[КОНЕЦ ПАТЧА]
[НАЧАЛО ПАТЧА (файл: dir\file2.odc)]
...
[КОНЕЦ ПАТЧА]
...

А утилита patch соответственно его применяет, вставая колом если не найдёт указанные файлы или их хеши не совпадут с ожидаемыми.

Тот же самый поток блоков можно сохранить в самом документе, к которому относится патч. Таким образом получим историю его изменений, о чём Александр тоже упоминал

Тэг блока - да любая константа, подтверждающая что это - блок. Хоть 123. Чисто для контроля. В принципе не обязателен, конечно. Разве что для частичного восстановления битого патча (а вдруг?)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Февраль, 2010 15:29 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
По поводу вложенных вьюшек есть вариант. Поскольку мы пишем патчер на ББ, то мы можем штатными средствами пройтись по всему дереву объектов в документе. И штатными же средствами опросить все их свойства. Пойду Дракон попытаю на предмет алгоритм нарисовать


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Февраль, 2010 15:54 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Обновил спецификацию (см. тему Diff & Patch).

Цитата:
2. Поля служебного заголовка файла
- [0] Название формата файла, ARRAY 12 OF CHAR.
- [+24] Версия формата, INTEGER.
- [+4] Описание заплатки, ARRAY 32 OF CHAR.
- [+64] Дата-время заплатки,
Код:
   RECORD
      d: Dates.Date; (* 12 байт *)
      t: Dates.Time (* 12 байт *)
   END

- [+24] Контрольная сумма файла CRC32, INTEGER.

3. Поля заплатки
- [0] Уникальная метка заплатки, INTEGER. Random?
- [+4] Начало/Конец заплатки, BOOLEAN. Каков размер BOOLEAN?
- [+4] Путь к файлу для применения заплатки, ARRAY 64 OF CHAR.

4. Поля блока
- [0] Тип операции: добавление/удаление/изменение блока, INTEGER.
- [+4] Размер блока N в байтах, INTEGER.
- [+4] Данные блока, ARRAY N OF CHAR.


Цитата:
2. Статус применения заплатки
Заплатка считается успешно применённой по отношению к исходному документу если:
- контрольная сумма файла совпадает с вычисленной.
- целевой файл найден и к нему имеется доступ.
- успешно произведена модификация всех частей заплаток для каждого файла.


Последний раз редактировалось Роман М. Четверг, 11 Февраль, 2010 15:02, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Февраль, 2010 16:25 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Может описывать заголовок просто как RECORD ... END. Имеют ли смысл эти [+4]?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Февраль, 2010 17:13 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
Основное, в чём пока заменить нечем, - коллективная работа с хранилищем, страховка от одновременных изменений, и т.п.
Так, может, тогда и хранить encoded-файлы? Чистый ascii.

Ну их нафик, сложности все эти с патчами-версионностью...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Февраль, 2010 20:28 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Мысль оригинальная, да... Сама по себе.

Только не совсем ясно, с какого конца кому её приложить.

Нас проблема диффов-патчей как раз не волнует, нас устраивает обычное хранение ODC, используем функционал коллективного сетевого хранилища. Т.е. для нашего режима encoded ничего не даёт.

А тем, кому нужен дифф - возможно...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Февраль, 2010 20:40 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
для нашего режима encoded ничего не даёт.
А. Не знал. Из общения с дипломником вышло впечатление, что там нужен чистый текст. Ну и ладно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Февраль, 2010 20:49 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Илья Ермаков писал(а):
А тем, кому нужен дифф - возможно...
odc-diff никому бы не помешал. Хотя бы знающий стандартные вьюшки.
Иван Горячев писал(а):
Поскольку мы пишем патчер на ББ, то мы можем штатными средствами пройтись по всему дереву объектов в документе.
Тов. Горячев знает, что говорит. В качестве примера предлагаю поглядеть его конвертер документов в юникод из "BlackBox Component Builder 1.6 Community Edition" (http://oberoncore.ru/projects/bb16ce). я был приятно удивлён, когда, забыв раскрыть все складки до преобразования, обнаружил внутри них юникод.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Февраль, 2010 21:42 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Евгений Темиргалеев писал(а):
Тов. Горячев знает, что говорит.

Пусть будет отдельным абзацем.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Февраль, 2010 21:55 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2461
Откуда: Россия, Томск
Info21 писал(а):
вышло впечатление, что там нужен чистый текст.

Александр Ильин писал(а):
текстовый формат без межстрочных зависимостей

В качестве примера: html, xml.
Цель: иметь возможность произвести слияние (merge).
Ситуация, в которой требуется слияние: пользователь А и пользователь Б получили копию файла, оба его изменили и создали каждый свой патч.
Задача слияния: с помощью автоматической процедуры получить файл, содержащий изменения от обоих пользователей.
Пример на уровне файла. Упрощенно представим формат ODC в качестве текстового файла, в котором первая строка хранит информацию о форматировании, в нашем случае о выделении жирным имени процедуры:
Код:
bold=22..25
PROCEDURE (o: Object) Init*;
Здесь имеется в виду, что слово Init должно быть выделено жирным, а именно - символы с 22 по 25 включительно, начиная от второй строки файла (символы нумеруются с нуля).

Предположим, пользователь А изменил имя переменной-получателя, заменив "o:Object" на "obj:Object".
Код:
bold=24..27
PROCEDURE (obj: Object) Init*;
Как видно, строка заголовка автоматически изменилась, чтобы отразить новое положение слова Init в тексте. Это и есть пример того, что я называю нелокальной зависимостью.

Пользователь Б, допустим, изменил имя типа с Object на Obj, а имя переменной не трогал.
Код:
bold=19..22
PROCEDURE (o: Obj) Init*;
Как видно, заголовок тоже автоматически изменился, чтобы отразить новое положение слова Init в тексте.

При попытке выполнить слияние получим следующую проблему:
Код:
bold=??..2?
PROCEDURE (obj: Obj) Init*;
Автоматике не ясно, что должно быть в заголовке. Один пользователь говорит, что там должно быть 24..27, другой - что 19..22, а на самом деле там должно быть третье значение: 23..26.

Решения два: либо автоматика должна обладать достаточными знаниями для того, чтобы вычислять новое значение (этим путём идёт Роман М. из Израиля), либо нелокальные зависимости надо превратить в локальные. Например, в XML это могло бы выглядеть так:
Код:
PROCEDURE (obj: Obj) <bold>Init</bold>*;


Нынешний формат ODC мало чем отличается от приведенного двухстрочного. Есть бинарный заголовок, в котором указано форматирование для каждой цепочки символов, какие символы считать вьюшками и т.п. Сама по себе бинарность проблемы не представляет. Если просто закодировать всё в ASCII, слияние проще не станет.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2025, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB