Commit e5dfac7ea364fb9312c7567c02bb7c4ed422fdf4

Authored by Shrikant Sharat
0 parents

Initial commit. Working prototype.

Showing 1 changed file with 204 additions and 0 deletions Side-by-side Diff

... ... @@ -0,0 +1,204 @@
  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