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 на основе закрытой версии, чтобы сразу выдавалось в вывод содержимое файла без встроенных отображений и т.п.. Вот что у меня получилось: Вложение: Исходный код: Код: 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/ |