2007-07-22 13:53:32 -04:00
|
|
|
import datetime, grp, os, pwd, re, stat
|
2007-10-21 20:50:11 -04:00
|
|
|
from point import Point
|
2007-07-21 10:37:02 -04:00
|
|
|
|
2007-07-23 10:50:07 -04:00
|
|
|
def resolve_token(w, y=None):
|
|
|
|
if y is None:
|
2009-06-11 01:33:16 -04:00
|
|
|
y = w.logical_cursor().y
|
|
|
|
return w.get_next_token_by_type(Point(0, y), 'name')
|
2007-07-23 10:50:07 -04:00
|
|
|
def resolve_name(w, y=None):
|
|
|
|
t = resolve_token(w, y)
|
2008-03-18 10:51:47 -04:00
|
|
|
assert t is not None
|
2007-07-21 10:37:02 -04:00
|
|
|
return t.string
|
2007-07-23 10:50:07 -04:00
|
|
|
def resolve_path(w, y=None):
|
2007-07-21 10:37:02 -04:00
|
|
|
name = resolve_name(w)
|
|
|
|
path = os.path.join(w.buffer.path, name)
|
|
|
|
return path
|
2009-03-21 15:41:33 -04:00
|
|
|
def resolve_name_path(w, y=None):
|
|
|
|
name = resolve_name(w)
|
|
|
|
path = os.path.join(w.buffer.path, name)
|
|
|
|
return name, path
|
2007-07-21 10:37:02 -04:00
|
|
|
|
|
|
|
def find_name(w, s):
|
|
|
|
found = False
|
2007-07-23 10:50:07 -04:00
|
|
|
y = 0
|
2007-07-21 10:37:02 -04:00
|
|
|
c = w.logical_cursor()
|
2007-07-23 10:50:07 -04:00
|
|
|
while not found and y < len(w.buffer.lines):
|
|
|
|
t = resolve_token(w, y)
|
2007-07-21 10:37:02 -04:00
|
|
|
if t.string == s:
|
|
|
|
found = True
|
|
|
|
break
|
2007-07-23 10:50:07 -04:00
|
|
|
y += 1
|
|
|
|
if found:
|
|
|
|
w.application.methods['goto-line'].execute(w, lineno=y+1)
|
|
|
|
p = Point(c.x, y)
|
|
|
|
if not w.point_is_visible(p):
|
|
|
|
w.goto(p)
|
2007-07-21 10:37:02 -04:00
|
|
|
|
|
|
|
def valid_owner(owner):
|
|
|
|
if not owner:
|
|
|
|
return False
|
|
|
|
elif owner.isdigit():
|
|
|
|
return True
|
|
|
|
try:
|
|
|
|
pwd.getpwnam(owner)
|
|
|
|
return True
|
|
|
|
except:
|
|
|
|
return False
|
|
|
|
def valid_group(group):
|
|
|
|
if not group:
|
|
|
|
return False
|
|
|
|
elif group.isdigit():
|
|
|
|
return True
|
|
|
|
try:
|
|
|
|
grp.getgrnam(group)
|
|
|
|
return True
|
|
|
|
except:
|
|
|
|
return False
|
|
|
|
|
2007-07-22 13:53:32 -04:00
|
|
|
def path_sort(a, b):
|
|
|
|
try:
|
|
|
|
x = cmp(a[0][0], b[0][0])
|
2009-03-29 20:50:27 -04:00
|
|
|
if x != 0: return -x
|
2007-07-22 13:53:32 -04:00
|
|
|
return cmp(a[5], b[5])
|
|
|
|
except:
|
|
|
|
raise Exception, repr(a) + ' ' + repr(b)
|
|
|
|
|
2009-03-29 20:50:27 -04:00
|
|
|
def path_sort2(a, b):
|
|
|
|
try:
|
|
|
|
x = cmp(a[5], b[5])
|
|
|
|
if x != 0: return x
|
|
|
|
return cmp(b[0][0], a[0][0])
|
|
|
|
except:
|
|
|
|
raise Exception, repr(a) + ' ' + repr(b)
|
|
|
|
|
2007-07-22 13:53:32 -04:00
|
|
|
def path_fields(path, name):
|
|
|
|
# let's escape some troublesome characters
|
|
|
|
name = re.sub(r'([\a\b\n\r\t\v])', r'\\\1', name)
|
2007-07-23 10:50:07 -04:00
|
|
|
# don't follow links
|
|
|
|
info = os.lstat(path)
|
2007-07-22 13:53:32 -04:00
|
|
|
|
|
|
|
# - regular, b block, c character, d directory, l symlink, p fifo
|
|
|
|
# s socket, ? unknown
|
|
|
|
perm = [' '] * 10
|
|
|
|
if stat.S_ISREG(info.st_mode):
|
|
|
|
perm[0] = '-'
|
|
|
|
elif stat.S_ISBLK(info.st_mode):
|
|
|
|
perm[0] = 'b'
|
|
|
|
elif stat.S_ISCHR(info.st_mode):
|
|
|
|
perm[0] = 'c'
|
|
|
|
elif stat.S_ISDIR(info.st_mode):
|
|
|
|
perm[0] = 'd'
|
|
|
|
elif stat.S_ISLNK(info.st_mode):
|
|
|
|
perm[0] = 'l'
|
|
|
|
elif stat.S_ISFIFO(info.st_mode):
|
|
|
|
perm[0] = 'p'
|
|
|
|
elif stat.S_ISSOCK(info.st_mode):
|
|
|
|
perm[0] = 's'
|
|
|
|
else:
|
|
|
|
perm[0] = '?'
|
|
|
|
|
|
|
|
i = 1
|
|
|
|
symbols = ('r', 'w', 'x')
|
|
|
|
for bundle in ((stat.S_IRUSR, stat.S_IWUSR, stat.S_IXUSR),
|
|
|
|
(stat.S_IRGRP, stat.S_IWGRP, stat.S_IXGRP),
|
|
|
|
(stat.S_IROTH, stat.S_IWOTH, stat.S_IXOTH)):
|
|
|
|
for j in range(0, 3):
|
|
|
|
if info.st_mode & bundle[j]:
|
|
|
|
perm[i] = symbols[j]
|
|
|
|
else:
|
|
|
|
perm[i] = '-'
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
if info.st_mode & stat.S_ISUID:
|
|
|
|
if perm[3] == 'x':
|
|
|
|
perm[3] = 's'
|
|
|
|
else:
|
|
|
|
perm[3] = 'S'
|
|
|
|
if info.st_mode & stat.S_ISGID:
|
|
|
|
if perm[6] == 'x':
|
|
|
|
perm[6] = 's'
|
|
|
|
else:
|
|
|
|
perm[6] = 'S'
|
|
|
|
if info.st_mode & stat.S_ISVTX:
|
|
|
|
if perm[9] == 'x':
|
|
|
|
perm[9] = 't'
|
|
|
|
else:
|
|
|
|
perm[9] = 'T'
|
|
|
|
|
|
|
|
perms = ''.join(perm)
|
|
|
|
|
|
|
|
try:
|
|
|
|
user = pwd.getpwuid(info.st_uid)[0]
|
|
|
|
except:
|
|
|
|
user = str(info.st_uid)
|
|
|
|
try:
|
|
|
|
group = grp.getgrgid(info.st_gid)[0]
|
|
|
|
except:
|
|
|
|
group = str(info.st_gid)
|
|
|
|
|
|
|
|
size = info.st_size
|
|
|
|
unit = 0
|
|
|
|
units = ('B', 'K', 'M', 'G',)
|
|
|
|
while unit < 3 and size > 1024:
|
|
|
|
size = size / 1024
|
|
|
|
unit += 1
|
|
|
|
size = '%d%s' % (size, units[unit])
|
|
|
|
|
|
|
|
mtime = datetime.datetime.fromtimestamp(info.st_mtime).strftime('%b %d %H:%M')
|
|
|
|
|
|
|
|
fields = (perms, user, group, size, mtime, name)
|
|
|
|
return fields
|