#!/bin/bash
-# no bashisms so it can be used in debian profile run by dash
-# --start adds to start of path, which will give it highest priority
-# --ifexists will add to path only if the directory exists
+# Copyright (C) 2016 Ian Kelling
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+# avoiding bashisms so it can be used in edge cases where I don't have bash,
+# however, I'm not super confident that I've avoided them all
+#
path_add() {
- local found x y z
- local ifexists start
- ifexists=false
- start=false
- while [ "$1" = --* ]; do
- if [ "$1" = --start ]; then
- start=true
- elif [ "$1" = --ifexists ]; then
- ifexists=true
- fi
- shift
+ local help="usage: path_add [options] PATH
+--help: print this
+--end: adds to end of path, which will give it lowest priority
+--force: add to path even if directory does not exist"
+ local found x y z ifexists end loop newpath
+ force=false
+ end=false
+ loop=true
+ # portable substring matching is ugly http://mywiki.wooledge.org/BashFAQ/041
+ while $loop; do
+ case $1 in
+ --*)
+ if [ "$1" = --end ]; then
+ end=true
+ elif [ "$1" = --force ]; then
+ force=true
+ elif [ "$1" = --help ]; then
+ echo "$help"
+ return
+ fi
+ shift
+ ;;
+ *)
+ loop=false
+ ;;
+ esac
done
- for x in "$@"; do
- found=false
- IFS=:
- for y in $PATH; do
- [ "$x" = "$y" ] && found=true
+ IFS=:
+ # build up the path without the components we want to add
+ for y in $PATH; do
+ for x in "$@"; do
+ if [ "$x" = "$y" ]; then
+ found=true
+ else
+ found=false
+ fi
done
- unset IFS
if ! $found; then
- if ! $ifexists || [ -d $x ]; then
- if $start; then
- PATH="$x:$PATH"
- else
- PATH="$PATH:$x"
- fi
+ if [ ! "$newpath" ]; then
+ newpath="$y"
+ else
+ newpath="$newpath:$y"
+ fi
+ fi
+ done
+
+ unset IFS
+ PATH="$newpath"
+ for x in "$@"; do
+ if $force || [ -d "$x" ]; then
+ if [ ! "$PATH" ]; then
+ PATH="$x"
+ elif $end; then
+ PATH="$PATH:$x"
+ else
+ PATH="$x:$PATH"
fi
fi
done