revenc 0.1.3 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/.gemfiles +53 -0
  2. data/.gitignore +4 -8
  3. data/Gemfile.lock +42 -37
  4. data/HISTORY.markdown +9 -2
  5. data/LICENSE +1 -1
  6. data/README.markdown +33 -38
  7. data/Rakefile +24 -34
  8. data/TODO.markdown +3 -0
  9. data/VERSION +1 -1
  10. data/bin/revenc +30 -13
  11. data/config/cucumber.yml +4 -3
  12. data/examples/rsync/encrypted_data/key/encfs6.xml +27 -27
  13. data/examples/rsync/revenc.conf +2 -2
  14. data/examples/simple/encfs6.xml +27 -27
  15. data/features/app.feature +17 -17
  16. data/features/bin.feature +6 -6
  17. data/features/configuration.feature +9 -9
  18. data/features/copy.feature +15 -12
  19. data/features/generator.feature +1 -1
  20. data/features/mount.feature +14 -14
  21. data/features/settings.feature +119 -0
  22. data/features/step_definitions/revenc_steps.rb +1 -2
  23. data/features/support/aruba.rb +9 -9
  24. data/features/support/env.rb +8 -2
  25. data/features/unmount.feature +8 -8
  26. data/lib/revenc.rb +12 -3
  27. data/lib/revenc/app.rb +27 -53
  28. data/lib/revenc/core/array.rb +11 -0
  29. data/lib/revenc/core/hash.rb +45 -0
  30. data/lib/revenc/encfs_wrapper.rb +20 -24
  31. data/lib/revenc/errors.rb +3 -3
  32. data/lib/revenc/io.rb +13 -13
  33. data/lib/revenc/settings.rb +98 -0
  34. data/revenc.gemspec +28 -17
  35. data/spec/aruba_helper.rb +25 -0
  36. data/spec/basic_app/array_spec.rb +48 -0
  37. data/spec/basic_gem/aruba_helper_spec.rb +33 -0
  38. data/spec/basic_gem/basic_gem_spec.rb +71 -1
  39. data/spec/basic_gem/gemspec_spec.rb +68 -0
  40. data/spec/revenc/error_spec.rb +2 -2
  41. data/spec/revenc/io_spec.rb +12 -12
  42. data/spec/spec_helper.rb +4 -9
  43. data/spec/watchr.rb +48 -26
  44. metadata +120 -177
  45. data/.yardopts +0 -6
  46. data/spec/spec.opts +0 -2
