#!/bin/bash set -e if test "${#}" -lt 1 || test "${#}" -gt 2; then printf "%s\n" "usage: $(basename $0) [section]" exit 1 fi REPO_NAME="${1}" if ! [[ "${REPO_NAME}" =~ ^[a-zA-Z0-9_-]+$ ]]; then printf "%s\n" "[err] repository name can only contain letters, numbers, underscores, and hyphens" exit 1 fi REPO_SECTION="${2:-uncategorized}" if ! [[ "${REPO_SECTION}" =~ ^[a-zA-Z0-9_-]+$ ]]; then printf "%s\n" "[err] section can only contain letters, numbers, underscores, and hyphens" exit 1 fi REPO_DIR="/srv/git/repos/${REPO_NAME}.git" if test -d "${REPO_DIR}"; then printf "%s\n" "[err] repository ${REPO_NAME}.git already exists at ${REPO_DIR}" exit 1 fi mkdir -p "${REPO_DIR}" &>/dev/null ( cd "${REPO_DIR}" if git init --bare &>/dev/null; then printf "%s\n" "[inf] created bare repository at ${REPO_DIR}" else printf "%s\n" "[err] failed to create bare repository at ${REPO_DIR}" fi git config core.logallrefupdates true EMPTY_TREE=$(git hash-object -t tree /dev/null) COMMIT=$(printf "%s\n" "initial commit" | git commit-tree "${EMPTY_TREE}") git update-ref refs/heads/main "${COMMIT}" git symbolic-ref HEAD refs/heads/main git update-server-info git config cgit.section "${REPO_SECTION}" cat > hooks/post-receive << "EOL" #!/bin/sh agefile="$(git rev-parse --git-dir)"/info/web/last-modified mkdir -p "$(dirname "$agefile")" && git for-each-ref \ --sort=-authordate --count=1 \ --format='%(authordate:iso8601)' \ >"$agefile" EOL chmod +x hooks/post-receive ) chown -R git:git "${REPO_DIR}" chmod -R g-w "${REPO_DIR}" printf "%s\n" "[inf] clone with git clone https://cgit.heqnx.com/${REPO_NAME}"