]> git.plutz.net Git - shellwiki/blob - macros/revisions
Merge commit '6bc502434737d7f08379e79b94fc6fda424ef779'
[shellwiki] / macros / revisions
1 #!/bin/sh
2
3 # Copyright 2022 - 2023 Paul Hänsch
4
5 # Permission to use, copy, modify, and/or distribute this software for any
6 # purpose with or without fee is hereby granted, provided that the above
7 # copyright notice and this permission notice appear in all copies.
8
9 # THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
12 # SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
15 # IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
17 . "$_EXEC/cgilite/cgilite.sh"
18 . "$_EXEC/tools.sh"
19 . "$_EXEC/acl.sh"
20
21 _(){ printf %s\\n "$*"; }
22 [ "${LANGUAGE}" -a -r "${_EXEC}/l10n/${LANGUAGE}.sh" ] && . "${_EXEC}/l10n/${LANGUAGE}.sh"
23
24 LIST=true DIFF=
25 while [ $# -gt 0 ]; do case $1 in
26   --list)
27     LIST=true
28     shift 1
29     ;;
30   --no-list)
31     LIST=
32     shift 1
33     ;;
34   --diff)
35     DIFF=true
36     shift 1
37     ;;
38   --no-diff)
39     DIFF=
40     shift 1
41     ;;
42   *)page="$1"
43     shift 1
44     ;;
45 esac; done
46
47 page_abs="$(page_abs "$page")"
48 page_default="${page_abs%:*/}" 
49
50 if ! acl_read "$page_abs"; then
51   return 0
52 fi
53
54 printf '<div class="macro revisions">\n'
55
56 if [ "$REV_PAGES" != true ]; then
57   printf '<div class="error">%s</div>' "$(_ GIT is not available to handle revisioning.)"
58   exit 1
59 fi
60
61 if [ "$LIST" = true ]; then
62   printf '<ul>\n'
63   IFS=" "
64   { git -C "$_DATA" log --date=format:"%a, %x %H:%M" \
65                       --pretty=format:"%h       %cd     %s" \
66                       -- "pages${page_abs}#page.md"
67     printf '\n'
68   } | while read -r hash date message; do
69     user="${message% @*}"; user="${user##*@ }"
70     printf '<li><span class="hash"><a href="%s">%s</a></span><span class="date">%s</span><span class="user">%s</span></li>\n' \
71       "$(HTML "${page%/}/[revision]/$hash")" "$(HTML "$hash")" "$(HTML "$date")" "$(HTML "$user")"
72   done
73   printf '</ul>\n'
74 fi
75
76 if [ "$DIFF" = true -a "$LANGUAGE_DEFAULT" -a "$page_default" != "$page_abs" ]; then
77   commit="$(git -C "$_DATA" log --pretty=format:%H -- "pages${page_abs}#page.md" |head -n1)"
78   printf '<section class="diff"><h2>%s</h2>' "$(_ 'Latest changes to the original language page')"
79   git -C "$_DATA" diff -U3 "$commit" -- "pages${page_default}#page.md" |tail -n+5 \
80   | while read -r diff; do case $diff in
81     @@\ *\ @@*)
82         line="${diff#@@ * @@}"
83         num="${diff%"${line}"}"
84         printf '<span class="linenum">%s</span>\n' "$(HTML "$num")"
85         printf '<span class="line">%s</span>\n' "$(HTML "$line")"
86         ;;
87     -*) printf '<span class="linedel">%s</span>\n' "$(HTML "$diff")";;
88     +*) printf '<span class="lineadd">%s</span>\n' "$(HTML "$diff")";;
89     \ *) printf '<span class="line">%s</span>\n' "$(HTML "$diff")";;
90     \\\ *) printf '<span class="linenote">%s</span>\n' "$(HTML "$diff")";;
91   esac; done
92   printf '</section>'
93 fi
94
95 printf '</div>\n'