@@ -0,0 +1,53 @@
1
+ .gemfiles
2
+ .gitattributes
3
+ .gitignore
4
+ Gemfile
5
+ Gemfile.lock
6
+ HISTORY.markdown
7
+ LICENSE
8
+ README.markdown
9
+ Rakefile
10
+ TODO.markdown
11
+ VERSION
12
+ bin/revenc
13
+ config/cucumber.yml
14
+ examples/rsync/encrypted_data/key/encfs6.xml
15
+ examples/rsync/revenc.conf
16
+ examples/rsync/scripts/passphrase
17
+ examples/rsync/unencrypted_data/test_file1.txt
18
+ examples/rsync/unencrypted_data/test_file2.txt
19
+ examples/simple/encfs6.xml
20
+ examples/simple/passphrase
21
+ examples/simple/unencrypted_data/test_file1.txt
22
+ examples/simple/unencrypted_data/test_file2.txt
23
+ features/app.feature
24
+ features/bin.feature
25
+ features/configuration.feature
26
+ features/copy.feature
27
+ features/generator.feature
28
+ features/mount.feature
29
+ features/settings.feature
30
+ features/step_definitions/.gitignore
31
+ features/step_definitions/revenc_steps.rb
32
+ features/support/aruba.rb
33
+ features/support/env.rb
34
+ features/support/hooks.rb
35
+ features/unmount.feature
36
+ lib/revenc.rb
37
+ lib/revenc/app.rb
38
+ lib/revenc/core/array.rb
39
+ lib/revenc/core/hash.rb
40
+ lib/revenc/encfs_wrapper.rb
41
+ lib/revenc/errors.rb
42
+ lib/revenc/io.rb
43
+ lib/revenc/settings.rb
44
+ revenc.gemspec
45
+ spec/aruba_helper.rb
46
+ spec/basic_app/array_spec.rb
47
+ spec/basic_gem/aruba_helper_spec.rb
48
+ spec/basic_gem/basic_gem_spec.rb
49
+ spec/basic_gem/gemspec_spec.rb
50
+ spec/revenc/error_spec.rb
51
+ spec/revenc/io_spec.rb
52
+ spec/spec_helper.rb
53
+ spec/watchr.rb
data/.gitignore CHANGED
@@ -1,10 +1,6 @@
1
- pkg/*
2
- *.gem
3
- .bundle
4
- coverage
5
- rdoc
6
- .yardoc
1
+ /pkg/
2
+ /.bundle/
3
+ /rdoc/
7
4
  rerun.txt
8
5
  tags
9
- tmp/fixtures
10
- tmp/aruba
6
+ /tmp/
@@ -1,54 +1,59 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- revenc (0.1.3)
5
- configatron (>= 2.5.1)
4
+ revenc (0.2.1)
6
5
  mutagem (>= 0.1.3)
7
6
  term-ansicolor (>= 1.0.4)
8
7
 
9
8
  GEM
10
9
  remote: http://rubygems.org/
11
10
  specs:
12
- aruba (0.2.3)
13
- background_process
14
- cucumber (~> 0.9.0)
15
- background_process (1.2)
16
- builder (2.1.2)
17
- configatron (2.6.3)
18
- yamler (>= 0.1.0)
19
- cucumber (0.9.0)
20
- builder (~> 2.1.2)
21
- diff-lcs (~> 1.1.2)
22
- gherkin (~> 2.2.2)
23
- json (~> 1.4.6)
24
- term-ansicolor (~> 1.0.5)
11
+ aruba (0.4.5)
12
+ bcat (>= 0.6.1)
13
+ childprocess (>= 0.1.9)
14
+ cucumber (>= 0.10.7)
15
+ rdiscount (>= 1.6.8)
16
+ rspec (>= 2.6.0)
17
+ bcat (0.6.1)
18
+ rack (~> 1.0)
19
+ builder (3.0.0)
20
+ childprocess (0.2.0)
21
+ ffi (~> 1.0.6)
22
+ cucumber (1.0.2)
23
+ builder (>= 2.1.2)
24
+ diff-lcs (>= 1.1.2)
25
+ gherkin (~> 2.4.5)
26
+ json (>= 1.4.6)
27
+ term-ansicolor (>= 1.0.5)
25
28
  diff-lcs (1.1.2)
26
- gherkin (2.2.4)
27
- json (~> 1.4.6)
28
- term-ansicolor (~> 1.0.5)
29
- trollop (~> 1.16.2)
30
- json (1.4.6)
31
- mutagem (0.1.3)
32
- rake (0.8.7)
33
- rdiscount (1.6.5)
34
- rspec (1.3.0)
35
- term-ansicolor (1.0.5)
36
- trollop (1.16.2)
37
- yamler (0.1.0)
38
- yard (0.6.1)
29
+ ffi (1.0.9)
30
+ gherkin (2.4.5)
31
+ json (>= 1.4.6)
32
+ json (2.1.0)
33
+ mutagem (0.2.3)
34
+ rack (1.3.1)
35
+ rake (0.9.2)
36
+ rdiscount (1.6.8)
37
+ rspec (2.6.0)
38
+ rspec-core (~> 2.6.0)
39
+ rspec-expectations (~> 2.6.0)
40
+ rspec-mocks (~> 2.6.0)
41
+ rspec-core (2.6.4)
42
+ rspec-expectations (2.6.0)
43
+ diff-lcs (~> 1.1.2)
44
+ rspec-mocks (2.6.0)
45
+ term-ansicolor (1.0.6)
39
46
 
40
47
  PLATFORMS
41
48
  ruby
42
49
 
43
50
  DEPENDENCIES
44
- aruba (>= 0.2.0)
45
- bundler (>= 1.0.0)
46
- configatron (>= 2.5.1)
47
- cucumber (>= 0.6)
48
- mutagem (>= 0.1.3)
51
+ aruba (~> 0.4.2)
52
+ bundler (>= 1.0.14)
53
+ cucumber (~> 1.0)
49
54
  rake (>= 0.8.7)
50
- rdiscount (>= 1.6.5)
51
55
  revenc!
52
- rspec (>= 1.2.9)
53
- term-ansicolor (>= 1.0.4)
54
- yard (>= 0.6.1)
56
+ rspec (>= 2.6.0)
57
+
58
+ BUNDLED WITH
59
+ 1.16.0
@@ -2,13 +2,20 @@ History
2
2
  =======
3
3
  Most recent changes are at the top
4
4
 
5
-
6
5
  Changes
7
6
  -------
8
7
 
8
+ ### 0.2.1 - 12/21/2017 ###
9
+
10
+ * Update and remove dependencies with known security issues
11
+
12
+ ### 0.2.0 - 08/02/2011 ###
13
+
14
+ * Merge upstream updates from [BasicApp](http://github.com/robertwahler/basic_app)
15
+
9
16
  ### 0.1.3 - 10/05/2010 ###
10
17
 
11
- * Using [mutagem](http://github.com/robertwahler/mutagem) for file locking based mutexes
18
+ * Using [Mutagem](http://github.com/robertwahler/mutagem) for file locking based mutexes
12
19
 
13
20
 
14
21
  ### 0.1.2 - 03/12/2010 ###
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010 GearheadForHire, LLC
1
+ Copyright (c) 2010-2017 GearheadForHire, LLC
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -1,32 +1,35 @@
1
1
  Revenc
2
2
  ======
3
3
 
4
- Mount an unencrypted folder as encrypted using EncFS and copy/synchronize the
4
+ Mount an unencrypted folder as encrypted using EncFS and copy/synchronize the
5
5
  encrypted files to untrusted destinations using rsync/cp
6
6
 
7
7
  Background
8
8
  ----------
9
9
 
10
- EncFS in reverse mode facilitates mounting an encrypted file system
11
- from an unencrypted source folder. This allows keeping your files unencrypted
12
- in a trusted environment while gaining the ability to encrypt on demand
10
+ EncFS in reverse mode facilitates mounting an encrypted file system
11
+ from an unencrypted source folder. This allows keeping your files unencrypted
12
+ in a trusted environment while gaining the ability to encrypt on demand
13
13
  i.e. when you want to rsync encrypted files off-site to an untrusted system.
14
14
 
15
+ Revenc was jump-started by cloning from
16
+ [BasicApp](https://github.com/robertwahler/basic_app).
17
+
15
18
  Why Revenc?
16
19
  -----------
17
20
 
18
- Revenc facilitates scripting EncFS reverse mounting and synchronizing by
19
- providing a configuration framework and validating mounts before running tools
21
+ Revenc facilitates scripting EncFS reverse mounting and synchronizing by
22
+ providing a configuration framework and validating mounts before running tools
20
23
  like rsync.
21
24
 
22
- Benefits
25
+ Benefits
23
26
  --------
24
27
 
25
28
  * Provides conventions for EncFS reverse mounting
26
- * Validates mountpoints before copying to prevent "rsync --delete" commands
27
- from trying to sync empty folders
28
- * Mount, unmount, and copy actions are protected by a mutex to prevent
29
- recursion on long running copy/sync operations. (mount, unmount and
29
+ * Validates mountpoints before copying to prevent "rsync --delete" commands
30
+ from trying to sync empty folders
31
+ * Mount, unmount, and copy actions are protected by a mutex to prevent
32
+ recursion on long running copy/sync operations. (mount, unmount and
30
33
  copy actions will fail if another instance of revenc is blocking)
31
34
  * Allow short, easy to remember command lines when used with configuration files.
32
35
  i.e. revenc mount, revenc unmount, revenc copy
@@ -36,7 +39,6 @@ Installation
36
39
 
37
40
  gem install revenc
38
41
 
39
-
40
42
  Usage
41
43
  -----
42
44
 
@@ -61,7 +63,7 @@ This calls the executable "encfs" with the following by default:
61
63
 
62
64
  Unmount using EncFS. Mountpoint is required when specified by revenc.conf.
63
65
 
64
- Unmount: revenc unmount <mountpoint>
66
+ Unmount: revenc unmount <mountpoint>
65
67
 
66
68
  This calls the executable "fusermount" with the following by default:
67
69
 
@@ -95,7 +97,7 @@ The following is a walk through of the steps used to create the example project
95
97
  ### Create the EncFS passphrase file ###
96
98
 
97
99
  You must supply EncFS with a passphrase in plain text. The passphrase is piped in on the command line
98
- to EncFS. This file can be stored anywhere on your trusted system. Revenc expects it in the
100
+ to EncFS. This file can be stored anywhere on your trusted system. Revenc expects it in the
99
101
  current folder, use revenc.conf to supply a different location.
100
102
 
101
103
  echo "my_super_secret_PassPHRase" > passphrase
@@ -103,12 +105,12 @@ current folder, use revenc.conf to supply a different location.
103
105
 
104
106
  ### Generate the EncFS key file ###
105
107
 
106
- Generation of your key file is done once. The same key is used for each mount action on the same
108
+ Generation of your key file is done once. The same key is used for each mount action on the same
107
109
  unencrypted source folder. You need to keep a copy of your key available in order to restore encrypted files.
108
- EncFS doesn't supply a method to fully automate the generation of the key file with so it needs
109
- to be done manually.
110
+ EncFS doesn't supply a method to fully automate the generation of the key file with so it needs
111
+ to be done manually.
110
112
 
111
- NOTE: The ENCFS6_CONFIG var is needed to control where the key file is created. The "${PWD}" is
113
+ NOTE: The ENCFS6_CONFIG var is needed to control where the key file is created. The "${PWD}" is
112
114
  used because EncFS expects full paths from the root folder.
113
115
 
114
116
  ENCFS6_CONFIG=./encfs6.xml encfs --reverse ${PWD}/unencrypted_data ${PWD}/encrypted_mountpoint -- -o ro
@@ -118,17 +120,17 @@ command prompt. You can complete the key generation any way you like. The foll
118
120
  used to generate the sample key. Note the I opted to store filenames in plain text for clarity.
119
121
 
120
122
  EncFS command prompt responses:
121
-
123
+
122
124
  x # expert mode
123
125
  1 # AES
124
126
  128 # key size
125
127
  1024 # block size
126
- 2 # Null => no encryption of filenames
128
+ 2 # Null => no encryption of filenames
127
129
  my_super_secret_PassPHRase # passphrase we stored in the step above
128
130
  my_super_secret_PassPHRase # confirm passphrase
129
131
 
130
132
 
131
- EncFS should generate encfs6.xml, mount the folder and return you to the command prompt. You can
133
+ EncFS should generate encfs6.xml, mount the folder and return you to the command prompt. You can
132
134
  now work with your encrypted files.
133
135
 
134
136
  ls encrypted_mountpoint
@@ -137,7 +139,7 @@ now work with your encrypted files.
137
139
 
138
140
  revenc unmount encrypted_mountpoint
139
141
  ls encrypted_mountpoint
140
-
142
+
141
143
  <no files here>
142
144
 
143
145
  revenc mount unencrypted_data encrypted_mountpoint
@@ -166,39 +168,32 @@ you can ommit action parameters. For example:
166
168
  revenc unmount
167
169
 
168
170
  The configuration file is YAML http://www.yaml.org/ format with ERB processing. You must
169
- escape ERB in the action commands. These need to be lazy loaded by Revenc. Unescaped
171
+ escape ERB in the action commands. These need to be lazy loaded by Revenc. Unescaped
170
172
  ERB is evaluated as the configuration file is read but before Revenc parses the commands.
171
173
  See the example configuration file examples/rsync/revenc.conf.
172
174
 
173
175
  The file features/configuration.feature has more details.
174
176
 
175
-
176
- System Requirements
177
+ System Requirements
177
178
  -------------------
178
179
 
179
- * POSIX system
180
- * EncFS http://www.arg0.net/encfs
181
-
180
+ * EncFS http://www.arg0.net/encfs (tested on versions: 1.5, 1.6)
182
181
 
183
- Run-time dependencies
182
+ Run-time dependencies
184
183
  ---------------------
185
- The following gems are required by default in applications cloned from BasicApp.
186
184
 
187
185
  * Term-ansicolor for optional color output <http://github.com/flori/term-ansicolor>
188
- * Configatron for configuration support <http://github.com/markbates/configatron>
189
-
186
+ * Mutagem for mutex support <http://github.com/robertwahler/mutagem>
190
187
 
191
188
  Development dependencies
192
189
  ------------------------
193
190
 
194
191
  * Bundler for dependency management <http://github.com/carlhuda/bundler>
195
- * Rspec for unit testing <http://github.com/dchelimsky/rspec>
196
- * Cucumber for functional testing <http://github.com/aslakhellesoy/cucumber>
197
- * Aruba for CLI testing <http://github.com/aslakhellesoy/aruba>
198
- * YARD for documentation generation <http://github.com/lsegal/yard>
199
-
192
+ * Rspec for unit testing <http://github.com/rspec/rspec>
193
+ * Cucumber for functional testing <http://github.com/cucumber/cucumber>
194
+ * Aruba for CLI testing <http://github.com/cucumber/aruba>
200
195
 
201
196
  Copyright
202
197
  ---------
203
198
 
204
- Copyright (c) 2010 GearheadForHire, LLC. See [LICENSE](LICENSE) for details.
199
+ Copyright (c) 2010-2017 GearheadForHire, LLC. See [LICENSE](LICENSE) for details.
data/Rakefile CHANGED
@@ -1,25 +1,15 @@
1
1
  # encoding: utf-8
2
2
 
3
- # bundler/setup is managing $LOAD_PATH, any gem needed by this Rakefile must
4
- # be listed as a development dependency in the gemspec
5
-
6
- require 'rubygems'
7
- require 'bundler/setup'
8
-
9
- Bundler::GemHelper.install_tasks
10
-
11
- def gemspec
12
- @gemspec ||= begin
13
- file = File.expand_path('../revenc.gemspec', __FILE__)
14
- eval(File.read(file), binding, file)
15
- end
16
- end
17
-
18
- require 'spec'
19
- require 'spec/rake/spectask'
20
- Spec::Rake::SpecTask.new(:spec) do |spec|
21
- spec.libs << 'lib' << 'spec'
22
- spec.spec_files = FileList['spec/**/*_spec.rb']
3
+ # Bundler is managing $LOAD_PATH, any gem needed by this Rakefile must be
4
+ # listed as a development dependency in the gemspec
5
+ require 'bundler/setup'
6
+ require 'bundler/gem_tasks'
7
+
8
+ require 'rspec/core/rake_task'
9
+ desc "Run RSpec"
10
+ RSpec::Core::RakeTask.new do |spec|
11
+ spec.pattern = 'spec/**/*_spec.rb'
12
+ spec.rspec_opts = ['--color', '--format nested']
23
13
  end
24
14
 
25
15
  require 'cucumber'
@@ -33,23 +23,23 @@ task :test => [:spec, :features]
33
23
 
34
24
  task :default => :test
35
25
 
36
- namespace :doc do
37
- project_root = File.expand_path(File.dirname(__FILE__))
38
- doc_destination = File.join(project_root, 'rdoc')
26
+ # put the gemfiles task in the :build dependency chain
27
+ task :build => [:gemfiles]
39
28
 
40
- require 'yard'
41
- require 'yard/rake/yardoc_task'
29
+ desc "Generate .gemfiles via 'git ls-files'"
30
+ task :gemfiles do
31
+ files = `git ls-files`
42
32
 
43
- YARD::Rake::YardocTask.new(:generate) do |yt|
44
- yt.options = ['--markup-provider', 'rdiscount',
45
- '--output-dir', doc_destination
46
- ] +
47
- gemspec.rdoc_options - ['--line-numbers', '--inline-source']
48
- end
33
+ filename = File.join(File.dirname(__FILE__), '.gemfiles')
34
+ cached_files = File.exists?(filename) ? File.open(filename, "r") {|f| f.read} : nil
35
+
36
+ # maintain EOL
37
+ files.gsub!(/\n/, "\r\n") if cached_files && cached_files.match("\r\n")
49
38
 
50
- desc "Remove generated documenation"
51
- task :clean do
52
- rm_r doc_destination if File.exists?(doc_destination)
39
+ if cached_files != files
40
+ puts "Updating .gemfiles"
41
+ File.open(filename, 'wb') {|f| f.write(files)}
53
42
  end
54
43
 
44
+ raise "unable to process gemfiles" unless files
55
45
  end
@@ -1,3 +1,6 @@
1
1
  TODO
2
2
  ====
3
3
 
4
+ * revenc.conf file paths should be relative to the config file location,
5
+ not cwd
6
+ * add alias 'umount' for 'unmount' action
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.2.1
data/bin/revenc CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  $:.unshift(File.dirname(__FILE__) + '/../lib')
4
4
 
5
+ require 'rubygems'
5
6
  require 'revenc'
6
7
  require 'optparse'
7
8
  require 'term/ansicolor'
@@ -18,28 +19,29 @@ banner << "\nActions: #{available_actions.join(' ')}\n" unless available_actions
18
19
  help = banner
19
20
  help += <<HELP
20
21
  Mount: revenc mount <unencrypted source> <empty mountpoint>
21
- Unmount: revenc unmount <mounted encypted folder>
22
+ Unmount: revenc unmount <mounted encypted folder>
22
23
  Copy: revenc copy <encrypted source> <destination>
23
24
  Note: Copying is normally done via rsync
24
25
 
25
26
  Options:
26
-
27
+
27
28
  HELP
28
29
 
29
30
  options = {}
30
31
  OptionParser.new do |opts|
31
32
  opts.banner = help
32
33
 
33
- # set defaults
34
- options[:verbose] = false
35
- options[:coloring] = true
36
-
37
34
  opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
38
35
  options[:verbose] = v
39
36
  end
40
37
 
41
- opts.on("-c", "--[no-]coloring", "Ansi color in output") do |c|
42
- options[:coloring] = c
38
+ opts.on("-c", "--[no-]coloring [MODE]", "ANSI color in output. MODE=AUTO (default) or ALWAYS") do |c|
39
+ options[:coloring] = c.nil? ? "AUTO" : c
40
+ options[:coloring].upcase! if options[:coloring]
41
+ unless [nil, false, "AUTO", "ALWAYS"].include?(options[:coloring])
42
+ puts "revenc, invalid color option: #{options[:coloring]}"
43
+ exit 1
44
+ end
43
45
  end
44
46
 
45
47
  opts.on("--version", "Display current version") do
@@ -52,7 +54,7 @@ OptionParser.new do |opts|
52
54
  end
53
55
 
54
56
  opts.on("--config FILE", "Load configuration options from FILE") do |file|
55
- options[:config] = file
57
+ options[:config] = file
56
58
  end
57
59
 
58
60
  # no argument, shows at tail. This will print an options summary.
@@ -60,7 +62,7 @@ OptionParser.new do |opts|
60
62
  puts opts
61
63
  exit 0
62
64
  end
63
-
65
+
64
66
  begin
65
67
  opts.parse!
66
68
  rescue OptionParser::InvalidOption => e
@@ -71,11 +73,26 @@ OptionParser.new do |opts|
71
73
 
72
74
  end
73
75
 
74
- if STDOUT.isatty
76
+ # options from config file, if it exists, will not overwrite command line
77
+ options = Revenc::Settings.new(FileUtils.pwd, options).options
78
+
79
+ if STDOUT.isatty || (options[:coloring] == 'ALWAYS')
75
80
  Term::ANSIColor::coloring = options[:coloring]
81
+
82
+ if options[:coloring] && Revenc::WINDOWS
83
+ unless ENV['ANSICON']
84
+ begin
85
+ require 'Win32/Console/ANSI'
86
+ rescue LoadError
87
+ Term::ANSIColor::coloring = false
88
+ STDERR.puts 'WARNING: You must "gem install win32console" (1.2.0 or higher) or use the ANSICON driver (https://github.com/adoxa/ansicon) to get color output on MRI/Windows'
89
+ end
90
+ end
91
+ end
92
+
76
93
  else
77
94
  Term::ANSIColor::coloring = false
78
95
  end
79
96
 
80
- app = Revenc::App.new(FileUtils.pwd, options)
81
- app.run
97
+ app = Revenc::App.new(FileUtils.pwd, ARGV.dup, options)
98
+ app.execute