#!/bin/sh # Take a list of MSYS-compatible paths and convert them to native # MS-Windows format. # Status is zero if successful, nonzero otherwise. VERSION='2013-11-09 10:48'; # UTC # The definition above must lie within the first 8 lines in order # for the Emacs time-stamp write hook (at end) to update it. # If you change this file with Emacs, please let the write hook # do its job. Otherwise, update this string manually. # Copyright (C) 2002-2013 Free Software Foundation, Inc. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . usage="usage: $0 PATHLIST [MUSTEXIST] [SEPARATOR [SEPARATOR2]]" help="$usage or: $0 OPTION Convert MSYS-compatible paths to MS-Windows native format. PATHLIST should be a list of paths separated by SEPARATOR. This list will be written to the standard output after performing the following transformations: 1. Empty paths will be discarded. 2. Backslashes will be replaced by forward slashed. 3. Two consecutive slashes will be replaced by a single one. 4. Each path will be translated to Windows-native format, using forward slashes (e.g. 'c:/foo/bar'). This translated path will never end with a slash. 5. Ocurrences of SEPARATOR2 withing the paths will be escaped with backslashes. 6. Different paths will be separated with SEPARATOR2. If MUSTEXIST is 'Y' (or not supplied), then each path in PATHLIST must exists. If SEPARATOR is not supplied, PATHLIST will be regarded as a single path. If SEPARATOR2 is not supplied, it will take the same value as SEPARATOR. Options: --help display this help and exit --version output version information and exit Report bugs to ." version=`expr "$VERSION" : '\([^ ]*\)'` version="msys-to-w32 $version Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law." for arg do case $arg in --help | --hel | --he | --h) exec echo "$help" ;; --version | --versio | --versi | --vers | --ver | --ve | --v) exec echo "$version" ;; --) shift break ;; -*) echo "$0: invalid option: $arg" >&2 exit 1 ;; *) break ;; esac done { test $# -ge 1 && test $# -le 4; } || { echo "$0: $usage" >&2; exit 1; } # Arguments pathlist=$1 mustexist=${2:-Y} separator=$3 separator2=${4:-${separator}} # Split pathlist into its path components if test -n "$separator" then IFS=${separator} patharray=( $pathlist ) else patharray=( "$pathlist" ) fi # Output pathlist pathlist2="" for p in "${patharray[@]}" do # Skip empty paths test "$p" = "" && continue # Replace '\' with '/', '//' with '/' and remove the final slash # (if any). p=${p//"\\"/"/"} p=${p//\/\//"/"} test ${#p} -gt 1 && p=${p%"/"} if test -d "$p" then # The path exists, so just translate it p2=`cd "$p" && pwd -W` else # The path does not exists. So, try to guess the # Windows-native translation test "${mustexist}" = "Y" && { echo "$0: invalid path: $p" >&2; exit 1; } # Look for the deepest existing directory in this path, # testing with partial paths by removing one component from # the right side in each iteration IFS=/ pcomponents=( $p ) pa=$p for (( i=${#pcomponents[@]}-1 ; i>=0 ; i-- )) do if test "${pcomponents[i]}" = "" then # The path component is empty. This can only mean # that the path starts with "/" and all components # have been stripped out already. So in this case # "pa" must be set to the MSYS root directory pa="/" else pa=${pa%"/${pcomponents[i]}"} fi if test -d "${pa}" then # Translate the existing part p2=`cd "${pa}" && pwd -W` # Remainder pb="${p#${pa}}" # Concatenate both parts (existing and remainder) test "${p2}" = "/" || p2="${p2}/" pb=${pb#/} p2="${p2}${pb}" break fi done # If no existing directory was found, error out test -e "${pa}" || { echo "$0: invalid path: ${p}" >&2; exit 1; } fi # Add this translated path to the translated pathlist test "${pathlist2}" = "" || pathlist2="${pathlist2}${separator2}" pathlist2="${pathlist2}${p2//${separator2}/\\${separator2}}" done # Write the translated pathlist to the standard output printf "${pathlist2}" ## Local Variables: ## eval: (add-hook 'write-file-functions 'time-stamp) ## time-stamp-start: "VERSION='" ## time-stamp-format: "%:y-%02m-%02d %02H:%02M" ## time-stamp-time-zone: "UTC" ## time-stamp-end: "'; # UTC" ## End: