Commit 17f8e971e39af0844eaf3fa85470cb5bd09a814c

Authored by Shrikant Sharat
1 parent aa1012e7f8

Work with non zsh-only plugins/scripts.

Plugins that are compatible with both bash and zsh don't obviously have a `.zsh`
extenstion. They use a `.sh` extension. We now support this.

Example: rupa/z

Showing 1 changed file with 4 additions and 0 deletions Inline Diff

1 #!/bin/zsh 1 #!/bin/zsh
2 2
3 # Each line in this string has the following entries separated by a space 3 # Each line in this string has the following entries separated by a space
4 # character. 4 # character.
5 # <repo-url>, <plugin-location>, <bundle-type> 5 # <repo-url>, <plugin-location>, <bundle-type>
6 # FIXME: Is not kept local by zsh! 6 # FIXME: Is not kept local by zsh!
7 local _ANTIGEN_BUNDLE_RECORD="" 7 local _ANTIGEN_BUNDLE_RECORD=""
8 8
9 # Syntaxes 9 # Syntaxes
10 # antigen-bundle <url> [<loc>=/] 10 # antigen-bundle <url> [<loc>=/]
11 antigen-bundle () { 11 antigen-bundle () {
12 12
13 # Bundle spec arguments' default values. 13 # Bundle spec arguments' default values.
14 local url="$ANTIGEN_DEFAULT_REPO_URL" 14 local url="$ANTIGEN_DEFAULT_REPO_URL"
15 local loc=/ 15 local loc=/
16 local btype=plugin 16 local btype=plugin
17 17
18 # Set spec values based on the positional arguments. 18 # Set spec values based on the positional arguments.
19 local position_args='url loc' 19 local position_args='url loc'
20 local i=1 20 local i=1
21 while ! [[ -z $1 || $1 == --*=* ]]; do 21 while ! [[ -z $1 || $1 == --*=* ]]; do
22 local arg_name="$(echo "$position_args" | cut -d\ -f$i)" 22 local arg_name="$(echo "$position_args" | cut -d\ -f$i)"
23 local arg_value="$1" 23 local arg_value="$1"
24 eval "local $arg_name='$arg_value'" 24 eval "local $arg_name='$arg_value'"
25 shift 25 shift
26 i=$(($i + 1)) 26 i=$(($i + 1))
27 done 27 done
28 28
29 # Check if url is just the plugin name. Super short syntax. 29 # Check if url is just the plugin name. Super short syntax.
30 if [[ "$url" != */* ]]; then 30 if [[ "$url" != */* ]]; then
31 loc="plugins/$url" 31 loc="plugins/$url"
32 url="$ANTIGEN_DEFAULT_REPO_URL" 32 url="$ANTIGEN_DEFAULT_REPO_URL"
33 fi 33 fi
34 34
35 # Set spec values from keyword arguments, if any. The remaining arguments 35 # Set spec values from keyword arguments, if any. The remaining arguments
36 # are all assumed to be keyword arguments. 36 # are all assumed to be keyword arguments.
37 while [[ $1 == --*=* ]]; do 37 while [[ $1 == --*=* ]]; do
38 local arg_name="$(echo "$1" | cut -d= -f1 | sed 's/^--//')" 38 local arg_name="$(echo "$1" | cut -d= -f1 | sed 's/^--//')"
39 local arg_value="$(echo "$1" | cut -d= -f2)" 39 local arg_value="$(echo "$1" | cut -d= -f2)"
40 eval "local $arg_name='$arg_value'" 40 eval "local $arg_name='$arg_value'"
41 shift 41 shift
42 done 42 done
43 43
44 # Resolve the url. 44 # Resolve the url.
45 if [[ $url != git://* && $url != https://* && $url != /* ]]; then 45 if [[ $url != git://* && $url != https://* && $url != /* ]]; then
46 url="${url%.git}" 46 url="${url%.git}"
47 url="https://github.com/$url.git" 47 url="https://github.com/$url.git"
48 fi 48 fi
49 49
50 # Add it to the record. 50 # Add it to the record.
51 _ANTIGEN_BUNDLE_RECORD="$_ANTIGEN_BUNDLE_RECORD\n$url $loc $btype" 51 _ANTIGEN_BUNDLE_RECORD="$_ANTIGEN_BUNDLE_RECORD\n$url $loc $btype"
52 52
53 -antigen-ensure-repo "$url" 53 -antigen-ensure-repo "$url"
54 54
55 -antigen-load "$url" "$loc" "$btype" 55 -antigen-load "$url" "$loc" "$btype"
56 56
57 } 57 }
58 58
59 antigen-bundles () { 59 antigen-bundles () {
60 # Bulk add many bundles at one go. Empty lines and lines starting with a `#` 60 # Bulk add many bundles at one go. Empty lines and lines starting with a `#`
61 # are ignored. Everything else is given to `antigen-bundle` as is, no 61 # are ignored. Everything else is given to `antigen-bundle` as is, no
62 # quoting rules applied. 62 # quoting rules applied.
63 63
64 local line 64 local line
65 65
66 grep -v '^$\|^#' | while read line; do 66 grep -v '^$\|^#' | while read line; do
67 # Using `eval` so that we can use the shell-style quoting in each line 67 # Using `eval` so that we can use the shell-style quoting in each line
68 # piped to `antigen-bundles`. 68 # piped to `antigen-bundles`.
69 eval "antigen-bundle $line" 69 eval "antigen-bundle $line"
70 done 70 done
71 } 71 }
72 72
73 antigen-update () { 73 antigen-update () {
74 # Update your bundles, i.e., `git pull` in all the plugin repos. 74 # Update your bundles, i.e., `git pull` in all the plugin repos.
75 -antigen-echo-record | awk '{print $1}' | sort -u | while read url; do 75 -antigen-echo-record | awk '{print $1}' | sort -u | while read url; do
76 -antigen-ensure-repo --update "$url" 76 -antigen-ensure-repo --update "$url"
77 done 77 done
78 } 78 }
79 79
80 -antigen-get-clone-dir () { 80 -antigen-get-clone-dir () {
81 # Takes a repo url and gives out the path that this url needs to be cloned 81 # Takes a repo url and gives out the path that this url needs to be cloned
82 # to. Doesn't actually clone anything. 82 # to. Doesn't actually clone anything.
83 # TODO: Memoize? 83 # TODO: Memoize?
84 echo -n $ADOTDIR/repos/ 84 echo -n $ADOTDIR/repos/
85 echo "$1" | sed \ 85 echo "$1" | sed \
86 -e 's/\.git$//' \ 86 -e 's/\.git$//' \
87 -e 's./.-SLASH-.g' \ 87 -e 's./.-SLASH-.g' \
88 -e 's.:.-COLON-.g' 88 -e 's.:.-COLON-.g'
89 } 89 }
90 90
91 -antigen-get-clone-url () { 91 -antigen-get-clone-url () {
92 # Takes a repo's clone dir and gives out the repo's original url that was 92 # Takes a repo's clone dir and gives out the repo's original url that was
93 # used to create the given directory path. 93 # used to create the given directory path.
94 # TODO: Memoize? 94 # TODO: Memoize?
95 echo "$1" | sed \ 95 echo "$1" | sed \
96 -e "s:^$ADOTDIR/repos/::" \ 96 -e "s:^$ADOTDIR/repos/::" \
97 -e 's/$/.git/' \ 97 -e 's/$/.git/' \
98 -e 's.-SLASH-./.g' \ 98 -e 's.-SLASH-./.g' \
99 -e 's.-COLON-.:.g' 99 -e 's.-COLON-.:.g'
100 } 100 }
101 101
102 -antigen-ensure-repo () { 102 -antigen-ensure-repo () {
103 103
104 local update=false 104 local update=false
105 if [[ $1 == --update ]]; then 105 if [[ $1 == --update ]]; then
106 update=true 106 update=true
107 shift 107 shift
108 fi 108 fi
109 109
110 local url="$1" 110 local url="$1"
111 local clone_dir="$(-antigen-get-clone-dir $url)" 111 local clone_dir="$(-antigen-get-clone-dir $url)"
112 112
113 if [[ ! -d $clone_dir ]]; then 113 if [[ ! -d $clone_dir ]]; then
114 git clone "$url" "$clone_dir" 114 git clone "$url" "$clone_dir"
115 elif $update; then 115 elif $update; then
116 git --git-dir "$clone_dir/.git" --work-tree "$clone_dir" pull 116 git --git-dir "$clone_dir/.git" --work-tree "$clone_dir" pull
117 fi 117 fi
118 118
119 } 119 }
120 120
121 -antigen-load () { 121 -antigen-load () {
122 122
123 local url="$1" 123 local url="$1"
124 local location="$(-antigen-get-clone-dir "$url")/$2" 124 local location="$(-antigen-get-clone-dir "$url")/$2"
125 local btype="$3" 125 local btype="$3"
126 126
127 if [[ $btype == theme ]]; then 127 if [[ $btype == theme ]]; then
128 128
129 # Of course, if its a theme, the location would point to the script 129 # Of course, if its a theme, the location would point to the script
130 # file. 130 # file.
131 source "$location" 131 source "$location"
132 132
133 else 133 else
134 134
135 # Source the plugin script 135 # Source the plugin script
136 # FIXME: I don't know. Looks very very ugly. Needs a better 136 # FIXME: I don't know. Looks very very ugly. Needs a better
137 # implementation once tests are ready. 137 # implementation once tests are ready.
138 local script_loc="$(ls "$location" | grep -m1 '.plugin.zsh$')" 138 local script_loc="$(ls "$location" | grep -m1 '.plugin.zsh$')"
139 if [[ -f $script_loc ]]; then 139 if [[ -f $script_loc ]]; then
140 # If we have a `*.plugin.zsh`, source it. 140 # If we have a `*.plugin.zsh`, source it.
141 source "$script_loc" 141 source "$script_loc"
142 elif [[ ! -z "$(ls "$location" | grep -m1 '.zsh$')" ]]; then 142 elif [[ ! -z "$(ls "$location" | grep -m1 '.zsh$')" ]]; then
143 # If there is no `*.plugin.zsh` file, source *all* the `*.zsh` 143 # If there is no `*.plugin.zsh` file, source *all* the `*.zsh`
144 # files. 144 # files.
145 for script ($location/*.zsh) source "$script" 145 for script ($location/*.zsh) source "$script"
146 elif [[ ! -z "$(ls "$location" | grep -m1 '.sh$')" ]]; then
147 # If there are no `*.zsh` files either, we look for and source any
148 # `*.sh` files instead.
149 for script ($location/*.sh) source "$script"
146 fi 150 fi
147 151
148 # Add to $fpath, for completion(s) 152 # Add to $fpath, for completion(s)
149 fpath=($location $fpath) 153 fpath=($location $fpath)
150 154
151 fi 155 fi
152 156
153 } 157 }
154 158
155 antigen-cleanup () { 159 antigen-cleanup () {
156 160
157 if [[ ! -d "$ADOTDIR/repos" || -z "$(ls "$ADOTDIR/repos/")" ]]; then 161 if [[ ! -d "$ADOTDIR/repos" || -z "$(ls "$ADOTDIR/repos/")" ]]; then
158 echo "You don't have any bundles." 162 echo "You don't have any bundles."
159 return 0 163 return 0
160 fi 164 fi
161 165
162 # Find directores in ADOTDIR/repos, that are not in the bundles record. 166 # Find directores in ADOTDIR/repos, that are not in the bundles record.
163 local unused_clones="$(comm -13 \ 167 local unused_clones="$(comm -13 \
164 <(-antigen-echo-record | awk '{print $1}' | sort -u) \ 168 <(-antigen-echo-record | awk '{print $1}' | sort -u) \
165 <(ls "$ADOTDIR/repos" | while read line; do 169 <(ls "$ADOTDIR/repos" | while read line; do
166 -antigen-get-clone-url "$line" 170 -antigen-get-clone-url "$line"
167 done))" 171 done))"
168 172
169 if [[ -z $unused_clones ]]; then 173 if [[ -z $unused_clones ]]; then
170 echo "You don't have any unidentified bundles." 174 echo "You don't have any unidentified bundles."
171 return 0 175 return 0
172 fi 176 fi
173 177
174 echo 'You have clones for the following repos, but are not used.' 178 echo 'You have clones for the following repos, but are not used.'
175 echo "$unused_clones" | sed 's/^/ /' 179 echo "$unused_clones" | sed 's/^/ /'
176 180
177 echo -n '\nDelete them all? [y/N] ' 181 echo -n '\nDelete them all? [y/N] '
178 if read -q; then 182 if read -q; then
179 echo 183 echo
180 echo 184 echo
181 echo "$unused_clones" | while read url; do 185 echo "$unused_clones" | while read url; do
182 echo -n "Deleting clone for $url..." 186 echo -n "Deleting clone for $url..."
183 rm -rf "$(-antigen-get-clone-dir $url)" 187 rm -rf "$(-antigen-get-clone-dir $url)"
184 echo ' done.' 188 echo ' done.'
185 done 189 done
186 else 190 else
187 echo 191 echo
188 echo Nothing deleted. 192 echo Nothing deleted.
189 fi 193 fi
190 } 194 }
191 195
192 antigen-lib () { 196 antigen-lib () {
193 antigen-bundle --loc=lib 197 antigen-bundle --loc=lib
194 } 198 }
195 199
196 antigen-theme () { 200 antigen-theme () {
197 local name="${1:-robbyrussell}" 201 local name="${1:-robbyrussell}"
198 antigen-bundle --loc=themes/$name.zsh-theme --btype=theme 202 antigen-bundle --loc=themes/$name.zsh-theme --btype=theme
199 } 203 }
200 204
201 antigen-apply () { 205 antigen-apply () {
202 # Initialize completion. 206 # Initialize completion.
203 # TODO: Only load completions if there are any changes to the bundle 207 # TODO: Only load completions if there are any changes to the bundle
204 # repositories. 208 # repositories.
205 compinit -i 209 compinit -i
206 } 210 }
207 211
208 antigen-list () { 212 antigen-list () {
209 # List all currently installed bundles 213 # List all currently installed bundles
210 if [[ -z "$_ANTIGEN_BUNDLE_RECORD" ]]; then 214 if [[ -z "$_ANTIGEN_BUNDLE_RECORD" ]]; then
211 echo "You don't have any bundles." >&2 215 echo "You don't have any bundles." >&2
212 return 1 216 return 1
213 else 217 else
214 -antigen-echo-record 218 -antigen-echo-record
215 fi 219 fi
216 } 220 }
217 221
218 # Echo the bundle specs as in the record. The first line is not echoed since it 222 # Echo the bundle specs as in the record. The first line is not echoed since it
219 # is a blank line. 223 # is a blank line.
220 -antigen-echo-record () { 224 -antigen-echo-record () {
221 echo "$_ANTIGEN_BUNDLE_RECORD" | sed -n '1!p' 225 echo "$_ANTIGEN_BUNDLE_RECORD" | sed -n '1!p'
222 } 226 }
223 227
224 -antigen-env-setup () { 228 -antigen-env-setup () {
225 # Pre-startup initializations 229 # Pre-startup initializations
226 -set-default ANTIGEN_DEFAULT_REPO_URL \ 230 -set-default ANTIGEN_DEFAULT_REPO_URL \
227 https://github.com/robbyrussell/oh-my-zsh.git 231 https://github.com/robbyrussell/oh-my-zsh.git
228 -set-default ADOTDIR $HOME/.antigen 232 -set-default ADOTDIR $HOME/.antigen
229 233
230 # Load the compinit module 234 # Load the compinit module
231 autoload -U compinit 235 autoload -U compinit
232 236
233 # Without the following, `compdef` function is not defined. 237 # Without the following, `compdef` function is not defined.
234 compinit -i 238 compinit -i
235 } 239 }
236 240
237 # Same as `export $1=$2`, but will only happen if the name specified by `$1` is 241 # Same as `export $1=$2`, but will only happen if the name specified by `$1` is
238 # not already set. 242 # not already set.
239 -set-default () { 243 -set-default () {
240 local arg_name="$1" 244 local arg_name="$1"
241 local arg_value="$2" 245 local arg_value="$2"
242 eval "test -z \"\$$arg_name\" && export $arg_name='$arg_value'" 246 eval "test -z \"\$$arg_name\" && export $arg_name='$arg_value'"
243 } 247 }
244 248
245 -antigen-env-setup 249 -antigen-env-setup
246 250