我正在尝试以编程方式将gitweb格式的查询字符串映射到cgit查询字符串以完全转换为cgit,而不会破坏指向我的存储库的旧的基于gitweb的URL,这些存储库分散在Web上。我已经看到了一些基于正则表达式的URL重写规则,如下所示:
http://www.clearchain.com/blog/posts/cgit-upgrade-gitweb-retired
但是我试图真正理解查询字符串中的变量以确保我正确,并且我将使用一个小的CGI程序而不是mod_rewrite或者重新映射的任何操作。特别是,我不理解h
,hb
和hp
哈希的语义以及它们如何针对不同类型的查询映射到cgit的id
查询变量。
任何熟悉他们的人都能吸引我,还是给我一个很好的资源?
答案 0 :(得分:0)
基本上
id
,则hashb
来自hashb
,否则来自hash
。id2
来自hashpb if the gitweb url uses
hashpb , otherwise from
hashp`。这是我现在正在使用的脚本(如果你的shell没有吮吸,则不会调用外部命令):
#!/bin/sh
q=$QUERY_STRING
repo=
action=
hash=
hashp=
file=
while test "$q" ; do
x=${q%%;*}
case "$x" in
p=*) repo=${x#p=} ;;
a=*commit*) action=commit ;;
a=*plain*) action=plain ;;
a=*summary*) action= ;;
a=*log*) action=log ;;
a=*) action=${x#a=} ;;
h=*) hash=${x#h=} ;;
hb=*) hashb=${x#hb=} ;;
hp=*) hashp=${x#hp=} ;;
hpb=*) hashpb=${x#hpb=} ;;
f=*) file=${x#f=} ;;
esac
t=${q#*;}
test "$t" = "$q" && break
q=$t
done
test "$hashb" && hash=$hashb
test "$hashpb" && hashp=$hashpb
loc=/cgit
if test "$repo" ; then
loc=$loc/$repo
if test "$action" ; then
loc=$loc/$action
if test "$file" ; then
loc=$loc/$file
fi
fi
if test "$hash" ; then
loc=$loc/\?id=$hash
if test "$hashp" ; then
loc=$loc\&id2=$hashp
fi
fi
fi
printf 'Status: 301 Moved Permanently\nLocation: %s\n\n' "$loc"