OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 25 Апрель, 2019 01:17

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




Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Про diff для .odc
СообщениеДобавлено: Суббота, 17 Август, 2013 14:16 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Евгений Темиргалеев писал(а):
Роман, Вы помогаете администрировать http://redmine.molpit.com/ или уже участвуете в поддержке Блэкбокс проектом http://oberoncore.ru/projects/oberonredmine? Для последнего рекомендовал бы Вам прежде чем приступать к работам --- основательно изучить матчасть.
Это разве относится к теме? Вопросы в личку, пожалуйста.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Про diff для .odc
СообщениеДобавлено: Суббота, 17 Август, 2013 14:28 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2567
Откуда: Россия, Ярославль
Роман, я в нескольких разных сообщениях пояснял, что я кагбэ не сторонник автономных внешних утилит (как автор одной из них, на беспощадном языке Dart), понимающих содержимое формата .odc, поэтому в рамках этой темы я занимаюсь только работой над заранее подготовленным "превью".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Про diff для .odc
СообщениеДобавлено: Суббота, 17 Август, 2013 21:27 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2567
Откуда: Россия, Ярославль
Mercurial в качестве extdiff tool предлагает реализовать сразу целую утилиту diff. Коварные.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Про diff для .odc
СообщениеДобавлено: Воскресенье, 18 Август, 2013 00:14 
Аватара пользователя

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


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

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

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

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


Исходный код:
Код:
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 можно обойтись??? Это бы сильно упростило задачу!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Про diff для .odc
СообщениеДобавлено: Воскресенье, 18 Август, 2013 12:48 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2567
Откуда: Россия, Ярославль
Иван Денисов писал(а):
Может у кого есть идеи, как без TextViews и TextModels можно обойтись??? Это бы сильно упростило задачу!!!

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Про diff для .odc
СообщениеДобавлено: Воскресенье, 25 Октябрь, 2015 17:31 

Зарегистрирован: Вторник, 15 Июль, 2008 15:55
Сообщения: 2
Откуда: Россия, Новосибирск
Хотелось бы узнать, на чём остановились по прошествии двух лет участники форума. Какие средства используются для просмотра diff между документами BlackBox'а?

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Про diff для .odc
СообщениеДобавлено: Воскресенье, 25 Октябрь, 2015 19:14 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Юрий Кузаков писал(а):
Хотелось бы узнать, на чём остановились по прошествии двух лет участники форума. Какие средства используются для просмотра diff между документами BlackBox'а?
В пределах среды БлэкБокс - при помощи поочерёдного нажатия на F9 при наличии открытых окон двух документов.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Про diff для .odc
СообщениеДобавлено: Суббота, 07 Ноябрь, 2015 15:50 

Зарегистрирован: Вторник, 15 Июль, 2008 15:55
Сообщения: 2
Откуда: Россия, Новосибирск
Есть ли сборка утилиты odcread для windows?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Про diff для .odc
СообщениеДобавлено: Понедельник, 09 Ноябрь, 2015 18:13 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Юрий Кузаков писал(а):
Есть ли сборка утилиты odcread для windows?

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


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

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


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

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


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

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