Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

opening directories recursively #4

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
@@ -71,7 +71,9 @@ You can use ``rmate --help`` to see the usage
TextMate selection strings can be used
-m, --name NAME The display name shown in TextMate
-t, --type TYPE Treat file as having TYPE
-n, --new Open in a new window (Sublime Text)
-f, --force Open even if the file is not writable
-r, --recursive Open directories recursively
-v, --verbose Verbose logging messages
-h, --help Show this help and exit
--version Show version and exit
55 changes: 41 additions & 14 deletions bin/rmate
Original file line number Diff line number Diff line change
@@ -133,12 +133,15 @@ class Settings:
self.port = 52698
self.wait = False
self.force = False
self.new = False
self.verbose = False
self.lines = []
self.names = []
self.types = []
self.files = []
self.ignore = []
self.tmpFile = None
self.recursive = False

self.read_disk_settings()

@@ -161,7 +164,9 @@ class Settings:
" TextMate selection strings can be used\n"
" -m, --name NAME The display name shown in TextMate\n"
" -t, --type TYPE Treat file as having TYPE\n"
" -f, --force Open even if the file is not wratable\n"
" -n, --new Open in a new window (Sublime Text)\n"
" -f, --force Open even if the file is not writable\n"
" -r, --recursive Open directories recursively\n"
" -v, --verbose Verbose logging messages\n"
" -h, --help Show this help and exit\n"
" --version Show version and exit\n\n"
@@ -176,26 +181,30 @@ class Settings:
sys.stderr.write('Could not read settings from disk.\n')
if config.has_option('NOSECTION', 'host'): self.host = config.get('NOSECTION', 'host')
if config.has_option('NOSECTION', 'port'): self.port = config.get('NOSECTION', 'port')
if config.has_option('NOSECTION', 'ignore'): self.ignore = config.get('NOSECTION', 'ignore').split()

def parse_cli_options(self):
try:
optlist, args = getopt.gnu_getopt(sys.argv[1:], 'hp:wl:m:t:fv', ['host=', 'port=', 'wait', 'no-wait', 'line=', 'name=', 'type=', 'force', 'verbose', 'help', 'version'])
optlist, args = getopt.gnu_getopt(sys.argv[1:], 'hp:wl:m:t:nfrv', ['host=', 'port=', 'wait', 'no-wait', 'line=',
'name=', 'type=', 'new', 'force', 'recursive', 'verbose', 'help', 'version'])
except getopt.GetoptError:
self.usage()
sys.exit(2)

for name, value in optlist:
if name == '--version': print(VERSION_STRING); sys.exit()
elif name in ('-h', '--help'): self.usage(); sys.exit()
elif name == '--host': self.host = value
elif name in ('-p', '--port'): self.port = int(value)
elif name in ('-w', '--wait'): self.wait = True
elif name == '--no-wait': self.wait = False
elif name in ('-l', '--line'): self.lines.append(value)
elif name in ('-m', '--name'): self.names.append(value)
elif name in ('-t', '--type'): self.types.append(value)
elif name in ('-f', '--force'): self.force = True
elif name in ('-v', '--verbose'): self.verbose = True
if name == '--version': print(VERSION_STRING); sys.exit()
elif name in ('-h', '--help'): self.usage(); sys.exit()
elif name == '--host': self.host = value
elif name in ('-p', '--port'): self.port = int(value)
elif name in ('-w', '--wait'): self.wait = True
elif name == '--no-wait': self.wait = False
elif name in ('-l', '--line'): self.lines.append(value)
elif name in ('-m', '--name'): self.names.append(value)
elif name in ('-t', '--type'): self.types.append(value)
elif name in ('-n', '--new'): self.new = True
elif name in ('-f', '--force'): self.force = True
elif name in ('-r', '--recursive'): self.recursive = True
elif name in ('-v', '--verbose'): self.verbose = True

if '-' in sys.argv[1:] and '-' not in args: args.append('-')
self.files = args
@@ -256,14 +265,29 @@ def main():
elif path == '-' and sys.stdin.isatty():
sys.stderr.write('Reading from stdin, press ^D to stop\n')
elif os.path.isdir(path):
sys.stderr.write("'%s' is a directory!\n" % path)
if settings.recursive:
if any(pattern in path for pattern in settings.ignore):
log("Ignoring folder %s" % path)
continue
log("Opening %s recursively" % path)
for (dirpath, dirnames, filenames) in os.walk(path):
for dirname in dirnames[:]:
# prune search
if any(pattern in dirname for pattern in settings.ignore) or dirname[0] == '.':
dirnames.remove(dirname)
settings.files.extend(os.path.join(dirpath, filename) for filename in filenames if filename[0] != '.')
else:
sys.stderr.write("'%s' is a directory! Use -r/--recursive to open recursively.\n" % path)
continue
elif os.path.isfile(path) and not os.access(path, os.W_OK):
if settings.force:
log("File %s is not writable. Opening anyway." % path)
else:
sys.stderr.write("File %s is not writable! Use -f/--force to open anyway.\n" % path)
continue
elif any(pattern in path for pattern in settings.ignore):
log("Ignoring file %s" % path)
continue

cmd = Command("open")
if len(settings.names) > idx: cmd['display-name'] = settings.names[idx]
@@ -276,6 +300,9 @@ def main():

cmd["data-on-save"] = 'yes'
cmd["re-activate"] = 'yes'
if settings.new:
cmd["new"] = 'yes'
settings.new = False
cmd["token"] = path
if path == '-':
cmd.read_stdin()