gitosis のソースパケジ

がき二名がどらえもんな映画を見ている間のヒマつぶしにスタバに入って電源確保したのは良いのですが USB ケーブルを忘れてしまい、接続不能。
どうしたものか、と思っていたら gitosis なソースパケジを展開したディレクトリを発見したのでそちら方面掘削してみることに。

debian 配下

以下。

$ ls -1
changelog
compat
control
copyright
gitosis.config
gitosis.docs
gitosis.examples
gitosis.postinst
gitosis.postrm
gitosis.preseed
gitosis.README.Debian
gitosis.templates
patches
po
README.source
rules
source
$

順に見ていきます。とは言え changelog は略。compat は 7 です。control は Depends 関連のみ、ってことで以下。

Depends:
 ${misc:Depends}, ${python:Depends}, adduser, git-core, openssh-server,
 python-setuptools, sudo
Suggests: git-daemon-run, gitweb

copyright も略。gitosis.config が以下。

#!/bin/sh

set -e

. /usr/share/debconf/confmodule

db_input low gitosis/username || true
db_go

db_input low gitosis/directory || true
db_go

db_input low gitosis/key || true
db_go

db_stop

これはまたシンプルですね。フライングしてテンプレ見てみるか。ちょい端折って以下。

Template: gitosis/username
Type: string
Default: gitosis

Template: gitosis/directory
Type: string
Default: /srv/gitosis

Template: gitosis/key
Type: string
Default:

gitosis.docs が以下。

README.rst
TODO.rst
debian/gitosis.preseed

コピッて debuild してみようかな。ってパケジが足らねぇ、って叱られた。ネト接続できてないので断念。たしか /usr/share/doc/gitosis/ あたりに投入されるはず。
あるいは gitosis.examples が以下で

etc-event.d-local-git-daemon
example.conf
gitweb.conf
lighttpd-gitweb.conf

こいつらも /usr/share/doc/gitosis/examples に投入のはず。次は gitosis.postinst ですが順に見ていきます。まず以下はお約束。

#!/bin/sh

set -e

# dh_pysupport includes needs to be early in postinst
# in order to be able to initialize gitosis-admin repository.

#DEBHELPER#

. /usr/share/debconf/confmodule

で、引数は configure 限定。

case "${1}" in
    configure)

# (snip)

        ;;

    abort-upgrade|abort-remove|abort-deconfigure)

        ;;

    *)
        echo "postinst called with unknown argument \`${1}'" >&2
        exit 1
        ;;
esac

exit 0

configure の中身を順に確認していきます。まず debconf 云々。

        db_version 2.0

        db_get gitosis/username
        _USERNAME="${RET:-gitosis}"

        db_get gitosis/directory
        _DIRECTORY="${RET:-/srv/gitosis}"

        db_get gitosis/key
        _KEY="${RET}"

        db_set gitosis/key ""

        db_stop

で、順に導入なナニ。redmine と比べて読みやすいですな。やっぱ DB がカラむと inst/rm なソレがややこしくなるに違いない。
debconf なソレの順にまずは _USERNAME 云々から。

        if ! getent passwd | grep -q ${_USERNAME}
        then
            adduser --quiet --system --home ${_DIRECTORY} --shell /bin/sh --disabled-password --no-create-home --gecos 'git repository hosting' --group ${_USERNAME}
        elif ! getent group | grep -q "^${_USERNAME}"
        then
            addgroup --system --quiet ${_USERNAME}
            gpasswd -a ${_USERNAME} ${_USERNAME}
        else
            echo "gitosis user (${_USERNAME}) already exists, doing nothing."
        fi

む、getent って何、って man 見たら以下とのこと

NAME
       getent - get entries from administrative database

で、_DIRECTORY および _KEY について云々してます。gitosis なパケジ導入したことがあるんですが、gitosis-init って自分でヤッてたよな、って記憶があって違和感があったんですが、_KEY が指定されてない場合は gitosis-init は実行されないですね。成程。
記述としては以下なカンジなんですが、rm でどう云々しているのかを見るのが楽しみです。

        if [ ! -d "${_DIRECTORY}" ]
        then
            mkdir -p "${_DIRECTORY}"
            chown ${_USERNAME}:${_USERNAME} ${_DIRECTORY} -R

            ln -s "${_DIRECTORY}"/repositories "${_DIRECTORY}"/git

            if [ -n "${_KEY}" ]
            then
                if [ -e "${_KEY}" ]
                then
                    sudo -H -u ${_USERNAME} gitosis-init < ${_KEY}
                else
                    TMPFILE="$(mktemp -t gitosis.XXXXXXXX)"

                    echo "${_KEY}" > ${TMPFILE}

                    sudo -H -u ${_USERNAME} gitosis-init < ${TMPFILE}

                    rm -f ${TMPFILE}
                fi
            fi
        else
            echo
            echo "gitosis directory (${_DIRECTORY}) already exists, doing nothing."
            echo "Make sure the directory is recursively owned by the correct user account (${_USERNAME})."
        fi

次は gitosis.postrm です。楽しみ、って書いたんですが purge では何もしていない模様。

#!/bin/sh

set -e

case "${1}" in
    remove)

# (snip)

        ;;

    purge|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)

        ;;

    *)
        echo "postrm called with unknown argument \`${1}'" >&2
        exit 1
        ;;
esac

#DEBHELPER#

exit 0

remove な中身はというと以下。

        _USERNAME="gitosis"
        _DIRECTORY="/srv/gitosis"

        if [ -x /usr/sbin/deluser ]
        then
            deluser --system ${_USERNAME}
        fi

        if [ -d "${_DIRECTORY}" ]
        then
            rmdir --ignore-fail-on-non-empty "${_DIRECTORY}" || true
        fi

デフォ限定、というあたりがアレですが、ユーザとディレクトリを削除されている模様。若干微妙な空気が漂っている気もしますがスルーで。
あと、gitosis.preseed というファイルがあります。これは別途確認の方向。

################################################################################
## gitosis

#gitosis gitosis/username string gitosis
#gitosis gitosis/directory string /srv/gitosis
#gitosis gitosis/key string
################################################################################

また、debian/rules もちょっと確認必要。

#!/usr/bin/make -f

%:
	dh --with quilt ${@}

そしてエントリ投入はテザリングでナニ。1100 前には映画が終わるみたいなのでエントリ投入したら本屋さんに寄って出待ちの方向。