Mercurial / extdiff не меняется на временный каталог (как я думаю, он должен) - PullRequest
3 голосов
/ 20 июля 2010

Использование 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 <my_real@email.address>
editor = D:\Documents\apps\Notepad++\notepad++.exe -multiInst

[extensions]
hgext.graphlog = 
hgext.extdiff = 

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

1 Ответ

2 голосов
/ 30 января 2012

Я могу подтвердить, что 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

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

Один запутанный момент заключается в том, что аргументы для программы diff различаются в зависимости от количества измененных файлов.Только с одним измененным файлом нет необходимости создавать снимок рабочей копии.Поэтому, если 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

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

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

...