minor bug fix
[distro-setup] / path-add-function
index ec41e06acb8f21ac4f05a5297765df6bcdc7d7dc..86ae5215f284c96c13e3b6fd2f45ef2646bd4121 100644 (file)
@@ -1,34 +1,84 @@
 #!/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=false
-    local start=false
-    while [ "$1" = --* ]; do
-        if [ "$1" = --start ]; then
-            start=true
+  local help="usage: path_add [options] PATH
+--help:     print this
+--end:      adds to end of path, which will give it lowest priority
+--ifexists: add to path only if directory exists"
+  local found x y ifexists end loop newpath
+  ifexists=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" = --ifexists ]; then
-            ifexists=true
+          ifexists=true
+        elif [ "$1" = --help ]; then
+          echo "$help"
+          return
         fi
         shift
-    done
+        ;;
+      *)
+        loop=false
+        ;;
+    esac
+  done
+  # if we arent passed a PATH, just return 0 for convenience
+  if ! test "$1"; then
+    return 0
+  fi
+  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
-        IFS=:
-        for y in $PATH; do
-            [ "$x" = "$y" ] && found=true
-        done
-        unset IFS
-        if ! $found; then
-            if [ $ifexists = false ]  || [ -d $x ]; then
-                if $start; then
-                    PATH="$x:$PATH"
-                else
-                    PATH="$PATH:$x"
-                fi
-            fi
-        fi
+      fi
     done
+    if ! $found; then
+      if [ ! "$newpath" ]; then
+        newpath="$y"
+      else
+        newpath="$newpath:$y"
+      fi
+    fi
+  done
+
+  unset IFS
+  PATH="$newpath"
+  for x in "$@"; do
+    if ! $ifexists || [ -d "$x" ]; then
+      if [ ! "$PATH" ]; then
+        PATH="$x"
+      elif $end; then
+        PATH="$PATH:$x"
+      else
+        PATH="$x:$PATH"
+      fi
+    fi
+  done
 }