Browse code

Add parsing

Robert Cranston authored on 26/05/2022 19:31:40
Showing 2 changed files

... ...
@@ -7,6 +7,70 @@ host.
7 7
 [Git]: https://en.wikipedia.org/wiki/Git
8 8
 [gitolite]: https://gitolite.com
9 9
 
10
+## Usage
11
+
12
+`git-gitolite --help`:
13
+
14
+```
15
+git-gitolite 1.0
16
+
17
+Manage the counterpart of a local Git repository on a remote gitolite
18
+host.
19
+
20
+usage:
21
+  git-gitolite help
22
+  git-gitolite info
23
+  git-gitolite init <license> [<description> [<references>]]
24
+  git-gitolite remote
25
+  git-gitolite head
26
+  git-gitolite publish
27
+  git-gitolite unpublish
28
+  git-gitolite rm
29
+  git-gitolite <command> [<args>...]
30
+  git-gitolite --help|-h
31
+  git-gitolite --version
32
+
33
+commands:
34
+  help
35
+    Runs the gitolite 'help' command.
36
+  info
37
+    Runs the gitolite 'info' command.
38
+  init
39
+    Creates and commits, separately, readme and license files.
40
+    A note about the <license> (which should be an SPDX identifier), as
41
+    well as <description> and <references> if given, is inserted into the
42
+    readme. The readme is opened in the editor configured for git
43
+    for review before each commit. This command then (re)sets the remote
44
+    URL, creates the remote repository and pushes.
45
+  remote
46
+    (Re)sets the remote URL.
47
+  head
48
+    Resets the remote HEAD to point to the same ref as the local HEAD,
49
+    making it the default view on a web server.
50
+  publish
51
+    Grants read permissions to 'gitweb', making it viewable through a
52
+    web server.
53
+  unpublish
54
+    Revokes read permissions from 'gitweb', preventing it from being
55
+    viewable through a web server.
56
+  rm
57
+    (Unlocks and) removes the remote repository.
58
+  <command>
59
+    Perform a gitolite command, filling in the host and repository name
60
+    automatically. See `git-gitolite help` for a list of commands.
61
+
62
+environment variables:
63
+  GIT_GITOLITE_USER
64
+    The gitolite user under which repositories are found.
65
+    [default: $USER]
66
+  GIT_GITOLITE_HOST
67
+    The host to connect to.
68
+    [default: git.$(dnsdomainname)]
69
+  GIT_GITOLITE_REMOTE
70
+    The git remote used to identify the gitolite server.
71
+    [default: origin]
72
+```
73
+
10 74
 ## License
11 75
 
12 76
 Licensed under the [ISC License][] unless otherwise noted, see the
13 77
new file mode 100755
... ...
@@ -0,0 +1,107 @@
1
+#!/bin/sh
2
+set -euC
3
+
4
+##/// git-gitolite 1.0
5
+#////
6
+#//// Manage the counterpart of a local Git repository on a remote gitolite
7
+#//// host.
8
+#////
9
+###// usage:
10
+#////   git-gitolite help
11
+#////   git-gitolite info
12
+#////   git-gitolite init <license> [<description> [<references>]]
13
+#////   git-gitolite remote
14
+#////   git-gitolite head
15
+#////   git-gitolite publish
16
+#////   git-gitolite unpublish
17
+#////   git-gitolite rm
18
+#////   git-gitolite <command> [<args>...]
19
+#////   git-gitolite --help|-h
20
+#////   git-gitolite --version
21
+#////
22
+###// commands:
23
+####/   help
24
+#////     Runs the gitolite 'help' command.
25
+####/   info
26
+#////     Runs the gitolite 'info' command.
27
+####/   init
28
+#////     Creates and commits, separately, readme and license files.
29
+#////     A note about the <license> (which should be an SPDX identifier), as
30
+#////     well as <description> and <references> if given, is inserted into the
31
+#////     readme. The readme is opened in the editor configured for git
32
+#////     for review before each commit. This command then (re)sets the remote
33
+#////     URL, creates the remote repository and pushes.
34
+####/   remote
35
+#////     (Re)sets the remote URL.
36
+####/   head
37
+#////     Resets the remote HEAD to point to the same ref as the local HEAD,
38
+#////     making it the default view on a web server.
39
+####/   publish
40
+#////     Grants read permissions to 'gitweb', making it viewable through a
41
+#////     web server.
42
+####/   unpublish
43
+#////     Revokes read permissions from 'gitweb', preventing it from being
44
+#////     viewable through a web server.
45
+####/   rm
46
+#////     (Unlocks and) removes the remote repository.
47
+####/   <command>
48
+#////     Perform a gitolite command, filling in the host and repository name
49
+#////     automatically. See `git-gitolite help` for a list of commands.
50
+#////
51
+###// environment variables:
52
+####/   GIT_GITOLITE_USER
53
+#////     The gitolite user under which repositories are found.
54
+#////     [default: $USER]
55
+####/   GIT_GITOLITE_HOST
56
+#////     The host to connect to.
57
+#////     [default: git.$(dnsdomainname)]
58
+####/   GIT_GITOLITE_REMOTE
59
+#////     The git remote used to identify the gitolite server.
60
+#////     [default: origin]
61
+
62
+## Messages
63
+prog="$(basename "$0")"
64
+help()    { sed -n 's|^#[#/]*/ \?||p' "$0";                 exit 0; }
65
+version() { help | awk '/^$/{++p;next}p==0';                exit 0; }
66
+usage()   { help | awk '/^$/{++p;next}p==2';                exit 0; }
67
+parse()   { printf '%s: error: %s\n'   "$prog" "$1"; usage; exit 1; } >&2
68
+error()   { printf '%s: error: %s\n'   "$prog" "$1";        exit 1; } >&2
69
+warning() { printf '%s: warning: %s\n' "$prog" "$1";                } >&2
70
+opt()     { [ $# -gt 1 ] || parse "option '$1' value not provided"; }
71
+arg()     { [ $# -gt 1 ] || parse "argument '$1' not provided";     }
72
+argend()  { [ $# -eq 0 ] || parse "unrecognized argument '$1'";     }
73
+
74
+## Parse special options
75
+case "${1:-}"
76
+in
77
+  '-h'|'--help') help; ;;
78
+  '--version') version; ;;
79
+esac
80
+
81
+## Parse required arguments
82
+arg 'command' "$@"; command="$1"; shift;
83
+
84
+case "$command" in
85
+  'init')
86
+    ## Parse required arguments
87
+    arg 'license' "$@"; license="$1"; shift;
88
+
89
+    ## Parse optional arguments
90
+    description='<DESCRIPTION>'
91
+    references=''
92
+    [ $# -eq 0 ] || { description="$1"; shift; }
93
+    [ $# -eq 0 ] || { references="$1";  shift; }
94
+    ;;
95
+esac
96
+
97
+## Parse unrecognized arguments
98
+case "$command" in
99
+  'help'|'info'|'init'|'remote'|'head'|'publish'|'unpublish'|'rm')
100
+    argend
101
+    ;;
102
+esac
103
+
104
+## Parse environment variables
105
+user="${GIT_GITOLITE_USER:-"$USER"}"
106
+host="${GIT_GITOLITE_HOST:-"git.$(dnsdomainname)"}"
107
+remote="${GIT_GITOLITE_REMOTE:-"origin"}"