Blame view

antigen.zsh 22 KB
85236bb76   Shrikant Sharat   Removed shebang l...
1
2
3
4
5
  # Antigen: A simple plugin manager for zsh
  # Authors: Shrikant Sharat Kandula
  #          and Contributors <https://github.com/zsh-users/antigen/contributors>
  # Homepage: http://antigen.sharats.me
  # License: MIT License <mitl.sharats.me>
e5dfac7ea   Shrikant Sharat   Initial commit. W...
6
7
8
  
  # Each line in this string has the following entries separated by a space
  # character.
c7827f8ac   Shrikant Sharat   Fix comments to i...
9
  # <repo-url>, <plugin-location>, <bundle-type>, <has-local-clone>
e5dfac7ea   Shrikant Sharat   Initial commit. W...
10
  # FIXME: Is not kept local by zsh!
9dc631003   Shrikant Sharat   Rename bundle rec...
11
  local _ANTIGEN_BUNDLE_RECORD=""
23ddf4336   Shrikant Sharat   Code formatting.
12
  local _ANTIGEN_INSTALL_DIR="$(cd "$(dirname "$0")" && pwd)"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
13

5e23ab6fe   Will Boyce   Defer `compdef` c...
14
15
  # Used to defer compinit/compdef
  typeset -a __deferred_compdefs
a9ebdcdbe   Shrikant Sharat   Don't load compin...
16
  compdef () { __deferred_compdefs=($__deferred_compdefs "$*") }
5e23ab6fe   Will Boyce   Defer `compdef` c...
17

e5dfac7ea   Shrikant Sharat   Initial commit. W...
18
  # Syntaxes
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
19
  #   antigen-bundle <url> [<loc>=/]
843297b20   Shrikant Sharat   Initial implement...
20
21
  # Keyword only arguments:
  #   branch - The branch of the repo to use for this bundle.
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
22
  antigen-bundle () {
e5dfac7ea   Shrikant Sharat   Initial commit. W...
23
24
25
26
  
      # Bundle spec arguments' default values.
      local url="$ANTIGEN_DEFAULT_REPO_URL"
      local loc=/
2923c490c   Shrikant Sharat   Branch informatio...
27
      local branch=
38b0b0409   Shrikant Sharat   Fix #12. Local bu...
28
      local no_local_clone=false
d535ba468   Shrikant Sharat   Introduced a new ...
29
      local btype=plugin
e5dfac7ea   Shrikant Sharat   Initial commit. W...
30

8bba7ab70   Shrikant Sharat   Use the new argum...
31
32
      # Parse the given arguments. (Will overwrite the above values).
      eval "$(-antigen-parse-args \
7a2ca5936   Shrikant Sharat   Allow whitespace ...
33
              'url?, loc? ; branch:?, no-local-clone?, btype:?' \
8bba7ab70   Shrikant Sharat   Use the new argum...
34
              "$@")"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
35

b29510ce7   Shrikant Sharat   Small code reorga...
36
37
38
39
40
      # Check if url is just the plugin name. Super short syntax.
      if [[ "$url" != */* ]]; then
          loc="plugins/$url"
          url="$ANTIGEN_DEFAULT_REPO_URL"
      fi
e5dfac7ea   Shrikant Sharat   Initial commit. W...
41
      # Resolve the url.
39379a878   Shrikant Sharat   Move url resolvin...
42
      url="$(-antigen-resolve-bundle-url "$url")"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
43

2923c490c   Shrikant Sharat   Branch informatio...
44
45
46
47
      # Add the branch information to the url.
      if [[ ! -z $branch ]]; then
          url="$url|$branch"
      fi
41abcf662   Shrikant Sharat   Simpler implement...
48
      # The `make_local_clone` variable better represents whether there should be
e6cc15b5f   Shrikant Sharat   Fix local paths w...
49
50
51
52
      # a local clone made. For cloning to be avoided, firstly, the `$url` should
      # be an absolute local path and `$branch` should be empty. In addition to
      # these two conditions, either the `--no-local-clone` option should be
      # given, or `$url` should not a git repo.
41abcf662   Shrikant Sharat   Simpler implement...
53
      local make_local_clone=true
0b4fbaaf6   Shrikant Sharat   Get rid of backsl...
54
55
      if [[ $url == /* && -z $branch &&
              ( $no_local_clone == true || ! -d $url/.git ) ]]; then
41abcf662   Shrikant Sharat   Simpler implement...
56
57
          make_local_clone=false
      fi
0c257ebe4   Shrikant Sharat   For #29. Intial w...
58
59
60
61
      # Add the theme extension to `loc`, if this is a theme.
      if [[ $btype == theme && $loc != *.zsh-theme ]]; then
          loc="$loc.zsh-theme"
      fi
e5dfac7ea   Shrikant Sharat   Initial commit. W...
62
      # Add it to the record.
cbdabb20c   Shrikant Sharat   80|
63
64
65
      _ANTIGEN_BUNDLE_RECORD="$_ANTIGEN_BUNDLE_RECORD
  $url $loc $btype"
      _ANTIGEN_BUNDLE_RECORD="$_ANTIGEN_BUNDLE_RECORD $make_local_clone"
a12d3140a   Shrikant Sharat   Removed bundle-in...
66

38b0b0409   Shrikant Sharat   Fix #12. Local bu...
67
      # Ensure a clone exists for this repo, if needed.
41abcf662   Shrikant Sharat   Simpler implement...
68
      if $make_local_clone; then
38b0b0409   Shrikant Sharat   Fix #12. Local bu...
69
70
          -antigen-ensure-repo "$url"
      fi
e5dfac7ea   Shrikant Sharat   Initial commit. W...
71

499c0dd5d   Shrikant Sharat   Added some comments.
72
      # Load the plugin.
e6cc15b5f   Shrikant Sharat   Fix local paths w...
73
      -antigen-load "$url" "$loc" "$btype" "$make_local_clone"
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
74

a12d3140a   Shrikant Sharat   Removed bundle-in...
75
  }
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
76

39379a878   Shrikant Sharat   Move url resolvin...
77
78
79
80
81
  -antigen-resolve-bundle-url () {
      # Given an acceptable short/full form of a bundle's repo url, this function
      # echoes the full form of the repo's clone url.
  
      local url="$1"
7af602dae   Shrikant Sharat   Minor comment edi...
82
      # Expand short github url syntax: `username/reponame`.
0b4fbaaf6   Shrikant Sharat   Get rid of backsl...
83
84
      if [[ $url != git://* &&
              $url != https://* &&
de3527fdc   Matthew Franglen   Permit non github...
85
86
              $url != http://* &&
              $url != ssh://* &&
0b4fbaaf6   Shrikant Sharat   Get rid of backsl...
87
              $url != /* &&
60fa053ec   Shrikant Sharat   Add tests for url...
88
89
              $url != git@github.com:*/*
              ]]; then
