summaryrefslogtreecommitdiffstats
path: root/Lib/posixpath.py
blob: e314cb3abfd9108a1f40b951db421615addebb14 (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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# Module 'path' -- common operations on POSIX pathnames

import posix


# Intelligent pathname concatenation.
# Inserts a '/' unless the first part is empty or already ends in '/'.
# Ignores the first part altogether if the second part is absolute
# (begins with '/').
#
def cat(a, b):
	if b[:1] = '/': return b
	if a = '' or a[-1:] = '/': return a + b
	return a + '/' + b


# Split a path in head (empty or ending in '/') and tail (no '/').
# The tail will be empty if the path ends in '/'.
#
def split(p):
	head, tail = '', ''
	for c in p:
		tail = tail + c
		if c = '/':
			head, tail = head + tail, ''
	return head, tail


# Return the tail (basename) part of a path.
#
def basename(p):
	return split(p)[1]


# Return the longest prefix of all list elements.
#
def commonprefix(m):
	if not m: return ''
	prefix = m[0]
	for item in m:
		for i in range(len(prefix)):
			if prefix[:i+1] <> item[:i+1]:
				prefix = prefix[:i]
				if i = 0: return ''
				break
	return prefix


# Does a file/directory exist?
#
def exists(path):
	try:
		st = posix.stat(path)
	except posix.error:
		return 0
	return 1


# Is a path a posix directory?
#
def isdir(path):
	try:
		st = posix.stat(path)
	except posix.error:
		return 0
	return st[0] / 4096 = 4 # S_IFDIR


# Is a path a symbolic link?
# This will always return false on systems where posix.lstat doesn't exist.
#
def islink(path):
	try:
		st = posix.lstat(path)
	except (posix.error, NameError):
		return 0
	return st[0] / 4096 = 10 # S_IFLNK


_mounts = []

def _getmounts():
	import commands, string
	mounts = []
	data = commands.getoutput('/etc/mount')
	lines = string.splitfields(data, '\n')
	for line in lines:
		words = string.split(line)
		if len(words) >= 3 and words[1] = 'on':
			mounts.append(words[2])
	return mounts


# Is a path a mount point?
# This only works for normalized, absolute paths,
# and only if the mount table as printed by /etc/mount is correct.
# Sorry.
#
def ismount(path):
	if not _mounts:
		_mounts[:] = _getmounts()
	return path in _mounts


# Directory tree walk.
# For each directory under top (including top itself),
# func(arg, dirname, filenames) is called, where dirname
# is the name of the directory and filenames is the list of
# files (and subdirectories etc.) in the directory.
# func may modify the filenames list, to implement a filter,
# or to impose a different order of visiting.
#
def walk(top, func, arg):
	try:
		names = posix.listdir(top)
	except posix.error:
		return
	func(arg, top, names)
	exceptions = ('.', '..')
	for name in names:
		if name not in exceptions:
			name = cat(top, name)
			if isdir(name):
				walk(name, func, arg)