aboutsummaryrefslogtreecommitdiff
path: root/lib/path.py
blob: be2340f9fec7bb86dfbb5663dedb1b413e3f1717 (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
125
# Module 'path' -- common operations on POSIX pathnames

import posix
import stat


# 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 stat.S_ISDIR(st[stat.ST_MODE])


# 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 stat.S_ISLNK(st[stat.ST_MODE])


_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)