1cae4fc91   Shrikant Sharat   Some refactoring ...
90
          url="https://github.com/${url%.git}.git"
39379a878   Shrikant Sharat   Move url resolvin...
91
92
93
94
      fi
  
      echo "$url"
  }
3c5ff1c1e   Shrikant Sharat   Add antigen-bundl...
95
96
97
98
99
100
  antigen-bundles () {
      # Bulk add many bundles at one go. Empty lines and lines starting with a `#`
      # are ignored. Everything else is given to `antigen-bundle` as is, no
      # quoting rules applied.
  
      local line
7c351dd3f   Shrikant Sharat   Fix line filterin...
101
      grep '^[[:space:]]*[^[:space:]#]' | while read line; do
3c5ff1c1e   Shrikant Sharat   Add antigen-bundl...
102
103
104
105
106
          # Using `eval` so that we can use the shell-style quoting in each line
          # piped to `antigen-bundles`.
          eval "antigen-bundle $line"
      done
  }
2fe4683b3   Shrikant Sharat   Update README wit...
107
  antigen-update () {
158407151   Shrikant Sharat   Refactoring of pr...
108
      # Update your bundles, i.e., `git pull` in all the plugin repos.
d43f31a79   Shrikant Sharat   Initial implement...
109
110
  
      date > $ADOTDIR/revert-info
0b4fbaaf6   Shrikant Sharat   Get rid of backsl...
111
      -antigen-echo-record |
fdcb458fd   Shrikant Sharat   Update messes plu...
112
          awk '$4 == "true" {print $1}' |
0b4fbaaf6   Shrikant Sharat   Get rid of backsl...
113
114
          sort -u |
          while read url; do
5d199ab20   Shrikant Sharat   Print the repo ur...
115
              echo "**** Pulling $url"
fdcb458fd   Shrikant Sharat   Update messes plu...
116
117
118
119
120
121
122
  
              local clone_dir="$(-antigen-get-clone-dir "$url")"
              if [[ -d "$clone_dir" ]]; then
                  (echo -n "$clone_dir:"
                      cd "$clone_dir"
                      git rev-parse HEAD) >> $ADOTDIR/revert-info
              fi
723b284b4   Shrikant Sharat   Use the arg parsi...
123
              -antigen-ensure-repo "$url" --update --verbose
fdcb458fd   Shrikant Sharat   Update messes plu...
124

5d199ab20   Shrikant Sharat   Print the repo ur...
125
              echo
8d0d219d6   Shrikant Sharat   Fix #9 Update com...
126
          done
158407151   Shrikant Sharat   Refactoring of pr...
127
  }
d43f31a79   Shrikant Sharat   Initial implement...
128
  antigen-revert () {
56ae2d04d   Mark Feltner   Modified some con...
129
130
131
132
133
134
135
136
137
138
139
140
      if [[ -f $ADOTDIR/revert-info ]]; then
          cat $ADOTDIR/revert-info | sed '1!p' | while read line; do
              dir="$(echo "$line" | cut -d: -f1)"
              git --git-dir="$dir/.git" --work-tree="$dir" \
                  checkout "$(echo "$line" | cut -d: -f2)" 2> /dev/null
  
          done
  
          echo "Reverted to state before running -update on $(
                  cat $ADOTDIR/revert-info | sed -n 1p)."
  
      else 
d43f31a79   Shrikant Sharat   Initial implement...
141
142
          echo 'No revert information available. Cannot revert.' >&2
      fi
d43f31a79   Shrikant Sharat   Initial implement...
143

