Mercurial / extdiff не меняется на временный каталог (как я ДУМАЮ, это должно быть)

Использование Windows, Mercurial и расширения extdiff (для Mercurial). Я пытался настроить extdiff для использования WinDiff в качестве внешнего инструмента сравнения, но я думаю, что сузил проблему достаточно, чтобы сказать, что проблема заключается еще до того, как я зашел так далеко.

Насколько я понимаю, extdiff просто вызывает вашу программу cmd.winmerge и передает ей необходимые каталоги. Я также работаю над некоторыми предположениями, изложенными здесь (которые могут быть точными, а могут и нет; я только изучаю Mercurial):

http://bitbucket.org/tortoisehg/stable/issue/457/multiple-extdiff-threads-in-one-process-causes-side#comment-36216

который говорит:

The extdiff (visual diff) extension works like this:

1-Generate temporary directory(ies) for older changesets 
2-run util.system( cwd=tempdir, "yourdiff tool dir1 dir2" ) 
    util.system does: 
        2.1 store cwd; 
        2.2 cd tempdir 
3-run your diff tool, wait for it to exit 
4-cd oldcwd 
5-Then finally extdiff deletes the temp directories. 

Проблема, с которой я столкнулся, заключается в том, что extdiff, похоже, не переходит во временную директорию перед продолжением, как, по-видимому, он должен был сделать на шаге 2.1 выше.

Пытаясь изолировать проблему, я написал командный файл, чтобы просто посмотреть, что это был за компакт-диск, что передавалось и как именно он передавался. Пакетный файл выглядит следующим образом:

@echo off
echo %cd%
echo %1
echo %2
D:\Documents\apps\WinMergePortable\App\WinMerge\WinMergeU.exe %1 %2

Затем я настроил extdiff, чтобы использовать этот командный файл в качестве моей программы extdiff. Это работает, но я вижу, что когда он повторяет% cd%, это просто c: \, а не c: \ temp, как ожидалось. Я проверил, что extdiff создает временные файлы в соответствующих временных каталогах (как и предполагалось на шаге 1 выше; что-то вроде c: \ temp \ extdiff.xxxxxx \ someFolder.someChangesetID \ file.ext), поэтому я знаю, что это ПРОСМОТРЕТЬ те каталоги. Просто он неправильно переключается на них перед вызовом WinMerge, поэтому, когда WinMerge открывается, он не видит временные файлы (поскольку он не находится в правильном рабочем каталоге).

Вот в чем я и застрял. Я не знаю, куда дальше идти. Я думал просто поставить

cd %tmp%

в моем пакетном файле, но он все еще не захватывает подкаталог extdiff.xxxxx \, в котором extdiff создает временные файлы.

В итоге: :-(


РЕДАКТИРОВАТЬ: изменение командного файла на

@echo off
echo %cd%\extdiff*
echo %1
echo %2
D:\Documents\apps\WinMergePortable\App\WinMerge\WinMergeU.exe %1 %2

похоже, заставляет его работать (обратите внимание, что вторая строка изменилась), но все еще кажется неприятным взломом вместо того, как он должен работать. : - \

РЕДАКТИРОВАТЬ: Вот мой файл Mercurial.ini:

[ui]
username = Tim Skoch <[email protected]>
editor = D:\Documents\apps\Notepad++\notepad++.exe -multiInst

[extensions]
hgext.graphlog = 
hgext.extdiff = 

[extdiff]
cmd.winmerge = d:\Documents\apps\mercurial\diff_winmerge.bat

person loneboat    schedule 20.07.2010    source источник
comment
Первый абзац относится к WinDiff (который я узнал по Windows SDK), а не к WinMerge.   -  person Niall C.    schedule 21.07.2010
comment
Было бы полезно увидеть соответствующие части вашего Mercurial.ini или .hg\hgrc.   -  person Niall C.    schedule 21.07.2010
comment
Я добавил свой файл Mercurial.ini; Я ДУМАЮ, что это нормально, потому что кажется, что все нормально (но опять же, я пишу о помощи, поэтому я, очевидно, не уверен на 100%). Просто CWD не меняют должным образом.   -  person loneboat    schedule 21.07.2010
comment
Я установил WinMerge, и он заработал без проблем. Моя запись Mercurial.ini имеет: cmd.winmerge=c:\work\tools\winmerge\winmergeu.exe, вызывается с помощью hg winmerge. Я использую Beyond Compare, и у меня не может быть двух открытых сеансов сравнения одновременно, поэтому вы можете проверить, не осталось ли у вас случайного процесса WinMerge. Кроме того, у меня нет идей, извините.   -  person Niall C.    schedule 21.07.2010


Ответы (1)


Я могу подтвердить, что extdiff перейдет во временный каталог перед запуском вашей программы сравнения. Вы можете использовать --debug, чтобы увидеть это. Здесь я использую true в качестве программы сравнения (она просто существует немедленно):

$ hg extdiff -p true --debug
making snapshot of 2 files from rev 18480437f81b
  a
  b
making snapshot of 2 files from working directory
  a
  b
running "'true'  'foo.18480437f81b' 'foo'" in /tmp/extdiff.IJ9clg
cleaning up temp directory

Двумя аргументами программы сравнения являются каталоги: каталог моментальных снимков для старых версий и один для новых версий. Они находятся во временном каталоге /tmp/extdiff.IJ9clg.

Один запутанный момент заключается в том, что аргументы для программы сравнения различны в зависимости от количества измененных файлов. Имея всего один измененный файл, нет необходимости создавать снимок рабочей копии. Итак, если a - единственный измененный файл, вы увидите

$ hg extdiff -p true --debug
making snapshot of 1 files from rev 18480437f81b
  a
running "'true'  '/tmp/extdiff.mUlnP_/foo.18480437f81b/a' '/home/mg/tmp/foo/a'"
in /tmp/extdiff.mUlnP_
cleaning up temp directory

Здесь программа сравнения была запущена с двумя файлами в качестве аргументов. Как описано в hg help -e extdiff, вы можете использовать некоторые переменные для построения командной строки. По умолчанию соответствует $parent $child.

Вы говорите, что WinMerge «не может правильно находить файлы». Есть другие вопросы и ответы на SO о WinMerge, и, похоже, он работает нормально. Может быть, вы можете попробовать их параметры командной строки.

person Martin Geisler    schedule 30.01.2012