2010-07-20 2 views
3

Avec Windows, Mercurial et l'extension extdiff (pour Mercurial). J'essayais de configurer extdiff pour utiliser WinDiff comme un outil de comparaison externe, mais je pense que j'ai suffisamment réduit le problème pour dire que le problème est avant même que je n'aille aussi loin. D'après ce que je comprends d'extdiff, il appelle simplement votre programme cmd.winmerge, et lui passe les répertoires nécessaires. Je travaille également hors de certaines hypothèses présentées ici (qui peuvent ou peuvent ne pas être précis, je suis en train d'apprendre Mercurial):Mercurial/extdiff ne change pas en temp dir (comme je le pense)

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

qui dit:

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. 

Le problème que Je ai est que extdiff ne semble pas être en train de changer dans le répertoire temp avant de continuer, comme il semble qu'il est censé faire à l'étape 2.1 ci-dessus. En essayant d'isoler le problème, j'ai écrit un fichier batch juste pour voir ce que le cd était, ce qui était passé, et comment exactement il était passé. Le fichier de commandes est la suivante:

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

Je puis mis en place extdiff d'utiliser ce fichier batch comme mon programme extdiff. Cela fonctionne, mais je vois que quand il fait écho à% cd%, c'est juste c: \, pas c: \ temp comme prévu. J'ai vérifié que extdiff crée les fichiers temporaires dans les répertoires temporaires appropriés (comme c'est supposé le faire à l'étape 1 ci-dessus, quelque chose comme c: \ temp \ extdiff.xxxxxx \ someFolder.someChangesetID \ fichier.ext), donc je sais que c'est VOIR ces répertoires. Il ne change pas correctement avant d'appeler WinMerge, donc quand WinMerge est ouvert, il ne voit pas les fichiers temporaires (puisqu'il ne se trouve pas dans le bon répertoire de travail).

C'est essentiellement là où je suis coincé. Je ne sais pas où aller d'ici. Je pensais juste mettre

cd %tmp% 

dans mon fichier batch, mais cela ne fonctionne toujours pas saisir le extdiff.xxxxx \ sous-répertoire qui extdiff crée les fichiers temporaires dans

En résumé:. :-(


EDIT: Modification du fichier batch pour

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

semble le faire fonctionner (note a changé la deuxième ligne), mais il semble toujours un hack méchant à la place de comment il est censé fonctionner. : - \

EDIT: Voici mon fichier 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 
+0

Le premier paragraphe se réfère à WinDiff (que je reconnais à partir du Windows SDK), pas WinMerge. –

+0

Il serait utile de voir les parties pertinentes de votre 'Mercurial.ini' ou' .hg \ hgrc'. –

+0

J'ai ajouté mon fichier Mercurial.ini; Je pense que c'est correct, car il semble que ça se passe bien (mais encore une fois, je poste pour de l'aide, donc je ne suis évidemment pas 100% confiant). C'est juste que le CWD ne change pas correctement. – loneboat

Répondre

2

Je peux confirmer que extdiffsera changement dans un répertoire temporaire avant de commencer votre programme diff. Vous pouvez utiliser --debug pour voir ceci.J'utilise ici true comme le programme diff (il existe seulement dans l'immédiat):

$ 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 

Les deux arguments pour le programme diff sont répertoires: un répertoire instantané pour les anciennes versions et une pour les nouvelles versions. Ils se trouvent dans le répertoire temporaire /tmp/extdiff.IJ9clg. Un point confus est que les arguments pour le programme diff sont différents en fonction du nombre de fichiers modifiés. Avec un seul fichier modifié, il n'est pas nécessaire de créer un instantané de la copie de travail. Donc, si a est le seul fichier modifié, vous verrez

$ 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 

Voici le programme diff a commencé avec deux fichiers comme arguments. Comme décrit dans hg help -e extdiff, vous pouvez utiliser certaines variables pour créer la ligne de commande. La valeur par défaut correspond à $parent $child.

Vous dites que WinMerge "ne trouve pas les fichiers correctement". Il y a other questions and answers on SO à propos de WinMerge et ils semblent fonctionner correctement. Peut-être que vous pouvez essayer leurs options de ligne de commande.

Questions connexes