Blame view

antigen.zsh 8.41 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
  }
fd547d958   Shrikant Sharat   An `antigen` comm...
251
252
253
254
255
256
257
  # 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.
258
259
  # 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...
260
  -antigen-echo-record () {
9dc631003   Shrikant Sharat   Rename bundle rec...
261
      echo "$_ANTIGEN_BUNDLE_RECORD" | sed -n '1!p'
e5dfac7ea   Shrikant Sharat   Initial commit. W...
262
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
263
  -antigen-env-setup () {
3047bfeb7   Shrikant Sharat   Load compinit at ...
264
      # Pre-startup initializations
e5dfac7ea   Shrikant Sharat   Initial commit. W...
265
266
      -set-default ANTIGEN_DEFAULT_REPO_URL \
          https://github.com/robbyrussell/oh-my-zsh.git
911cc8cb5   Shrikant Sharat   Use ADOTDIR as th...
267
      -set-default ADOTDIR $HOME/.antigen
3047bfeb7   Shrikant Sharat   Load compinit at ...
268
269
270
271
272
273
  
      # Load the compinit module
      autoload -U compinit
  
      # Without the following, `compdef` function is not defined.
      compinit -i
e5dfac7ea   Shrikant Sharat   Initial commit. W...
274
275
276
277
278
  }
  
  # 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...
279
280
      local arg_name="$1"
      local arg_value="$2"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
281
282
      eval "test -z \"\$$arg_name\" && export $arg_name='$arg_value'"
  }
a4f6e2fc8   Shrikant Sharat   Fix #2. Add `anti...
283
  -antigen-env-setup