Blame view
antigen.zsh
8.41 KB
|
e5dfac7ea
|
1 2 3 4 |
#!/bin/zsh # Each line in this string has the following entries separated by a space # character. |
|
a12d3140a
|
5 |
# <repo-url>, <plugin-location>, <bundle-type> |
|
e5dfac7ea
|
6 |
# FIXME: Is not kept local by zsh! |
|
9dc631003
|
7 |
local _ANTIGEN_BUNDLE_RECORD="" |
|
e5dfac7ea
|
8 9 |
# Syntaxes |
|
a4f6e2fc8
|
10 |
# antigen-bundle <url> [<loc>=/] |
|
843297b20
|
11 12 |
# Keyword only arguments: # branch - The branch of the repo to use for this bundle. |
|
a4f6e2fc8
|
13 |
antigen-bundle () {
|
|
e5dfac7ea
|
14 15 16 17 |
# Bundle spec arguments' default values.
local url="$ANTIGEN_DEFAULT_REPO_URL"
local loc=/
|
|
843297b20
|
18 |
local branch=- |
|
d535ba468
|
19 |
local btype=plugin |
|
e5dfac7ea
|
20 21 |
# Set spec values based on the positional arguments.
|
|
280ec4481
|
22 |
local position_args='url loc' |
|
e5dfac7ea
|
23 24 |
local i=1
while ! [[ -z $1 || $1 == --*=* ]]; do
|
|
43bb2cef1
|
25 26 |
local arg_name="$(echo "$position_args" | cut -d\ -f$i)"
local arg_value="$1"
|
|
e5dfac7ea
|
27 28 29 30 |
eval "local $arg_name='$arg_value'"
shift
i=$(($i + 1))
done
|
|
1abf1faf6
|
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
|
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
|
39 40 |
local arg_name="$(echo "$1" | cut -d= -f1 | sed 's/^--//')"
local arg_value="$(echo "$1" | cut -d= -f2)"
|
|
e5dfac7ea
|
41 42 43 44 45 |
eval "local $arg_name='$arg_value'"
shift
done
# Resolve the url.
|
|
8110fb2f2
|
46 |
if [[ $url != git://* && $url != https://* && $url != /* ]]; then |
|
bb140864c
|
47 |
url="${url%.git}"
|
|
bb140864c
|
48 |
url="https://github.com/$url.git" |
|
e5dfac7ea
|
49 |
fi |
|
e5dfac7ea
|
50 |
# Add it to the record. |
|
843297b20
|
51 52 |
_ANTIGEN_BUNDLE_RECORD="$_ANTIGEN_BUNDLE_RECORD $url $loc $btype $branch" |
|
a12d3140a
|
53 |
|
|
499c0dd5d
|
54 |
# Ensure a clone exists for this repo. |
|
843297b20
|
55 |
-antigen-ensure-repo "$url" "$branch" |
|
e5dfac7ea
|
56 |
|
|
499c0dd5d
|
57 |
# Load the plugin. |
|
843297b20
|
58 |
-antigen-load "$url" "$loc" "$btype" "$branch" |
|
2ac7c0cb0
|
59 |
|
|
a12d3140a
|
60 |
} |
|
2ac7c0cb0
|
61 |
|
|
3c5ff1c1e
|
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
|
68 |
grep -v '^\s*$\|^#' | while read line; do |
|
3c5ff1c1e
|
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
|
74 |
antigen-update () {
|
|
158407151
|
75 |
# Update your bundles, i.e., `git pull` in all the plugin repos. |
|
8d0d219d6
|
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
|
82 |
} |
|
a4f6e2fc8
|
83 |
-antigen-get-clone-dir () {
|
|
a12d3140a
|
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
|
87 88 |
local url="$1"
local branch="$2"
|
|
843297b20
|
89 |
|
|
499c0dd5d
|
90 91 |
# The branched_url will be the same as the url itself, unless there is no
# branch specified.
|
|
843297b20
|
92 |
local branched_url="$url" |
|
499c0dd5d
|
93 94 |
# If a branch is specified, i.e., branch is not `-`, append it to the url,
# separating with a pipe character.
|
|
843297b20
|
95 96 97 |
if [[ "$branch" != - ]]; then
branched_url="$branched_url|$branch"
fi
|
|
499c0dd5d
|
98 99 |
# Echo the full path to the clone directory.
echo -n $ADOTDIR/repos/
|
|
843297b20
|
100 |
echo "$branched_url" | sed \ |
|
a12d3140a
|
101 102 |
-e 's/\.git$//' \
-e 's./.-SLASH-.g' \
|
|
843297b20
|
103 104 |
-e 's.:.-COLON-.g' \
-e 's.|.-PIPE-.g'
|
|
2ac7c0cb0
|
105 |
} |
|
a4f6e2fc8
|
106 |
-antigen-get-clone-url () {
|
|
0b32bec27
|
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
|
114 115 |
-e 's.-COLON-.:.g' \
-e 's.-PIPE-.|.g'
|
|
0b32bec27
|
116 |
} |
|
a4f6e2fc8
|
117 |
-antigen-ensure-repo () {
|
|
2ac7c0cb0
|
118 |
|
|
499c0dd5d
|
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
|
124 125 126 127 128 |
local update=false
if [[ $1 == --update ]]; then
update=true
shift
fi
|
|
499c0dd5d
|
129 |
# Get the clone's directory as per the given repo url and branch. |
|
2ac7c0cb0
|
130 |
local url="$1" |
|
843297b20
|
131 132 |
local branch="$2"
local clone_dir="$(-antigen-get-clone-dir $url $branch)"
|
|
2ac7c0cb0
|
133 |
|
|
499c0dd5d
|
134 |
# Clone if it doesn't already exist. |
|
aa510273d
|
135 136 137 |
if [[ ! -d $clone_dir ]]; then
git clone "$url" "$clone_dir"
elif $update; then
|
|
499c0dd5d
|
138 |
# Pull changes if update requested. |
|
aa1012e7f
|
139 |
git --git-dir "$clone_dir/.git" --work-tree "$clone_dir" pull |
|
2ac7c0cb0
|
140 |
fi |
|
499c0dd5d
|
141 |
# If its a specific branch that we want, checkout that branch. |
|
843297b20
|
142 143 144 145 |
if [[ "$branch" != - ]]; then
git --git-dir "$clone_dir/.git" --work-tree "$clone_dir" \
checkout "$branch"
fi
|
|
e5dfac7ea
|
146 |
} |
|
a4f6e2fc8
|
147 |
-antigen-load () {
|
|
e5dfac7ea
|
148 |
|
|
a12d3140a
|
149 |
local url="$1" |
|
843297b20
|
150 |
local loc="$2" |
|
a12d3140a
|
151 |
local btype="$3" |
|
843297b20
|
152 |
local branch="$4" |
|
499c0dd5d
|
153 |
# The full location where the plugin is located. |
|
843297b20
|
154 |
local location="$(-antigen-get-clone-dir "$url" "$branch")/$loc" |
|
e5dfac7ea
|
155 |
|
|
d535ba468
|
156 |
if [[ $btype == theme ]]; then |
|
e5dfac7ea
|
157 |
|
|
d535ba468
|
158 159 160 |
# Of course, if its a theme, the location would point to the script
# file.
source "$location"
|
|
e5dfac7ea
|
161 |
|
|
d535ba468
|
162 |
else |
|
e5dfac7ea
|
163 |
|
|
d535ba468
|
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
|
168 |
|
|
d535ba468
|
169 170 171 |
if [[ -f $script_loc ]]; then
# If we have a `*.plugin.zsh`, source it.
source "$script_loc"
|
|
499c0dd5d
|
172 |
|
|
d535ba468
|
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
|
177 |
|
|
17f8e971e
|
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
|
182 |
|
|
d535ba468
|
183 |
fi |
|
499c0dd5d
|
184 |
# Add to $fpath, for completion(s). |
|
d535ba468
|
185 186 187 |
fpath=($location $fpath)
fi
|
|
e5dfac7ea
|
188 |
|
|
e5dfac7ea
|
189 |
} |
|
a4f6e2fc8
|
190 |
antigen-cleanup () {
|
|
0b32bec27
|
191 |
|
|
499c0dd5d
|
192 |
# Cleanup unused repositories. |
|
0b32bec27
|
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
|
200 |
<(-antigen-echo-record | awk '{print $1 "|" $4}' | sort -u) \
|
|
0b32bec27
|
201 |
<(ls "$ADOTDIR/repos" | while read line; do |
|
a4f6e2fc8
|
202 |
-antigen-get-clone-url "$line" |
|
0b32bec27
|
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
|
211 212 |
echo "$unused_clones" \
| sed -e 's/^/ /' -e 's/|/, branch /'
|
|
0b32bec27
|
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
|
221 |
rm -rf "$(-antigen-get-clone-dir $url)" |
|
0b32bec27
|
222 223 224 225 226 227 228 |
echo ' done.'
done
else
echo
echo Nothing deleted.
fi
}
|
|
a4f6e2fc8
|
229 230 |
antigen-lib () {
antigen-bundle --loc=lib
|
|
e5dfac7ea
|
231 |
} |
|
a4f6e2fc8
|
232 |
antigen-theme () {
|
|
e5dfac7ea
|
233 |
local name="${1:-robbyrussell}"
|
|
a4f6e2fc8
|
234 |
antigen-bundle --loc=themes/$name.zsh-theme --btype=theme |
|
e5dfac7ea
|
235 |
} |
|
a4f6e2fc8
|
236 |
antigen-apply () {
|
|
e5dfac7ea
|
237 |
# Initialize completion. |
|
a91386310
|
238 239 |
# TODO: Only load completions if there are any changes to the bundle
# repositories.
|
|
e5dfac7ea
|
240 241 |
compinit -i } |
|
a4f6e2fc8
|
242 |
antigen-list () {
|
|
df942673b
|
243 |
# List all currently installed bundles |
|
9dc631003
|
244 |
if [[ -z "$_ANTIGEN_BUNDLE_RECORD" ]]; then |
|
df942673b
|
245 246 247 |
echo "You don't have any bundles." >&2
return 1
else
|
|
a4f6e2fc8
|
248 |
-antigen-echo-record |
|
df942673b
|
249 250 |
fi } |
|
fd547d958
|
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
|
258 259 |
# Echo the bundle specs as in the record. The first line is not echoed since it # is a blank line. |
|
a4f6e2fc8
|
260 |
-antigen-echo-record () {
|
|
9dc631003
|
261 |
echo "$_ANTIGEN_BUNDLE_RECORD" | sed -n '1!p' |
|
e5dfac7ea
|
262 |
} |
|
a4f6e2fc8
|
263 |
-antigen-env-setup () {
|
|
3047bfeb7
|
264 |
# Pre-startup initializations |
|
e5dfac7ea
|
265 266 |
-set-default ANTIGEN_DEFAULT_REPO_URL \
https://github.com/robbyrussell/oh-my-zsh.git
|
|
911cc8cb5
|
267 |
-set-default ADOTDIR $HOME/.antigen |
|
3047bfeb7
|
268 269 270 271 272 273 |
# Load the compinit module
autoload -U compinit
# Without the following, `compdef` function is not defined.
compinit -i
|
|
e5dfac7ea
|
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
|
279 280 |
local arg_name="$1"
local arg_value="$2"
|
|
e5dfac7ea
|
281 282 |
eval "test -z \"\$$arg_name\" && export $arg_name='$arg_value'" } |
|
a4f6e2fc8
|
283 |
-antigen-env-setup |