aboutsummaryrefslogtreecommitdiff
blob: 72b8239dfbf4ed4a03a6af51332d90683f104505 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# -*-eselect-*-  vim: ft=eselect
# Copyright (c) 2005-2012 Gentoo Foundation
#
# This file is part of the 'eselect' tools framework.
#
# eselect 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 2 of the License, or (at your option) any later
# version.
#
# eselect 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
# eselect.  If not, see <http://www.gnu.org/licenses/>.

# basename and dirname functions
# transparent bash-only replacements for the external commands
# extended pattern matching (shopt -s extglob) is required
basename() {
	local path=$1 suf=$2

	if [[ -z ${path} ]]; then
		echo
		return
	fi

	# remove any trailing slashes
	path=${path%%*(/)}

	# remove everything up to and including the last slash
	path=${path##*/}

	# remove any suffix
	[[ ${suf} != "${path}" ]] && path=${path%"${suf}"}

	# output the result, or "/" if we ended up with a null string
	echo "${path:-/}"
}

dirname() {
	local path=$1

	if [[ -z ${path} ]]; then
		echo .
		return
	fi

	# remove any trailing slashes
	path=${path%%*(/)}

	# if the path contains only non-slash characters, then dirname is cwd
	[[ ${path:-/} != */* ]] && path=.

	# remove any trailing slashes followed by non-slash characters
	path=${path%/*}
	path=${path%%*(/)}

	# output the result, or "/" if we ended up with a null string
	echo "${path:-/}"
}

# Wrapper function for either GNU "readlink -f" or "realpath".
canonicalise() {
	@CANONICALISE@ "$@"
}

# relative_name
# Convert filename $1 to be relative to directory $2 (both must exist).
relative_name() {
	local path=$(canonicalise "$1") dir=$(canonicalise "$2") c
	while [[ -n ${dir} ]]; do
		c=${dir%%/*}
		dir=${dir##"${c}"*(/)}
		if [[ ${path%%/*} = "${c}" ]]; then
			path=${path##"${c}"*(/)}
		else
			path=..${path:+/}${path}
		fi
	done
	echo "${path:-.}"
}