Blame view

antigen.zsh 9.66 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.
a12d3140a   Shrikant Sharat   Removed bundle-in...
5
  # <repo-url>, <plugin-location>, <bundle-type>
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=
d535ba468   Shrikant Sharat   Introduced a new ...
19
      local btype=plugin
e5dfac7ea   Shrikant Sharat   Initial commit. W...
20
21
  
      # Set spec values based on the positional arguments.
280ec4481   Shrikant Sharat   name argument for...
22
      local position_args='url loc'
e5dfac7ea   Shrikant Sharat   Initial commit. W...
23
24
      local i=1
      while ! [[ -z $1 || $1 == --*=* ]]; do
43bb2cef1   Shrikant Sharat   Variable declarat...
25
26
          local arg_name="$(echo "$position_args" | cut -d\  -f$i)"
          local arg_value="$1"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
27
28
29
30
          eval "local $arg_name='$arg_value'"
          shift
          i=$(($i + 1))
      done
1abf1faf6   Shrikant Sharat   Plugins can be sp...
31
32
33
34
35
      # 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...
36
37
38
      # Set spec values from keyword arguments, if any. The remaining arguments
      # are all assumed to be keyword arguments.
      while [[ $1 == --*=* ]]; do
43bb2cef1   Shrikant Sharat   Variable declarat...
39
40
          local arg_name="$(echo "$1" | cut -d= -f1 | sed 's/^--//')"
          local arg_value="$(echo "$1" | cut -d= -f2)"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
41
42
43
44
45
          eval "local $arg_name='$arg_value'"
          shift
      done
  
      # Resolve the url.
39379a878   Shrikant Sharat   Move url resolvin...
46
      url="$(-antigen-resolve-bundle-url "$url")"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
47

2923c490c   Shrikant Sharat   Branch informatio...
48
49
50
51
      # Add the branch information to the url.
      if [[ ! -z $branch ]]; then
          url="$url|$branch"
      fi
e5dfac7ea   Shrikant Sharat   Initial commit. W...
52
      # Add it to the record.
2923c490c   Shrikant Sharat   Branch informatio...
53
54
      _ANTIGEN_BUNDLE_RECORD="$_ANTIGEN_BUNDLE_RECORD
  $url $loc $btype"
a12d3140a   Shrikant Sharat   Removed bundle-in...
55

499c0dd5d   Shrikant Sharat   Added some comments.
56
      # Ensure a clone exists for this repo.
2923c490c   Shrikant Sharat   Branch informatio...
57
      -antigen-ensure-repo "$url"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
58

499c0dd5d   Shrikant Sharat   Added some comments.
59
      # Load the plugin.
2923c490c   Shrikant Sharat   Branch informatio...
60
      -antigen-load "$url" "$loc" "$btype"
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
61

a12d3140a   Shrikant Sharat   Removed bundle-in...
62
  }
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
63

39379a878   Shrikant Sharat   Move url resolvin...
64
65
66
67
68
  -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"
1cae4fc91   Shrikant Sharat   Some refactoring ...
69
      # Expand short github url syntax: `username/reponame`
60fa053ec   Shrikant Sharat   Add tests for url...
70
71
72
73
74
      if [[ $url != git://* && \
              $url != https://* && \
              $url != /* && \
              $url != git@github.com:*/*
              ]]; then
1cae4fc91   Shrikant Sharat   Some refactoring ...
75
          url="https://github.com/${url%.git}.git"
39379a878   Shrikant Sharat   Move url resolvin...
76
77
78
79
      fi
  
      echo "$url"
  }
3c5ff1c1e   Shrikant Sharat   Add antigen-bundl...
80
81
82
83
84
85
  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...
86
      grep -v '^\s*$\|^#' | while read line; do
3c5ff1c1e   Shrikant Sharat   Add antigen-bundl...
87
88
89
90
91
          # 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...
