Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过perltidy的svn差异_Perl_Svn_Perl Tidy - Fatal编程技术网

通过perltidy的svn差异

通过perltidy的svn差异,perl,svn,perl-tidy,Perl,Svn,Perl Tidy,在我的subversion工作副本中查找差异之前,我想运行perltidy。 在svn配置中,我写道: diff-cmd = /usr/bin/d.sh 正如David W在回答中所说,我编写了一个脚本/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"

在我的subversion工作副本中查找差异之前,我想运行perltidy。 在svn配置中,我写道:

diff-cmd = /usr/bin/d.sh
正如David W在回答中所说,我编写了一个脚本/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,我对代码做了一些修改

但现在脚本只执行第一个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;

我不是一个有经验的
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
#/bin/bash
args=(“$@”)
last_idx=$(${{args[@]}-1))
f2=“${args[$last_idx]}”
未设置参数[$last\u idx]
last_idx=$(${{args[@]}-1))
f1=“${args[$last_idx]}”
未设置参数[$last\u idx]
/usr/bin/diff“$args[@]”\

您只需要更健壮的参数处理。看起来(至少)
-u
-l
除了文件名之外还传递给脚本。@ikegami,谢谢,更新了我的问题。还有其他问题:(是文件名
-
还是以
-
开头的东西?svn文件名
/tmp/tru/.svn/pristine/0d/0de49951070d7da521e9b26cde1853e6b66a665a.svn base
包含
-
。但它已经不重要了。我讨厌bash。我用perl重新编写了这个脚本,它工作得很好。a love perl,谢谢你的帮助,yo你回到了脆弱的硬编码arg nums和使用临时文件。你已经被前者咬了一次,甚至两次!
#!/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