diff options
Diffstat (limited to '')
| -rwxr-xr-x | scripts/git-permalink | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/scripts/git-permalink b/scripts/git-permalink new file mode 100755 index 00000000..846a68d1 --- /dev/null +++ b/scripts/git-permalink @@ -0,0 +1,87 @@ +#!/bin/sh +set -eu + +FILE="${1:-}" +MYLINENO="${2:-}" +COMMIT="$(git rev-parse HEAD)" +ORIGIN="$(git config --get remote.origin.url)" +REPOSITORY="$(basename "$PWD")" + +usage() { + cat <<EOF +Usage: + $0 FILE [LINENO] +EOF +} + +if [ -z "$FILE" ]; then + echo 'Missing $FILE argument' + usage + exit 2 +fi + +euandreh() { + printf 'https://git.euandreh.xyz/%s/tree/%s?id=%s%s\n' "$REPOSITORY" "$FILE" "$COMMIT" "${MYLINENO:+#n$MYLINENO}" +} + +sourcehut() { + printf '%s/tree/%s/item/%s%s\n' "$ORIGIN" "$COMMIT" "$FILE" "${MYLINENO:+#L$MYLINENO}" +} + +savannah() { + printf '%s/tree/%s?id=%s%s\n' "$(echo "$ORIGIN" | sed 's|gnu.org/git|gnu.org/cgit|')" "$FILE" "$COMMIT" "${MYLINENO:+#n$MYLINENO}" +} + +gitlab() { + if echo "$ORIGIN" | grep -q '^git@gitlab.com:'; then + NAME="$(echo "$ORIGIN" | cut -d: -f2 | cut -d/ -f1)" + ORIGIN="https://gitlab.com/$NAME/$REPOSITORY" + fi + printf '%s/-/blob/%s/%s%s\n' "$ORIGIN" "$COMMIT" "$FILE" "${MYLINENO:+#L$MYLINENO}" +} + +damnyou_github() { + if echo "$MYLINENO" | grep -q -- -; then + P1="$(echo "$MYLINENO" | cut -d- -f1)" + P2="$(echo "$MYLINENO" | cut -d- -f2)" + printf '#L%s-L%s' "$P1" "$P2" + elif [ -n "$MYLINENO" ]; then + printf '#L%s' "${MYLINENO}" + else + printf '' + fi +} + +github() { + if echo "$ORIGIN" | grep -q '^git@github.com:'; then + NAME="$(echo "$ORIGIN" | cut -d: -f2 | cut -d/ -f1)" + ORIGIN="https://github.com/$NAME/$REPOSITORY" + fi + printf '%s/blob/%s/%s%s\n' "$ORIGIN" "$COMMIT" "$FILE" "$(damnyou_github)" +} + +guess_permalink() { + case "$ORIGIN" in + *euandreh.xyz*) + euandreh + ;; + *git.sr.ht*) + sourcehut + ;; + *git.savannah.gnu.org*) + savannah + ;; + *gitlab.com*) + gitlab + ;; + *github.com*) + github + ;; + *) + echo "Unsupported origin: $ORIGIN" + exit 1 + ;; + esac +} + +open `guess_permalink` |