92
  antigen-update () {
158407151   Shrikant Sharat   Refactoring of pr...
93
      # Update your bundles, i.e., `git pull` in all the plugin repos.
8d0d219d6   Shrikant Sharat   Fix #9 Update com...
94
      -antigen-echo-record \
2923c490c   Shrikant Sharat   Branch informatio...
95
          | awk '{print $1}' \
8d0d219d6   Shrikant Sharat   Fix #9 Update com...
96
          | sort -u \
2923c490c   Shrikant Sharat   Branch informatio...
97
          | while read url; do
5d199ab20   Shrikant Sharat   Print the repo ur...
98
              echo "**** Pulling $url"
0912ba472   Shrikant Sharat   Print a summary o...
99
              -antigen-ensure-repo --update --verbose "$url"
5d199ab20   Shrikant Sharat   Print the repo ur...
100
              echo
8d0d219d6   Shrikant Sharat   Fix #9 Update com...
101
          done
158407151   Shrikant Sharat   Refactoring of pr...
102
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
103
  -antigen-get-clone-dir () {
a12d3140a   Shrikant Sharat   Removed bundle-in...
104
105
106
      # Takes a repo url and gives out the path that this url needs to be cloned
      # to. Doesn't actually clone anything.
      # TODO: Memoize?
843297b20   Shrikant Sharat   Initial implement...
107

2923c490c   Shrikant Sharat   Branch informatio...
108
109
      # The url given.
      local url="$1"
843297b20   Shrikant Sharat   Initial implement...
110

499c0dd5d   Shrikant Sharat   Added some comments.
111
112
      # Echo the full path to the clone directory.
      echo -n $ADOTDIR/repos/
2923c490c   Shrikant Sharat   Branch informatio...
113
      echo "$url" | sed \
a12d3140a   Shrikant Sharat   Removed bundle-in...
114
          -e 's./.-SLASH-.g' \
843297b20   Shrikant Sharat   Initial implement...
115
116
          -e 's.:.-COLON-.g' \
          -e 's.|.-PIPE-.g'
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
117
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
118
  -antigen-get-clone-url () {
0b32bec27   Shrikant Sharat   bundle-cleanup co...
119
120
121
122
123
      # Takes a repo's clone dir and gives out the repo's original url that was
      # used to create the given directory path.
      # TODO: Memoize?
      echo "$1" | sed \
          -e "s:^$ADOTDIR/repos/::" \
0b32bec27   Shrikant Sharat   bundle-cleanup co...
124
          -e 's.-SLASH-./.g' \
843297b20   Shrikant Sharat   Initial implement...
125
          -e 's.-COLON-.:.g' \
a5e21a6a1   Shrikant Sharat   Do comparisons wi...
126
          -e 's.-PIPE-.|.g'
0b32bec27   Shrikant Sharat   bundle-cleanup co...
127
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
128
  -antigen-ensure-repo () {
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
129

499c0dd5d   Shrikant Sharat   Added some comments.
130
131
132
      # 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...
133
      # Argument defaults.
499c0dd5d   Shrikant Sharat   Added some comments.
134
      # Check if we have to update.
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
135
      local update=false
c1479baff   Shrikant Sharat   Accept a --verbos...
136
137
138
139
140
141
      # Verbose output.
      local verbose=false
  
      # Load any boolean arguments specified.
      while [[ $1 == --* ]]; do
          eval "local '${1#--}=true'"
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
142
          shift
c1479baff   Shrikant Sharat   Accept a --verbos...
143
      done
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
144

499c0dd5d   Shrikant Sharat   Added some comments.
145
      # Get the clone's directory as per the given repo url and branch.
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
146
      local url="$1"
2923c490c   Shrikant Sharat   Branch informatio...
147
      local clone_dir="$(-antigen-get-clone-dir $url)"
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
148

499c0dd5d   Shrikant Sharat   Added some comments.
149
      # Clone if it doesn't already exist.
aa510273d   Shrikant Sharat   Removed useless l...
150
      if [[ ! -d $clone_dir ]]; then
2923c490c   Shrikant Sharat   Branch informatio...
151
          git clone "${url%|*}" "$clone_dir"
aa510273d   Shrikant Sharat   Removed useless l...
152
      elif $update; then
0912ba472   Shrikant Sharat   Print a summary o...
153
154
155
          # Save current revision.
          old_rev="$(git --git-dir "$clone_dir/.git" --work-tree "$clone_dir" \
              rev-parse HEAD)"
499c0dd5d   Shrikant Sharat   Added some comments.
156
          # Pull changes if update requested.
0912ba472   Shrikant Sharat   Print a summary o...
157
158
159
160
161
          git --git-dir "$clone_dir/.git" --work-tree "$clone_dir" \
              pull
          # Get the new revision.
          new_rev="$(git --git-dir "$clone_dir/.git" --work-tree "$clone_dir" \
              rev-parse HEAD)"
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
162
      fi
499c0dd5d   Shrikant Sharat   Added some comments.
163
      # If its a specific branch that we want, checkout that branch.
2923c490c   Shrikant Sharat   Branch informatio...
164
      if [[ $url == *\|* ]]; then
843297b20   Shrikant Sharat   Initial implement...
165
          git --git-dir "$clone_dir/.git" --work-tree "$clone_dir" \
2923c490c   Shrikant Sharat   Branch informatio...
166
              checkout "${url#*|}"
843297b20   Shrikant Sharat   Initial implement...
167
      fi
0912ba472   Shrikant Sharat   Print a summary o...
168
169
170
171
172
173
174
      if ! [[ -z $old_rev || $old_rev == $new_rev ]]; then
          echo Updated from ${old_rev:0:7} to ${new_rev:0:7}.
          if $verbose; then
              git --git-dir "$clone_dir/.git" --work-tree "$clone_dir" \
                  log --oneline --reverse --no-merges --stat '@{1}..'
          fi
      fi
e5dfac7ea   Shrikant Sharat   Initial commit. W...
175
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
176
  -antigen-load () {
e5dfac7ea   Shrikant Sharat   Initial commit. W...
177

a12d3140a   Shrikant Sharat   Removed bundle-in...
178
      local url="$1"
843297b20   Shrikant Sharat   Initial implement...
179
      local loc="$2"
a12d3140a   Shrikant Sharat   Removed bundle-in...
180
      local btype="$3"
843297b20   Shrikant Sharat   Initial implement...
181

499c0dd5d   Shrikant Sharat   Added some comments.
182
      # The full location where the plugin is located.
2923c490c   Shrikant Sharat   Branch informatio...
183
      local location="$(-antigen-get-clone-dir "$url")/$loc"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
184

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

d535ba468   Shrikant Sharat   Introduced a new ...
187
188
189
          # Of course, if its a theme, the location would point to the script
          # file.
          source "$location"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
190

d535ba468   Shrikant Sharat   Introduced a new ...
191
      else
e5dfac7ea   Shrikant Sharat   Initial commit. W...
192

d535ba468   Shrikant Sharat   Introduced a new ...
193
194
195
          # Source the plugin script
          # FIXME: I don't know. Looks very very ugly. Needs a better
          # implementation once tests are ready.
cd68a349f   Shrikant Sharat   Fix update to zsh...
196
          local script_loc="$(ls "$location" | grep -m1 '\.plugin\.zsh$')"
499c0dd5d   Shrikant Sharat   Added some comments.
197

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

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

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

d535ba468   Shrikant Sharat   Introduced a new ...
212
          fi
499c0dd5d   Shrikant Sharat   Added some comments.
213
          # Add to $fpath, for completion(s).
d535ba468   Shrikant Sharat   Introduced a new ...
214
215
216
          fpath=($location $fpath)
  
      fi
e5dfac7ea   Shrikant Sharat   Initial commit. W...
217

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

499c0dd5d   Shrikant Sharat   Added some comments.
221
      # Cleanup unused repositories.
1f541f429   Shrikant Sharat   Add --force argum...
222
223
224
225
      local force=false
      if [[ $1 == --force ]]; then
          force=true
      fi
0b32bec27   Shrikant Sharat   bundle-cleanup co...
226
227
228
229
230
231
232
      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 \
a5e21a6a1   Shrikant Sharat   Do comparisons wi...
233
234
          <(-antigen-echo-record \
              | awk '{print $1}' \
b2523d4be   Shrikant Sharat   Fix -cleanup list...
235
              | while read line; do
a5e21a6a1   Shrikant Sharat   Do comparisons wi...
236
                  -antigen-get-clone-dir "$line"
72fae27c8   Shrikant Sharat   Inputs to `comm` ...
237
              done \
a5e21a6a1   Shrikant Sharat   Do comparisons wi...
238
239
              | sort -u) \
          <(ls -d "$ADOTDIR/repos/"* | sort -u))"
0b32bec27   Shrikant Sharat   bundle-cleanup co...
240
241
242
243
244
245
246
  
      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.'
843297b20   Shrikant Sharat   Initial implement...
247
      echo "$unused_clones" \
a5e21a6a1   Shrikant Sharat   Do comparisons wi...
248
249
250
          | while read line; do
              -antigen-get-clone-url "$line"
          done \
843297b20   Shrikant Sharat   Initial implement...
251
          | sed -e 's/^/  /' -e 's/|/, branch /'
0b32bec27   Shrikant Sharat   bundle-cleanup co...
252

1f541f429   Shrikant Sharat   Add --force argum...
253
254
      if $force || (echo -n '
  Delete them all? [y/N] '; read -q); then
0b32bec27   Shrikant Sharat   bundle-cleanup co...
255
256
          echo
          echo
759e381e1   Shrikant Sharat   Refactor variable...
257
          echo "$unused_clones" | while read line; do
a5e21a6a1   Shrikant Sharat   Do comparisons wi...
258
259
              echo -n "Deleting clone for $(-antigen-get-clone-url "$line")..."
              rm -rf "$line"
0b32bec27   Shrikant Sharat   bundle-cleanup co...
260
261
262
263
264
265
266
              echo ' done.'
          done
      else
          echo
          echo Nothing deleted.
      fi
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
267
268
  antigen-lib () {
      antigen-bundle --loc=lib
e5dfac7ea   Shrikant Sharat   Initial commit. W...
269
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
270
  antigen-theme () {
e5dfac7ea   Shrikant Sharat   Initial commit. W...
271
      local name="${1:-robbyrussell}"
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
272
      antigen-bundle --loc=themes/$name.zsh-theme --btype=theme
e5dfac7ea   Shrikant Sharat   Initial commit. W...
273
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
274
  antigen-apply () {
e5dfac7ea   Shrikant Sharat   Initial commit. W...
275
      # Initialize completion.
a91386310   Shrikant Sharat   Add a todo note o...
276
277
      # TODO: Only load completions if there are any changes to the bundle
      # repositories.
e5dfac7ea   Shrikant Sharat   Initial commit. W...
278
279
      compinit -i
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
280
  antigen-list () {
df942673b   Shrikant Sharat   Added bundle-list...
281
      # List all currently installed bundles
9dc631003   Shrikant Sharat   Rename bundle rec...
282
      if [[ -z "$_ANTIGEN_BUNDLE_RECORD" ]]; then
df942673b   Shrikant Sharat   Added bundle-list...
283
284
285
          echo "You don't have any bundles." >&2
          return 1
      else
3aa0d2d8a   Shrikant Sharat   Fix duplicate ent...
286
          -antigen-echo-record | sort -u
df942673b   Shrikant Sharat   Added bundle-list...
287
288
      fi
  }
fee42de18   Shrikant Sharat   Add a small antig...
289
290
291
292
293
294
295
  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...
296
297
298
299
300
301
302
  # 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" "$@"
  }
bc9d20c7a   Shrikant Sharat   Add comments.
303
304
  # 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...
305
  -antigen-echo-record () {
9dc631003   Shrikant Sharat   Rename bundle rec...
306
      echo "$_ANTIGEN_BUNDLE_RECORD" | sed -n '1!p'
e5dfac7ea   Shrikant Sharat   Initial commit. W...
307
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
308
  -antigen-env-setup () {
3047bfeb7   Shrikant Sharat   Load compinit at ...
309
      # Pre-startup initializations
e5dfac7ea   Shrikant Sharat   Initial commit. W...
310
311
      -set-default ANTIGEN_DEFAULT_REPO_URL \
          https://github.com/robbyrussell/oh-my-zsh.git
911cc8cb5   Shrikant Sharat   Use ADOTDIR as th...
312
      -set-default ADOTDIR $HOME/.antigen
3047bfeb7   Shrikant Sharat   Load compinit at ...
313
314
315
316
317
318
  
      # Load the compinit module
      autoload -U compinit
  
      # Without the following, `compdef` function is not defined.
      compinit -i
e5dfac7ea   Shrikant Sharat   Initial commit. W...
319
320
321
322
323
  }
  
  # 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...
324
325
      local arg_name="$1"
      local arg_value="$2"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
326
327
      eval "test -z \"\$$arg_name\" && export $arg_name='$arg_value'"
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
328
  -antigen-env-setup