... | ... |
@@ -105,3 +105,109 @@ esac |
105 | 105 |
user="${GIT_GITOLITE_USER:-"$USER"}" |
106 | 106 |
host="${GIT_GITOLITE_HOST:-"git.$(dnsdomainname)"}" |
107 | 107 |
remote="${GIT_GITOLITE_REMOTE:-"origin"}" |
108 |
+ |
|
109 |
+## ssh |
|
110 |
+ssh() |
|
111 |
+{ |
|
112 |
+ command ssh -T "git@$host" "$@" |
|
113 |
+} |
|
114 |
+ |
|
115 |
+## Repository-independent commands |
|
116 |
+case "$command" in |
|
117 |
+ 'info'|'help') ssh "$command" "$@"; exit; ;; |
|
118 |
+esac |
|
119 |
+ |
|
120 |
+## Helpers |
|
121 |
+toplevel="$(git rev-parse --show-toplevel)" |
|
122 |
+project="$(basename "$toplevel")" |
|
123 |
+repo="$user/$project" |
|
124 |
+url="https://$host/$repo" |
|
125 |
+remote_url="$(git remote get-url "$remote" 2> /dev/null || true)" |
|
126 |
+remote_repo="$(printf '%s\n' "$remote_url" | sed 's#^\(.\+://\)\?[^/]\+/##')" |
|
127 |
+head="$(git rev-parse --abbrev-ref HEAD 2> /dev/null || true)" |
|
128 |
+licenses='https://github.com/github/choosealicense.com/raw/gh-pages/_licenses' |
|
129 |
+ |
|
130 |
+remote() |
|
131 |
+{ |
|
132 |
+ git remote remove "$remote" 2> /dev/null || true |
|
133 |
+ git remote add "$remote" "$url" |
|
134 |
+} |
|
135 |
+ |
|
136 |
+commit() |
|
137 |
+{ |
|
138 |
+ message="$1"; shift; |
|
139 |
+ file="$1"; shift; |
|
140 |
+ printf '%s\n' "$@" >> "$file" |
|
141 |
+ eval "$(git var GIT_EDITOR)" '"$file"' |
|
142 |
+ git add "$file" |
|
143 |
+ git commit -m "$message" |
|
144 |
+} |
|
145 |
+ |
|
146 |
+fmt() |
|
147 |
+{ |
|
148 |
+ printf '%s\n' "$@" \ |
|
149 |
+ | command fmt --width=79 --goal=79 |
|
150 |
+} |
|
151 |
+ |
|
152 |
+## Repository initialization commands |
|
153 |
+[ "$remote_url" = "" ] || [ "$remote_url" = "$url" ] || \ |
|
154 |
+ warning "remote '$remote_url' does not match '$url'" |
|
155 |
+case "$command" in |
|
156 |
+ 'init') |
|
157 |
+ # Readme. |
|
158 |
+ commit 'Add readme' "$toplevel/README.md" \ |
|
159 |
+ "# [\`$project\`][]" \ |
|
160 |
+ '' \ |
|
161 |
+ ${description:+"$description"} \ |
|
162 |
+ ${description:+""} \ |
|
163 |
+ "[\`$project\`]: $url" \ |
|
164 |
+ ${references:+"$references"} |
|
165 |
+ # License. |
|
166 |
+ license_raw="$(curl -sL "$licenses/$license.txt")" |
|
167 |
+ license_title="$( |
|
168 |
+ printf '%s' "$license_raw" \ |
|
169 |
+ | awk -F': ' '/^title:/{print $2; exit; }' |
|
170 |
+ )" |
|
171 |
+ license_body="$( |
|
172 |
+ printf '%s' "$license_raw" \ |
|
173 |
+ | awk 's>=2&&!/^$/{b++};b;/^---$/{s++}' \ |
|
174 |
+ | sed \ |
|
175 |
+ -e 's/\[year\]/'"$(date +%Y)"'/' \ |
|
176 |
+ -e 's/\[fullname\]/'"$(git config user.name)"'/' \ |
|
177 |
+ )" |
|
178 |
+ printf '%s\n' "$license_body" >| "$toplevel/LICENSE" |
|
179 |
+ git add "$toplevel/LICENSE" |
|
180 |
+ commit 'Add license' "$toplevel/README.md" \ |
|
181 |
+ '' \ |
|
182 |
+ '## License' \ |
|
183 |
+ '' \ |
|
184 |
+ "$(fmt \ |
|
185 |
+ "Licensed under the [$license_title][] unless otherwise noted, see" \ |
|
186 |
+ 'the [`LICENSE`][] file.' \ |
|
187 |
+ )" \ |
|
188 |
+ '' \ |
|
189 |
+ "[$license_title]: https://choosealicense.com/licenses/$license" \ |
|
190 |
+ '[`LICENSE`]: LICENSE' |
|
191 |
+ # Remote. |
|
192 |
+ remote |
|
193 |
+ ssh create "$repo" |
|
194 |
+ git push |
|
195 |
+ exit |
|
196 |
+ ;; |
|
197 |
+ 'remote') |
|
198 |
+ remote |
|
199 |
+ exit |
|
200 |
+ ;; |
|
201 |
+esac |
|
202 |
+ |
|
203 |
+## Repository-dependent commands |
|
204 |
+[ "$remote_repo" ] || \ |
|
205 |
+ error "remote repo for '$remote' is not defined (run 'git-gitolite init'?)" |
|
206 |
+case "$command" in |
|
207 |
+ 'head') ssh symbolic-ref "$remote_repo" HEAD "refs/heads/$head"; ;; |
|
208 |
+ 'publish') ssh perms "$remote_repo" + READERS 'gitweb'; ;; |
|
209 |
+ 'unpublish') ssh perms "$remote_repo" - READERS 'gitweb'; ;; |
|
210 |
+ 'rm') ssh D unlock "$remote_repo"; |
|
211 |
+ ssh D rm "$remote_repo"; ;; |
|
212 |
+ *) ssh "$command" "$remote_repo" "$@"; ;; |
|
213 |
+esac |