OberonCore
https://forum.oberoncore.ru/

Про diff для .odc
https://forum.oberoncore.ru/viewtopic.php?f=47&t=4432
Страница 2 из 2

Автор:  Роман М. [ Суббота, 17 Август, 2013 14:16 ]
Заголовок сообщения:  Re: Про diff для .odc

Евгений Темиргалеев писал(а):
Роман, Вы помогаете администрировать http://redmine.molpit.com/ или уже участвуете в поддержке Блэкбокс проектом http://oberoncore.ru/projects/oberonredmine? Для последнего рекомендовал бы Вам прежде чем приступать к работам --- основательно изучить матчасть.
Это разве относится к теме? Вопросы в личку, пожалуйста.

Автор:  Пётр Кушнир [ Суббота, 17 Август, 2013 14:28 ]
Заголовок сообщения:  Re: Про diff для .odc

Роман, я в нескольких разных сообщениях пояснял, что я кагбэ не сторонник автономных внешних утилит (как автор одной из них, на беспощадном языке Dart), понимающих содержимое формата .odc, поэтому в рамках этой темы я занимаюсь только работой над заранее подготовленным "превью".

Автор:  Пётр Кушнир [ Суббота, 17 Август, 2013 21:27 ]
Заголовок сообщения:  Re: Про diff для .odc

Mercurial в качестве extdiff tool предлагает реализовать сразу целую утилиту diff. Коварные.

Автор:  Роман М. [ Воскресенье, 18 Август, 2013 00:14 ]
Заголовок сообщения:  Re: Про diff для .odc

Пётр Кушнир писал(а):
Mercurial в качестве extdiff tool предлагает реализовать сразу целую утилиту diff. Коварные.
Если я правильно понимаю, то результатом работы "extdiff tool" должен быть изменённый файл на основе предлагаемых изменений второго файла. То есть, как и у других VCS.
Значит, как вариант, можно написать компонент и/или доработать ББ для того, чтобы в качестве такой утилиты смог принимать аргументы в командной строке и также сравнивать файлы ODC. Merge Tool...

Автор:  Иван Денисов [ Воскресенье, 18 Август, 2013 10:43 ]
Заголовок сообщения:  Re: Про diff для .odc

Пётр Кушнир писал(а):
Бинарник вот тут https://dl.dropboxusercontent.com/u/953 ... extract.7z
Исходник для него пока в подсистеме YWin в репозитории bb.open, соответственно, он только для Windows.

Пётр, скажу честно, разработка — шедевр реализации!

Пробовал адаптировать ваши наработки для Linux на основе закрытой версии, чтобы сразу выдавалось в вывод содержимое файла без встроенных отображений и т.п.. Вот что у меня получилось:
Вложение:
odctoutf8.7z [305.11 КБ]
Скачиваний: 424


