aboutsummaryrefslogtreecommitdiff
path: root/scripts/git-permalink
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/git-permalink')
-rwxr-xr-xscripts/git-permalink87
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`