svn diff через perltidy
Я хочу запустить perltidy, прежде чем искать diff в своей рабочей копии Subversion. в конфигурации SVN я написал:
diff-cmd = /usr/bin/d.sh
Как сказал Дэвид В. в этом ответе /questions/4103748/tiding-subversion-perl-repo-s-perltidy/4103765#4103765 я делаю скрипт /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 diff в рабочей копии, я получаю некоторые ошибки:
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
#!/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 ответ
Я не опытный bash
код, поэтому следующее может быть неоптимальным, особенно с учетом избыточности, но это решает вашу проблему, предполагая, что последние два аргумента являются именами файлов.
#!/bin/bash
args=("$@")
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=("$@")
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