138 lines
4.4 KiB
Python
138 lines
4.4 KiB
Python
import fnmatch
|
|
import os
|
|
import shutil
|
|
import tempfile
|
|
|
|
import dirutil
|
|
from buffer import Buffer
|
|
|
|
ignore = ['*.o', '*.lo', '*.la', '#*#', '*.rej', '*~', '.#*', '.DS_Store',
|
|
'*.pyc', '*.pyo', '.sconsign.dblite']
|
|
|
|
class DirBuffer(Buffer):
|
|
btype = 'dir'
|
|
def __init__(self, path, name=None):
|
|
Buffer.__init__(self)
|
|
self.path = os.path.realpath(path)
|
|
|
|
self.settings['hide-dot'] = True
|
|
self.settings['type-sort'] = False
|
|
self.settings['hide-glob'] = True
|
|
self.settings['ignores'] = list(ignore)
|
|
|
|
def changed(self):
|
|
return False
|
|
def readonly(self):
|
|
return True
|
|
def name(self):
|
|
return self.path
|
|
def path_exists(self):
|
|
return os.path.exists(self.path)
|
|
|
|
def get_names(self):
|
|
if not self.path_exists():
|
|
raise Exception, "directory %r does not exists" % self.path
|
|
names = os.listdir(self.path)
|
|
if self.path != '/':
|
|
names.insert(0, '..')
|
|
names.insert(0, '.')
|
|
return names
|
|
def _make_path(self, name):
|
|
return os.path.join(self.path, name)
|
|
def _get_lines(self):
|
|
names = self.get_names()
|
|
|
|
fieldlines = []
|
|
maxlens = [0] * 5
|
|
for name in names:
|
|
if self.settings.get('hide-dot'):
|
|
if name.startswith('.') and name not in ('.', '..'):
|
|
continue
|
|
if self.settings.get('hide-glob'):
|
|
skip = False
|
|
for glob in self.settings.get('ignores', []):
|
|
if fnmatch.fnmatch(name, glob):
|
|
skip = True
|
|
break
|
|
if skip:
|
|
continue
|
|
path = self._make_path(name)
|
|
fields = dirutil.path_fields(path, name)
|
|
for i in range(0, 5):
|
|
try:
|
|
maxlens[i] = max(maxlens[i], len(fields[i]))
|
|
except:
|
|
raise Exception, '%d %r' % (i, fields[i])
|
|
fieldlines.append(fields)
|
|
|
|
if self.settings.get('type-sort'):
|
|
fieldlines.sort(cmp=dirutil.path_sort)
|
|
else:
|
|
fieldlines.sort(cmp=dirutil.path_sort2)
|
|
fmt = '%%%ds %%-%ds %%-%ds %%%ds %%%ds %%s' % tuple(maxlens)
|
|
|
|
lines = []
|
|
for fields in fieldlines:
|
|
s = fmt % fields
|
|
lines.append(s)
|
|
return lines
|
|
def open(self):
|
|
self.lines = self._get_lines()
|
|
def reload(self):
|
|
lines = self._get_lines()
|
|
self.set_lines(lines, force=True)
|
|
def save(self, force=False):
|
|
raise Exception, "can't save a directory buffer"
|
|
def save_as(self, path):
|
|
raise Exception, "can't save a directory buffer"
|
|
|
|
class ArchiveBuffer(DirBuffer):
|
|
btype = 'archive'
|
|
types = [
|
|
['.tar', 'tar xf %(archive)r -C %(dir)r'],
|
|
['.tgz', 'tar xfz %(archive)r -C %(dir)r'],
|
|
['.tar.gz', 'tar xfz %(archive)r -C %(dir)r'],
|
|
['.tar.bz2', 'tar xfj %(archive)r -C %(dir)r'],
|
|
#['.gz', 'gunzip %(archive)r'],
|
|
#['.bz2', 'bunzip2 %(archive)r'],
|
|
['.zip', 'unzip -qq %(archive)r -d %(dir)r'],
|
|
['.jar', 'unzip -qq %(archive)r -d %(dir)r'],
|
|
]
|
|
def __init__(self, path, name=None):
|
|
self.archive = os.path.realpath(path)
|
|
for suffix, cmd in self.types:
|
|
if self.archive.endswith(suffix):
|
|
path = tempfile.mkdtemp()
|
|
cwd = os.getcwd()
|
|
os.chdir(path)
|
|
s = cmd % {'archive': self.archive, 'dir': path}
|
|
os.chdir(cwd)
|
|
retval = os.system(s)
|
|
if retval != 0: raise Exception("%r failed" % s)
|
|
DirBuffer.__init__(self, path, name)
|
|
|
|
def close(self):
|
|
shutil.rmtree(self.path)
|
|
|
|
class PathListBuffer(DirBuffer):
|
|
btype = 'pathlist'
|
|
def __init__(self, name, paths):
|
|
Buffer.__init__(self)
|
|
self.paths = list(paths)
|
|
self.path = os.getcwd()
|
|
self._name = name
|
|
self.settings['hide-dot'] = False
|
|
self.settings['type-sort'] = False
|
|
def path_exists(self):
|
|
raise Exception
|
|
def get_names(self):
|
|
cwd = os.getcwd()
|
|
return [x.replace(cwd, '.', 1) for x in self.paths]
|
|
def _make_path(self, name):
|
|
if name.startswith('.'):
|
|
return name.replace('.', os.getcwd(), 1)
|
|
else:
|
|
return name
|
|
def name(self):
|
|
return self._name
|