aboutsummaryrefslogtreecommitdiff
path: root/src/git-permalink.sh
blob: 5202d290ec26deaa17dadc66aa791a2990e53673 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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 >&2
	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
}

xdg-open "$(guess_permalink)"