OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 27 Апрель, 2024 23:43

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




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Diff & Patch
СообщениеДобавлено: Четверг, 11 Февраль, 2010 14:57 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Продолжение развития темы "Контроль изменений в составных документах"
http://forum.oberoncore.ru/viewtopic.php?f=1&t=2323&start=0.

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

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

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


Код:
   (* Поля служебного заголовка *)
   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;


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Роман М. писал(а):
Код:
(* Поля заплатки *)
   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. И как таки обращаемся с вложенными вьюшками? Просто без этого затея вообще бессмысленна - проще перевести документ в текст и пользовать толпу имеющихся тулзовин. А информация о цвете-шрифтах всё-таки гораздо менее ценна чем вложенный текст, например.


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

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


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Роман М. писал(а):
  1. Не понял насчёт псевдокода. Такая конструкция ведь некомпилируема?! Или имеется в виду записать в поток сначала размер данных описания, а потом сами данные?

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

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

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


Вложения:
PatchBlocksSample.odc [2.51 КБ]
Скачиваний: 589
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Diff & Patch
СообщениеДобавлено: Четверг, 11 Февраль, 2010 17:11 

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


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

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


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

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

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


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

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


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

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