Blame view

antigen.zsh 18 KB
e5dfac7ea   Shrikant Sharat   Initial commit. W...
1
2
3
4
  #!/bin/zsh
  
  # Each line in this string has the following entries separated by a space
  # character.
c7827f8ac   Shrikant Sharat   Fix comments to i...
5
  # <repo-url>, <plugin-location>, <bundle-type>, <has-local-clone>
e5dfac7ea   Shrikant Sharat   Initial commit. W...
6
  # FIXME: Is not kept local by zsh!
9dc631003   Shrikant Sharat   Rename bundle rec...
7
  local _ANTIGEN_BUNDLE_RECORD=""
e5dfac7ea   Shrikant Sharat   Initial commit. W...
8
9
  
  # Syntaxes
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
10
  #   antigen-bundle <url> [<loc>=/]
843297b20   Shrikant Sharat   Initial implement...
11
12
  # Keyword only arguments:
  #   branch - The branch of the repo to use for this bundle.
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
13
  antigen-bundle () {
e5dfac7ea   Shrikant Sharat   Initial commit. W...
14
15
16
17
  
      # Bundle spec arguments' default values.
      local url="$ANTIGEN_DEFAULT_REPO_URL"
      local loc=/
2923c490c   Shrikant Sharat   Branch informatio...
18
      local branch=
38b0b0409   Shrikant Sharat   Fix #12. Local bu...
19
      local no_local_clone=false
d535ba468   Shrikant Sharat   Introduced a new ...
20
      local btype=plugin
e5dfac7ea   Shrikant Sharat   Initial commit. W...
21

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

b29510ce7   Shrikant Sharat   Small code reorga...
27
28
29
30
31
      # 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...
32
      # Resolve the url.
39379a878   Shrikant Sharat   Move url resolvin...
33
      url="$(-antigen-resolve-bundle-url "$url")"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
34

2923c490c   Shrikant Sharat   Branch informatio...
35
36
37
38
      # Add the branch information to the url.
      if [[ ! -z $branch ]]; then
          url="$url|$branch"
      fi
41abcf662   Shrikant Sharat   Simpler implement...
39
      # The `make_local_clone` variable better represents whether there should be
e6cc15b5f   Shrikant Sharat   Fix local paths w...
40
41
42
43
      # 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...
44
      local make_local_clone=true
0b4fbaaf6   Shrikant Sharat   Get rid of backsl...
45
46
      if [[ $url == /* && -z $branch &&
              ( $no_local_clone == true || ! -d $url/.git ) ]]; then
41abcf662   Shrikant Sharat   Simpler implement...
47
48
          make_local_clone=false
      fi
0c257ebe4   Shrikant Sharat   For #29. Intial w...
49
50
51
52
      # 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...
53
      # Add it to the record.
cbdabb20c   Shrikant Sharat   80|
54
55
56
      _ANTIGEN_BUNDLE_RECORD="$_ANTIGEN_BUNDLE_RECORD
  $url $loc $btype"
      _ANTIGEN_BUNDLE_RECORD="$_ANTIGEN_BUNDLE_RECORD $make_local_clone"
a12d3140a   Shrikant Sharat   Removed bundle-in...
57

38b0b0409   Shrikant Sharat   Fix #12. Local bu...
58
      # Ensure a clone exists for this repo, if needed.
41abcf662   Shrikant Sharat   Simpler implement...
59
      if $make_local_clone; then
38b0b0409   Shrikant Sharat   Fix #12. Local bu...
60
61
          -antigen-ensure-repo "$url"
      fi
e5dfac7ea   Shrikant Sharat   Initial commit. W...
62

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

a12d3140a   Shrikant Sharat   Removed bundle-in...
66
  }
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
67

39379a878   Shrikant Sharat   Move url resolvin...
68
69
70
71
72
  -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...
73
      # Expand short github url syntax: `username/reponame`.
0b4fbaaf6   Shrikant Sharat   Get rid of backsl...
74
75
76
      if [[ $url != git://* &&
              $url != https://* &&
              $url != /* &&
60fa053ec   Shrikant Sharat   Add tests for url...
77
78
              $url != git@github.com:*/*
              ]]; then
1cae4fc91   Shrikant Sharat   Some refactoring ...
79
          url="https://github.com/${url%.git}.git"
39379a878   Shrikant Sharat   Move url resolvin...
80
81
82
83
      fi
  
      echo "$url"
  }