Исходный код:
Код:
MODULE Init;
   
   IMPORT Kernel, Dialog, Converters, HostMenus, Log, LinLog, TextModels, Stores, Files, TextViews, Views, Strings;
   
   CONST
      CR = 0DX;

   PROCEDURE LogUTF8Char (ch: CHAR);
   BEGIN   (* UTF-8 format *)
      IF ch <= 7FX THEN
         Log.Char(CHR(SHORT(SHORT(ORD(ch)))))
      ELSIF ch <= 7FFX THEN
         Log.Char(CHR(SHORT(SHORT( - 64 + ORD(ch) DIV 64))));
         Log.Char(CHR(SHORT(SHORT( - 128 + ORD(ch) MOD 64))))
      ELSE
         Log.Char(CHR(SHORT(SHORT( - 32 + ORD(ch) DIV 4096))));
         Log.Char(CHR(SHORT(SHORT( - 128 + ORD(ch) DIV 64 MOD 64))));
         Log.Char(CHR(SHORT(SHORT( - 128 + ORD(ch) MOD 64))))
      END
   END LogUTF8Char;


   PROCEDURE SplitFileName (fullpath: ARRAY OF CHAR; woExt: BOOLEAN; OUT path, name, type: ARRAY OF CHAR);
      VAR i, dot, slash, shift: INTEGER; ok: BOOLEAN;
   BEGIN
      i := LEN(fullpath$); dot := - 1; slash := - 1; ok := FALSE;
      path := ''; name := ''; type := '';
      WHILE (i >= 0) & ~ok DO
         IF (fullpath[i] = '.') & (dot = - 1) THEN dot := i
         ELSIF ((fullpath[i] = '/') OR (fullpath[i] = '\')) & (slash = - 1) THEN slash := i END;
         ok := (slash # - 1);
         DEC(i)
      END;
      
      IF dot > - 1 THEN Strings.Extract(fullpath, dot + 1, LEN(fullpath$), type) ELSE dot := 0 END;
      IF slash > - 1 THEN Strings.Extract(fullpath, 0, slash, path); INC(slash) ELSE slash := 0 END;
      IF LEN(fullpath$) > (LEN(type$) + LEN(path$) + 2) THEN
         IF slash=0 THEN shift:=1 ELSE shift:=2 END;
         IF woExt THEN Strings.Extract(fullpath, slash, LEN(fullpath$) - LEN(path$) - LEN(type$) - shift, name)
         ELSE Strings.Extract(fullpath, slash, LEN(fullpath$) - (LEN(path$)) + 1, name) END;
      END
   END SplitFileName;

   PROCEDURE Init;
      VAR res: INTEGER; m: Kernel.Module; actualPath, vs, p0, n0, t0: ARRAY 2048 OF CHAR;  loc: Files.Locator; name: Files.Name; conv: Converters.Converter; view: Views.View;
      md: TextModels.Model; rd: TextModels.Reader; ch: CHAR;
   BEGIN
      LinLog.Open;
      Converters.Register("Documents.ImportDocument", "Documents.ExportDocument", "", "odc", {});
      IF Kernel.bootInfo.argc = 2 THEN
         SplitFileName(Kernel.bootInfo.argv[1]$, TRUE, p0, n0, t0 );
         conv := NIL;
         name := n0$ + "." + t0$;
         loc := Files.dir.This(p0);
         view := Views.Old (Views.dontAsk,loc, name, conv);
         IF view # NIL THEN
            WITH view: TextViews.View DO
               md := view(TextViews.View).ThisModel();
               IF md # NIL THEN
                  rd := md.NewReader(NIL);
                  rd.ReadChar(ch);
                  WHILE ~rd.eot DO
                     IF ch = CR THEN Log.Ln ELSE LogUTF8Char(ch) END;
                     rd.ReadChar(ch)
                  END
               END
            ELSE
               Log.String("odc contains not a text view")
            END
         ELSE
            Log.String("no file" + Kernel.bootInfo.argv[1]$); Log.Ln
         END
      ELSE
         Log.String("no file specified"); Log.Ln
      END
   END Init;
BEGIN
   Init
END Init.


Собирал я это дело часа три на линукс версии :( пришлось выкорчевывать систему печати из разных модулей, так как она не портирована. Каков же результат?
Команда:
Код:
 ./odctoutf8 Host/Mod/Files.odc

Выдает содержимое файла в консоль. Чудесно, но когда это дело прикручиваю к git, он ругается, что прочитать файл не может:
Код:
divan@hp:~/oberon/cb16$ git diff HEAD^^^^ HEAD^^^^^
diff --git a/Sql/Code/DB.ocf b/Sql/Code/DB.ocf
index 36a98d9..36b5942 100644
Binary files a/Sql/Code/DB.ocf and b/Sql/Code/DB.ocf differ
fatal: unable to read files to diff


Если вывод пропустить через вот такой скрипт:
Код:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, sys
oneline = False
try:
        p = os.popen('/usr/local/bin/odctoutf8 ' + sys.argv[1], "r")
        while 1:
                line = p.readline()
                if not line: break
                newline = "".join([i for i in line if ord(i) < 128 and ord(i) > 31 or ord(i) == 9])+"\n"
                newline = newline.replace("\t", "  ")
                if newline != "\n" and newline != "":
                        print newline,
                        oneline = True
except IndexError:
        print "Error: no file passed to converter. Please report event to admin."
if not oneline:
        print "empty result of odc-to-ascii conversation"


То все работает прекрасно:
Код:
divan@hp:~/oberon/cb16$ git diff HEAD^^^^ HEAD^^^^^
diff --git a/Sql/Code/DB.ocf b/Sql/Code/DB.ocf
index 36a98d9..36b5942 100644
Binary files a/Sql/Code/DB.ocf and b/Sql/Code/DB.ocf differ
diff --git a/Sql/Mod/DB.odc b/Sql/Mod/DB.odc
index ecdbfa3..19eca6a 100644
--- a/Sql/Mod/DB.odc
+++ b/Sql/Mod/DB.odc
@@ -142,7 +142,7 @@ MODULE SqlDB;
     VAR j: INTEGER;
   BEGIN  (* extract the designator that describes a global variable *)
     j := 0;
-    IF (CAP(ch) >= "A") & (CAP(ch) <= "Z") THEN
+    IF (CAP(ch) >= "A") & (CAP(ch) < "Z") THEN
       REPEAT
         t[j] := ch; INC(j);
         INC(i); ch := s[i]


В локальном репозитории все шикарно почти! Но вот беда, Gtk2 требует себе дисплей на сервере:
Цитата:
(odctoutf8:23318): Gtk-WARNING **: cannot open display:

Проблему решил установкой виртуального дисплея! В консоли не сервере заработало, НО вот когда Питон это все дело запускает опять ругается на отсутствие дисплея:

Выкорчевывать Gtk2 из всех модулей у меня уже сил нет в ближайшие дни. Может у кого есть идеи, как без TextViews и TextModels можно обойтись??? Это бы сильно упростило задачу!!!

Автор:  Пётр Кушнир [ Воскресенье, 18 Август, 2013 12:48 ]
Заголовок сообщения:  Re: Про diff для .odc

Иван Денисов писал(а):
Может у кого есть идеи, как без TextViews и TextModels можно обойтись??? Это бы сильно упростило задачу!!!

В этом и проблема, правильность разбора содержимого бинарного файла определяется правильностью последовательности вызовов
TextViews.StdTextView.Internalize2
TextViews.View.Internalize2 через супер вызов
Converters.View.Internalize2 через супер вызов из супер вызова
Converters.View.Internalize
Views.View.Internalize через супервызов
Stores.Store.Internalize через супервызов

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

Автор:  Юрий Кузаков [ Воскресенье, 25 Октябрь, 2015 17:31 ]
Заголовок сообщения:  Re: Про diff для .odc

Хотелось бы узнать, на чём остановились по прошествии двух лет участники форума. Какие средства используются для просмотра diff между документами BlackBox'а?

Пётр Кушнир писал(а):
Бинарник вот тут https://dl.dropboxusercontent.com/u/953 ... extract.7z
Исходник для него пока в подсистеме YWin в репозитории bb.open, соответственно, он только для Windows.

Ссылка уже не актуальна. Можно ли получить новую?

Автор:  Роман М. [ Воскресенье, 25 Октябрь, 2015 19:14 ]
Заголовок сообщения:  Re: Про diff для .odc

Юрий Кузаков писал(а):
Хотелось бы узнать, на чём остановились по прошествии двух лет участники форума. Какие средства используются для просмотра diff между документами BlackBox'а?
В пределах среды БлэкБокс - при помощи поочерёдного нажатия на F9 при наличии открытых окон двух документов.

Вне пределов БлэкБокс - при помощи командной утилиты odcread можно получить плоское текстовое представление в UTF-8 (без view) посредством перенаправления вывода в файл, а затем путём сравнивания двух текстовых файлов любыми diff утилитами.
Для некоторых VCS найдено решение тут.

А вот насчёт merge двух ODC - пока не было найдено решения.

Автор:  Юрий Кузаков [ Суббота, 07 Ноябрь, 2015 15:50 ]
Заголовок сообщения:  Re: Про diff для .odc

Есть ли сборка утилиты odcread для windows?

Автор:  Роман М. [ Понедельник, 09 Ноябрь, 2015 18:13 ]
Заголовок сообщения:  Re: Про diff для .odc

Юрий Кузаков писал(а):
Есть ли сборка утилиты odcread для windows?

Обычный make должен собрать, по идее. Makefile имеется ведь.

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