OberonCore
https://forum.oberoncore.ru/

Diff & Patch
https://forum.oberoncore.ru/viewtopic.php?f=47&t=2339
Страница 1 из 1

Автор:  Роман М. [ Четверг, 11 Февраль, 2010 14:57 ]
Заголовок сообщения:  Diff & Patch

Продолжение развития темы "Контроль изменений в составных документах"
http://forum.oberoncore.ru/viewtopic.php?f=1&t=2323&start=0.

В этой теме будем обсуждать технические стороны подсистемы и реализацию.

Выкладываю последнее техописание (spec) средств управления изменениями версий составных документов BlackBox (аналог diff и patch).

Вложение:
Diff-patch.odc [6.73 КБ]
Скачиваний: 748


Код:
   (* Поля служебного заголовка *)
   Header* = RECORD
      header-:ARRAY 12 OF CHAR; (* Название формата файла *)
      version-: INTEGER; (* Версия формата *)
      datetime-: RECORD (* Дата-время заплатки *)
         d-: Dates.Date;
         t-: Dates.Time
      END;
      chksum-: INTEGER (*  *)
   END;
   
   (* Поля заплатки *)
   Label* = RECORD
      tag-: INTEGER; (* Уникальная метка *)
      type-: BOOLEAN; (* Начало/Конец заплатки *)
      desc-: ARRAY 32 OF CHAR; (* Описание *)
      path-: ARRAY 64 OF CHAR (* Путь к файлу для применения заплатки *)
   END;
   
   (* Поля блока *)
   Block* = RECORD
      optype-: INTEGER; (* Тип операции: добавление/удаление/изменение блока *)
      size-: INTEGER (* Размер блока в байтах *)
   END;

Автор:  Иван Горячев [ Четверг, 11 Февраль, 2010 15:29 ]
Заголовок сообщения:  Re: Diff & Patch

Роман М. писал(а):
Код:
(* Поля заплатки *)
   Label* = RECORD
      tag-: INTEGER; (* Уникальная метка *)
      type-: BOOLEAN; (* Начало/Конец заплатки *)
      desc-: ARRAY 32 OF CHAR; (* Описание *)
      path-: ARRAY 64 OF CHAR (* Путь к файлу для применения заплатки *)
   END;

1. Какой смысл имеет поле type?
2. desc и path слишком маленькие. Лучше так:
Код:
descLen- : INTEGER;
desc- : ARRAY [descLen] OF CHAR; (*это же раскладка в файле, псевдокод тобишь*)

3. Какая информация хранится в блоке?
4. И как таки обращаемся с вложенными вьюшками? Просто без этого затея вообще бессмысленна - проще перевести документ в текст и пользовать толпу имеющихся тулзовин. А информация о цвете-шрифтах всё-таки гораздо менее ценна чем вложенный текст, например.

Автор:  Роман М. [ Четверг, 11 Февраль, 2010 16:10 ]
Заголовок сообщения:  Re: Diff & Patch

  1. Каждый следующий патч должен начинаться с индикатора, сигнализирующего о начале группы блоков и заканчиваться индикатором конца блоков. Или же взять вместо этого поле с количеством блоков в Label, необходимых для считывания очередного патча.
  2. Не понял насчёт псевдокода. Такая конструкция ведь некомпилируема?! Или имеется в виду записать в поток сначала размер данных описания, а потом сами данные?
  3. В блоке должна храниться информация о разнице между исходным и конечным документами. Но так как в RECORD я не могу поместить динамические данные, то остались только тип операции и размер блока. Причём, данные блока представляют из себя последовательность байтов, т.к. контейнер не дожен знать что за структура внутри. А вот как её интерпретировать потом - отдельным классом-моделью, полагаю. Внутри структура будет представлять из себя набор символов со всякими вьюшками и прочими элементами.
    Меня такие вопросы наводят на мысль, что я мыслю по-прежнему, по-борландовски. Поправь, если я не прав.
  4. см. выше.

Автор:  Иван Горячев [ Четверг, 11 Февраль, 2010 16:41 ]
Заголовок сообщения:  Re: Diff & Patch

Роман М. писал(а):
  1. Не понял насчёт псевдокода. Такая конструкция ведь некомпилируема?! Или имеется в виду записать в поток сначала размер данных описания, а потом сами данные?

Да, именно это и имелось.
Цитата:
Меня такие вопросы наводят на мысль, что я мыслю по-прежнему, по-борландовски. Поправь, если я не прав.

Похоже на то. У нас вообще-то есть готовый инструмент для хранения разнородных блоков патча - составной документ ББ. Как это должно выглядеть - в примере. Естественно там без обработки ошибок и ещё кучи мелочей... Так что вопрос о формате патч-файла вообще не стоит - ODC :)

А вот что я реально не понимаю - алгоритм работы diffа. Патчер - тупой конечный автомат, перебирающий блоки. А вот diff?

Вложения:
PatchBlocksSample.odc [2.51 КБ]
Скачиваний: 658

Автор:  Роман М. [ Четверг, 11 Февраль, 2010 17:11 ]
Заголовок сообщения:  Re: Diff & Patch

Для diff алгоритм таков: Википедия: Наибольшая общая подпоследовательность.
Нужно подумать как быть в нашем случае.

Автор:  Роман М. [ Суббота, 13 Февраль, 2010 13:58 ]
Заголовок сообщения:  Re: Diff & Patch

Стал рассматривать различные реализации diff: все они повязаны на построчной (тобишь line break) обработке. Причём, некоторые из них используют дополнительные трюки, основанные на использовании хэш-таблиц этих строк.
В нашем же случае (документ ODC) мы имеем одну длинную строку. В связи с чем пока затрудняюсь в подгонке алгоритма под такой случай. У кого есть какие мысли насчёт этого?

Автор:  Иван Горячев [ Суббота, 13 Февраль, 2010 14:56 ]
Заголовок сообщения:  Re: Diff & Patch

Роман М. писал(а):
Стал рассматривать различные реализации diff: все они повязаны на построчной (тобишь line break) обработке. Причём, некоторые из них используют дополнительные трюки, основанные на использовании хэш-таблиц этих строк.
В нашем же случае (документ ODC) мы имеем одну длинную строку. В связи с чем пока затрудняюсь в подгонке алгоритма под такой случай. У кого есть какие мысли насчёт этого?

1. "Документ ODC" - понятие растяжимое и не всегда текстовое. Формы - они тоже ODC
2. В тексте есть строки - TextMappers.Scanner возвращает TextMappers.line в конце каждой строки. Другое дело что никакого быстрого чтения строк в ББ нет. К тому же строки (клавишу Ввод) люди обычно пользуют только в исходниках. В документации же "строка" часто соответствует абзацу.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/