Blame view

antigen.zsh 8.68 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=/
843297b20   Shrikant Sharat   Initial implement...
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.
8110fb2f2   Shrikant Sharat   Add support for a...
46
      if [[ $url != git://* && $url != https://* && $url != /* ]]; then
bb140864c   Shrikant Sharat   The plugin name s...
47
          url="${url%.git}"
bb140864c   Shrikant Sharat   The plugin name s...
48
          url="https://github.com/$url.git"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
49
      fi
e5dfac7ea   Shrikant Sharat   Initial commit. W...
50
      # Add it to the record.
843297b20   Shrikant Sharat   Initial implement...
51
52
      _ANTIGEN_BUNDLE_RECORD="$_ANTIGEN_BUNDLE_RECORD
  $url $loc $btype $branch"
a12d3140a   Shrikant Sharat   Removed bundle-in...
53

499c0dd5d   Shrikant Sharat   Added some comments.
54
      # Ensure a clone exists for this repo.
843297b20   Shrikant Sharat   Initial implement...
55
      -antigen-ensure-repo "$url" "$branch"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
56

499c0dd5d   Shrikant Sharat   Added some comments.
57
      # Load the plugin.
843297b20   Shrikant Sharat   Initial implement...
58
      -antigen-load "$url" "$loc" "$btype" "$branch"
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
59

a12d3140a   Shrikant Sharat   Removed bundle-in...
60
  }
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
61

3c5ff1c1e   Shrikant Sharat   Add antigen-bundl...
62
63
64
65
66
67
  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...
68
      grep -v '^\s*$\|^#' | while read line; do
3c5ff1c1e   Shrikant Sharat   Add antigen-bundl...
69
70
71
72
73
          # 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...
74
  antigen-update () {
158407151   Shrikant Sharat   Refactoring of pr...
75
      # Update your bundles, i.e., `git pull` in all the plugin repos.
8d0d219d6   Shrikant Sharat   Fix #9 Update com...
76
77
78
79
80
81
      -antigen-echo-record \
          | awk '{print $1 "|" $4}' \
          | sort -u \
          | while read url_line; do
              -antigen-ensure-repo --update "${url_line%|*}" "${url_line#*|}"
          done
158407151   Shrikant Sharat   Refactoring of pr...
82
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
83
  -antigen-get-clone-dir () {
a12d3140a   Shrikant Sharat   Removed bundle-in...
84
85
86
      # 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...
87
88
      local url="$1"
      local branch="$2"
843297b20   Shrikant Sharat   Initial implement...
89

499c0dd5d   Shrikant Sharat   Added some comments.
90
91
      # The branched_url will be the same as the url itself, unless there is no
      # branch specified.
843297b20   Shrikant Sharat   Initial implement...
92
      local branched_url="$url"
499c0dd5d   Shrikant Sharat   Added some comments.
93
94
      # If a branch is specified, i.e., branch is not `-`, append it to the url,
      # separating with a pipe character.
843297b20   Shrikant Sharat   Initial implement...
95
96
97
      if [[ "$branch" != - ]]; then
          branched_url="$branched_url|$branch"
      fi
499c0dd5d   Shrikant Sharat   Added some comments.
98
99
      # Echo the full path to the clone directory.
      echo -n $ADOTDIR/repos/
843297b20   Shrikant Sharat   Initial implement...
100
      echo "$branched_url" | sed \
a12d3140a   Shrikant Sharat   Removed bundle-in...
101
102
          -e 's/\.git$//' \
          -e 's./.-SLASH-.g' \
843297b20   Shrikant Sharat   Initial implement...
103
104
          -e 's.:.-COLON-.g' \
          -e 's.|.-PIPE-.g'
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
105
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
106
  -antigen-get-clone-url () {
0b32bec27   Shrikant Sharat   bundle-cleanup co...
107
108
109
110
111
112
113
      # 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/::" \
          -e 's/$/.git/' \
          -e 's.-SLASH-./.g' \
843297b20   Shrikant Sharat   Initial implement...
114
115
          -e 's.-COLON-.:.g' \
          -e 's.-PIPE-.|.g'
0b32bec27   Shrikant Sharat   bundle-cleanup co...
116
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
117
  -antigen-ensure-repo () {
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
118

499c0dd5d   Shrikant Sharat   Added some comments.
119
120
121
122
123
      # 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.
  
      # Check if we have to update.
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
124
125
126
127
128
      local update=false
      if [[ $1 == --update ]]; then
          update=true
          shift
      fi
499c0dd5d   Shrikant Sharat   Added some comments.
129
      # Get the clone's directory as per the given repo url and branch.
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
130
      local url="$1"
843297b20   Shrikant Sharat   Initial implement...
131
132
      local branch="$2"
      local clone_dir="$(-antigen-get-clone-dir $url $branch)"
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
133

499c0dd5d   Shrikant Sharat   Added some comments.
134
      # Clone if it doesn't already exist.
aa510273d   Shrikant Sharat   Removed useless l...
135
136
137
      if [[ ! -d $clone_dir ]]; then
          git clone "$url" "$clone_dir"
      elif $update; then
499c0dd5d   Shrikant Sharat   Added some comments.
138
          # Pull changes if update requested.
aa1012e7f   Shrikant Sharat   Fix #4. Updated f...
139
          git --git-dir "$clone_dir/.git" --work-tree "$clone_dir" pull
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
140
      fi
499c0dd5d   Shrikant Sharat   Added some comments.
141
      # If its a specific branch that we want, checkout that branch.
843297b20   Shrikant Sharat   Initial implement...
142
143
144
145
      if [[ "$branch" != - ]]; then
          git --git-dir "$clone_dir/.git" --work-tree "$clone_dir" \
              checkout "$branch"
      fi
e5dfac7ea   Shrikant Sharat   Initial commit. W...
146
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
147
  -antigen-load () {
e5dfac7ea   Shrikant Sharat   Initial commit. W...
148

a12d3140a   Shrikant Sharat   Removed bundle-in...
149
      local url="$1"
843297b20   Shrikant Sharat   Initial implement...
150
      local loc="$2"
a12d3140a   Shrikant Sharat   Removed bundle-in...
151
      local btype="$3"
843297b20   Shrikant Sharat   Initial implement...
152
      local branch="$4"
499c0dd5d   Shrikant Sharat   Added some comments.
153
      # The full location where the plugin is located.
843297b20   Shrikant Sharat   Initial implement...
154
      local location="$(-antigen-get-clone-dir "$url" "$branch")/$loc"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
155

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

d535ba468   Shrikant Sharat   Introduced a new ...
158
159
160
          # Of course, if its a theme, the location would point to the script
          # file.
          source "$location"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
161

d535ba468   Shrikant Sharat   Introduced a new ...
162
      else
e5dfac7ea   Shrikant Sharat   Initial commit. W...
163

d535ba468   Shrikant Sharat   Introduced a new ...
164
165
166
167
          # Source the plugin script
          # FIXME: I don't know. Looks very very ugly. Needs a better
          # implementation once tests are ready.
          local script_loc="$(ls "$location" | grep -m1 '.plugin.zsh$')"
499c0dd5d   Shrikant Sharat   Added some comments.
168

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

d535ba468   Shrikant Sharat   Introduced a new ...
173
174
175
176
          elif [[ ! -z "$(ls "$location" | grep -m1 '.zsh$')" ]]; then
              # If there is no `*.plugin.zsh` file, source *all* the `*.zsh`
              # files.
              for script ($location/*.zsh) source "$script"
499c0dd5d   Shrikant Sharat   Added some comments.
177

17f8e971e   Shrikant Sharat   Work with non zsh...
178
179
180
181
          elif [[ ! -z "$(ls "$location" | grep -m1 '.sh$')" ]]; then
              # If there are no `*.zsh` files either, we look for and source any
              # `*.sh` files instead.
              for script ($location/*.sh) source "$script"
499c0dd5d   Shrikant Sharat   Added some comments.
182

d535ba468   Shrikant Sharat   Introduced a new ...
183
          fi
499c0dd5d   Shrikant Sharat   Added some comments.
184
          # Add to $fpath, for completion(s).
d535ba468   Shrikant Sharat   Introduced a new ...
185
186
187
          fpath=($location $fpath)
  
      fi
e5dfac7ea   Shrikant Sharat   Initial commit. W...
188

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

499c0dd5d   Shrikant Sharat   Added some comments.
192
      # Cleanup unused repositories.
0b32bec27   Shrikant Sharat   bundle-cleanup co...
193
194
195
196
197
198
199
      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 \
843297b20   Shrikant Sharat   Initial implement...
200
          <(-antigen-echo-record | awk '{print $1 "|" $4}' | sort -u) \
0b32bec27   Shrikant Sharat   bundle-cleanup co...
201
          <(ls "$ADOTDIR/repos" | while read line; do
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
202
                  -antigen-get-clone-url "$line"
0b32bec27   Shrikant Sharat   bundle-cleanup co...
203
204
205
206
207
208
209
210
              done))"
  
      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...
211
212
      echo "$unused_clones" \
          | sed -e 's/^/  /' -e 's/|/, branch /'
0b32bec27   Shrikant Sharat   bundle-cleanup co...
213
214
215
216
217
218
219
220
  
      echo -n '
  Delete them all? [y/N] '
      if read -q; then
          echo
          echo
          echo "$unused_clones" | while read url; do
              echo -n "Deleting clone for $url..."
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
221
              rm -rf "$(-antigen-get-clone-dir $url)"
0b32bec27   Shrikant Sharat   bundle-cleanup co...
222
223
224
225
226
227
228
              echo ' done.'
          done
      else
          echo
          echo Nothing deleted.
      fi
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
229
230
  antigen-lib () {
      antigen-bundle --loc=lib
e5dfac7ea   Shrikant Sharat   Initial commit. W...
231
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
232
  antigen-theme () {
e5dfac7ea   Shrikant Sharat   Initial commit. W...
233
      local name="${1:-robbyrussell}"
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
234
      antigen-bundle --loc=themes/$name.zsh-theme --btype=theme
e5dfac7ea   Shrikant Sharat   Initial commit. W...
235
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
236
  antigen-apply () {
e5dfac7ea   Shrikant Sharat   Initial commit. W...
237
      # Initialize completion.
a91386310   Shrikant Sharat   Add a todo note o...
238
239
      # TODO: Only load completions if there are any changes to the bundle
      # repositories.
e5dfac7ea   Shrikant Sharat   Initial commit. W...
240
241
      compinit -i
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
242
  antigen-list () {
df942673b   Shrikant Sharat   Added bundle-list...
243
      # List all currently installed bundles
9dc631003   Shrikant Sharat   Rename bundle rec...
244
      if [[ -z "$_ANTIGEN_BUNDLE_RECORD" ]]; then
df942673b   Shrikant Sharat   Added bundle-list...
245
246
247
          echo "You don't have any bundles." >&2
          return 1
      else
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
248
          -antigen-echo-record
df942673b   Shrikant Sharat   Added bundle-list...
249
250
      fi
  }
fee42de18   Shrikant Sharat   Add a small antig...
251
252
253
254
255
256
257
  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...
258
259
260
261
262
263
264
  # 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.
265
266
  # 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...
267
  -antigen-echo-record () {
9dc631003   Shrikant Sharat   Rename bundle rec...
268
      echo "$_ANTIGEN_BUNDLE_RECORD" | sed -n '1!p'
e5dfac7ea   Shrikant Sharat   Initial commit. W...
269
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
270
  -antigen-env-setup () {
3047bfeb7   Shrikant Sharat   Load compinit at ...
271
      # Pre-startup initializations
e5dfac7ea   Shrikant Sharat   Initial commit. W...
272
273
      -set-default ANTIGEN_DEFAULT_REPO_URL \
          https://github.com/robbyrussell/oh-my-zsh.git
911cc8cb5   Shrikant Sharat   Use ADOTDIR as th...
274
      -set-default ADOTDIR $HOME/.antigen
3047bfeb7   Shrikant Sharat   Load compinit at ...
275
276
277
278
279
280
  
      # Load the compinit module
      autoload -U compinit
  
      # Without the following, `compdef` function is not defined.
      compinit -i
e5dfac7ea   Shrikant Sharat   Initial commit. W...
281
282
283
284
285
  }
  
  # 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...
286
287
      local arg_name="$1"
      local arg_value="$2"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
288
289
      eval "test -z \"\$$arg_name\" && export $arg_name='$arg_value'"
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
290
  -antigen-env-setup