Commit e5dfac7ea364fb9312c7567c02bb7c4ed422fdf4

Authored by Shrikant Sharat
0 parents

Initial commit. Working prototype.

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

File was created 1 #!/bin/zsh
2
3 # Each line in this string has the following entries separated by a space
4 # character.
5 # <bundle-name>, <repo-url>, <plugin-location>, <repo-local-clone-dir>
6 # FIXME: Is not kept local by zsh!
7 local bundles=""
8
9 # Syntaxes
10 # bundle <url> [<loc>=/] [<name>]
11 bundle () {
12
13 # Bundle spec arguments' default values.
14 local url="$ANTIGEN_DEFAULT_REPO_URL"
15 local loc=/
16 local name=
17 local load=true
18
19 # Set spec values based on the positional arguments.
20 local position_args='url loc name'
21 local i=1
22 while ! [[ -z $1 || $1 == --*=* ]]; do
23 arg_name="$(echo "$position_args" | cut -d\ -f$i)"
24 arg_value="$1"
25 eval "local $arg_name='$arg_value'"
26 shift
27 i=$(($i + 1))
28 done
29
30 # Set spec values from keyword arguments, if any. The remaining arguments
31 # are all assumed to be keyword arguments.
32 while [[ $1 == --*=* ]]; do
33 arg_name="$(echo "$1" | cut -d= -f1 | sed 's/^--//')"
34 arg_value="$(echo "$1" | cut -d= -f2)"
35 eval "local $arg_name='$arg_value'"
36 shift
37 done
38
39 # Resolve the url.
40 if [[ $url != git://* && $url != https://* ]]; then
41 url="https://github.com/$url.git"
42 name="$(basename "$url")"
43 fi
44
45 # Plugin's repo will be cloned here.
46 local clone_dir="$ANTIGEN_REPO_CACHE/$(echo "$url" \
47 | sed -e 's/\.git$//' -e 's./.-SLASH-.g' -e 's.:.-COLON-.g')"
48
49 # Make an intelligent guess about the name of the plugin, if not already
50 # done or is explicitly specified.
51 if [[ -z $name ]]; then
52 name="$(basename $url/$loc)"
53 fi
54
55 # Add it to the record.
56 bundles="$bundles\n$name $url $loc $clone_dir"
57
58 # Load it, unless specified otherwise.
59 if $load; then
60 bundle-load "$name"
61 fi
62 }
63
64 bundle-install () {
65
66 if [[ $1 == --update ]]; then
67 local update=true
68 else
69 local update=false
70 fi
71
72 mkdir -p "$ANTIGEN_BUNDLE_DIR"
73
74 local handled_repos=""
75
76 echo-non-empty "$bundles" | while read spec; do
77
78 local name="$(echo "$spec" | awk '{print $1}')"
79 local url="$(echo "$spec" | awk '{print $2}')"
80 local loc="$(echo "$spec" | awk '{print $3}')"
81 local clone_dir="$(echo "$spec" | awk '{print $4}')"
82
83 if [[ -z "$(echo "$handled_repos" | grep -Fm1 "$url")" ]]; then
84 if [[ -d $clone_dir ]]; then
85 git --git-dir "$clone_dir/.git" pull
86 else
87 git clone "$url" "$clone_dir"
88 fi
89
90 handled_repos="$handled_repos\n$url"
91 fi
92
93 if [[ $name != *.theme ]]; then
94 cp -R "$clone_dir/$loc" "$ANTIGEN_BUNDLE_DIR/$name"
95 else
96 mkdir -p "$ANTIGEN_BUNDLE_DIR/$name"
97 cp "$clone_dir/$loc" "$ANTIGEN_BUNDLE_DIR/$name"
98 fi
99
100 bundle-load "$name"
101
102 done
103
104 }
105
106 bundle-load () {
107 if [[ $1 == --init ]]; then
108 do_init=true
109 shift
110 else
111 do_init=false
112 fi
113
114 name="$1"
115 bundle_dir="$ANTIGEN_BUNDLE_DIR/$name"
116
117 # Source the plugin script
118 script_loc="$bundle_dir/$name.plugin.zsh"
119 if [[ -f $script_loc ]]; then
120 source "$script_loc"
121 fi
122
123 # If the name of the plugin ends with `.lib`, all the *.zsh files in it are
124 # sourced. This is kind of a hack to source the libraries of oh-my-zsh.
125 if [[ $name == *.lib ]]; then
126 # FIXME: This throws an error if no files match the given glob pattern.
127 for lib ($bundle_dir/*.zsh) source $lib
128 fi
129
130 # If the name ends with `.theme`, it is handled as if it were a zsh-theme
131 # plugin.
132 if [[ $name == *.theme ]]; then
133 source "$bundle_dir/${name%.theme}.zsh-theme"
134 fi
135
136 # Add to $fpath, if it provides completion
137 if [[ -f "$bundle_dir/_$name" ]]; then
138 fpath=($bundle_dir $fpath)
139 fi
140
141 if $do_init; then
142 bundle-init
143 fi
144 }
145
146 bundle-lib () {
147 bundle --name=oh-my-zsh.lib --loc=lib
148 }
149
150 bundle-theme () {
151 local url="$ANTIGEN_DEFAULT_REPO_URL"
152 local name="${1:-robbyrussell}"
153 bundle "$url" --name=$name.theme --loc=themes/$name.zsh-theme
154 }
155
156 bundle-init () {
157 # Initialize completion.
158 # FIXME: Ensure this runs only once.
159 autoload -U compinit
160 compinit -i
161 }
162
163 # A python command wrapper. Almost the same as `python -c`, but dedents the
164 # source string.
165 py () {
166 code="$1"
167
168 # Find indentation from first line.
169 indent="$(echo "$code" | grep -m1 -v '^$' | grep -o '^\s*' | wc -c)"
170
171 # Strip that many spaces in the start from each line.
172 if [[ $indent != 0 ]]; then
173 indent=$(($indent - 1))
174 code="$(echo "$code" | sed "s/^\s\{$indent\}//")"
175 fi
176
177 # Run the piece of code.
178 python -c "$code"
179 }
180
181 # Does what it says.
182 echo-non-empty () {
183 echo "$@" | while read line; do
184 [[ $line != "" ]] && echo $line
185 done
186 }
187
188 -bundle-env-setup () {
189 -set-default ANTIGEN_DEFAULT_REPO_URL \
190 https://github.com/robbyrussell/oh-my-zsh.git
191 -set-default ANTIGEN_REPO_CACHE $HOME/.antigen/cache
192 -set-default ANTIGEN_BUNDLE_DIR $HOME/.antigen/bundles
193 }
194
195 # Same as `export $1=$2`, but will only happen if the name specified by `$1` is
196 # not already set.
197 -set-default () {
198 arg_name="$1"
199 arg_value="$2"
200 eval "test -z \"\$$arg_name\" && export $arg_name='$arg_value'"
201 }
202
203 -bundle-env-setup
204 bundle-init
205