2013-05-16 5 views
0

Я хочу запустить perltidy, прежде чем искать diff в своей рабочей копии subversion. в SVN конфигурации я писал:svn diff through perltidy

diff-cmd = /usr/bin/d.sh 

Как сказал Дэвид W в этом ответе https://stackoverflow.com/a/5834900/1927848 я сделать /usr/bin/d.sh скрипт:

#!/usr/local/bin/bash 
/usr/local/bin/perltidy "$1" > "/tmp/$1" 
/usr/local/bin/perltidy "$2" > "/tmp/$2" 
/usr/bin/diff "$1" "$2" 
/bin/rm "/tmp/$1" "/tmp/$2" 
exit 0 

и когда я сделать SVN различий в работе копия, я получил некоторые ошибки:

dev# svn diff 
Index: nodeny/new_month.pl 
=================================================================== 
Unknown option: u 
Error on command line; for help try 'perltidy -h' 
Option l is ambiguous (libpods, line-up-parentheses, logfile, logfile-gap, long-block-line-count, look-for-autoloader, look-for-hash-bang, look-for-selfloader) 
Error on command line; for help try 'perltidy -h' 
diff: option requires an argument -- L 
/usr/bin/diff: Try `/usr/bin/diff --help' for more information. 

где мои ошибки?

UPD: $ 1 и $ 2 не являются именами файлов, $ 6 и $ 7 содержат имена файлов. я сделал некоторые изменения в код, благодаря Ikegami comment

#!/usr/local/bin/bash 

/usr/local/bin/perltidy "$6" -st > "/tmp/tidy001" 
/usr/local/bin/perltidy "$7" -st > "/tmp/tidy002" 
/usr/bin/diff "/tmp/tidy001" "/tmp/tidy002" 
/bin/rm "/tmp/tidy001" "/tmp/tidy002" 
exit 0 

но теперь скрипт только делает первые Perltidy команды и ждать ... что случилось?
UPD2: скрипт на Perl, который работает:

#!/usr/bin/perl 

use Text::Diff; 

if (-e $ARGV[-2] && -e $ARGV[-1]) { 
    my $str1 = `/usr/local/bin/perltidy -npro -pbp -nst -se -et=4 -bar -l=200 $ARGV[-2] -st`; 
    my $str2 = `/usr/local/bin/perltidy -npro -pbp -nst -se -et=4 -bar -l=200 $ARGV[-1] -st`; 
    my $diff = diff(\$str1, \$str2); 
    print $diff; 
} 
else { 
    print "Error file $ARGV[-2] or $ARGV[-1] not exists\n"; 
} 
exit 0; 
+1

Вам просто нужна более надежная обработка аргументов. Похоже (по крайней мере) '-u' и' -l' передаются скрипту в дополнение к именам файлов. – ikegami

+0

@ikegami, спасибо, обновил мой вопрос. получил другую проблему :( – Suic

+0

Является ли это одним из имен файлов '-' или что-то, что начинается с' -'? – ikegami

ответ

1

Я не опытный bash код, так что следующее не может быть оптимальным, особенно с учетом избыточности, но он решает вашу проблему, предполагая, что последние два аргумента являются именами файлов.

#!/bin/bash 

args=("[email protected]") 

f1_idx=$((${#args[@]} - 2)) 
f1="${args[$f1_idx]}" 
/usr/local/bin/perltidy "$f1" -st > "/tmp/$f1" 
args[$f1_idx]="/tmp/$f1" 

f2_idx=$((${#args[@]} - 1)) 
f2="${args[$f2_idx]}" 
/usr/local/bin/perltidy "$f2" -st > "/tmp/$f2" 
args[$f2_idx]="/tmp/$f2" 

/usr/bin/diff "$args[@]" 
/bin/rm "/tmp/$f1" "/tmp/$f2" 

exit 0 

Или, если вы не заботитесь о фактических имен файлов (как подразумевает ваше обновление), вы можете избежать временных файлов вообще.

#!/bin/bash 

args=("[email protected]") 

last_idx=$((${#args[@]} - 1)) 
f2="${args[$last_idx]}" 
unset args[$last_idx] 

last_idx=$((${#args[@]} - 1)) 
f1="${args[$last_idx]}" 
unset args[$last_idx] 

/usr/bin/diff "$args[@]" \ 
    <(/usr/local/bin/perltidy "$f1" -st) \ 
    <(/usr/local/bin/perltidy "$f2" -st) 

exit 0