0

プログラムでgitweb形式のクエリ文字列をcgitクエリ文字列にマッピングして、ウェブのあちこちに散らばっているリポジトリを指す古いgitwebベースのURLを壊さずに、完全にcgitに移行しようとしています。次のような正規表現ベースのURL書き換えルールを見てきました。

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

しかし、私はクエリ文字列の変数を実際に理解して正しく理解しようとしています。mod_rewriteなどの再マッピングではなく、小さなCGIプログラムを使用します。特に、、、、およびハッシュのセマンティクスとh、それらがさまざまなタイプのクエリのcgitのクエリ変数にどのようにマップされるかを理解していません。hbhpid

それらに精通している人は私に記入したり、良いリソースを教えてくれますか?

4

1 に答える 1

0

基本的に

  • idhashbgitweb urlがを使用する場合はからhashb、それ以外の場合はから取得しhashます。
  • id2if the gitweb url useshashpbhashpbhashp`から来てい, otherwise fromます。
  • 残りはかなり簡単です。

これが私が今使用しているスクリプトです(シェルがうまくいかない場合は外部コマンドは呼び出されません):

#!/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 に答える