Blame view

antigen.zsh 6.99 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.
280ec4481   Shrikant Sharat   name argument for...
5
  # <repo-url>, <plugin-location>, <repo-local-clone-dir>,
d535ba468   Shrikant Sharat   Introduced a new ...
6
  # <bundle-type>
e5dfac7ea   Shrikant Sharat   Initial commit. W...
7
  # FIXME: Is not kept local by zsh!
9dc631003   Shrikant Sharat   Rename bundle rec...
8
  local _ANTIGEN_BUNDLE_RECORD=""
e5dfac7ea   Shrikant Sharat   Initial commit. W...
9
10
  
  # Syntaxes
280ec4481   Shrikant Sharat   name argument for...
11
  #   bundle <url> [<loc>=/]
e5dfac7ea   Shrikant Sharat   Initial commit. W...
12
13
14
15
16
  bundle () {
  
      # Bundle spec arguments' default values.
      local url="$ANTIGEN_DEFAULT_REPO_URL"
      local loc=/
d535ba468   Shrikant Sharat   Introduced a new ...
17
      local btype=plugin
e5dfac7ea   Shrikant Sharat   Initial commit. W...
18
19
  
      # Set spec values based on the positional arguments.
280ec4481   Shrikant Sharat   name argument for...
20
      local position_args='url loc'
e5dfac7ea   Shrikant Sharat   Initial commit. W...
21
22
      local i=1
      while ! [[ -z $1 || $1 == --*=* ]]; do
43bb2cef1   Shrikant Sharat   Variable declarat...
23
24
          local arg_name="$(echo "$position_args" | cut -d\  -f$i)"
          local arg_value="$1"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
25
26
27
28
          eval "local $arg_name='$arg_value'"
          shift
          i=$(($i + 1))
      done
1abf1faf6   Shrikant Sharat   Plugins can be sp...
29
30
31
32
33
      # 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...
34
35
36
      # 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...
37
38
          local arg_name="$(echo "$1" | cut -d= -f1 | sed 's/^--//')"
          local arg_value="$(echo "$1" | cut -d= -f2)"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
39
40
41
42
43
44
          eval "local $arg_name='$arg_value'"
          shift
      done
  
      # Resolve the url.
      if [[ $url != git://* && $url != https://* ]]; then
bb140864c   Shrikant Sharat   The plugin name s...
45
          url="${url%.git}"
bb140864c   Shrikant Sharat   The plugin name s...
46
          url="https://github.com/$url.git"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
47
48
49
      fi
  
      # Plugin's repo will be cloned here.
911cc8cb5   Shrikant Sharat   Use ADOTDIR as th...
50
      local clone_dir="$ADOTDIR/repos/$(echo "$url" \
e5dfac7ea   Shrikant Sharat   Initial commit. W...
51
          | sed -e 's/\.git$//' -e 's./.-SLASH-.g' -e 's.:.-COLON-.g')"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
52
      # Add it to the record.
280ec4481   Shrikant Sharat   name argument for...
53
54
      _ANTIGEN_BUNDLE_RECORD="$_ANTIGEN_BUNDLE_RECORD
  $url $loc $clone_dir $btype"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
55

2ac7c0cb0   Shrikant Sharat   Bundles are insta...
56
      -antigen-ensure-repo "$url" "$clone_dir"
c17d243a6   Shrikant Sharat   Removed unused lo...
57
      bundle-load "$clone_dir/$loc" "$btype"
2ac7c0cb0   Shrikant Sharat   Bundles are insta...
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
  
  }
  
  -antigen-ensure-repo () {
  
      local update=false
      if [[ $1 == --update ]]; then
          update=true
          shift
      fi
  
      local handled_repos=""
      local install_bundles=""
  
      local url="$1"
      local clone_dir="$2"
  
      if ! echo "$handled_repos" | grep -Fqm1 "$url"; then
          if [[ ! -d $clone_dir ]]; then
              git clone "$url" "$clone_dir"
          elif $update; then
              git --git-dir "$clone_dir/.git" pull
          fi
  
          handled_repos="$handled_repos
  $url"
      fi
e5dfac7ea   Shrikant Sharat   Initial commit. W...
85
86
87
  }
  
  bundle-install () {
43bb2cef1   Shrikant Sharat   Variable declarat...
88
      local update=false
e5dfac7ea   Shrikant Sharat   Initial commit. W...
89
      if [[ $1 == --update ]]; then
43bb2cef1   Shrikant Sharat   Variable declarat...
90
          update=true
64df9931b   Shrikant Sharat   Don't leave the -...
91
          shift
e5dfac7ea   Shrikant Sharat   Initial commit. W...
92
      fi
911cc8cb5   Shrikant Sharat   Use ADOTDIR as th...
93
      mkdir -p "$ADOTDIR/bundles"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
94
95
  
      local handled_repos=""
882de6912   Shrikant Sharat   Fix current theme...
96
      local install_bundles=""
e5dfac7ea   Shrikant Sharat   Initial commit. W...
97

de4644c0f   Shrikant Sharat   Install plugins i...
98
99
100
      if [[ $# != 0 ]]; then
          # Record and install just the given plugin here and now.
          bundle "$@"
9dc631003   Shrikant Sharat   Rename bundle rec...
101
          install_bundles="$(-bundle-echo-record | tail -1)"
de4644c0f   Shrikant Sharat   Install plugins i...
102
103
      else
          # Install all the plugins, previously recorded.
60d0dc571   Shrikant Sharat   Refactor to priva...
104
          install_bundles="$(-bundle-echo-record)"
882de6912   Shrikant Sharat   Fix current theme...
105
      fi
de4644c0f   Shrikant Sharat   Install plugins i...
106

882de6912   Shrikant Sharat   Fix current theme...
107
108
      # If the above `if` is directly piped to the below `while`, the contents
      # inside the `if` construct are run in a new subshell, so changes to the
9dc631003   Shrikant Sharat   Rename bundle rec...
109
110
      # `$_ANTIGEN_BUNDLE_RECORD` variable are lost after the `if` construct
      # finishes. So, we need the temporary `$install_bundles` variable.
882de6912   Shrikant Sharat   Fix current theme...
111
      echo "$install_bundles" | while read spec; do
e5dfac7ea   Shrikant Sharat   Initial commit. W...
112
113
114
115
116
  
          local name="$(echo "$spec" | awk '{print $1}')"
          local url="$(echo "$spec" | awk '{print $2}')"
          local loc="$(echo "$spec" | awk '{print $3}')"
          local clone_dir="$(echo "$spec" | awk '{print $4}')"
d535ba468   Shrikant Sharat   Introduced a new ...
117
          local btype="$(echo "$spec" | awk '{print $5}')"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
118
119
  
          if [[ -z "$(echo "$handled_repos" | grep -Fm1 "$url")" ]]; then
78b101b2e   Shrikant Sharat   bundle-install do...
120
              if [[ ! -d $clone_dir ]]; then
e5dfac7ea   Shrikant Sharat   Initial commit. W...
121
                  git clone "$url" "$clone_dir"
78b101b2e   Shrikant Sharat   bundle-install do...
122
123
              elif $update; then
                  git --git-dir "$clone_dir/.git" pull
e5dfac7ea   Shrikant Sharat   Initial commit. W...
124
125
126
127
128
              fi
  
              handled_repos="$handled_repos
  $url"
          fi
d535ba468   Shrikant Sharat   Introduced a new ...
129
          bundle-load "$clone_dir/$loc" "$btype"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
130
131
  
      done
592f1460b   Shrikant Sharat   Load completions ...
132
133
      # Initialize completions after installing
      bundle-apply
e5dfac7ea   Shrikant Sharat   Initial commit. W...
134
  }
b05176f25   Shrikant Sharat   bundle-install!, ...
135
136
137
  bundle-install! () {
      bundle-install --update
  }
d22fb4b90   Shrikant Sharat   bundle-cleanup co...
138
  bundle-cleanup () {
911cc8cb5   Shrikant Sharat   Use ADOTDIR as th...
139
140
      if [[ ! -d "$ADOTDIR/bundles" || \
          "$(ls "$ADOTDIR/bundles/" | wc -l)" == 0 ]]; then
9dd10834e   Shrikant Sharat   Fix cleanup givin...
141
142
143
          echo "You don't have any bundles."
          return 0
      fi
911cc8cb5   Shrikant Sharat   Use ADOTDIR as th...
144
      # Find directores in ADOTDIR/bundles, that are not in the bundles record.
d22fb4b90   Shrikant Sharat   bundle-cleanup co...
145
      local unidentified_bundles="$(comm -13 \
60d0dc571   Shrikant Sharat   Refactor to priva...
146
          <(-bundle-echo-record | awk '{print $1}' | sort) \
911cc8cb5   Shrikant Sharat   Use ADOTDIR as th...
147
          <(ls -1 "$ADOTDIR/bundles"))"
d22fb4b90   Shrikant Sharat   bundle-cleanup co...
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
  
      if [[ -z $unidentified_bundles ]]; then
          echo "You don't have any unidentified bundles."
          return 0
      fi
  
      echo The following bundles are not recorded:
      echo "$unidentified_bundles" | sed 's/^/  /'
  
      echo -n '
  Delete them all? [y/N] '
      if read -q; then
          echo
          echo
          echo "$unidentified_bundles" | while read name; do
              echo -n Deleting $name...
911cc8cb5   Shrikant Sharat   Use ADOTDIR as th...
164
              rm -rf "$ADOTDIR/bundles/$name"
d22fb4b90   Shrikant Sharat   bundle-cleanup co...
165
166
167
168
169
170
171
              echo ' done.'
          done
      else
          echo
          echo Nothing deleted.
      fi
  }
e5dfac7ea   Shrikant Sharat   Initial commit. W...
172
  bundle-load () {
e5dfac7ea   Shrikant Sharat   Initial commit. W...
173

d535ba468   Shrikant Sharat   Introduced a new ...
174
175
      local location="$1"
      local btype="$2"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
176

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

d535ba468   Shrikant Sharat   Introduced a new ...
179
180
181
          # Of course, if its a theme, the location would point to the script
          # file.
          source "$location"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
182

d535ba468   Shrikant Sharat   Introduced a new ...
183
      else
e5dfac7ea   Shrikant Sharat   Initial commit. W...
184

d535ba468   Shrikant Sharat   Introduced a new ...
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
          # 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$')"
          if [[ -f $script_loc ]]; then
              # If we have a `*.plugin.zsh`, source it.
              source "$script_loc"
          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"
          fi
  
          # Add to $fpath, for completion(s)
          fpath=($location $fpath)
  
      fi
e5dfac7ea   Shrikant Sharat   Initial commit. W...
202

e5dfac7ea   Shrikant Sharat   Initial commit. W...
203
204
205
  }
  
  bundle-lib () {
d535ba468   Shrikant Sharat   Introduced a new ...
206
      bundle --loc=lib
e5dfac7ea   Shrikant Sharat   Initial commit. W...
207
208
209
210
211
  }
  
  bundle-theme () {
      local url="$ANTIGEN_DEFAULT_REPO_URL"
      local name="${1:-robbyrussell}"
d535ba468   Shrikant Sharat   Introduced a new ...
212
      bundle --loc=themes/$name.zsh-theme --btype=theme
e5dfac7ea   Shrikant Sharat   Initial commit. W...
213
  }
1af74ea9e   Shrikant Sharat   Load completions ...
214
  bundle-apply () {
e5dfac7ea   Shrikant Sharat   Initial commit. W...
215
      # Initialize completion.
24fbcce0a   Shrikant Sharat   Add comments to b...
216
      # TODO: Doesn't look like this is really necessary. Need to investigate.
e5dfac7ea   Shrikant Sharat   Initial commit. W...
217
218
      compinit -i
  }
df942673b   Shrikant Sharat   Added bundle-list...
219
220
  bundle-list () {
      # List all currently installed bundles
9dc631003   Shrikant Sharat   Rename bundle rec...
221
      if [[ -z "$_ANTIGEN_BUNDLE_RECORD" ]]; then
df942673b   Shrikant Sharat   Added bundle-list...
222
223
224
          echo "You don't have any bundles." >&2
          return 1
      else
60d0dc571   Shrikant Sharat   Refactor to priva...
225
          -bundle-echo-record | awk '{print $1 " " $2 " " $3}'
df942673b   Shrikant Sharat   Added bundle-list...
226
227
      fi
  }
bc9d20c7a   Shrikant Sharat   Add comments.
228
229
  # Echo the bundle specs as in the record. The first line is not echoed since it
  # is a blank line.
60d0dc571   Shrikant Sharat   Refactor to priva...
230
  -bundle-echo-record () {
9dc631003   Shrikant Sharat   Rename bundle rec...
231
      echo "$_ANTIGEN_BUNDLE_RECORD" | sed -n '1!p'
e5dfac7ea   Shrikant Sharat   Initial commit. W...
232
233
234
  }
  
  -bundle-env-setup () {
3047bfeb7   Shrikant Sharat   Load compinit at ...
235
      # Pre-startup initializations
e5dfac7ea   Shrikant Sharat   Initial commit. W...
236
237
      -set-default ANTIGEN_DEFAULT_REPO_URL \
          https://github.com/robbyrussell/oh-my-zsh.git
911cc8cb5   Shrikant Sharat   Use ADOTDIR as th...
238
      -set-default ADOTDIR $HOME/.antigen
3047bfeb7   Shrikant Sharat   Load compinit at ...
239
240
241
242
243
244
  
      # Load the compinit module
      autoload -U compinit
  
      # Without the following, `compdef` function is not defined.
      compinit -i
e5dfac7ea   Shrikant Sharat   Initial commit. W...
245
246
247
248
249
  }
  
  # 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...
250
251
      local arg_name="$1"
      local arg_value="$2"
e5dfac7ea   Shrikant Sharat   Initial commit. W...
252
253
254
255
      eval "test -z \"\$$arg_name\" && export $arg_name='$arg_value'"
  }
  
  -bundle-env-setup