Linux
Git
shell
Web

Linux:gitリポジトリを一時的にweb公開するscript

gitは "git instaweb" でカレントのリポジトリをweb公開できて、webブラウザからlogやdiffがとれる。
特に複数のbranchを持っている状態のときにあちこちのbranchに移動しつつ参照できて便利だなと思う。
便利だけど、数十人のproject等でサーバマシンを共有している場合にportがかぶるとやだなって思ったので、開いているportを自動で割り当ててinstawebするshell-scriptを書いた。

"webgit.sh start"   で開始して
"webgit.sh stop"  で停止する

  • 表示イメージ 18333fig0401-tn1 (1).png
#!/bin/sh
#===============================================================================
# [webgit.sh]
# git-repoを一時的にwebに公開するscript
#
# git-repoの存在するサーバマシン上で実行できます
# ※ git-repoのweb参照が不要になったら必ず終了させてください
#
# 起動: git管理下にあるディレクトリ上で webgit.sh start
#                                       --> 表示されたURLにて参照できます
#
# 終了: git管理下にあるディレクトリ上で webgit.sh stop
#
#===============================================================================
# 2012.05.15 nfukuoka 新規作成

servername=`hostname`

f_getport()
{
    perl - <<'EOT'
    use IO;
    my $port_no = do {
        my $l = IO::Socket::INET->new(
            Listen => 5,
            LocalHost => '127.0.0.1',
            LocalPort => 0,
            Proto => 'tcp',
            ReuseAddr => 1,
        ) or die $!;
        print $l->sockport;
    };
EOT
}

cmd=$1
if [ "x$cmd" = "x" ];then
    echo "Usage: `basename $0` start|stop" >&2
    exit 1
fi


ret=9
if [ "x$cmd" = "xstart" ];then

    l_port=`f_getport`

    # (まずは apache2 instaweb 終了)
    git instaweb  --stop
    sleep 1

    # apache2 instaweb 開始
    git instaweb  --httpd=apache2 --port=$l_port --browser='none'

    # print access URL
    echo "\n"
    echo "-----"
    printf "Access URL -->   http://%s:%s/\n" "$servername" "$l_port"
    echo "-----"
    ret=0

elif [ "x$cmd" = "xstop" ];then

    # apache2 instaweb 終了
    git instaweb  --stop
    ret=0
fi

exit $ret