[e8a4ca]: mkinstalldirs Maximize Restore History

Download this file

mkinstalldirs    184 lines (163 with data), 4.4 kB

#! /bin/sh
# mkinstalldirs --- make directory hierarchy

scriptversion=2005-11-03.10

# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
# Created: 1993-05-16
# Public domain.
#
# This file is maintained in Automake, please report
# bugs to <bug-automake@gnu.org> or send patches to
# <automake-patches@gnu.org>.

errstatus=0
dirmode=""

usage="\
Usage:
  mkinstalldirs [-h] [--help] [--version]
  mkinstalldirs [--require REQDIR] [-m MODE] DIR ...

Create each directory DIR (with mode MODE, if specified), including all
leading file name components.  If REQDIR is specified, then DIR arguments
will not be processed, unless REQDIR already exists.

Report bugs to <bug-automake@gnu.org>."

# process command line arguments
arglist="void" optarg=""
for argval
do
  newarg=""
  if test "x$optarg" = xdisabled
  then
    test -d "$argval" || arglist="$arglist \"$argval\""
  elif test -n "$optarg"
  then
    newarg="$optarg"
    eval $optarg=\"$argval\"
    optarg=""
  else
    case $argval in
      -h | --help | --h*)         # -h for help
        echo "$usage"
        exit $?
        ;;
      -m)                         # -m PERM arg
        optarg=dirmode
        ;;
      --version)
        echo "$0 $scriptversion"
        exit $?
        ;;
      --require=*)                # --require=REQDIR arg
        reqdir=`echo $argval | sed -n s'/[^=]*=//'p`
        newarg=reqdir
        ;;
      --require)                  # --require REQDIR arg
        optarg=reqdir
        ;;
      --)                         # stop option processing
        optarg=disabled
        ;;
      -*)                         # unknown option
        echo >&2 "$0: illegal option -- $argval"
        echo >&2 "$usage"
        exit 1
        ;;
      *)                          # non-option arg
        test -d "$argval" || arglist="$arglist \"$argval\""
        ;;
    esac
  fi
  case $newarg in
    reqdir)
      test -d "${reqdir}" ||
      {
        echo >&2 "$0: $reqdir: directory must exist"
        exit 1
      } ;;
  esac
done

if test -n "$optarg" && test "x$optarg" != xdisabled
then
  test x$optarg = xdirmode && optarg="-m"
  echo >&2 "$0: $optarg: argument expected"
  exit 1
fi

eval set $arglist; shift
test $# -gt 0 || exit 0

# Solaris 8's mkdir -p isn't thread-safe.  If you mkdir -p a/b and
# mkdir -p a/c at the same time, both will detect that a is missing,
# one will create a, then the other will try to create a and die with
# a "File exists" error.  This is a problem when calling mkinstalldirs
# from a parallel make.  We use --version in the probe to restrict
# ourselves to GNU mkdir, which is thread-safe.
case $dirmode in
  '')
    if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
      echo "mkdir -p -- $*"
      exec mkdir -p -- "$@"
    else
      # On NextStep and OpenStep, the `mkdir' command does not
      # recognize any option.  It will interpret all options as
      # directories to create, and then abort because `.' already
      # exists.
      test -d ./-p && rmdir ./-p
      test -d ./--version && rmdir ./--version
    fi
    ;;
  *)
    if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
       test ! -d ./--version; then
      echo "mkdir -m $dirmode -p -- $*"
      exec mkdir -m "$dirmode" -p -- "$@"
    else
      # Clean up after NextStep and OpenStep mkdir.
      for d in ./-m ./-p ./--version "./$dirmode";
      do
        test -d $d && rmdir $d
      done
    fi
    ;;
esac

for file
do
  case $file in
    /*) pathcomp=/ ;;
    *)  pathcomp= ;;
  esac
  oIFS=$IFS
  IFS=/
  set fnord $file
  shift
  IFS=$oIFS

  for d
  do
    test "x$d" = x && continue

    pathcomp=$pathcomp$d
    case $pathcomp in
      -*) pathcomp=./$pathcomp ;;
    esac

    if test ! -d "$pathcomp"; then
      echo "mkdir $pathcomp"

      mkdir "$pathcomp" || lasterr=$?

      if test ! -d "$pathcomp"; then
	errstatus=$lasterr
      else
	if test ! -z "$dirmode"; then
	  echo "chmod $dirmode $pathcomp"
	  lasterr=
	  chmod "$dirmode" "$pathcomp" || lasterr=$?

	  if test ! -z "$lasterr"; then
	    errstatus=$lasterr
	  fi
	fi
      fi
    fi

    pathcomp=$pathcomp/
  done
done

exit $errstatus

# Local Variables:
# mode: shell-script
# sh-indentation: 2
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-end: "$"
# End: