droxi 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +18 -1
- data/Rakefile +3 -38
- data/bin/droxi +1 -1
- data/droxi.gemspec +1 -1
- data/lib/droxi.rb +69 -24
- data/lib/droxi/commands.rb +27 -14
- data/lib/droxi/complete.rb +4 -2
- data/lib/droxi/settings.rb +6 -2
- data/lib/droxi/state.rb +19 -6
- data/lib/droxi/text.rb +5 -3
- data/spec/testutils.rb +1 -0
- metadata +2 -3
- data/droxi.1.template +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad346e735c5106bff58480298a50a5c296e15542
|
4
|
+
data.tar.gz: f565510a170c8ad38066048d4cf7fe10bf09d51e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d14ddec3bd6d7cb7bbd3ad82ece43f7f9cb3811868fa1ef82525fb3dcbf853aaecf30365c960ded970be82fbf26455d454a334e34c27a6b599b7eca50f56cbda
|
7
|
+
data.tar.gz: 337b45f2741a59ac04422264ce0452abcd69e62eea9e2ee38dea7a97dca309fc56e14d4c90b62e2244c7ce11a4e36c82ed9b4541e2505e5ce8a8e5a49a54dcc1
|
data/README.md
CHANGED
@@ -26,7 +26,24 @@ Features
|
|
26
26
|
- Context-sensitive tab completion and path globbing
|
27
27
|
- Upload, download, organize, search, and share files
|
28
28
|
- File revision control
|
29
|
-
-
|
29
|
+
- Interactive help
|
30
|
+
|
31
|
+
Usage
|
32
|
+
-----
|
33
|
+
Usage: droxi [OPTION ...] [COMMAND [ARGUMENT ...]]
|
34
|
+
|
35
|
+
If invoked without arguments, run in interactive mode. If invoked with
|
36
|
+
arguments, parse the arguments as a command invocation, execute the
|
37
|
+
command, and exit.
|
38
|
+
|
39
|
+
For a list of commands, run `droxi help` or use the 'help' command in
|
40
|
+
interactive mode.
|
41
|
+
|
42
|
+
Options:
|
43
|
+
--debug Enable debug command
|
44
|
+
-f, --file FILE Specify path of config file
|
45
|
+
-h, --help Print help information and exit
|
46
|
+
--version Print version information and exit
|
30
47
|
|
31
48
|
Examples
|
32
49
|
--------
|
data/Rakefile
CHANGED
@@ -37,7 +37,7 @@ task :doc do
|
|
37
37
|
sh 'rdoc `find lib -name *.rb`'
|
38
38
|
end
|
39
39
|
|
40
|
-
desc 'build executable
|
40
|
+
desc 'build executable'
|
41
41
|
task :build do
|
42
42
|
def build_exe
|
43
43
|
filenames = `find lib -name *.rb`.split + ['bin/droxi']
|
@@ -50,64 +50,29 @@ task :build do
|
|
50
50
|
File.chmod(0755, 'build/droxi')
|
51
51
|
end
|
52
52
|
|
53
|
-
def date(gemspec)
|
54
|
-
require 'time'
|
55
|
-
Time.parse(gemspec[/\d{4}-\d{2}-\d{2}/]).strftime('%B %Y')
|
56
|
-
end
|
57
|
-
|
58
|
-
def commands
|
59
|
-
require_relative 'lib/droxi/commands'
|
60
|
-
Commands::NAMES.sort.map do |name|
|
61
|
-
cmd = Commands.const_get(name.upcase.to_sym)
|
62
|
-
".TP\n#{cmd.usage}\n#{cmd.description}\n"
|
63
|
-
end.join.strip
|
64
|
-
end
|
65
|
-
|
66
|
-
def build_page
|
67
|
-
gemspec = IO.read('droxi.gemspec')
|
68
|
-
main = IO.read('lib/droxi.rb')
|
69
|
-
|
70
|
-
contents = format(IO.read('droxi.1.template'),
|
71
|
-
date: date(gemspec),
|
72
|
-
version: main[/\d+\.\d+\.\d+/],
|
73
|
-
commands: commands)
|
74
|
-
|
75
|
-
IO.write('build/droxi.1', contents)
|
76
|
-
end
|
77
|
-
|
78
53
|
Dir.mkdir('build') unless Dir.exist?('build')
|
79
54
|
build_exe
|
80
|
-
build_page
|
81
|
-
end
|
82
|
-
|
83
|
-
desc 'build html version of man page'
|
84
|
-
task :html do
|
85
|
-
sh 'groff -man -T html build/droxi.1 > build/droxi.html'
|
86
55
|
end
|
87
56
|
|
88
57
|
PREFIX = ENV['PREFIX'] || ENV['prefix'] || '/usr/local'
|
89
58
|
BIN_PATH = "#{PREFIX}/bin"
|
90
|
-
MAN_PATH = "#{PREFIX}/share/man/man1"
|
91
59
|
|
92
|
-
desc 'install executable
|
60
|
+
desc 'install executable'
|
93
61
|
task :install do
|
94
62
|
require 'fileutils'
|
95
63
|
begin
|
96
64
|
FileUtils.mkdir_p(BIN_PATH)
|
97
65
|
FileUtils.cp('build/droxi', BIN_PATH)
|
98
|
-
FileUtils.mkdir_p(MAN_PATH)
|
99
|
-
FileUtils.cp('build/droxi.1', MAN_PATH)
|
100
66
|
rescue => error
|
101
67
|
puts error
|
102
68
|
end
|
103
69
|
end
|
104
70
|
|
105
|
-
desc 'uninstall executable
|
71
|
+
desc 'uninstall executable'
|
106
72
|
task :uninstall do
|
107
73
|
require 'fileutils'
|
108
74
|
begin
|
109
75
|
FileUtils.rm("#{BIN_PATH}/droxi")
|
110
|
-
FileUtils.rm("#{MAN_PATH}/droxi.1")
|
111
76
|
rescue => error
|
112
77
|
puts error
|
113
78
|
end
|
data/bin/droxi
CHANGED
data/droxi.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'droxi'
|
3
3
|
s.version = IO.read('lib/droxi.rb')[/VERSION = '(.+)'/, 1]
|
4
|
-
s.date = '2015-05-
|
4
|
+
s.date = '2015-05-31'
|
5
5
|
s.summary = 'An ftp-like command-line interface to Dropbox'
|
6
6
|
s.description = "A command-line Dropbox interface based on GNU coreutils, \
|
7
7
|
GNU ftp, and lftp. Features include smart tab completion, \
|
data/lib/droxi.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
begin
|
2
2
|
require 'dropbox_sdk'
|
3
3
|
rescue LoadError
|
4
|
-
puts
|
5
|
-
puts
|
4
|
+
puts 'droxi requires the dropbox-sdk gem.'
|
5
|
+
puts 'Run `gem install dropbox-sdk` to install it.'
|
6
6
|
exit
|
7
7
|
end
|
8
|
+
require 'optparse'
|
8
9
|
require 'readline'
|
9
10
|
|
10
11
|
require_relative 'droxi/commands'
|
@@ -16,24 +17,34 @@ require_relative 'droxi/text'
|
|
16
17
|
# Command-line Dropbox client module.
|
17
18
|
module Droxi
|
18
19
|
# Version number of the program.
|
19
|
-
VERSION = '0.
|
20
|
+
VERSION = '0.4.0'
|
20
21
|
|
21
22
|
# Message to display when invoked with the --help option.
|
22
|
-
HELP_TEXT =
|
23
|
-
|
24
|
-
'
|
25
|
-
'
|
26
|
-
'in
|
23
|
+
HELP_TEXT = [
|
24
|
+
'If invoked without arguments, run in interactive mode. If invoked with ' \
|
25
|
+
'arguments, parse the arguments as a command invocation, execute the ' \
|
26
|
+
'command, and exit.',
|
27
|
+
"For a list of commands, run `droxi help` or use the 'help' command in " \
|
28
|
+
'interactive mode.'
|
29
|
+
]
|
27
30
|
|
28
31
|
# Run the client.
|
29
|
-
def self.run
|
30
|
-
|
31
|
-
|
32
|
+
def self.run
|
33
|
+
reenter = ARGV[0] == 'REENTER'
|
34
|
+
ARGV.delete_if { |arg| arg == 'REENTER' }
|
35
|
+
original_argv = ARGV.dup
|
36
|
+
options = handle_options
|
37
|
+
Settings.init
|
32
38
|
|
33
|
-
|
34
|
-
|
39
|
+
client = DropboxClient.new(access_token)
|
40
|
+
state = State.new(client, ARGV.empty?, original_argv)
|
41
|
+
state.debug_enabled = options[:debug]
|
35
42
|
|
36
|
-
|
43
|
+
if ARGV.empty?
|
44
|
+
run_interactive(client, state, reenter)
|
45
|
+
else
|
46
|
+
invoke(ARGV, client, state)
|
47
|
+
end
|
37
48
|
rescue DropboxAuthError => error
|
38
49
|
warn error
|
39
50
|
Settings.delete(:access_token)
|
@@ -43,15 +54,45 @@ module Droxi
|
|
43
54
|
|
44
55
|
private
|
45
56
|
|
46
|
-
# Handles command-line options
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
57
|
+
# Handles command-line options and returns a +Hash+ of the extracted options.
|
58
|
+
def self.handle_options
|
59
|
+
options = { debug: false }
|
60
|
+
|
61
|
+
parser = OptionParser.new do |opts|
|
62
|
+
opts.banner = 'Usage: droxi [OPTION ...] [COMMAND [ARGUMENT ...]]'
|
63
|
+
|
64
|
+
opts.separator ''
|
65
|
+
HELP_TEXT.each do |text|
|
66
|
+
Text.wrap(text).each { |s| opts.separator(s) }
|
67
|
+
opts.separator ''
|
68
|
+
end
|
69
|
+
opts.separator 'Options:'
|
70
|
+
|
71
|
+
opts.on('--debug', 'Enable debug command') { options[:debug] = true }
|
72
|
+
|
73
|
+
opts.on('-f', '--file FILE', String,
|
74
|
+
'Specify path of config file') do |path|
|
75
|
+
Settings.config_file_path = path
|
76
|
+
end
|
77
|
+
|
78
|
+
opts.on('-h', '--help', 'Print help information and exit') do
|
79
|
+
puts opts
|
80
|
+
exit
|
81
|
+
end
|
82
|
+
|
83
|
+
opts.on('--version', 'Print version information and exit') do
|
84
|
+
puts "droxi v#{VERSION}"
|
85
|
+
exit
|
86
|
+
end
|
53
87
|
end
|
54
|
-
|
88
|
+
|
89
|
+
begin
|
90
|
+
parser.parse!
|
91
|
+
rescue OptionParser::ParseError => err
|
92
|
+
warn(err)
|
93
|
+
exit(1)
|
94
|
+
end
|
95
|
+
|
55
96
|
options
|
56
97
|
end
|
57
98
|
|
@@ -96,9 +137,13 @@ module Droxi
|
|
96
137
|
end
|
97
138
|
|
98
139
|
# Run the client in interactive mode.
|
99
|
-
def self.run_interactive(client, state)
|
140
|
+
def self.run_interactive(client, state, reenter)
|
100
141
|
info = client.account_info
|
101
|
-
|
142
|
+
if reenter
|
143
|
+
state.pwd = state.oldpwd
|
144
|
+
else
|
145
|
+
puts "Logged in as #{info['display_name']} (#{info['email']})"
|
146
|
+
end
|
102
147
|
|
103
148
|
init_readline(state)
|
104
149
|
with_interrupt_handling { do_interaction_loop(client, state, info) }
|
data/lib/droxi/commands.rb
CHANGED
@@ -51,7 +51,7 @@ module Commands
|
|
51
51
|
# command, +false+ otherwise.
|
52
52
|
def num_args_ok?(num_args)
|
53
53
|
args = @usage.split.drop(1)
|
54
|
-
min_args = args.
|
54
|
+
min_args = args.count { |arg| !arg[/[\[\]]/] }
|
55
55
|
max_args = if args.any? { |arg| arg.end_with?('...') }
|
56
56
|
num_args
|
57
57
|
else
|
@@ -118,12 +118,12 @@ module Commands
|
|
118
118
|
'debug STRING...',
|
119
119
|
"Evaluates the given string as Ruby code and prints the result. Won't \
|
120
120
|
work unless the program was invoked with the --debug flag.",
|
121
|
-
# rubocop:disable Lint/
|
122
|
-
lambda do |
|
123
|
-
if
|
121
|
+
# rubocop:disable Lint/Eval
|
122
|
+
lambda do |_client, state, args|
|
123
|
+
if state.debug_enabled
|
124
124
|
begin
|
125
125
|
p eval(args.join(' '))
|
126
|
-
# rubocop:enable Lint/
|
126
|
+
# rubocop:enable Lint/Eval
|
127
127
|
rescue SyntaxError => error
|
128
128
|
warn error
|
129
129
|
rescue => error
|
@@ -135,6 +135,20 @@ module Commands
|
|
135
135
|
end
|
136
136
|
)
|
137
137
|
|
138
|
+
# Execute shell command.
|
139
|
+
EXEC = Command.new(
|
140
|
+
'exec STRING...',
|
141
|
+
"Executes the given string in the system shell. ! can be used as \
|
142
|
+
shorthand for exec, as in \"!ls\".",
|
143
|
+
lambda do |_client, state, args|
|
144
|
+
state.pwd = '/'
|
145
|
+
Settings.save
|
146
|
+
cmd = args.join(' ')
|
147
|
+
cmd += '; droxi REENTER ' + state.argv.join(' ') if state.interactive
|
148
|
+
Kernel.exec(cmd)
|
149
|
+
end
|
150
|
+
)
|
151
|
+
|
138
152
|
# Terminate the session.
|
139
153
|
EXIT = Command.new(
|
140
154
|
'exit',
|
@@ -233,7 +247,6 @@ module Commands
|
|
233
247
|
else
|
234
248
|
try_and_handle(DropboxError) do
|
235
249
|
client.revisions(path).each do |rev|
|
236
|
-
|
237
250
|
size = rev['size'].sub(/ (.)B/, '\1').sub(' bytes', '').rjust(7)
|
238
251
|
mtime = Time.parse(rev['modified'])
|
239
252
|
current_year = (mtime.year == Time.now.year)
|
@@ -285,7 +298,8 @@ module Commands
|
|
285
298
|
lambda do |_client, state, args|
|
286
299
|
long = extract_flags(LS.usage, args, '-l' => 0).include?('-l')
|
287
300
|
|
288
|
-
files
|
301
|
+
files = []
|
302
|
+
dirs = []
|
289
303
|
state.expand_patterns(args, true).each do |path|
|
290
304
|
if path.is_a?(GlobError)
|
291
305
|
warn "ls: #{path}: no such file or directory"
|
@@ -566,11 +580,11 @@ module Commands
|
|
566
580
|
|
567
581
|
# Parse and execute a line of user input in the given context.
|
568
582
|
def self.exec(input, client, state)
|
569
|
-
|
570
|
-
|
571
|
-
elsif !input.empty?
|
583
|
+
unless input.empty?
|
584
|
+
input.sub!(/^!/, 'exec ')
|
572
585
|
tokens = Text.tokenize(input)
|
573
|
-
cmd
|
586
|
+
cmd = tokens.first
|
587
|
+
args = tokens.drop(1)
|
574
588
|
try_command(cmd, args, client, state)
|
575
589
|
end
|
576
590
|
end
|
@@ -700,7 +714,8 @@ module Commands
|
|
700
714
|
# removed flags. Prints warnings if the flags are not in the given +String+
|
701
715
|
# of valid flags (e.g. '-rf').
|
702
716
|
def self.extract_flags(usage, args, flags)
|
703
|
-
extracted
|
717
|
+
extracted = []
|
718
|
+
index = 0
|
704
719
|
while index < args.size
|
705
720
|
arg = args[index]
|
706
721
|
extracted_flags =
|
@@ -742,7 +757,6 @@ module Commands
|
|
742
757
|
end
|
743
758
|
|
744
759
|
# Continuously try to upload until successful or interrupted.
|
745
|
-
# rubocop:disable Style/MethodLength
|
746
760
|
def self.loop_upload(uploader, monitor_thread, tries)
|
747
761
|
while tries != 0 && uploader.offset < uploader.total_size
|
748
762
|
begin
|
@@ -756,7 +770,6 @@ module Commands
|
|
756
770
|
monitor_thread.kill if monitor_thread
|
757
771
|
raise error
|
758
772
|
end
|
759
|
-
# rubocop:enable Style/MethodLength
|
760
773
|
|
761
774
|
# Displays real-time progress for the a being uploaded.
|
762
775
|
def self.monitor_upload(uploader, to_path)
|
data/lib/droxi/complete.rb
CHANGED
@@ -11,7 +11,7 @@ module Complete
|
|
11
11
|
completion_options(type, tokens.last, state).map do |option|
|
12
12
|
option.gsub(' ', '\ ').sub(/\\ $/, ' ')
|
13
13
|
.split.drop(tokens.last.count(' ')).join(' ')
|
14
|
-
.sub(
|
14
|
+
.sub(%r{[^\\/]$}, '\0 ')
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
@@ -36,6 +36,8 @@ module Complete
|
|
36
36
|
index = tokens.drop_while { |token| token[/^-\w+$/] }.size
|
37
37
|
if index <= 1
|
38
38
|
'COMMAND'
|
39
|
+
elsif tokens[0].start_with?('!') || tokens[0].downcase == 'exec'
|
40
|
+
'LOCAL_FILE'
|
39
41
|
elsif Commands::NAMES.include?(tokens.first)
|
40
42
|
cmd = Commands.const_get(tokens.first.upcase.to_sym)
|
41
43
|
cmd.type_of_arg(index - 2)
|
@@ -121,7 +123,7 @@ module Complete
|
|
121
123
|
# Return the name of the directory indicated by a path.
|
122
124
|
def self.strip_filename(path)
|
123
125
|
return path if path == '/'
|
124
|
-
path.end_with?('/') ? path.sub(
|
126
|
+
path.end_with?('/') ? path.sub(%r{/$}, '') : File.dirname(path)
|
125
127
|
end
|
126
128
|
|
127
129
|
# Return a version of a path with .. and . resolved to appropriate
|
data/lib/droxi/settings.rb
CHANGED
@@ -75,10 +75,14 @@ module Settings
|
|
75
75
|
# setting data.
|
76
76
|
def self.parse(line)
|
77
77
|
return warn_invalid(line) unless /^(.+?)=(.+)$/ =~ line
|
78
|
-
key
|
78
|
+
key = Regexp.last_match[1].to_sym
|
79
|
+
value = Regexp.last_match[2]
|
79
80
|
return warn_invalid(line) unless [:access_token, :oldpwd].include?(key)
|
80
81
|
{ key => value }
|
81
82
|
end
|
82
83
|
|
83
|
-
|
84
|
+
# Initialize settings by reading rc file.
|
85
|
+
def self.init
|
86
|
+
self.settings = read
|
87
|
+
end
|
84
88
|
end
|
data/lib/droxi/state.rb
CHANGED
@@ -15,18 +15,30 @@ class State
|
|
15
15
|
# The previous remote working directory path.
|
16
16
|
attr_reader :oldpwd
|
17
17
|
|
18
|
+
# The actual/original command-line arguments
|
19
|
+
attr_reader :argv
|
20
|
+
|
21
|
+
# Whether the session is interactive.
|
22
|
+
attr_reader :interactive
|
23
|
+
|
18
24
|
# The previous local working directory path.
|
19
25
|
attr_accessor :local_oldpwd
|
20
26
|
|
21
27
|
# +true+ if the client has requested to quit, +false+ otherwise.
|
22
28
|
attr_accessor :exit_requested
|
23
29
|
|
30
|
+
# +true+ if the --debug option was given, +false+ otherwise.
|
31
|
+
attr_accessor :debug_enabled
|
32
|
+
|
24
33
|
# Return a new application state that uses the given client. Starts at the
|
25
34
|
# Dropbox root and with an empty cache.
|
26
|
-
def initialize(client)
|
35
|
+
def initialize(client, interactive = true, argv = ARGV)
|
36
|
+
@interactive = interactive
|
37
|
+
@argv = argv
|
27
38
|
@cache = Cache.new
|
28
39
|
@client = client
|
29
40
|
@exit_requested = false
|
41
|
+
@debug_enabled = false
|
30
42
|
@pwd = '/'
|
31
43
|
@oldpwd = Settings[:oldpwd] || '/'
|
32
44
|
@local_oldpwd = Dir.pwd
|
@@ -53,9 +65,10 @@ class State
|
|
53
65
|
path = resolve_path(path)
|
54
66
|
metadata(path)
|
55
67
|
path = "#{path}/".sub('//', '/')
|
56
|
-
@cache.keys.select do |key|
|
68
|
+
keys = @cache.keys.select do |key|
|
57
69
|
key.start_with?(path) && key != path && !key.sub(path, '').include?('/')
|
58
|
-
end
|
70
|
+
end
|
71
|
+
keys.map { |key| @cache[key]['path'] }
|
59
72
|
end
|
60
73
|
|
61
74
|
# Return +true+ if the Dropbox path is a directory, +false+ otherwise.
|
@@ -80,7 +93,7 @@ class State
|
|
80
93
|
path.gsub!('//', '/')
|
81
94
|
nil while path.sub!(%r{/([^/]+?)/\.\.}, '')
|
82
95
|
nil while path.sub!('./', '')
|
83
|
-
path.sub!(
|
96
|
+
path.sub!(%r{/\.$}, '')
|
84
97
|
path.chomp!('/')
|
85
98
|
path.gsub!('//', '/')
|
86
99
|
path.empty? ? '/' : path
|
@@ -130,8 +143,8 @@ class State
|
|
130
143
|
path = path.downcase
|
131
144
|
dir = File.dirname(path)
|
132
145
|
matches = contents(dir).select do |entry|
|
133
|
-
|
134
|
-
|
146
|
+
File.fnmatch(path, entry.downcase)
|
147
|
+
end
|
135
148
|
return GlobError.new(pattern) if matches.empty?
|
136
149
|
return matches unless preserve_root
|
137
150
|
prefix = pattern.rpartition('/')[0, 2].join
|
data/lib/droxi/text.rb
CHANGED
@@ -8,7 +8,7 @@ module Text
|
|
8
8
|
def self.table(items)
|
9
9
|
return [] if items.empty?
|
10
10
|
width = terminal_width
|
11
|
-
item_width = items.map
|
11
|
+
item_width = items.map(&:size).max + 2
|
12
12
|
items_per_line = [1, width / item_width].max
|
13
13
|
format_table(items, item_width, items_per_line)
|
14
14
|
end
|
@@ -16,7 +16,8 @@ module Text
|
|
16
16
|
# Wrap a +String+ to fit the terminal and return an +Array+ of lines in the
|
17
17
|
# result.
|
18
18
|
def self.wrap(text)
|
19
|
-
width
|
19
|
+
width = terminal_width
|
20
|
+
position = 0
|
20
21
|
lines = []
|
21
22
|
while position < text.size
|
22
23
|
lines << get_wrap_segment(text[position, text.size], width)
|
@@ -52,7 +53,8 @@ module Text
|
|
52
53
|
|
53
54
|
# Return an +Array+ of lines of the given items formatted as a table.
|
54
55
|
def self.format_table(items, item_width, columns)
|
55
|
-
lines
|
56
|
+
lines = []
|
57
|
+
items = items.dup
|
56
58
|
until items.empty?
|
57
59
|
lines << items.shift(columns).map { |item| item.ljust(item_width) }.join
|
58
60
|
end
|
data/spec/testutils.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: droxi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Mulcahy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dropbox-sdk
|
@@ -42,7 +42,6 @@ files:
|
|
42
42
|
- README.md
|
43
43
|
- Rakefile
|
44
44
|
- bin/droxi
|
45
|
-
- droxi.1.template
|
46
45
|
- droxi.gemspec
|
47
46
|
- lib/droxi.rb
|
48
47
|
- lib/droxi/cache.rb
|
data/droxi.1.template
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
.TH DROXI 1 "%{date}" "droxi %{version}"
|
2
|
-
.SH NAME
|
3
|
-
droxi \- ftp-like command-line interface to Dropbox
|
4
|
-
.SH SYNOPSIS
|
5
|
-
droxi [OPTION]... [COMMAND] [ARGUMENT]...
|
6
|
-
.SH DESCRIPTION
|
7
|
-
A command-line Dropbox interface inspired by GNU coreutils, GNU ftp, and lftp.
|
8
|
-
Features include smart tab completion, globbing, and interactive help. If
|
9
|
-
invoked without arguments, runs in interactive mode. If invoked with arguments,
|
10
|
-
parses the arguments as a command invocation, executes the command, and exits.
|
11
|
-
.SH COMMANDS
|
12
|
-
.TP
|
13
|
-
!STRING
|
14
|
-
Pass a string to be executed by the local shell.
|
15
|
-
%{commands}
|
16
|
-
.SH OPTIONS
|
17
|
-
.TP
|
18
|
-
--debug
|
19
|
-
Enable the 'debug' command for the session.
|
20
|
-
.TP
|
21
|
-
-h, --help
|
22
|
-
Print help information and exit.
|
23
|
-
.TP
|
24
|
-
--version
|
25
|
-
Print version information and exit.
|
26
|
-
.SH BUGS
|
27
|
-
If you find one, please use https://github.com/jangler/droxi/issues to report
|
28
|
-
it, or contact me via email.
|
29
|
-
.SH AUTHOR
|
30
|
-
Written by Brandon Mulcahy (brandon@jangler.info).
|