3c5ff1c1e   Shrikant Sharat   Add antigen-bundl...
84
85
86
87
88
89
  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
2e6d0c416   Shrikant Sharat   Fix #5. Ignore sp...
90
      grep -v '^\s*$\|^#' | while read line; do
3c5ff1c1e   Shrikant Sharat   Add antigen-bundl...
91
92
93
94
95
          # 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...
96
  antigen-update () {
158407151   Shrikant Sharat   Refactoring of pr...
97
      # Update your bundles, i.e., `git pull` in all the plugin repos.
d43f31a79   Shrikant Sharat   Initial implement...
98
99
  
      date > $ADOTDIR/revert-info
0b4fbaaf6   Shrikant Sharat   Get rid of backsl...
100
101
102
103
      -antigen-echo-record |
          awk '{print $1}' |
          sort -u |
          while read url; do
5d199ab20   Shrikant Sharat   Print the repo ur...
104
              echo "**** Pulling $url"
d43f31a79   Shrikant Sharat   Initial implement...
105
106
107
108
              (dir="$(-antigen-get-clone-dir "$url")"
                  echo -n "$dir:"
                  cd "$dir"
                  git rev-parse HEAD) >> $ADOTDIR/revert-info
723b284b4   Shrikant Sharat   Use the arg parsi...
109
              -antigen-ensure-repo "$url" --update --verbose
5d199ab20   Shrikant Sharat   Print the repo ur...
110
              echo
8d0d219d6   Shrikant Sharat   Fix #9 Update com...
111
          done
158407151   Shrikant Sharat   Refactoring of pr...
112
  }
