Commit ff5f83bb8f94fd699806870315b959d65ec5e6ec

Authored by Shrikant Sharat
1 parent 6a489884bc

80|

Showing 1 changed file with 12 additions and 2 deletions Inline Diff

1 #!/bin/zsh 1 #!/bin/zsh
2 2
3 # Each line in this string has the following entries separated by a space 3 # Each line in this string has the following entries separated by a space
4 # character. 4 # character.
5 # <repo-url>, <plugin-location>, <bundle-type>, <has-local-clone> 5 # <repo-url>, <plugin-location>, <bundle-type>, <has-local-clone>
6 # FIXME: Is not kept local by zsh! 6 # FIXME: Is not kept local by zsh!
7 local _ANTIGEN_BUNDLE_RECORD="" 7 local _ANTIGEN_BUNDLE_RECORD=""
8 local _ANTIGEN_INSTALL_DIR="$(cd "$(dirname "$0")" && pwd)" 8 local _ANTIGEN_INSTALL_DIR="$(cd "$(dirname "$0")" && pwd)"
9 9
10 # Used to defer compinit/compdef 10 # Used to defer compinit/compdef
11 typeset -a __deferred_compdefs 11 typeset -a __deferred_compdefs
12 compdef () { __deferred_compdefs=($__deferred_compdefs "$*") } 12 compdef () { __deferred_compdefs=($__deferred_compdefs "$*") }
13 13
14 # Syntaxes 14 # Syntaxes
15 # antigen-bundle <url> [<loc>=/] 15 # antigen-bundle <url> [<loc>=/]
16 # Keyword only arguments: 16 # Keyword only arguments:
17 # branch - The branch of the repo to use for this bundle. 17 # branch - The branch of the repo to use for this bundle.
18 antigen-bundle () { 18 antigen-bundle () {
19 19
20 # Bundle spec arguments' default values. 20 # Bundle spec arguments' default values.
21 local url="$ANTIGEN_DEFAULT_REPO_URL" 21 local url="$ANTIGEN_DEFAULT_REPO_URL"
22 local loc=/ 22 local loc=/
23 local branch= 23 local branch=
24 local no_local_clone=false 24 local no_local_clone=false
25 local btype=plugin 25 local btype=plugin
26 26
27 # Parse the given arguments. (Will overwrite the above values). 27 # Parse the given arguments. (Will overwrite the above values).
28 eval "$(-antigen-parse-args \ 28 eval "$(-antigen-parse-args \
29 'url?, loc? ; branch:?, no-local-clone?, btype:?' \ 29 'url?, loc? ; branch:?, no-local-clone?, btype:?' \
30 "$@")" 30 "$@")"
31 31
32 # Check if url is just the plugin name. Super short syntax. 32 # Check if url is just the plugin name. Super short syntax.
33 if [[ "$url" != */* ]]; then 33 if [[ "$url" != */* ]]; then
34 loc="plugins/$url" 34 loc="plugins/$url"
35 url="$ANTIGEN_DEFAULT_REPO_URL" 35 url="$ANTIGEN_DEFAULT_REPO_URL"
36 fi 36 fi
37 37
38 # Resolve the url. 38 # Resolve the url.
39 url="$(-antigen-resolve-bundle-url "$url")" 39 url="$(-antigen-resolve-bundle-url "$url")"
40 40
41 # Add the branch information to the url. 41 # Add the branch information to the url.
42 if [[ ! -z $branch ]]; then 42 if [[ ! -z $branch ]]; then
43 url="$url|$branch" 43 url="$url|$branch"
44 fi 44 fi
45 45
46 # The `make_local_clone` variable better represents whether there should be 46 # The `make_local_clone` variable better represents whether there should be
47 # a local clone made. For cloning to be avoided, firstly, the `$url` should 47 # a local clone made. For cloning to be avoided, firstly, the `$url` should
48 # be an absolute local path and `$branch` should be empty. In addition to 48 # be an absolute local path and `$branch` should be empty. In addition to
49 # these two conditions, either the `--no-local-clone` option should be 49 # these two conditions, either the `--no-local-clone` option should be
50 # given, or `$url` should not a git repo. 50 # given, or `$url` should not a git repo.
51 local make_local_clone=true 51 local make_local_clone=true
52 if [[ $url == /* && -z $branch && 52 if [[ $url == /* && -z $branch &&
53 ( $no_local_clone == true || ! -d $url/.git ) ]]; then 53 ( $no_local_clone == true || ! -d $url/.git ) ]]; then
54 make_local_clone=false 54 make_local_clone=false
55 fi 55 fi
56 56
57 # Add the theme extension to `loc`, if this is a theme. 57 # Add the theme extension to `loc`, if this is a theme.
58 if [[ $btype == theme && $loc != *.zsh-theme ]]; then 58 if [[ $btype == theme && $loc != *.zsh-theme ]]; then
59 loc="$loc.zsh-theme" 59 loc="$loc.zsh-theme"
60 fi 60 fi
61 61
62 # Add it to the record. 62 # Add it to the record.
63 _ANTIGEN_BUNDLE_RECORD="$_ANTIGEN_BUNDLE_RECORD\n$url $loc $btype" 63 _ANTIGEN_BUNDLE_RECORD="$_ANTIGEN_BUNDLE_RECORD\n$url $loc $btype"
64 _ANTIGEN_BUNDLE_RECORD="$_ANTIGEN_BUNDLE_RECORD $make_local_clone" 64 _ANTIGEN_BUNDLE_RECORD="$_ANTIGEN_BUNDLE_RECORD $make_local_clone"
65 65
66 # Ensure a clone exists for this repo, if needed. 66 # Ensure a clone exists for this repo, if needed.
67 if $make_local_clone; then 67 if $make_local_clone; then
68 -antigen-ensure-repo "$url" 68 -antigen-ensure-repo "$url"
69 fi 69 fi
70 70
71 # Load the plugin. 71 # Load the plugin.
72 -antigen-load "$url" "$loc" "$btype" "$make_local_clone" 72 -antigen-load "$url" "$loc" "$btype" "$make_local_clone"
73 73
74 } 74 }
75 75
76 -antigen-resolve-bundle-url () { 76 -antigen-resolve-bundle-url () {
77 # Given an acceptable short/full form of a bundle's repo url, this function 77 # Given an acceptable short/full form of a bundle's repo url, this function
78 # echoes the full form of the repo's clone url. 78 # echoes the full form of the repo's clone url.
79 79
80 local url="$1" 80 local url="$1"
81 81
82 # Expand short github url syntax: `username/reponame`. 82 # Expand short github url syntax: `username/reponame`.
83 if [[ $url != git://* && 83 if [[ $url != git://* &&
84 $url != https://* && 84 $url != https://* &&
85 $url != /* && 85 $url != /* &&
86 $url != git@github.com:*/* 86 $url != git@github.com:*/*
87 ]]; then 87 ]]; then
88 url="https://github.com/${url%.git}.git" 88 url="https://github.com/${url%.git}.git"
89 fi 89 fi
90 90
91 echo "$url" 91 echo "$url"
92 } 92 }
93 93
94 antigen-bundles () { 94 antigen-bundles () {
95 # Bulk add many bundles at one go. Empty lines and lines starting with a `#` 95 # Bulk add many bundles at one go. Empty lines and lines starting with a `#`
96 # are ignored. Everything else is given to `antigen-bundle` as is, no 96 # are ignored. Everything else is given to `antigen-bundle` as is, no
97 # quoting rules applied. 97 # quoting rules applied.
98 98
99 local line 99 local line
100 100
101 grep '^[[:space:]]*[^[:space:]#]' | while read line; do 101 grep '^[[:space:]]*[^[:space:]#]' | while read line; do
102 # Using `eval` so that we can use the shell-style quoting in each line 102 # Using `eval` so that we can use the shell-style quoting in each line
103 # piped to `antigen-bundles`. 103 # piped to `antigen-bundles`.
104 eval "antigen-bundle $line" 104 eval "antigen-bundle $line"
105 done 105 done
106 } 106 }
107 107
108 antigen-update () { 108 antigen-update () {
109 # Update your bundles, i.e., `git pull` in all the plugin repos. 109 # Update your bundles, i.e., `git pull` in all the plugin repos.
110 110
111 date > $ADOTDIR/revert-info 111 date > $ADOTDIR/revert-info
112 112
113 -antigen-echo-record | 113 -antigen-echo-record |
114 awk '$4 == "true" {print $1}' | 114 awk '$4 == "true" {print $1}' |
115 sort -u | 115 sort -u |
116 while read url; do 116 while read url; do
117 echo "**** Pulling $url" 117 echo "**** Pulling $url"
118 118
119 local clone_dir="$(-antigen-get-clone-dir "$url")" 119 local clone_dir="$(-antigen-get-clone-dir "$url")"
120 if [[ -d "$clone_dir" ]]; then 120 if [[ -d "$clone_dir" ]]; then
121 (echo -n "$clone_dir:" 121 (echo -n "$clone_dir:"
122 cd "$clone_dir" 122 cd "$clone_dir"
123 git rev-parse HEAD) >> $ADOTDIR/revert-info 123 git rev-parse HEAD) >> $ADOTDIR/revert-info
124 fi 124 fi
125 125
126 -antigen-ensure-repo "$url" --update --verbose 126 -antigen-ensure-repo "$url" --update --verbose
127 127
128 echo 128 echo
129 done 129 done
130 } 130 }
131 131
132 antigen-revert () { 132 antigen-revert () {
133 if [[ -f $ADOTDIR/revert-info ]]; then 133 if [[ -f $ADOTDIR/revert-info ]]; then
134 cat $ADOTDIR/revert-info | sed '1!p' | while read line; do 134 cat $ADOTDIR/revert-info | sed '1!p' | while read line; do
135 dir="$(echo "$line" | cut -d: -f1)" 135 dir="$(echo "$line" | cut -d: -f1)"
136 git --git-dir="$dir/.git" --work-tree="$dir" \ 136 git --git-dir="$dir/.git" --work-tree="$dir" \
137 checkout "$(echo "$line" | cut -d: -f2)" 2> /dev/null 137 checkout "$(echo "$line" | cut -d: -f2)" 2> /dev/null
138 138
139 done 139 done
140 140
141 echo "Reverted to state before running -update on $( 141 echo "Reverted to state before running -update on $(
142 cat $ADOTDIR/revert-info | sed -n 1p)." 142 cat $ADOTDIR/revert-info | sed -n 1p)."
143 143
144 else 144 else
145 echo 'No revert information available. Cannot revert.' >&2 145 echo 'No revert information available. Cannot revert.' >&2
146 fi 146 fi
147 147
148 148
149 } 149 }
150 150
151 -antigen-get-clone-dir () { 151 -antigen-get-clone-dir () {
152 # Takes a repo url and gives out the path that this url needs to be cloned 152 # Takes a repo url and gives out the path that this url needs to be cloned
153 # to. Doesn't actually clone anything. 153 # to. Doesn't actually clone anything.
154 echo -n $ADOTDIR/repos/ 154 echo -n $ADOTDIR/repos/
155 155
156 if [[ "$1" == "https://github.com/sorin-ionescu/prezto.git" ]]; then 156 if [[ "$1" == "https://github.com/sorin-ionescu/prezto.git" ]]; then
157 # Prezto's directory *has* to be `.zprezto`. 157 # Prezto's directory *has* to be `.zprezto`.
158 echo .zprezto 158 echo .zprezto
159 159
160 else 160 else
161 echo "$1" | sed \ 161 echo "$1" | sed \
162 -e 's./.-SLASH-.g' \ 162 -e 's./.-SLASH-.g' \
163 -e 's.:.-COLON-.g' \ 163 -e 's.:.-COLON-.g' \
164 -e 's.|.-PIPE-.g' 164 -e 's.|.-PIPE-.g'
165 165
166 fi 166 fi
167 } 167 }
168 168
169 -antigen-get-clone-url () { 169 -antigen-get-clone-url () {
170 # Takes a repo's clone dir and gives out the repo's original url that was 170 # Takes a repo's clone dir and gives out the repo's original url that was
171 # used to create the given directory path. 171 # used to create the given directory path.
172 172
173 if [[ "$1" == ".zprezto" ]]; then 173 if [[ "$1" == ".zprezto" ]]; then
174 # Prezto's (in `.zprezto`), is assumed to be from `sorin-ionescu`'s 174 # Prezto's (in `.zprezto`), is assumed to be from `sorin-ionescu`'s
175 # remote. 175 # remote.
176 echo https://github.com/sorin-ionescu/prezto.git 176 echo https://github.com/sorin-ionescu/prezto.git
177 177
178 else 178 else
179 echo "$1" | sed \ 179 echo "$1" | sed \
180 -e "s:^$ADOTDIR/repos/::" \ 180 -e "s:^$ADOTDIR/repos/::" \
181 -e 's.-SLASH-./.g' \ 181 -e 's.-SLASH-./.g' \
182 -e 's.-COLON-.:.g' \ 182 -e 's.-COLON-.:.g' \
183 -e 's.-PIPE-.|.g' 183 -e 's.-PIPE-.|.g'
184 184
185 fi 185 fi
186 } 186 }
187 187
188 -antigen-ensure-repo () { 188 -antigen-ensure-repo () {
189 189
190 # Ensure that a clone exists for the given repo url and branch. If the first 190 # Ensure that a clone exists for the given repo url and branch. If the first
191 # argument is `--update` and if a clone already exists for the given repo 191 # argument is `--update` and if a clone already exists for the given repo
192 # and branch, it is pull-ed, i.e., updated. 192 # and branch, it is pull-ed, i.e., updated.
193 193
194 # Argument defaults. 194 # Argument defaults.
195 # The url. No sane default for this, so just empty. 195 # The url. No sane default for this, so just empty.
196 local url= 196 local url=
197 # Check if we have to update. 197 # Check if we have to update.
198 local update=false 198 local update=false
199 # Verbose output. 199 # Verbose output.
200 local verbose=false 200 local verbose=false
201 201
202 eval "$(-antigen-parse-args 'url ; update?, verbose?' "$@")" 202 eval "$(-antigen-parse-args 'url ; update?, verbose?' "$@")"
203 shift $# 203 shift $#
204 204
205 # Get the clone's directory as per the given repo url and branch. 205 # Get the clone's directory as per the given repo url and branch.
206 local clone_dir="$(-antigen-get-clone-dir $url)" 206 local clone_dir="$(-antigen-get-clone-dir $url)"
207 207
208 # A temporary function wrapping the `git` command with repeated arguments. 208 # A temporary function wrapping the `git` command with repeated arguments.
209 --plugin-git () { 209 --plugin-git () {
210 (cd "$clone_dir" && git --no-pager "$@") 210 (cd "$clone_dir" && git --no-pager "$@")
211 } 211 }
212 212
213 # Clone if it doesn't already exist. 213 # Clone if it doesn't already exist.
214 if [[ ! -d $clone_dir ]]; then 214 if [[ ! -d $clone_dir ]]; then
215 git clone --recursive "${url%|*}" "$clone_dir" 215 git clone --recursive "${url%|*}" "$clone_dir"
216 elif $update; then 216 elif $update; then
217 # Save current revision. 217 # Save current revision.
218 local old_rev="$(--plugin-git rev-parse HEAD)" 218 local old_rev="$(--plugin-git rev-parse HEAD)"
219 # Pull changes if update requested. 219 # Pull changes if update requested.
220 --plugin-git pull 220 --plugin-git pull
221 # Update submodules. 221 # Update submodules.
222 --plugin-git submodule update --recursive 222 --plugin-git submodule update --recursive
223 # Get the new revision. 223 # Get the new revision.
224 local new_rev="$(--plugin-git rev-parse HEAD)" 224 local new_rev="$(--plugin-git rev-parse HEAD)"
225 fi 225 fi
226 226
227 # If its a specific branch that we want, checkout that branch. 227 # If its a specific branch that we want, checkout that branch.
228 if [[ $url == *\|* ]]; then 228 if [[ $url == *\|* ]]; then
229 local current_branch=${$(--plugin-git symbolic-ref HEAD)##refs/heads/} 229 local current_branch=${$(--plugin-git symbolic-ref HEAD)##refs/heads/}
230 local requested_branch="${url#*|}" 230 local requested_branch="${url#*|}"
231 # Only do the checkout when we are not already on the branch. 231 # Only do the checkout when we are not already on the branch.
232 [[ $requested_branch != $current_branch ]] && 232 [[ $requested_branch != $current_branch ]] &&
233 --plugin-git checkout $requested_branch 233 --plugin-git checkout $requested_branch
234 fi 234 fi
235 235
236 if [[ -n $old_rev && $old_rev != $new_rev ]]; then 236 if [[ -n $old_rev && $old_rev != $new_rev ]]; then
237 echo Updated from ${old_rev:0:7} to ${new_rev:0:7}. 237 echo Updated from ${old_rev:0:7} to ${new_rev:0:7}.
238 if $verbose; then 238 if $verbose; then
239 --plugin-git log --oneline --reverse --no-merges --stat '@{1}..' 239 --plugin-git log --oneline --reverse --no-merges --stat '@{1}..'
240 fi 240 fi
241 fi 241 fi
242 242
243 # Remove the temporary git wrapper function. 243 # Remove the temporary git wrapper function.
244 unfunction -- --plugin-git 244 unfunction -- --plugin-git
245 245
246 } 246 }
247 247
248 -antigen-load () { 248 -antigen-load () {
249 249
250 local url="$1" 250 local url="$1"
251 local loc="$2" 251 local loc="$2"
252 local btype="$3" 252 local btype="$3"
253 local make_local_clone="$4" 253 local make_local_clone="$4"
254 254
255 # The full location where the plugin is located. 255 # The full location where the plugin is located.
256 local location 256 local location
257 if $make_local_clone; then 257 if $make_local_clone; then
258 location="$(-antigen-get-clone-dir "$url")/$loc" 258 location="$(-antigen-get-clone-dir "$url")/$loc"
259 else 259 else
260 location="$url" 260 location="$url"
261 fi 261 fi
262 262
263 if [[ $btype == theme ]]; then 263 if [[ $btype == theme ]]; then
264 264
265 # Of course, if its a theme, the location would point to the script 265 # Of course, if its a theme, the location would point to the script
266 # file. 266 # file.
267 source "$location" 267 source "$location"
268 268
269 else 269 else
270 270
271 # Source the plugin script. 271 # Source the plugin script.
272 # FIXME: I don't know. Looks very very ugly. Needs a better 272 # FIXME: I don't know. Looks very very ugly. Needs a better
273 # implementation once tests are ready. 273 # implementation once tests are ready.
274 local script_loc="$(ls "$location" | grep -m1 '\.plugin\.zsh$')" 274 local script_loc="$(ls "$location" | grep -m1 '\.plugin\.zsh$')"
275 275
276 if [[ -f $location/$script_loc ]]; then 276 if [[ -f $location/$script_loc ]]; then
277 # If we have a `*.plugin.zsh`, source it. 277 # If we have a `*.plugin.zsh`, source it.
278 source "$location/$script_loc" 278 source "$location/$script_loc"
279 279
280 elif [[ -f $location/init.zsh ]]; then 280 elif [[ -f $location/init.zsh ]]; then
281 # If we have a `init.zsh` 281 # If we have a `init.zsh`
282 if (( $+functions[pmodload] )); then 282 if (( $+functions[pmodload] )); then
283 # If pmodload is defined pmodload the module. Remove `modules/` 283 # If pmodload is defined pmodload the module. Remove `modules/`
284 # from loc to find module name. 284 # from loc to find module name.
285 pmodload "${loc#modules/}" 285 pmodload "${loc#modules/}"
286 else 286 else
287 # Otherwise source it. 287 # Otherwise source it.
288 source "$location/init.zsh" 288 source "$location/init.zsh"
289 fi 289 fi
290 290
291 elif ls "$location" | grep -qm1 '\.zsh$'; then 291 elif ls "$location" | grep -qm1 '\.zsh$'; then
292 # If there is no `*.plugin.zsh` file, source *all* the `*.zsh` 292 # If there is no `*.plugin.zsh` file, source *all* the `*.zsh`
293 # files. 293 # files.
294 for script ($location/*.zsh(N)) source "$script" 294 for script ($location/*.zsh(N)) source "$script"
295 295
296 elif ls "$location" | grep -qm1 '\.sh$'; then 296 elif ls "$location" | grep -qm1 '\.sh$'; then
297 # If there are no `*.zsh` files either, we look for and source any 297 # If there are no `*.zsh` files either, we look for and source any
298 # `*.sh` files instead. 298 # `*.sh` files instead.
299 for script ($location/*.sh(N)) source "$script" 299 for script ($location/*.sh(N)) source "$script"
300 300
301 fi 301 fi
302 302
303 # Add to $fpath, for completion(s). 303 # Add to $fpath, for completion(s).
304 fpath=($location $fpath) 304 fpath=($location $fpath)
305 305
306 fi 306 fi
307 307
308 } 308 }
309 309
310 # Update (with `git pull`) antigen itself. 310 # Update (with `git pull`) antigen itself.
311 # TODO: Once update is finished, show a summary of the new commits, as a kind of 311 # TODO: Once update is finished, show a summary of the new commits, as a kind of
312 # "what's new" message. 312 # "what's new" message.
313 antigen-selfupdate () { 313 antigen-selfupdate () {
314 ( cd $_ANTIGEN_INSTALL_DIR 314 ( cd $_ANTIGEN_INSTALL_DIR
315 if [[ ! -d .git ]]; then 315 if [[ ! -d .git ]]; then
316 echo "Your copy of antigen doesn't appear to be a git clone. " \ 316 echo "Your copy of antigen doesn't appear to be a git clone. " \
317 "The 'selfupdate' command cannot work in this case." 317 "The 'selfupdate' command cannot work in this case."
318 return 1 318 return 1
319 fi 319 fi
320 git pull 320 git pull
321 ) 321 )
322 } 322 }
323 323
324 antigen-cleanup () { 324 antigen-cleanup () {
325 325
326 # Cleanup unused repositories. 326 # Cleanup unused repositories.
327 327
328 local force=false 328 local force=false
329 if [[ $1 == --force ]]; then 329 if [[ $1 == --force ]]; then
330 force=true 330 force=true
331 fi 331 fi
332 332
333 if [[ ! -d "$ADOTDIR/repos" || -z "$(ls "$ADOTDIR/repos/")" ]]; then 333 if [[ ! -d "$ADOTDIR/repos" || -z "$(ls "$ADOTDIR/repos/")" ]]; then
334 echo "You don't have any bundles." 334 echo "You don't have any bundles."
335 return 0 335 return 0
336 fi 336 fi
337 337
338 # Find directores in ADOTDIR/repos, that are not in the bundles record. 338 # Find directores in ADOTDIR/repos, that are not in the bundles record.
339 local unused_clones="$(comm -13 \ 339 local unused_clones="$(comm -13 \
340 <(-antigen-echo-record | 340 <(-antigen-echo-record |
341 awk '$4 == "true" {print $1}' | 341 awk '$4 == "true" {print $1}' |
342 while read line; do 342 while read line; do
343 -antigen-get-clone-dir "$line" 343 -antigen-get-clone-dir "$line"
344 done | 344 done |
345 sort -u) \ 345 sort -u) \
346 <(ls -d "$ADOTDIR/repos/"* | sort -u))" 346 <(ls -d "$ADOTDIR/repos/"* | sort -u))"
347 347
348 if [[ -z $unused_clones ]]; then 348 if [[ -z $unused_clones ]]; then
349 echo "You don't have any unidentified bundles." 349 echo "You don't have any unidentified bundles."
350 return 0 350 return 0
351 fi 351 fi
352 352
353 echo 'You have clones for the following repos, but are not used.' 353 echo 'You have clones for the following repos, but are not used.'
354 echo "$unused_clones" | 354 echo "$unused_clones" |
355 while read line; do 355 while read line; do
356 -antigen-get-clone-url "$line" 356 -antigen-get-clone-url "$line"
357 done | 357 done |
358 sed -e 's/^/ /' -e 's/|/, branch /' 358 sed -e 's/^/ /' -e 's/|/, branch /'
359 359
360 if $force || (echo -n '\nDelete them all? [y/N] '; read -q); then 360 if $force || (echo -n '\nDelete them all? [y/N] '; read -q); then
361 echo 361 echo
362 echo 362 echo
363 echo "$unused_clones" | while read line; do 363 echo "$unused_clones" | while read line; do
364 echo -n "Deleting clone for $(-antigen-get-clone-url "$line")..." 364 echo -n "Deleting clone for $(-antigen-get-clone-url "$line")..."
365 rm -rf "$line" 365 rm -rf "$line"
366 echo ' done.' 366 echo ' done.'
367 done 367 done
368 else 368 else
369 echo 369 echo
370 echo Nothing deleted. 370 echo Nothing deleted.
371 fi 371 fi
372 } 372 }
373 373
374 antigen-use () { 374 antigen-use () {
375 if [[ $1 == oh-my-zsh ]]; then 375 if [[ $1 == oh-my-zsh ]]; then
376 -antigen-use-oh-my-zsh 376 -antigen-use-oh-my-zsh
377 elif [[ $1 == prezto ]]; then 377 elif [[ $1 == prezto ]]; then
378 -antigen-use-prezto 378 -antigen-use-prezto
379 else 379 else
380 echo 'Usage: antigen-use <library-name>' >&2 380 echo 'Usage: antigen-use <library-name>' >&2
381 echo 'Where <library-name> is any one of the following:' >&2 381 echo 'Where <library-name> is any one of the following:' >&2
382 echo ' * oh-my-zsh' >&2 382 echo ' * oh-my-zsh' >&2
383 echo ' * prezto' >&2 383 echo ' * prezto' >&2
384 return 1 384 return 1
385 fi 385 fi
386 } 386 }
387 387
388 -antigen-use-oh-my-zsh () { 388 -antigen-use-oh-my-zsh () {
389 if [[ -z "$ZSH" ]]; then 389 if [[ -z "$ZSH" ]]; then
390 export ZSH="$(-antigen-get-clone-dir "$ANTIGEN_DEFAULT_REPO_URL")" 390 export ZSH="$(-antigen-get-clone-dir "$ANTIGEN_DEFAULT_REPO_URL")"
391 fi 391 fi
392 antigen-bundle --loc=lib 392 antigen-bundle --loc=lib
393 } 393 }
394 394
395 -antigen-use-prezto () { 395 -antigen-use-prezto () {
396 antigen-bundle sorin-ionescu/prezto 396 antigen-bundle sorin-ionescu/prezto
397 export ZDOTDIR=$ADOTDIR/repos/ 397 export ZDOTDIR=$ADOTDIR/repos/
398 } 398 }
399 399
400 # For backwards compatibility. 400 # For backwards compatibility.
401 antigen-lib () { -antigen-use-oh-my-zsh; echo "'antigen-lib' is deprecated and will soon be removed. Use 'antigen-use oh-my-zsh' instead."} 401 antigen-lib () {
402 antigen-prezto-lib () { -antigen-use-prezto; echo "'antigen-prezto-lib' is deprecated and will soon be removed. Use 'antigen-use prezto' instead."} 402 -antigen-use-oh-my-zsh
403 echo '`antigen-lib` is deprecated and will soon be removed.'
404 echo 'Use `antigen-use oh-my-zsh` instead.'
405 }
406
407 # For backwards compatibility.
408 antigen-prezto-lib () {
409 -antigen-use-prezto
410 echo '`antigen-prezto-lib` is deprecated and will soon be removed.'
411 echo 'Use `antigen-use prezto` instead.'
412 }
403 413
404 antigen-theme () { 414 antigen-theme () {
405 415
406 if [[ "$1" != */* && "$1" != --* ]]; then 416 if [[ "$1" != */* && "$1" != --* ]]; then
407 # The first argument is just a name of the plugin, to be picked up from 417 # The first argument is just a name of the plugin, to be picked up from
408 # the default repo. 418 # the default repo.
409 local name="${1:-robbyrussell}" 419 local name="${1:-robbyrussell}"
410 antigen-bundle --loc=themes/$name --btype=theme 420 antigen-bundle --loc=themes/$name --btype=theme
411 421
412 else 422 else
413 antigen-bundle "$@" --btype=theme 423 antigen-bundle "$@" --btype=theme
414 424
415 fi 425 fi
416 426
417 } 427 }
418 428
419 antigen-apply () { 429 antigen-apply () {
420 430
421 # Initialize completion. 431 # Initialize completion.
422 local cdef 432 local cdef
423 433
424 # Load the compinit module. This will readefine the `compdef` function to 434 # Load the compinit module. This will readefine the `compdef` function to
425 # the one that actually initializes completions. 435 # the one that actually initializes completions.
426 autoload -U compinit 436 autoload -U compinit
427 compinit -i 437 compinit -i
428 438
429 # Apply all `compinit`s that have been deferred. 439 # Apply all `compinit`s that have been deferred.
430 eval "$(for cdef in $__deferred_compdefs; do 440 eval "$(for cdef in $__deferred_compdefs; do
431 echo compdef $cdef 441 echo compdef $cdef
432 done)" 442 done)"
433 443
434 unset __deferred_compdefs 444 unset __deferred_compdefs
435 445
436 } 446 }
437 447
438 antigen-list () { 448 antigen-list () {
439 # List all currently installed bundles. 449 # List all currently installed bundles.
440 if [[ -z "$_ANTIGEN_BUNDLE_RECORD" ]]; then 450 if [[ -z "$_ANTIGEN_BUNDLE_RECORD" ]]; then
441 echo "You don't have any bundles." >&2 451 echo "You don't have any bundles." >&2
442 return 1 452 return 1
443 else 453 else
444 -antigen-echo-record | sort -u 454 -antigen-echo-record | sort -u
445 fi 455 fi
446 } 456 }
447 457
448 antigen-snapshot () { 458 antigen-snapshot () {
449 459
450 local snapshot_file="${1:-antigen-shapshot}" 460 local snapshot_file="${1:-antigen-shapshot}"
451 461
452 # The snapshot content lines are pairs of repo-url and git version hash, in 462 # The snapshot content lines are pairs of repo-url and git version hash, in
453 # the form: 463 # the form:
454 # <version-hash> <repo-url> 464 # <version-hash> <repo-url>
455 local snapshot_content="$(-antigen-echo-record | 465 local snapshot_content="$(-antigen-echo-record |
456 grep 'true$' | 466 grep 'true$' |
457 sed 's/ .*$//' | 467 sed 's/ .*$//' |
458 sort -u | 468 sort -u |
459 while read url; do 469 while read url; do
460 local dir="$(-antigen-get-clone-dir "$url")" 470 local dir="$(-antigen-get-clone-dir "$url")"
461 local version_hash="$(cd "$dir" && git rev-parse HEAD)" 471 local version_hash="$(cd "$dir" && git rev-parse HEAD)"
462 echo "$version_hash $url" 472 echo "$version_hash $url"
463 done)" 473 done)"
464 474
465 { 475 {
466 # The first line in the snapshot file is for metadata, in the form: 476 # The first line in the snapshot file is for metadata, in the form:
467 # key='value'; key='value'; key='value'; 477 # key='value'; key='value'; key='value';
468 # Where `key`s are valid shell variable names. 478 # Where `key`s are valid shell variable names.
469 479
470 # Snapshot version. Has no relation to antigen version. If the snapshot 480 # Snapshot version. Has no relation to antigen version. If the snapshot
471 # file format changes, this number can be incremented. 481 # file format changes, this number can be incremented.
472 echo -n "version='1';" 482 echo -n "version='1';"
473 483
474 # Snapshot creation date+time. 484 # Snapshot creation date+time.
475 echo -n " created_on='$(date)';" 485 echo -n " created_on='$(date)';"
476 486
477 # Add a checksum with the md5 checksum of all the snapshot lines. 487 # Add a checksum with the md5 checksum of all the snapshot lines.
478 local checksum="$(echo "$snapshot_content" | md5sum)" 488 local checksum="$(echo "$snapshot_content" | md5sum)"
479 echo -n " checksum='${checksum%% *}';" 489 echo -n " checksum='${checksum%% *}';"
480 490
481 # A newline after the metadata and then the snapshot lines. 491 # A newline after the metadata and then the snapshot lines.
482 echo "\n$snapshot_content" 492 echo "\n$snapshot_content"
483 493
484 } > "$snapshot_file" 494 } > "$snapshot_file"
485 495
486 } 496 }
487 497
488 antigen-restore () { 498 antigen-restore () {
489 499
490 if [[ $# == 0 ]]; then 500 if [[ $# == 0 ]]; then
491 echo 'Please provide a snapshot file to restore from.' >&2 501 echo 'Please provide a snapshot file to restore from.' >&2
492 return 1 502 return 1
493 fi 503 fi
494 504
495 local snapshot_file="$1" 505 local snapshot_file="$1"
496 506
497 # TODO: Before doing anything with the snapshot file, verify its checksum. 507 # TODO: Before doing anything with the snapshot file, verify its checksum.
498 # If it fails, notify this to the user and confirm if restore should 508 # If it fails, notify this to the user and confirm if restore should
499 # proceed. 509 # proceed.
500 510
501 echo -n "Restoring from $snapshot_file..." 511 echo -n "Restoring from $snapshot_file..."
502 512
503 sed -n '1!p' "$snapshot_file" | 513 sed -n '1!p' "$snapshot_file" |
504 while read line; do 514 while read line; do
505 515
506 local version_hash="${line%% *}" 516 local version_hash="${line%% *}"
507 local url="${line##* }" 517 local url="${line##* }"
508 local clone_dir="$(-antigen-get-clone-dir "$url")" 518 local clone_dir="$(-antigen-get-clone-dir "$url")"
509 519
510 if [[ ! -d $clone_dir ]]; then 520 if [[ ! -d $clone_dir ]]; then
511 git clone "$url" "$clone_dir" > /dev/null 521 git clone "$url" "$clone_dir" > /dev/null
512 fi 522 fi
513 523
514 (cd "$clone_dir" && git checkout $version_hash) 2> /dev/null 524 (cd "$clone_dir" && git checkout $version_hash) 2> /dev/null
515 525
516 done 526 done
517 527
518 echo ' done.' 528 echo ' done.'
519 echo 'Please open a new shell to get the restored changes.' 529 echo 'Please open a new shell to get the restored changes.'
520 } 530 }
521 531
522 antigen-help () { 532 antigen-help () {
523 cat <<EOF 533 cat <<EOF
524 Antigen is a plugin management system for zsh. It makes it easy to grab awesome 534 Antigen is a plugin management system for zsh. It makes it easy to grab awesome
525 shell scripts and utilities, put up on github. For further details and complete 535 shell scripts and utilities, put up on github. For further details and complete
526 documentation, visit the project's page at 'http://antigen.sharats.me'. 536 documentation, visit the project's page at 'http://antigen.sharats.me'.
527 EOF 537 EOF
528 } 538 }
529 539
530 # A syntax sugar to avoid the `-` when calling antigen commands. With this 540 # A syntax sugar to avoid the `-` when calling antigen commands. With this
531 # function, you can write `antigen-bundle` as `antigen bundle` and so on. 541 # function, you can write `antigen-bundle` as `antigen bundle` and so on.
532 antigen () { 542 antigen () {
533 local cmd="$1" 543 local cmd="$1"
534 if [[ -z "$cmd" ]]; then 544 if [[ -z "$cmd" ]]; then
535 echo 'Please give a command to run.' >&2 545 echo 'Please give a command to run.' >&2
536 return 1 546 return 1
537 fi 547 fi
538 shift 548 shift
539 549
540 if functions "antigen-$cmd" > /dev/null; then 550 if functions "antigen-$cmd" > /dev/null; then
541 "antigen-$cmd" "$@" 551 "antigen-$cmd" "$@"
542 else 552 else
543 echo "Unknown command: $cmd" 553 echo "Unknown command: $cmd"
544 fi 554 fi
545 } 555 }
546 556
547 -antigen-parse-args () { 557 -antigen-parse-args () {
548 # An argument parsing functionality to parse arguments the *antigen* way :). 558 # An argument parsing functionality to parse arguments the *antigen* way :).
549 # Takes one first argument (called spec), which dictates how to parse and 559 # Takes one first argument (called spec), which dictates how to parse and
550 # the rest of the arguments are parsed. Outputs a piece of valid shell code 560 # the rest of the arguments are parsed. Outputs a piece of valid shell code
551 # that can be passed to `eval` inside a function which creates the arguments 561 # that can be passed to `eval` inside a function which creates the arguments
552 # and their values as local variables. Suggested use is to set the defaults 562 # and their values as local variables. Suggested use is to set the defaults
553 # to all arguments first and then eval the output of this function. 563 # to all arguments first and then eval the output of this function.
554 564
555 # Spec: Only long argument supported. No support for parsing short options. 565 # Spec: Only long argument supported. No support for parsing short options.
556 # The spec must have two sections, separated by a `;`. 566 # The spec must have two sections, separated by a `;`.
557 # '<positional-arguments>;<keyword-only-arguments>' 567 # '<positional-arguments>;<keyword-only-arguments>'
558 # Positional arguments are passed as just values, like `command a b`. 568 # Positional arguments are passed as just values, like `command a b`.
559 # Keyword arguments are passed as a `--name=value` pair, like `command 569 # Keyword arguments are passed as a `--name=value` pair, like `command
560 # --arg1=a --arg2=b`. 570 # --arg1=a --arg2=b`.
561 571
562 # Each argument in the spec is separated by a `,`. Each keyword argument can 572 # Each argument in the spec is separated by a `,`. Each keyword argument can
563 # end in a `:` to specifiy that this argument wants a value, otherwise it 573 # end in a `:` to specifiy that this argument wants a value, otherwise it
564 # doesn't take a value. (The value in the output when the keyword argument 574 # doesn't take a value. (The value in the output when the keyword argument
565 # doesn't have a `:` is `true`). 575 # doesn't have a `:` is `true`).
566 576
567 # Arguments in either section can end with a `?` (should come after `:`, if 577 # Arguments in either section can end with a `?` (should come after `:`, if
568 # both are present), means optional. FIXME: Not yet implemented. 578 # both are present), means optional. FIXME: Not yet implemented.
569 579
570 # See the test file, tests/arg-parser.t for (working) examples. 580 # See the test file, tests/arg-parser.t for (working) examples.
571 581
572 local spec="$1" 582 local spec="$1"
573 shift 583 shift
574 584
575 # Sanitize the spec 585 # Sanitize the spec
576 spec="$(echo "$spec" | tr '\n' ' ' | sed 's/[[:space:]]//g')" 586 spec="$(echo "$spec" | tr '\n' ' ' | sed 's/[[:space:]]//g')"
577 587
578 local code='' 588 local code=''
579 589
580 --add-var () { 590 --add-var () {
581 test -z "$code" || code="$code\n" 591 test -z "$code" || code="$code\n"
582 code="${code}local $1='$2'" 592 code="${code}local $1='$2'"
583 } 593 }
584 594
585 local positional_args="$(echo "$spec" | cut -d\; -f1)" 595 local positional_args="$(echo "$spec" | cut -d\; -f1)"
586 local positional_args_count="$(echo $positional_args | 596 local positional_args_count="$(echo $positional_args |
587 awk -F, '{print NF}')" 597 awk -F, '{print NF}')"
588 598
589 # Set spec values based on the positional arguments. 599 # Set spec values based on the positional arguments.
590 local i=1 600 local i=1
591 while [[ -n $1 && $1 != --* ]]; do 601 while [[ -n $1 && $1 != --* ]]; do
592 602
593 if (( $i > $positional_args_count )); then 603 if (( $i > $positional_args_count )); then
594 echo "Only $positional_args_count positional arguments allowed." >&2 604 echo "Only $positional_args_count positional arguments allowed." >&2
595 echo "Found at least one more: '$1'" >&2 605 echo "Found at least one more: '$1'" >&2
596 return 606 return
597 fi 607 fi
598 608
599 local name_spec="$(echo "$positional_args" | cut -d, -f$i)" 609 local name_spec="$(echo "$positional_args" | cut -d, -f$i)"
600 local name="${${name_spec%\?}%:}" 610 local name="${${name_spec%\?}%:}"
601 local value="$1" 611 local value="$1"
602 612
603 if echo "$code" | grep -qm1 "^local $name="; then 613 if echo "$code" | grep -qm1 "^local $name="; then
604 echo "Argument '$name' repeated with the value '$value'". >&2 614 echo "Argument '$name' repeated with the value '$value'". >&2
605 return 615 return
606 fi 616 fi
607 617
608 --add-var $name "$value" 618 --add-var $name "$value"
609 619
610 shift 620 shift
611 i=$(($i + 1)) 621 i=$(($i + 1))
612 done 622 done
613 623
614 local keyword_args="$( 624 local keyword_args="$(
615 # Positional arguments can double up as keyword arguments too. 625 # Positional arguments can double up as keyword arguments too.
616 echo "$positional_args" | tr , '\n' | 626 echo "$positional_args" | tr , '\n' |
617 while read line; do 627 while read line; do
618 if [[ $line == *\? ]]; then 628 if [[ $line == *\? ]]; then
619 echo "${line%?}:?" 629 echo "${line%?}:?"
620 else 630 else
621 echo "$line:" 631 echo "$line:"
622 fi 632 fi
623 done 633 done
624 634
625 # Specified keyword arguments. 635 # Specified keyword arguments.
626 echo "$spec" | cut -d\; -f2 | tr , '\n' 636 echo "$spec" | cut -d\; -f2 | tr , '\n'
627 )" 637 )"
628 local keyword_args_count="$(echo $keyword_args | awk -F, '{print NF}')" 638 local keyword_args_count="$(echo $keyword_args | awk -F, '{print NF}')"
629 639
630 # Set spec values from keyword arguments, if any. The remaining arguments 640 # Set spec values from keyword arguments, if any. The remaining arguments
631 # are all assumed to be keyword arguments. 641 # are all assumed to be keyword arguments.
632 while [[ $1 == --* ]]; do 642 while [[ $1 == --* ]]; do
633 # Remove the `--` at the start. 643 # Remove the `--` at the start.
634 local arg="${1#--}" 644 local arg="${1#--}"
635 645
636 # Get the argument name and value. 646 # Get the argument name and value.
637 if [[ $arg != *=* ]]; then 647 if [[ $arg != *=* ]]; then
638 local name="$arg" 648 local name="$arg"
639 local value='' 649 local value=''
640 else 650 else
641 local name="${arg%\=*}" 651 local name="${arg%\=*}"
642 local value="${arg#*=}" 652 local value="${arg#*=}"
643 fi 653 fi
644 654
645 if echo "$code" | grep -qm1 "^local $name="; then 655 if echo "$code" | grep -qm1 "^local $name="; then
646 echo "Argument '$name' repeated with the value '$value'". >&2 656 echo "Argument '$name' repeated with the value '$value'". >&2
647 return 657 return
648 fi 658 fi
649 659
650 # The specification for this argument, used for validations. 660 # The specification for this argument, used for validations.
651 local arg_line="$(echo "$keyword_args" | grep -m1 "^$name:\??\?")" 661 local arg_line="$(echo "$keyword_args" | grep -m1 "^$name:\??\?")"
652 662
653 # Validate argument and value. 663 # Validate argument and value.
654 if [[ -z $arg_line ]]; then 664 if [[ -z $arg_line ]]; then
655 # This argument is not known to us. 665 # This argument is not known to us.
656 echo "Unknown argument '$name'." >&2 666 echo "Unknown argument '$name'." >&2
657 return 667 return
658 668
659 elif (echo "$arg_line" | grep -qm1 ':') && [[ -z $value ]]; then 669 elif (echo "$arg_line" | grep -qm1 ':') && [[ -z $value ]]; then
660 # This argument needs a value, but is not provided. 670 # This argument needs a value, but is not provided.
661 echo "Required argument for '$name' not provided." >&2 671 echo "Required argument for '$name' not provided." >&2
662 return 672 return
663 673
664 elif (echo "$arg_line" | grep -vqm1 ':') && [[ ! -z $value ]]; then 674 elif (echo "$arg_line" | grep -vqm1 ':') && [[ ! -z $value ]]; then
665 # This argument doesn't need a value, but is provided. 675 # This argument doesn't need a value, but is provided.
666 echo "No argument required for '$name', but provided '$value'." >&2 676 echo "No argument required for '$name', but provided '$value'." >&2
667 return 677 return
668 678
669 fi 679 fi
670 680
671 if [[ -z $value ]]; then 681 if [[ -z $value ]]; then
672 value=true 682 value=true
673 fi 683 fi
674 684
675 --add-var "${name//-/_}" "$value" 685 --add-var "${name//-/_}" "$value"
676 shift 686 shift
677 done 687 done
678 688
679 echo "$code" 689 echo "$code"
680 690
681 unfunction -- --add-var 691 unfunction -- --add-var
682 692
683 } 693 }
684 694
685 # Echo the bundle specs as in the record. The first line is not echoed since it 695 # Echo the bundle specs as in the record. The first line is not echoed since it
686 # is a blank line. 696 # is a blank line.
687 -antigen-echo-record () { 697 -antigen-echo-record () {
688 echo "$_ANTIGEN_BUNDLE_RECORD" | sed -n '1!p' 698 echo "$_ANTIGEN_BUNDLE_RECORD" | sed -n '1!p'
689 } 699 }
690 700
691 -antigen-env-setup () { 701 -antigen-env-setup () {
692 702
693 # Helper function: Same as `export $1=$2`, but will only happen if the name 703 # Helper function: Same as `export $1=$2`, but will only happen if the name
694 # specified by `$1` is not already set. 704 # specified by `$1` is not already set.
695 -set-default () { 705 -set-default () {
696 local arg_name="$1" 706 local arg_name="$1"
697 local arg_value="$2" 707 local arg_value="$2"
698 eval "test -z \"\$$arg_name\" && export $arg_name='$arg_value'" 708 eval "test -z \"\$$arg_name\" && export $arg_name='$arg_value'"
699 } 709 }
700 710
701 # Pre-startup initializations. 711 # Pre-startup initializations.
702 -set-default ANTIGEN_DEFAULT_REPO_URL \ 712 -set-default ANTIGEN_DEFAULT_REPO_URL \
703 https://github.com/robbyrussell/oh-my-zsh.git 713 https://github.com/robbyrussell/oh-my-zsh.git
704 -set-default ADOTDIR $HOME/.antigen 714 -set-default ADOTDIR $HOME/.antigen
705 715
706 # Setup antigen's own completion. 716 # Setup antigen's own completion.
707 compdef _antigen antigen 717 compdef _antigen antigen
708 718
709 # Remove private functions. 719 # Remove private functions.
710 unfunction -- -set-default 720 unfunction -- -set-default
711 } 721 }
712 722
713 # Setup antigen's autocompletion 723 # Setup antigen's autocompletion
714 _antigen () { 724 _antigen () {
715 compadd \ 725 compadd \
716 bundle \ 726 bundle \
717 bundles \ 727 bundles \
718 update \ 728 update \
719 revert \ 729 revert \
720 list \ 730 list \
721 cleanup \ 731 cleanup \
722 lib \ 732 lib \
723 selfupdate \ 733 selfupdate \
724 theme \ 734 theme \
725 apply \ 735 apply \
726 help 736 help
727 } 737 }
728 738
729 -antigen-env-setup 739 -antigen-env-setup
730 740