0

我正在尝试以编程方式将 gitweb 格式的查询字符串映射到 cgit 查询字符串,以完全过渡到 cgit,而不会破坏旧的基于 gitweb 的 url,这些 url 指向我散布在网络上的存储库。我见过一些基于正则表达式的 URL 重写规则,如下所示:

http://www.clearchain.com/blog/posts/cgit-upgrade-gitweb-retired

但我试图真正理解查询字符串中的变量以确保我做对了,我将使用一个小型 CGI 程序而不是 mod_rewrite 或任何对重新映射的操作。特别是,我不了解 、 和哈希的语义h以及hb它们hp如何映射到 cgit 的id不同类型查询的查询变量。

任何熟悉他们的人都可以填写我或将我指向一个好的资源吗?

4

1 回答 1

0

基本上

  • idhashb如果 gitweb url 使用,则来自hashb,否则来自hash
  • id2来自 hashb if the gitweb url useshashb , otherwise fromhashp`。
  • 其余的非常简单。

这是我现在使用的脚本(如果你的 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"
于 2012-10-22T21:28:59.190 回答