d43f31a79   Shrikant Sharat   Initial implement...
113
114
115
116
117
118
119
120
121
122
123
124
125
126
  antigen-revert () {
      if ! [[ -f $ADOTDIR/revert-info ]]; then
          echo 'No revert information available. Cannot revert.' >&2
      fi
  
      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)."
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
127
  -antigen-get-clone-dir () {
a12d3140a   Shrikant Sharat   Removed bundle-in...
128
129
      # 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.
130
      echo -n $ADOTDIR/repos/
222271a0b   Shrikant Sharat   Memoization is no...
131
      echo "$1" | sed \
a12d3140a   Shrikant Sharat   Removed bundle-in...
132
          -e 's./.-SLASH-.g' \
843297b20   Shrikant Sharat   Initial implement...
133
134
          -e 's.:.-COLON-.g' \
          -e 's.|.-PIPE-.g'
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
135
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
136
  -antigen-get-clone-url () {
0b32bec27   Shrikant Sharat   bundle-cleanup co...
137
138
      # Takes a repo's clone dir and gives out the repo's original url that was
      # used to create the given directory path.
0b32bec27   Shrikant Sharat   bundle-cleanup co...
139
140
      echo "$1" | sed \
          -e "s:^$ADOTDIR/repos/::" \
0b32bec27   Shrikant Sharat   bundle-cleanup co...
141
          -e 's.-SLASH-./.g' \
843297b20   Shrikant Sharat   Initial implement...
142
          -e 's.-COLON-.:.g' \
a5e21a6a1   Shrikant Sharat   Do comparisons wi...
143
          -e 's.-PIPE-.|.g'
0b32bec27   Shrikant Sharat   bundle-cleanup co...
144
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
145
  -antigen-ensure-repo () {
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
146

499c0dd5d   Shrikant Sharat   Added some comments.
147
148
149
      # 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...
150
      # Argument defaults.
723b284b4   Shrikant Sharat   Use the arg parsi...
151
152
      # The url. No sane default for this, so just empty.
      local url=
499c0dd5d   Shrikant Sharat   Added some comments.
153
      # Check if we have to update.
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
154
      local update=false
c1479baff   Shrikant Sharat   Accept a --verbos...
155
156
      # Verbose output.
      local verbose=false
723b284b4   Shrikant Sharat   Use the arg parsi...
157
158
      eval "$(-antigen-parse-args 'url ; update?, verbose?' "$@")"
      shift $#
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
159

499c0dd5d   Shrikant Sharat   Added some comments.
160
      # Get the clone's directory as per the given repo url and branch.
2923c490c   Shrikant Sharat   Branch informatio...
161
      local clone_dir="$(-antigen-get-clone-dir $url)"
062a7b830   Shrikant Sharat   Refactor temporar...
162
163
164
165
166
  
      # A temporary function wrapping the `git` command with repeated arguments.
      --plugin-git () {
          eval git --git-dir=$clone_dir/.git --work-tree=$clone_dir "$@"
      }
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
167

499c0dd5d   Shrikant Sharat   Added some comments.
168
      # Clone if it doesn't already exist.
aa510273d   Shrikant Sharat   Removed useless l...
169
      if [[ ! -d $clone_dir ]]; then
2923c490c   Shrikant Sharat   Branch informatio...
170
          git clone "${url%|*}" "$clone_dir"
aa510273d   Shrikant Sharat   Removed useless l...
171
      elif $update; then
0912ba472   Shrikant Sharat   Print a summary o...
172
          # Save current revision.
382d92096   Shrikant Sharat   Use local variabl...
173
          local old_rev="$(--plugin-git rev-parse HEAD)"
499c0dd5d   Shrikant Sharat   Added some comments.
174
          # Pull changes if update requested.
062a7b830   Shrikant Sharat   Refactor temporar...
175
          --plugin-git pull
0912ba472   Shrikant Sharat   Print a summary o...
176
          # Get the new revision.
382d92096   Shrikant Sharat   Use local variabl...
177
          local new_rev="$(--plugin-git rev-parse HEAD)"
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
178
      fi
499c0dd5d   Shrikant Sharat   Added some comments.
179
      # If its a specific branch that we want, checkout that branch.
2923c490c   Shrikant Sharat   Branch informatio...
180
      if [[ $url == *\|* ]]; then
013216d53   Shrikant Sharat   Merge branch 'mas...
181
          local current_branch=${$(--plugin-git symbolic-ref HEAD)##refs/heads/}
ccc3d1443   Arash Rouhani   Stop saying "alre...
182
          local requested_branch="${url#*|}"
f783f3860   Shrikant Sharat   Comments and inde...
183
          # Only do the checkout when we are not already on the branch.
ccc3d1443   Arash Rouhani   Stop saying "alre...
184
          [[ $requested_branch != $current_branch ]] &&
f783f3860   Shrikant Sharat   Comments and inde...
185
              --plugin-git checkout $requested_branch
843297b20   Shrikant Sharat   Initial implement...
186
      fi
0912ba472   Shrikant Sharat   Print a summary o...
187
188
189
      if ! [[ -z $old_rev || $old_rev == $new_rev ]]; then
          echo Updated from ${old_rev:0:7} to ${new_rev:0:7}.
          if $verbose; then
062a7b830   Shrikant Sharat   Refactor temporar...
190
              --plugin-git log --oneline --reverse --no-merges --stat '@{1}..'
0912ba472   Shrikant Sharat   Print a summary o...
191
192
          fi
      fi
7af602dae   Shrikant Sharat   Minor comment edi...
193
      # Remove the temporary git wrapper function.
062a7b830   Shrikant Sharat   Refactor temporar...
194
      unfunction -- --plugin-git
e5dfac7ea   Shrikant Sharat   Initial commit. W...
195
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
196
  -antigen-load () {
e5dfac7ea   Shrikant Sharat   Initial commit. W...
197

a12d3140a   Shrikant Sharat   Removed bundle-in...
198
      local url="$1"
843297b20   Shrikant Sharat   Initial implement...
199
      local loc="$2"
a12d3140a   Shrikant Sharat   Removed bundle-in...
200
      local btype="$3"
41abcf662   Shrikant Sharat   Simpler implement...
201
      local make_local_clone="$4"
843297b20   Shrikant Sharat   Initial implement...
202

499c0dd5d   Shrikant Sharat   Added some comments.
203
      # The full location where the plugin is located.
38b0b0409   Shrikant Sharat   Fix #12. Local bu...
204
      local location
41abcf662   Shrikant Sharat   Simpler implement...
205
      if $make_local_clone; then
38b0b0409   Shrikant Sharat   Fix #12. Local bu...
206
207
208
209
          location="$(-antigen-get-clone-dir "$url")/$loc"
      else
          location="$url"
      fi
e5dfac7ea   Shrikant Sharat   Initial commit. W...
210

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

d535ba468   Shrikant Sharat   Introduced a new ...
213
214
215
          # Of course, if its a theme, the location would point to the script
          # file.
          source "$location"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
216

d535ba468   Shrikant Sharat   Introduced a new ...
217
      else
e5dfac7ea   Shrikant Sharat   Initial commit. W...
218

7af602dae   Shrikant Sharat   Minor comment edi...
219
          # Source the plugin script.
d535ba468   Shrikant Sharat   Introduced a new ...
220
221
          # FIXME: I don't know. Looks very very ugly. Needs a better
          # implementation once tests are ready.
cd68a349f   Shrikant Sharat   Fix update to zsh...
222
          local script_loc="$(ls "$location" | grep -m1 '\.plugin\.zsh$')"
499c0dd5d   Shrikant Sharat   Added some comments.
223

d535ba468   Shrikant Sharat   Introduced a new ...
224
225
226
          if [[ -f $script_loc ]]; then
              # If we have a `*.plugin.zsh`, source it.
              source "$script_loc"
499c0dd5d   Shrikant Sharat   Added some comments.
227

cd68a349f   Shrikant Sharat   Fix update to zsh...
228
          elif [[ ! -z "$(ls "$location" | grep -m1 '\.zsh$')" ]]; then
d535ba468   Shrikant Sharat   Introduced a new ...
229
230
              # If there is no `*.plugin.zsh` file, source *all* the `*.zsh`
              # files.
cd68a349f   Shrikant Sharat   Fix update to zsh...
231
              for script ($location/*.zsh(N)) source "$script"
499c0dd5d   Shrikant Sharat   Added some comments.
232

cd68a349f   Shrikant Sharat   Fix update to zsh...
233
          elif [[ ! -z "$(ls "$location" | grep -m1 '\.sh$')" ]]; then
17f8e971e   Shrikant Sharat   Work with non zsh...
234
235
              # If there are no `*.zsh` files either, we look for and source any
              # `*.sh` files instead.
cd68a349f   Shrikant Sharat   Fix update to zsh...
236
              for script ($location/*.sh(N)) source "$script"
499c0dd5d   Shrikant Sharat   Added some comments.
237

d535ba468   Shrikant Sharat   Introduced a new ...
238
          fi
499c0dd5d   Shrikant Sharat   Added some comments.
239
          # Add to $fpath, for completion(s).
d535ba468   Shrikant Sharat   Introduced a new ...
240
241
242
          fpath=($location $fpath)
  
      fi
e5dfac7ea   Shrikant Sharat   Initial commit. W...
243

e5dfac7ea   Shrikant Sharat   Initial commit. W...
244
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
245
  antigen-cleanup () {
0b32bec27   Shrikant Sharat   bundle-cleanup co...
246

499c0dd5d   Shrikant Sharat   Added some comments.
247
      # Cleanup unused repositories.
1f541f429   Shrikant Sharat   Add --force argum...
248
249
250
251
      local force=false
      if [[ $1 == --force ]]; then
          force=true
      fi
0b32bec27   Shrikant Sharat   bundle-cleanup co...
252
253
254
255
256
257
258
      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...
259
260
261
          <(-antigen-echo-record |
              awk '$4 == "true" {print $1}' |
              while read line; do
a5e21a6a1   Shrikant Sharat   Do comparisons wi...
262
                  -antigen-get-clone-dir "$line"
0b4fbaaf6   Shrikant Sharat   Get rid of backsl...
263
264
              done |
              sort -u) \
a5e21a6a1   Shrikant Sharat   Do comparisons wi...
265
          <(ls -d "$ADOTDIR/repos/"* | sort -u))"
0b32bec27   Shrikant Sharat   bundle-cleanup co...
266
267
268
269
270
271
272
  
      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...
273
274
      echo "$unused_clones" |
          while read line; do
a5e21a6a1   Shrikant Sharat   Do comparisons wi...
275
              -antigen-get-clone-url "$line"
0b4fbaaf6   Shrikant Sharat   Get rid of backsl...
276
277
          done |
          sed -e 's/^/  /' -e 's/|/, branch /'
0b32bec27   Shrikant Sharat   bundle-cleanup co...
278

1f541f429   Shrikant Sharat   Add --force argum...
279
280
      if $force || (echo -n '
  Delete them all? [y/N] '; read -q); then
0b32bec27   Shrikant Sharat   bundle-cleanup co...
281
282
          echo
          echo
759e381e1   Shrikant Sharat   Refactor variable...
283
          echo "$unused_clones" | while read line; do
a5e21a6a1   Shrikant Sharat   Do comparisons wi...
284
285
              echo -n "Deleting clone for $(-antigen-get-clone-url "$line")..."
              rm -rf "$line"
0b32bec27   Shrikant Sharat   bundle-cleanup co...
286
287
288
289
290
291
292
              echo ' done.'
          done
      else
          echo
          echo Nothing deleted.
      fi
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
293
294
  antigen-lib () {
      antigen-bundle --loc=lib
e5dfac7ea   Shrikant Sharat   Initial commit. W...
295
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
296
  antigen-theme () {
0c257ebe4   Shrikant Sharat   For #29. Intial w...
297
298
299
300
301
302
303
304
305
306
307
  
      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...
308
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
309
  antigen-apply () {
e5dfac7ea   Shrikant Sharat   Initial commit. W...
310
      # Initialize completion.
a91386310   Shrikant Sharat   Add a todo note o...
311
312
      # TODO: Only load completions if there are any changes to the bundle
      # repositories.
e5dfac7ea   Shrikant Sharat   Initial commit. W...
313
314
      compinit -i
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
315
  antigen-list () {
7af602dae   Shrikant Sharat   Minor comment edi...
316
      # List all currently installed bundles.
9dc631003   Shrikant Sharat   Rename bundle rec...
317
      if [[ -z "$_ANTIGEN_BUNDLE_RECORD" ]]; then
df942673b   Shrikant Sharat   Added bundle-list...
318
319
320
          echo "You don't have any bundles." >&2
          return 1
      else
3aa0d2d8a   Shrikant Sharat   Fix duplicate ent...
321
          -antigen-echo-record | sort -u
df942673b   Shrikant Sharat   Added bundle-list...
322
323
      fi
  }
d36c6f93d   Shrikant Sharat   Implemented `anti...
324
325
326
327
328
329
330
331
332
  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>
      local snapshot_content="$(-antigen-echo-record | sed 's/ .*$//' | sort -u |
          while read url; do
2c2f91c92   Shrikant Sharat   Added `antigen-re...
333
334
335
              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...
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
          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.
          local checksum="$(echo "$snapshot_content" | md5sum)"
          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...
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
  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
                  git clone "$url" "$clone_dir" > /dev/null
              fi
  
              (cd "$clone_dir" && git checkout $version_hash) 2> /dev/null
  
          done
  
      echo ' done.'
      echo 'Please open a new shell to get the restored changes.'
  }
fee42de18   Shrikant Sharat   Add a small antig...
394
395
396
397
398
399
400
  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...
401
402
403
404
405
406
407
  # 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"
      shift
      "antigen-$cmd" "$@"
  }
cffa56ed7   Shrikant Sharat   Added function to...
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
  -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 ...
435
      # Sanitize the spec
620c89d5b   Shrikant Sharat   Remove use of the...
436
437
      spec="$(echo "$spec" | tr '
  ' ' ' | sed 's/[[:space:]]//g')"
7a2ca5936   Shrikant Sharat   Allow whitespace ...
438

cffa56ed7   Shrikant Sharat   Added function to...
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
      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
      while ! [[ -z $1 || $1 == --* ]]; do
  
          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"
9d1b71736   Shrikant Sharat   Detect repeated a...
464
465
466
467
          if echo "$code" | grep -qm1 "^local $name="; then
              echo "Argument '$name' repeated with the value '$value'". >&2
              return
          fi
cffa56ed7   Shrikant Sharat   Added function to...
468
469
470
471
472
          --add-var $name "$value"
  
          shift
          i=$(($i + 1))
      done
973558eee   Shrikant Sharat   Support positiona...
473
      local keyword_args="$(
6d333dfa0   Shrikant Sharat   Fix #20. Using `s...
474
475
476
477
478
479
480
481
482
483
484
485
              # 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...
486
487
488
              echo "$spec" | cut -d\; -f2 | tr , '
  '
              )"
cffa56ed7   Shrikant Sharat   Added function to...
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
      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
9d1b71736   Shrikant Sharat   Detect repeated a...
505
506
507
508
          if echo "$code" | grep -qm1 "^local $name="; then
              echo "Argument '$name' repeated with the value '$value'". >&2
              return
          fi
cffa56ed7   Shrikant Sharat   Added function to...
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
          # The specification for this argument, used for validations.
          local arg_line="$(echo "$keyword_args" | grep -m1 "^$name:\??\?")"
  
          # Validate argument and value.
          if [[ -z $arg_line ]]; then
              # This argument is not known to us.
              echo "Unknown argument '$name'." >&2
              return
  
          elif (echo "$arg_line" | grep -qm1 ':') && [[ -z $value ]]; then
              # This argument needs a value, but is not provided.
              echo "Required argument for '$name' not provided." >&2
              return
  
          elif (echo "$arg_line" | grep -vqm1 ':') && [[ ! -z $value ]]; then
              # 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.
543
544
  # 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...
545
  -antigen-echo-record () {
9dc631003   Shrikant Sharat   Rename bundle rec...
546
      echo "$_ANTIGEN_BUNDLE_RECORD" | sed -n '1!p'
e5dfac7ea   Shrikant Sharat   Initial commit. W...
547
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
548
  -antigen-env-setup () {
7af602dae   Shrikant Sharat   Minor comment edi...
549
      # Pre-startup initializations.
e5dfac7ea   Shrikant Sharat   Initial commit. W...
550
551
      -set-default ANTIGEN_DEFAULT_REPO_URL \
          https://github.com/robbyrussell/oh-my-zsh.git
911cc8cb5   Shrikant Sharat   Use ADOTDIR as th...
552
      -set-default ADOTDIR $HOME/.antigen
3047bfeb7   Shrikant Sharat   Load compinit at ...
553

7af602dae   Shrikant Sharat   Minor comment edi...
554
      # Load the compinit module.
3047bfeb7   Shrikant Sharat   Load compinit at ...
555
556
557
558
      autoload -U compinit
  
      # Without the following, `compdef` function is not defined.
      compinit -i
40deb795b   Shrikant Sharat   Add completion de...
559
560
  
      compdef _antigen antigen
e5dfac7ea   Shrikant Sharat   Initial commit. W...
561
562
563
564
565
  }
  
  # Same as `export $1=$2`, but will only happen if the name specified by `$1` is
  # not already set.
  -set-default () {
43bb2cef1   Shrikant Sharat   Variable declarat...
566
567
      local arg_name="$1"
      local arg_value="$2"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
568
569
      eval "test -z \"\$$arg_name\" && export $arg_name='$arg_value'"
  }
84c855441   Guilherme Espada   Half-fix #26
570
  # Setup antigen's autocompletion
b69ad8866   Shrikant Sharat   Fix code formatti...
571
572
573
574
575
576
577
578
579
580
581
582
  _antigen () {
      compadd \
          bundle\
          bundles\
          update\
          revert\
          list\
          cleanup\
          lib\
          theme\
          apply\
          help
84c855441   Guilherme Espada   Half-fix #26
583
  }
b69ad8866   Shrikant Sharat   Fix code formatti...
584
  -antigen-env-setup