d43f31a79   Shrikant Sharat   Initial implement...
144
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
145
  -antigen-get-clone-dir () {
a12d3140a   Shrikant Sharat   Removed bundle-in...
146
147
      # Takes a repo url and gives out the path that this url needs to be cloned
      # to. Doesn't actually clone anything.
499c0dd5d   Shrikant Sharat   Added some comments.
148
      echo -n $ADOTDIR/repos/
eb1ebaf3c   Shrikant Sharat   Load `init.zsh` i...
149
150
151
  
      if [[ "$1" == "https://github.com/sorin-ionescu/prezto.git" ]]; then
          # Prezto's directory *has* to be `.zprezto`.
297f0f733   Shrikant Sharat   The `-n` in url/d...
152
          echo .zprezto
eb1ebaf3c   Shrikant Sharat   Load `init.zsh` i...
153

c0ee02666   Hugaerts@gmail.com   add support for p...
154
      else
297f0f733   Shrikant Sharat   The `-n` in url/d...
155
          echo "$1" | sed \
eb1ebaf3c   Shrikant Sharat   Load `init.zsh` i...
156
157
158
              -e 's./.-SLASH-.g' \
              -e 's.:.-COLON-.g' \
              -e 's.|.-PIPE-.g'
c0ee02666   Hugaerts@gmail.com   add support for p...
159
      fi
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
160
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
161
  -antigen-get-clone-url () {
0b32bec27   Shrikant Sharat   bundle-cleanup co...
162
163
      # Takes a repo's clone dir and gives out the repo's original url that was
      # used to create the given directory path.
eb1ebaf3c   Shrikant Sharat   Load `init.zsh` i...
164
165
166
167
  
      if [[ "$1" == ".zprezto" ]]; then
          # Prezto's (in `.zprezto`), is assumed to be from `sorin-ionescu`'s
          # remote.
297f0f733   Shrikant Sharat   The `-n` in url/d...
168
          echo https://github.com/sorin-ionescu/prezto.git
eb1ebaf3c   Shrikant Sharat   Load `init.zsh` i...
169

c0ee02666   Hugaerts@gmail.com   add support for p...
170
      else
297f0f733   Shrikant Sharat   The `-n` in url/d...
171
          echo "$1" | sed \
eb1ebaf3c   Shrikant Sharat   Load `init.zsh` i...
172
173
174
175
              -e "s:^$ADOTDIR/repos/::" \
              -e 's.-SLASH-./.g' \
              -e 's.-COLON-.:.g' \
              -e 's.-PIPE-.|.g'
c0ee02666   Hugaerts@gmail.com   add support for p...
176
      fi
0b32bec27   Shrikant Sharat   bundle-cleanup co...
177
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
178
  -antigen-ensure-repo () {
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
179

499c0dd5d   Shrikant Sharat   Added some comments.
180
181
182
      # Ensure that a clone exists for the given repo url and branch. If the first
      # argument is `--update` and if a clone already exists for the given repo
      # and branch, it is pull-ed, i.e., updated.
c1479baff   Shrikant Sharat   Accept a --verbos...
183
      # Argument defaults.
723b284b4   Shrikant Sharat   Use the arg parsi...
184
185
      # The url. No sane default for this, so just empty.
      local url=
499c0dd5d   Shrikant Sharat   Added some comments.
186
      # Check if we have to update.
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
187
      local update=false
c1479baff   Shrikant Sharat   Accept a --verbos...
188
189
      # Verbose output.
      local verbose=false
723b284b4   Shrikant Sharat   Use the arg parsi...
190
191
      eval "$(-antigen-parse-args 'url ; update?, verbose?' "$@")"
      shift $#
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
192

499c0dd5d   Shrikant Sharat   Added some comments.
193
      # Get the clone's directory as per the given repo url and branch.
2923c490c   Shrikant Sharat   Branch informatio...
194
      local clone_dir="$(-antigen-get-clone-dir $url)"
062a7b830   Shrikant Sharat   Refactor temporar...
195
196
197
  
      # A temporary function wrapping the `git` command with repeated arguments.
      --plugin-git () {
3c16e1f03   Shrikant Sharat   Avoid git cd-less...
198
          (cd "$clone_dir" && git --no-pager "$@")
062a7b830   Shrikant Sharat   Refactor temporar...
199
      }
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
200

499c0dd5d   Shrikant Sharat   Added some comments.
201
      # Clone if it doesn't already exist.
aa510273d   Shrikant Sharat   Removed useless l...
202
      if [[ ! -d $clone_dir ]]; then
2873acbf1   Gregory Hugaerts   make bundles inst...
203
          git clone --recursive "${url%|*}" "$clone_dir"
aa510273d   Shrikant Sharat   Removed useless l...
204
      elif $update; then
0912ba472   Shrikant Sharat   Print a summary o...
205
          # Save current revision.
382d92096   Shrikant Sharat   Use local variabl...
206
          local old_rev="$(--plugin-git rev-parse HEAD)"
499c0dd5d   Shrikant Sharat   Added some comments.
207
          # Pull changes if update requested.
3c16e1f03   Shrikant Sharat   Avoid git cd-less...
208
          --plugin-git pull
292d226b9   Shrikant Sharat   Use `--plugin-git...
209
          # Update submodules.
3c16e1f03   Shrikant Sharat   Avoid git cd-less...
210
          --plugin-git submodule update --recursive
0912ba472   Shrikant Sharat   Print a summary o...
211
          # Get the new revision.
382d92096   Shrikant Sharat   Use local variabl...
212
          local new_rev="$(--plugin-git rev-parse HEAD)"
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
213
      fi
499c0dd5d   Shrikant Sharat   Added some comments.
214
      # If its a specific branch that we want, checkout that branch.
2923c490c   Shrikant Sharat   Branch informatio...
215
      if [[ $url == *\|* ]]; then
013216d53   Shrikant Sharat   Merge branch 'mas...
216
          local current_branch=${$(--plugin-git symbolic-ref HEAD)##refs/heads/}
ccc3d1443   Arash Rouhani   Stop saying "alre...
217
          local requested_branch="${url#*|}"
f783f3860   Shrikant Sharat   Comments and inde...
218
          # Only do the checkout when we are not already on the branch.
ccc3d1443   Arash Rouhani   Stop saying "alre...
219
          [[ $requested_branch != $current_branch ]] &&
f783f3860   Shrikant Sharat   Comments and inde...
220
              --plugin-git checkout $requested_branch
843297b20   Shrikant Sharat   Initial implement...
221
      fi
56ae2d04d   Mark Feltner   Modified some con...
222
      if [[ -n $old_rev && $old_rev != $new_rev ]]; then
0912ba472   Shrikant Sharat   Print a summary o...
223
224
          echo Updated from ${old_rev:0:7} to ${new_rev:0:7}.
          if $verbose; then
062a7b830   Shrikant Sharat   Refactor temporar...
225
              --plugin-git log --oneline --reverse --no-merges --stat '@{1}..'
0912ba472   Shrikant Sharat   Print a summary o...
226
227
          fi
      fi
7af602dae   Shrikant Sharat   Minor comment edi...
228
      # Remove the temporary git wrapper function.
062a7b830   Shrikant Sharat   Refactor temporar...
229
      unfunction -- --plugin-git
e5dfac7ea   Shrikant Sharat   Initial commit. W...
230
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
231
  -antigen-load () {
e5dfac7ea   Shrikant Sharat   Initial commit. W...
232

a12d3140a   Shrikant Sharat   Removed bundle-in...
233
      local url="$1"
843297b20   Shrikant Sharat   Initial implement...
234
      local loc="$2"
a12d3140a   Shrikant Sharat   Removed bundle-in...
235
      local btype="$3"
41abcf662   Shrikant Sharat   Simpler implement...
236
      local make_local_clone="$4"
843297b20   Shrikant Sharat   Initial implement...
237

499c0dd5d   Shrikant Sharat   Added some comments.
238
      # The full location where the plugin is located.
38b0b0409   Shrikant Sharat   Fix #12. Local bu...
239
      local location
41abcf662   Shrikant Sharat   Simpler implement...
240
      if $make_local_clone; then
38b0b0409   Shrikant Sharat   Fix #12. Local bu...
241
242
243
244
          location="$(-antigen-get-clone-dir "$url")/$loc"
      else
          location="$url"
      fi
e5dfac7ea   Shrikant Sharat   Initial commit. W...
245

d535ba468   Shrikant Sharat   Introduced a new ...
246
      if [[ $btype == theme ]]; then
e5dfac7ea   Shrikant Sharat   Initial commit. W...
247

d535ba468   Shrikant Sharat   Introduced a new ...
248
249
250
          # Of course, if its a theme, the location would point to the script
          # file.
          source "$location"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
251

d535ba468   Shrikant Sharat   Introduced a new ...
252
      else
e5dfac7ea   Shrikant Sharat   Initial commit. W...
253

7af602dae   Shrikant Sharat   Minor comment edi...
254
          # Source the plugin script.
d535ba468   Shrikant Sharat   Introduced a new ...
255
256
          # FIXME: I don't know. Looks very very ugly. Needs a better
          # implementation once tests are ready.
0bf5a61c4   Josh Matthews   Removing -q and -...
257
          local script_loc="$(ls "$location" | grep '\.plugin\.zsh$' | head -n1)"
499c0dd5d   Shrikant Sharat   Added some comments.
258

286957967   Ryuta Kamizono   Fix `*.plugin.zsh...
259
          if [[ -f $location/$script_loc ]]; then
d535ba468   Shrikant Sharat   Introduced a new ...
260
              # If we have a `*.plugin.zsh`, source it.
286957967   Ryuta Kamizono   Fix `*.plugin.zsh...
261
              source "$location/$script_loc"
eb1ebaf3c   Shrikant Sharat   Load `init.zsh` i...
262
263
  
          elif [[ -f $location/init.zsh ]]; then
b84ae117e   Gregory Hugaerts   add check for pmo...
264
265
              # If we have a `init.zsh`
              if (( $+functions[pmodload] )); then
a58d8cf02   Shrikant Sharat   Simplify loading ...
266
267
268
                  # If pmodload is defined pmodload the module. Remove `modules/`
                  # from loc to find module name.
                  pmodload "${loc#modules/}"
b84ae117e   Gregory Hugaerts   add check for pmo...
269
              else
a58d8cf02   Shrikant Sharat   Simplify loading ...
270
                  # Otherwise source it.
b84ae117e   Gregory Hugaerts   add check for pmo...
271
272
                  source "$location/init.zsh"
              fi
499c0dd5d   Shrikant Sharat   Added some comments.
273

0bf5a61c4   Josh Matthews   Removing -q and -...
274
          elif ls "$location" | grep -l '\.zsh$' &> /dev/null; then
d535ba468   Shrikant Sharat   Introduced a new ...
275
276
              # If there is no `*.plugin.zsh` file, source *all* the `*.zsh`
              # files.
cd68a349f   Shrikant Sharat   Fix update to zsh...
277
              for script ($location/*.zsh(N)) source "$script"
499c0dd5d   Shrikant Sharat   Added some comments.
278

0bf5a61c4   Josh Matthews   Removing -q and -...
279
          elif ls "$location" | grep -l '\.sh$' &> /dev/null; then
17f8e971e   Shrikant Sharat   Work with non zsh...
280
281
              # If there are no `*.zsh` files either, we look for and source any
              # `*.sh` files instead.
cd68a349f   Shrikant Sharat   Fix update to zsh...
282
              for script ($location/*.sh(N)) source "$script"
499c0dd5d   Shrikant Sharat   Added some comments.
283

d535ba468   Shrikant Sharat   Introduced a new ...
284
          fi
499c0dd5d   Shrikant Sharat   Added some comments.
285
          # Add to $fpath, for completion(s).
d535ba468   Shrikant Sharat   Introduced a new ...
286
287
288
          fpath=($location $fpath)
  
      fi
e5dfac7ea   Shrikant Sharat   Initial commit. W...
289

e5dfac7ea   Shrikant Sharat   Initial commit. W...
290
  }
a54264963   Shrikant Sharat   Refactorings on t...
291
292
293
  # Update (with `git pull`) antigen itself.
  # TODO: Once update is finished, show a summary of the new commits, as a kind of
  # "what's new" message.
a6d46893a   Xavier Garrido   add a selfupdate ...
294
  antigen-selfupdate () {
a54264963   Shrikant Sharat   Refactorings on t...
295
      ( cd $_ANTIGEN_INSTALL_DIR
3e5187782   ChangZhuo Chen   Let antigen-selfu...
296
          if [[ ! ( -d .git || -f .git ) ]]; then
a54264963   Shrikant Sharat   Refactorings on t...
297
298
              echo "Your copy of antigen doesn't appear to be a git clone. " \
                  "The 'selfupdate' command cannot work in this case."
a6d46893a   Xavier Garrido   add a selfupdate ...
299
300
              return 1
          fi
3e5187782   ChangZhuo Chen   Let antigen-selfu...
301
302
303
304
305
          local head="$(git rev-parse --abbrev-ref HEAD)"
          if [[ $head == "HEAD" ]]; then
              # If current head is detached HEAD, checkout to master branch.
              git checkout master
          fi
a6d46893a   Xavier Garrido   add a selfupdate ...
306
307
308
          git pull
      )
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
309
  antigen-cleanup () {
0b32bec27   Shrikant Sharat   bundle-cleanup co...
310

499c0dd5d   Shrikant Sharat   Added some comments.
311
      # Cleanup unused repositories.
1f541f429   Shrikant Sharat   Add --force argum...
312
313
314
315
      local force=false
      if [[ $1 == --force ]]; then
          force=true
      fi
0b32bec27   Shrikant Sharat   bundle-cleanup co...
316
317
318
319
320
321
322
      if [[ ! -d "$ADOTDIR/repos" || -z "$(ls "$ADOTDIR/repos/")" ]]; then
          echo "You don't have any bundles."
          return 0
      fi
  
      # Find directores in ADOTDIR/repos, that are not in the bundles record.
      local unused_clones="$(comm -13 \
0b4fbaaf6   Shrikant Sharat   Get rid of backsl...
323
324
325
          <(-antigen-echo-record |
              awk '$4 == "true" {print $1}' |
              while read line; do
a5e21a6a1   Shrikant Sharat   Do comparisons wi...
326
                  -antigen-get-clone-dir "$line"
0b4fbaaf6   Shrikant Sharat   Get rid of backsl...
327
328
              done |
              sort -u) \
a5e21a6a1   Shrikant Sharat   Do comparisons wi...
329
          <(ls -d "$ADOTDIR/repos/"* | sort -u))"
0b32bec27   Shrikant Sharat   bundle-cleanup co...
330
331
332
333
334
335
336
  
      if [[ -z $unused_clones ]]; then
          echo "You don't have any unidentified bundles."
          return 0
      fi
  
      echo 'You have clones for the following repos, but are not used.'
0b4fbaaf6   Shrikant Sharat   Get rid of backsl...
337
338
      echo "$unused_clones" |
          while read line; do
a5e21a6a1   Shrikant Sharat   Do comparisons wi...
339
              -antigen-get-clone-url "$line"
0b4fbaaf6   Shrikant Sharat   Get rid of backsl...
340
341
          done |
          sed -e 's/^/  /' -e 's/|/, branch /'
0b32bec27   Shrikant Sharat   bundle-cleanup co...
342

1f541f429   Shrikant Sharat   Add --force argum...
343
344
      if $force || (echo -n '
  Delete them all? [y/N] '; read -q); then
0b32bec27   Shrikant Sharat   bundle-cleanup co...
345
346
          echo
          echo
759e381e1   Shrikant Sharat   Refactor variable...
347
          echo "$unused_clones" | while read line; do
a5e21a6a1   Shrikant Sharat   Do comparisons wi...
348
349
              echo -n "Deleting clone for $(-antigen-get-clone-url "$line")..."
              rm -rf "$line"
0b32bec27   Shrikant Sharat   bundle-cleanup co...
350
351
352
353
354
355
356
              echo ' done.'
          done
      else
          echo
          echo Nothing deleted.
      fi
  }
da678afb2   Adam Stankiewicz   Introduce antigen...
357
  antigen-use () {
2b0796f6a   Shrikant Sharat   Add a `Usage:` li...
358
      if [[ $1 == oh-my-zsh ]]; then
387fbc4d4   Shrikant Sharat   Internalize libra...
359
          -antigen-use-oh-my-zsh
2b0796f6a   Shrikant Sharat   Add a `Usage:` li...
360
      elif [[ $1 == prezto ]]; then
387fbc4d4   Shrikant Sharat   Internalize libra...
361
          -antigen-use-prezto
da678afb2   Adam Stankiewicz   Introduce antigen...
362
      else
2b0796f6a   Shrikant Sharat   Add a `Usage:` li...
363
364
          echo 'Usage: antigen-use <library-name>' >&2
          echo 'Where <library-name> is any one of the following:' >&2
da678afb2   Adam Stankiewicz   Introduce antigen...
365
366
367
368
369
          echo ' * oh-my-zsh' >&2
          echo ' * prezto' >&2
          return 1
      fi
  }
387fbc4d4   Shrikant Sharat   Internalize libra...
370
  -antigen-use-oh-my-zsh () {
c3198e0aa   Shrikant Sharat   Set `$ZSH` to oh-...
371
372
373
      if [[ -z "$ZSH" ]]; then
          export ZSH="$(-antigen-get-clone-dir "$ANTIGEN_DEFAULT_REPO_URL")"
      fi
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
374
      antigen-bundle --loc=lib
e5dfac7ea   Shrikant Sharat   Initial commit. W...
375
  }
387fbc4d4   Shrikant Sharat   Internalize libra...
376
  -antigen-use-prezto () {
c0ee02666   Hugaerts@gmail.com   add support for p...
377
378
379
      antigen-bundle sorin-ionescu/prezto
      export ZDOTDIR=$ADOTDIR/repos/
  }
387fbc4d4   Shrikant Sharat   Internalize libra...
380
  # For backwards compatibility.
ff5f83bb8   Shrikant Sharat   80|
381
382
383
384
385
386
387
388
389
390
391
392
  antigen-lib () {
      -antigen-use-oh-my-zsh
      echo '`antigen-lib` is deprecated and will soon be removed.'
      echo 'Use `antigen-use oh-my-zsh` instead.'
  }
  
  # For backwards compatibility.
  antigen-prezto-lib () {
      -antigen-use-prezto
      echo '`antigen-prezto-lib` is deprecated and will soon be removed.'
      echo 'Use `antigen-use prezto` instead.'
  }
387fbc4d4   Shrikant Sharat   Internalize libra...
393

a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
394
  antigen-theme () {
0c257ebe4   Shrikant Sharat   For #29. Intial w...
395
396
397
398
399
400
401
402
403
404
405
  
      if [[ "$1" != */* && "$1" != --* ]]; then
          # The first argument is just a name of the plugin, to be picked up from
          # the default repo.
          local name="${1:-robbyrussell}"
          antigen-bundle --loc=themes/$name --btype=theme
  
      else
          antigen-bundle "$@" --btype=theme
  
      fi
e5dfac7ea   Shrikant Sharat   Initial commit. W...
406
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
407
  antigen-apply () {
a9ebdcdbe   Shrikant Sharat   Don't load compin...
408

e5dfac7ea   Shrikant Sharat   Initial commit. W...
409
      # Initialize completion.
a9ebdcdbe   Shrikant Sharat   Don't load compin...
410
411
412
413
414
415
416
417
418
419
420
      local cdef
  
      # Load the compinit module. This will readefine the `compdef` function to
      # the one that actually initializes completions.
      autoload -U compinit
      compinit -i
  
      # Apply all `compinit`s that have been deferred.
      eval "$(for cdef in $__deferred_compdefs; do
                  echo compdef $cdef
              done)"
5e23ab6fe   Will Boyce   Defer `compdef` c...
421
      unset __deferred_compdefs
a9ebdcdbe   Shrikant Sharat   Don't load compin...
422

e5dfac7ea   Shrikant Sharat   Initial commit. W...
423
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
424
  antigen-list () {
7af602dae   Shrikant Sharat   Minor comment edi...
425
      # List all currently installed bundles.
9dc631003   Shrikant Sharat   Rename bundle rec...
426
      if [[ -z "$_ANTIGEN_BUNDLE_RECORD" ]]; then
df942673b   Shrikant Sharat   Added bundle-list...
427
428
429
          echo "You don't have any bundles." >&2
          return 1
      else
3aa0d2d8a   Shrikant Sharat   Fix duplicate ent...
430
          -antigen-echo-record | sort -u
df942673b   Shrikant Sharat   Added bundle-list...
431
432
      fi
  }
d36c6f93d   Shrikant Sharat   Implemented `anti...
433
434
435
436
437
438
439
  antigen-snapshot () {
  
      local snapshot_file="${1:-antigen-shapshot}"
  
      # The snapshot content lines are pairs of repo-url and git version hash, in
      # the form:
      #   <version-hash> <repo-url>
5b8e33407   Shrikant Sharat   Only save bundles...
440
441
442
443
      local snapshot_content="$(-antigen-echo-record |
          grep 'true$' |
          sed 's/ .*$//' |
          sort -u |
d36c6f93d   Shrikant Sharat   Implemented `anti...
444
          while read url; do
2c2f91c92   Shrikant Sharat   Added `antigen-re...
445
446
447
              local dir="$(-antigen-get-clone-dir "$url")"
              local version_hash="$(cd "$dir" && git rev-parse HEAD)"
              echo "$version_hash $url"
d36c6f93d   Shrikant Sharat   Implemented `anti...
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
          done)"
  
      {
          # The first line in the snapshot file is for metadata, in the form:
          #   key='value'; key='value'; key='value';
          # Where `key`s are valid shell variable names.
  
          # Snapshot version. Has no relation to antigen version. If the snapshot
          # file format changes, this number can be incremented.
          echo -n "version='1';"
  
          # Snapshot creation date+time.
          echo -n " created_on='$(date)';"
  
          # Add a checksum with the md5 checksum of all the snapshot lines.
3811dd84f   Corey Jewett   localize and don'...
463
          chksum() { (md5sum; test $? = 127 && md5) 2>/dev/null | cut -d' ' -f1 }
3e76602f8   Corey Jewett   cross platform md5
464
          local checksum="$(echo "$snapshot_content" | chksum)"
3811dd84f   Corey Jewett   localize and don'...
465
          unset -f chksum;
d36c6f93d   Shrikant Sharat   Implemented `anti...
466
467
468
469
470
471
472
473
474
          echo -n " checksum='${checksum%% *}';"
  
          # A newline after the metadata and then the snapshot lines.
          echo "
  $snapshot_content"
  
      } > "$snapshot_file"
  
  }
2c2f91c92   Shrikant Sharat   Added `antigen-re...
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
  antigen-restore () {
  
      if [[ $# == 0 ]]; then
          echo 'Please provide a snapshot file to restore from.' >&2
          return 1
      fi
  
      local snapshot_file="$1"
  
      # TODO: Before doing anything with the snapshot file, verify its checksum.
      # If it fails, notify this to the user and confirm if restore should
      # proceed.
  
      echo -n "Restoring from $snapshot_file..."
  
      sed -n '1!p' "$snapshot_file" |
          while read line; do
  
              local version_hash="${line%% *}"
              local url="${line##* }"
              local clone_dir="$(-antigen-get-clone-dir "$url")"
  
              if [[ ! -d $clone_dir ]]; then
d91610f46   Shrikant Sharat   Please shutup!
498
                  git clone "$url" "$clone_dir" &> /dev/null
2c2f91c92   Shrikant Sharat   Added `antigen-re...
499
              fi
d91610f46   Shrikant Sharat   Please shutup!
500
              (cd "$clone_dir" && git checkout $version_hash) &> /dev/null
2c2f91c92   Shrikant Sharat   Added `antigen-re...
501
502
503
504
505
506
  
          done
  
      echo ' done.'
      echo 'Please open a new shell to get the restored changes.'
  }
fee42de18   Shrikant Sharat   Add a small antig...
507
508
509
510
511
512
513
  antigen-help () {
      cat <<EOF
  Antigen is a plugin management system for zsh. It makes it easy to grab awesome
  shell scripts and utilities, put up on github. For further details and complete
  documentation, visit the project's page at 'http://antigen.sharats.me'.
  EOF
  }
fd547d958   Shrikant Sharat   An `antigen` comm...
514
515
516
517
  # A syntax sugar to avoid the `-` when calling antigen commands. With this
  # function, you can write `antigen-bundle` as `antigen bundle` and so on.
  antigen () {
      local cmd="$1"
876b7ae4f   Shrikant Sharat   Return with error...
518
      if [[ -z "$cmd" ]]; then
6f087127c   Shrikant Sharat   Add `Antigen:` pr...
519
          echo 'Antigen: Please give a command to run.' >&2
876b7ae4f   Shrikant Sharat   Return with error...
520
521
522
          return 1
      fi
      shift
426eb0789   rummik   Add some error ch...
523
524
525
526
  
      if functions "antigen-$cmd" > /dev/null; then
          "antigen-$cmd" "$@"
      else
6f087127c   Shrikant Sharat   Add `Antigen:` pr...
527
          echo "Antigen: Unknown command: $cmd" >&2
426eb0789   rummik   Add some error ch...
528
      fi
fd547d958   Shrikant Sharat   An `antigen` comm...
529
  }
cffa56ed7   Shrikant Sharat   Added function to...
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
  -antigen-parse-args () {
      # An argument parsing functionality to parse arguments the *antigen* way :).
      # Takes one first argument (called spec), which dictates how to parse and
      # the rest of the arguments are parsed. Outputs a piece of valid shell code
      # that can be passed to `eval` inside a function which creates the arguments
      # and their values as local variables. Suggested use is to set the defaults
      # to all arguments first and then eval the output of this function.
  
      # Spec: Only long argument supported. No support for parsing short options.
      # The spec must have two sections, separated by a `;`.
      #       '<positional-arguments>;<keyword-only-arguments>'
      # Positional arguments are passed as just values, like `command a b`.
      # Keyword arguments are passed as a `--name=value` pair, like `command
      # --arg1=a --arg2=b`.
  
      # Each argument in the spec is separated by a `,`. Each keyword argument can
      # end in a `:` to specifiy that this argument wants a value, otherwise it
      # doesn't take a value. (The value in the output when the keyword argument
      # doesn't have a `:` is `true`).
  
      # Arguments in either section can end with a `?` (should come after `:`, if
      # both are present), means optional. FIXME: Not yet implemented.
  
      # See the test file, tests/arg-parser.t for (working) examples.
  
      local spec="$1"
      shift
7a2ca5936   Shrikant Sharat   Allow whitespace ...
557
      # Sanitize the spec
620c89d5b   Shrikant Sharat   Remove use of the...
558
559
      spec="$(echo "$spec" | tr '
  ' ' ' | sed 's/[[:space:]]//g')"
7a2ca5936   Shrikant Sharat   Allow whitespace ...
560

cffa56ed7   Shrikant Sharat   Added function to...
561
562
563
564
565
566
567
568
569
570
571
572
573
574
      local code=''
  
      --add-var () {
          test -z "$code" || code="$code
  "
          code="${code}local $1='$2'"
      }
  
      local positional_args="$(echo "$spec" | cut -d\; -f1)"
      local positional_args_count="$(echo $positional_args |
              awk -F, '{print NF}')"
  
      # Set spec values based on the positional arguments.
      local i=1
56ae2d04d   Mark Feltner   Modified some con...
575
      while [[ -n $1 && $1 != --* ]]; do
cffa56ed7   Shrikant Sharat   Added function to...
576
577
578
579
580
581
582
583
584
585
  
          if (( $i > $positional_args_count )); then
              echo "Only $positional_args_count positional arguments allowed." >&2
              echo "Found at least one more: '$1'" >&2
              return
          fi
  
          local name_spec="$(echo "$positional_args" | cut -d, -f$i)"
          local name="${${name_spec%\?}%:}"
          local value="$1"
0bf5a61c4   Josh Matthews   Removing -q and -...
586
          if echo "$code" | grep -l "^local $name=" &> /dev/null; then
9d1b71736   Shrikant Sharat   Detect repeated a...
587
588
589
              echo "Argument '$name' repeated with the value '$value'". >&2
              return
          fi
cffa56ed7   Shrikant Sharat   Added function to...
590
591
592
593
594
          --add-var $name "$value"
  
          shift
          i=$(($i + 1))
      done
973558eee   Shrikant Sharat   Support positiona...
595
      local keyword_args="$(
6d333dfa0   Shrikant Sharat   Fix #20. Using `s...
596
597
598
599
600
601
602
603
604
605
606
607
              # Positional arguments can double up as keyword arguments too.
              echo "$positional_args" | tr , '
  ' |
                  while read line; do
                      if [[ $line == *\? ]]; then
                          echo "${line%?}:?"
                      else
                          echo "$line:"
                      fi
                  done
  
              # Specified keyword arguments.
973558eee   Shrikant Sharat   Support positiona...
608
609
610
              echo "$spec" | cut -d\; -f2 | tr , '
  '
              )"
cffa56ed7   Shrikant Sharat   Added function to...
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
      local keyword_args_count="$(echo $keyword_args | awk -F, '{print NF}')"
  
      # Set spec values from keyword arguments, if any. The remaining arguments
      # are all assumed to be keyword arguments.
      while [[ $1 == --* ]]; do
          # Remove the `--` at the start.
          local arg="${1#--}"
  
          # Get the argument name and value.
          if [[ $arg != *=* ]]; then
              local name="$arg"
              local value=''
          else
              local name="${arg%\=*}"
              local value="${arg#*=}"
          fi
0bf5a61c4   Josh Matthews   Removing -q and -...
627
          if echo "$code" | grep -l "^local $name=" &> /dev/null; then
9d1b71736   Shrikant Sharat   Detect repeated a...
628
629
630
              echo "Argument '$name' repeated with the value '$value'". >&2
              return
          fi
cffa56ed7   Shrikant Sharat   Added function to...
631
          # The specification for this argument, used for validations.
6a8c5c114   Shrikant Sharat   80| and refactor ...
632
633
          local arg_line="$(echo "$keyword_args" |
                              egrep "^$name:?\??" | head -n1)"
cffa56ed7   Shrikant Sharat   Added function to...
634
635
636
637
638
639
  
          # Validate argument and value.
          if [[ -z $arg_line ]]; then
              # This argument is not known to us.
              echo "Unknown argument '$name'." >&2
              return
6a8c5c114   Shrikant Sharat   80| and refactor ...
640
641
          elif (echo "$arg_line" | grep -l ':' &> /dev/null) &&
                  [[ -z $value ]]; then
cffa56ed7   Shrikant Sharat   Added function to...
642
643
644
              # This argument needs a value, but is not provided.
              echo "Required argument for '$name' not provided." >&2
              return
6a8c5c114   Shrikant Sharat   80| and refactor ...
645
646
          elif (echo "$arg_line" | grep -vl ':' &> /dev/null) &&
                  [[ -n $value ]]; then
cffa56ed7   Shrikant Sharat   Added function to...
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
              # This argument doesn't need a value, but is provided.
              echo "No argument required for '$name', but provided '$value'." >&2
              return
  
          fi
  
          if [[ -z $value ]]; then
              value=true
          fi
  
          --add-var "${name//-/_}" "$value"
          shift
      done
  
      echo "$code"
  
      unfunction -- --add-var
  
  }
bc9d20c7a   Shrikant Sharat   Add comments.
666
667
  # Echo the bundle specs as in the record. The first line is not echoed since it
  # is a blank line.
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
668
  -antigen-echo-record () {
9dc631003   Shrikant Sharat   Rename bundle rec...
669
      echo "$_ANTIGEN_BUNDLE_RECORD" | sed -n '1!p'
e5dfac7ea   Shrikant Sharat   Initial commit. W...
670
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
671
  -antigen-env-setup () {
3e9253968   Shrikant Sharat   Moved `-set-defau...
672
673
674
675
676
677
678
679
  
      # Helper function: Same as `export $1=$2`, but will only happen if the name
      # specified by `$1` is not already set.
      -set-default () {
          local arg_name="$1"
          local arg_value="$2"
          eval "test -z \"\$$arg_name\" && export $arg_name='$arg_value'"
      }
7af602dae   Shrikant Sharat   Minor comment edi...
680
      # Pre-startup initializations.
e5dfac7ea   Shrikant Sharat   Initial commit. W...
681
682
      -set-default ANTIGEN_DEFAULT_REPO_URL \
          https://github.com/robbyrussell/oh-my-zsh.git
911cc8cb5   Shrikant Sharat   Use ADOTDIR as th...
683
      -set-default ADOTDIR $HOME/.antigen
3047bfeb7   Shrikant Sharat   Load compinit at ...
684

37b9bb1e4   Shrikant Sharat   Rollback #36. com...
685
686
      # Setup antigen's own completion.
      compdef _antigen antigen
e5dfac7ea   Shrikant Sharat   Initial commit. W...
687

3e9253968   Shrikant Sharat   Moved `-set-defau...
688
689
      # Remove private functions.
      unfunction -- -set-default
e5dfac7ea   Shrikant Sharat   Initial commit. W...
690
  }
84c855441   Guilherme Espada   Half-fix #26
691
  # Setup antigen's autocompletion
b69ad8866   Shrikant Sharat   Fix code formatti...
692
  _antigen () {
a6d46893a   Xavier Garrido   add a selfupdate ...
693
694
695
696
697
698
699
      compadd        \
          bundle     \
          bundles    \
          update     \
          revert     \
          list       \
          cleanup    \
1918edf88   Guilherme Espada   Update completion
700
          use        \
a6d46893a   Xavier Garrido   add a selfupdate ...
701
702
703
          selfupdate \
          theme      \
          apply      \
1918edf88   Guilherme Espada   Update completion
704
705
          snapshot   \
          restore    \
b69ad8866   Shrikant Sharat   Fix code formatti...
706
          help
84c855441   Guilherme Espada   Half-fix #26
707
  }
b69ad8866   Shrikant Sharat   Fix code formatti...
708
  -antigen-env-setup