td 0.11.2 → 0.11.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- M2EwMGZhM2U3ZmE4ZWE3YzE4ZGM4NTA3NDVmYzZlZTFmMmVkZDdiMg==
4
+ MTZmYjMxNzU1OTk3MzQ0MzcyMGU5NzRhNzdkZjZhM2Q4ZTFlNDEyMw==
5
5
  data.tar.gz: !binary |-
6
- MzUwZGIzYTVjOGE2Yzc1NDcyYWYzZTE2YjNlZjNkMzY3YTljYTY4OQ==
6
+ NzFhNTY5YjIyNmRlYTUzNzk1YWIxY2Q1MzMxMzc1YjFhODkxZmY4ZA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZDE3YWM1OGQ5MWZmNTIxM2Q4NDNhMDdlMDUwYTcxNzYwZWUyNGU4YjRhNWFk
10
- ZjZjOTFjNWRjZmQ0YWVhNmFlYTQyZDIyMTQ1NTBjNTA0NjI5YzlhMTMwMGE0
11
- MDRlNDFiZDZiMTE1YjBlZmZkM2RkMzIxNDQ3NDc2OGEzNGMwY2M=
9
+ MTZkZGQyMWFkYjcxMDE2NWI2ZWEwZTVjNDQ5ODQ4YzYxMjMwOTJmZTI1Njc4
10
+ MGI4YWU1NzgzOTRmNjQ3ZDE5YjUxMTY2ZjhlMDM5Y2MxMmFjMWE4ZTEwNWM3
11
+ ZmZlYzM5ODRmYTQ0MTE0ZmRkMmFmNTNmNGYyMDU5MDhjNzRhOGE=
12
12
  data.tar.gz: !binary |-
13
- OTY4NWJkYmJiNmU5NTRjYTUyZTA0MDg5ODQ1ZmM0NmMwMjY2MmUzMjhiZTdk
14
- ZGE5MWQ1OWI4MzQ0YTlkMzcyY2YyMWVhNTc1ZjhhMTVkZTAyOTExZWU1OWM1
15
- M2QzNjM5MTQ1ZmY0NzA0NTNjNTI4ZjQwNWIxNmMzYzY3YWY4YWM=
13
+ OWI1OGZjYTE4ODBjZDc4YWFiMDJhZWNmYmVlNjg3OTdkODA4Y2FlMjkyMDY5
14
+ OGY3M2M1N2QzYTMwMGFiZDhhM2RhZTQ3ODVkMjgxNWE0MGYzZjFhM2Y3Y2Ux
15
+ OGZiYTU0ZTFiOWEyZGYzZTgyMmRmMTFhOTY0Mzc2ZDM4Y2NlN2Q=
data/ChangeLog CHANGED
@@ -1,3 +1,33 @@
1
+ == 2014-07-31 version 0.11.3
2
+
3
+ * Support name updates for schedules using sched:update command
4
+ * Update Bulk Import JAR file repository to Central Maven Repository where
5
+ the Bulk Import JAR file is now hosted
6
+ * Require Ruby v1.9 or superior for td to work ==> deprecated Ruby v1.8
7
+ * Limit the number of keys in the input file (JSON, Msgoack) that can be
8
+ imported in one import to 512 as per the backend's limitations
9
+ * Fixed import:create to work with import-only permissions and write-only API
10
+ keys
11
+ * Handle NotFoundError, AuthError, and ForbiddenError to suppress printing of
12
+ the exception stack traces but yet show the exception class name for reference
13
+ back to the actual HTTP error code
14
+ * validate the endpoints provided by -e / --endpoint using the Health-check
15
+ REST API /v3/system/server_status. Validation is avoided for any command
16
+ that does not require connectivity with the Treasure Data REST API server
17
+ * JAR update errors are ignored when running import:prepare. This command
18
+ does not require connectivity and can be ran even when the machine is not
19
+ connected to the internet
20
+ * Fixed Time based progress indicator to reflect the update interval exactly
21
+ * Read logging.properties Logging configuration file from ~/.td/java first,
22
+ then the td repository's location (default). This allows customization of
23
+ the logging for the Java Bulk Import CLI (td-import-java).
24
+ * Improve job result downloading by showing the total downloaded size and
25
+ percentage progress (Size based progress indicator). This is done when
26
+ printing the result in tabular format or writing the result on file in csv,
27
+ tsv, json, msgpack, or msgpack.gz formats. When displaying the result in csv,
28
+ tsv, and json format on stdout, the progress indicator is not used since the
29
+ data is progressively streamed in as it's received from the API server
30
+
1
31
  == 2014-06-18 version 0.11.2
2
32
 
3
33
  * Improve the update experience by showing a download progress indicator
@@ -7,7 +37,7 @@
7
37
  * Add support for other/alternative backends using the -e / --endpoint
8
38
  option. The backend can be also saved on the configuration file of use
9
39
  via the 'td server:endpoint' or when running 'td -e <newendpoint> account'
10
- command. The TD_API_SERVER environment variable still takes precendence
40
+ command. The TD_API_SERVER environment variable still takes precedence
11
41
  over all these settings
12
42
  * Removed Treasure Data Result Output database and table name client side
13
43
  validation since it's performed in the API backend
@@ -82,7 +112,7 @@
82
112
  * Add --format option to some subcommands to specify render format. json, csv and tsv.
83
113
  * job:show and query subcommand now accept --format option without --output
84
114
  * Show -k option in command result message if -k option is given.
85
- * Support import:jar_update subcommand to update td-import seperately
115
+ * Support import:jar_update subcommand to update td-import separately
86
116
 
87
117
 
88
118
  == 2013-11-20 version 0.10.95
@@ -109,10 +139,10 @@
109
139
 
110
140
  == 2013-11-05 version 0.10.92
111
141
 
112
- * Improve import commands. It can parse string values of 'HH:mm:ss' time format automatically without specifying '%T' and transfer into long unix timestamp.
113
- * Improve import commands. It can parse string values of 'yyyy/MM/dd HH:mm:ss' time format automatically without specifying 'time-format' and transfer into long unix timestamp.
114
- * Improve import commands. It can parse string values of 'yyyy/MM/dd HH:mm:ss Z' time format automatically without specifying 'time-format' and transfer into long unix timestamp.
115
- * Add 'regex' to source file format option of import:prepare command.
142
+ * Improve import commands. It can parse string values of 'HH:mm:ss' time format automatically without specifying '%T' and transfer into long Unix timestamp.
143
+ * Improve import commands. It can parse string values of 'yyyy/MM/dd HH:mm:ss' time format automatically without specifying 'time-format' and transfer into long Unix timestamp.
144
+ * Improve import commands. It can parse string values of 'yyyy/MM/dd HH:mm:ss Z' time format automatically without specifying 'time-format' and transfer into long Unix timestamp.
145
+ * Add 'regexp' to source file format option of import:prepare command.
116
146
  * Fix import:upload command. NullPointerException often occurs when data files are uploaded.
117
147
 
118
148
 
@@ -205,7 +235,7 @@
205
235
  == 2013-05-27 version 0.10.78
206
236
 
207
237
  * Add -q(--query) option to sched:create command
208
- * Add -x option to job:show, exlude result from automatically being downloaded
238
+ * Add -x option to job:show, exclude result from automatically being downloaded
209
239
  * Update parallel gem dependency to 0.6.1 or later
210
240
  * user:add now requires email and password
211
241
  * td-client v0.8.50
@@ -214,8 +244,8 @@
214
244
  == 2013-05-06 version 0.10.77
215
245
 
216
246
  * Fix 'invalid byte sequence in UTF-8' at job result writing to CSV
217
- * Fix installed version check mechanizm of auto updater
218
- * Remove using curses to detect terminal height for Windows unexpected behaviour
247
+ * Fix installed version check mechanism of auto updater
248
+ * Remove using curses to detect terminal height for Windows unexpected behavior
219
249
  * Set User-Agent header
220
250
 
221
251
 
@@ -280,7 +310,8 @@
280
310
 
281
311
  == 2013-01-22 version 0.10.68
282
312
 
283
- * Fixed cmdline argument handling problems of bulk_import:prepare_parts2 subcommand
313
+ * Fixed command-line argument handling problems of
314
+ bulk_import:prepare_parts2 subcommand
284
315
 
285
316
 
286
317
  == 2013-01-18 version 0.10.67
@@ -412,7 +443,7 @@ results on console
412
443
 
413
444
  * bulk_import:prepare_parts supports --true and --false type conversion options
414
445
  * bulk_import:prepare_parts supports --time-value option
415
- * bulk_import:prepare_parts convers /null/i to NULL by default
446
+ * bulk_import:prepare_parts converts /null/i to NULL by default
416
447
 
417
448
 
418
449
  == 2012-09-04 version 0.10.44
@@ -432,7 +463,7 @@ results on console
432
463
 
433
464
  == 2012-08-30 version 0.10.41
434
465
 
435
- * Supports HTTP_PROXY environemnt variable to use a proxy server
466
+ * Supports HTTP_PROXY environment variable to use a proxy server
436
467
 
437
468
 
438
469
  == 2012-08-07 version 0.10.40
@@ -662,7 +693,7 @@ results on console
662
693
  * Added new feature: status
663
694
  * Refined usage message
664
695
  * Fixed argument length check
665
- * help subcommand shows commandline examples
696
+ * help subcommand shows command-line examples
666
697
  * table:tail subcommand reduced default max row number
667
698
  * job:list subcommand supports --running and --error options
668
699
 
@@ -759,7 +790,7 @@ results on console
759
790
 
760
791
  == 2011-09-08 version 0.9.0
761
792
 
762
- * Changed subcommands grammer: action-group -> group:action
793
+ * Changed subcommands grammar: action-group -> group:action
763
794
  * Fixed import subcommand to strip \n
764
795
 
765
796
 
data/README.rdoc CHANGED
@@ -1,9 +1,9 @@
1
1
  = Treasure Data command line tool
2
2
 
3
- This CUI utility wraps the td-client-ruby (https://github.com/treasure-data/td-client-ruby),
4
- the REST API for managing databases and jobs on the Treasure Data Cloud.
3
+ This CUI utility wraps the {Ruby Client Library td-client-ruby}[https://github.com/treasure-data/td-client-ruby]
4
+ to interact with the REST API in managing databases and jobs on the Treasure Data Cloud.
5
5
 
6
- For more about Treasure Data, see <http://treasure-data.com/>.
6
+ For more info about Treasure Data, see <http://treasure-data.com/>.
7
7
 
8
8
  For full documentation see <http://docs.treasure-data.com/>.
9
9
 
@@ -57,6 +57,24 @@ Then run following commands on MinGW Shell:
57
57
  $ bundle install # don't use "--path" option
58
58
  $ rake exe:build # don't use "bundle exec"
59
59
 
60
+ == Bulk Import
61
+
62
+ Some of the +td+ commands prefixed with +td+ +import+ leverages the {Java Bulk Import CLI td-import-java}[https://github.com/treasure-data/td-import-java]
63
+ to process and Bulk load data in the Treasure Data Cloud.
64
+
65
+ The Bulk Import CLI is downloaded automatically at the first call to any of the command that require it; the use will
66
+ need internet connectivity in order to fetch the Bulk Import CLI JAR file from the
67
+ {Central Maven repository}[http://central.maven.org/maven2/com/treasuredata/td-import/]
68
+ and take advantage of these advanced features. If you need to setup a proxy, please consult this
69
+ {documentation}[http://docs.treasuredata.com/articles/faq#how-can-i-use-the-td-command-through-a-proxy] page.
70
+
71
+ The log levels and properties of the Bulk Import CLI can be configured in a +logging.properties+ file. A default
72
+ configuration is provided in a file within the gem or Toolbelt folder root, in the +java/+ folder. If you wish to
73
+ customize it, please make a copy of this file and store it in the:
74
+
75
+ ~/.td/java folder on Mac OSX or Linux
76
+ %USERPROFILE%\.td\java folder on Windows
77
+
60
78
  == Testing Hooks
61
79
 
62
80
  The CLI implements several hooks to enable/disable/trigger special behaviors.
@@ -66,61 +84,65 @@ These hooks are expressed as environment variables and can therefore be provided
66
84
 
67
85
  * Unix / Linux / MacOSX
68
86
  * environment variable export in the shell the command is executed. The setting remains active until the shell is closed. E.g.:
69
-
87
+
70
88
  $ export TD_TOOLBELT_DEBUG=1
71
-
89
+
72
90
  * in the shell configuration file, to be active in any new shell that is opened. E.g.: add
73
-
91
+
74
92
  export TD_TOOLBELT_DEBUG=1
75
-
93
+
76
94
  to <tt>~/.bashrc</tt> or equivalent shell configuration file.
77
95
  To make the setting active in the current shell, source the configuration file, e.g.:
78
-
96
+
79
97
  $ source ~/.bashrc
80
-
98
+
81
99
  * on the command line at runtime (active only for the duration of the command). E.g.:
82
-
100
+
83
101
  $ TD_TOOLBELT_DEBUG=1 td ....
84
-
102
+
85
103
  * as alias on in the current shell. The setting remains active until the shell is closed. E.g.:
86
-
104
+
87
105
  $ alias td='TD_TOOLBELT_DEBUG=1 td'
88
-
106
+
89
107
  * as alias in configuration file, to be active in any new shell that is opened. E.g.:
90
-
108
+
91
109
  alias td='TD_TOOLBELT_DEBUG=1 td'`
92
-
110
+
93
111
  to <tt>~/.bashrc</tt> or equivalent shell configuration file.
94
112
  To make the setting active in the current shell, source the configuration file, e.g.:
95
-
113
+
96
114
  $ source ~/.bashrc
97
-
115
+
98
116
  * Windows
99
117
  * in the command prompt the command is executed. The setting remains active until the command prompt window is closed. E.g.:
100
-
118
+
101
119
  cmd> set TD_TOOLBELT_DEBUG=1
102
-
120
+
103
121
  * as a global environment variable in the system settings. It will be active for all new command prompt windows.
104
122
 
105
123
  These are the available hooks:
106
124
 
107
125
  * Enable debugging mode:
108
-
126
+
109
127
  $ TD_TOOLBELT_DEBUG=1
110
-
128
+
111
129
  * JAR auto update (enabled by default is not specified). This setting does not affect <tt>import:jar_update</tt>:
112
130
  * Enable:
113
-
131
+
114
132
  $ TD_TOOLBELT_JAR_UPDATE=1
115
-
133
+
116
134
  * Disable:
117
-
135
+
118
136
  $ TD_TOOLBELT_JAR_UPDATE=0
119
-
120
- * Specify an alternative endpoint to use to update the toolbelt (default: http://toolbelt.treasuredata.com):
121
-
137
+
138
+ * Specify an alternative endpoint to use updating the toolbelt (default: http://toolbelt.treasuredata.com):
139
+
122
140
  $ TD_TOOLBELT_UPDATE_ROOT="http://toolbelt.treasuredata.com"
123
-
141
+
142
+ * Specify an alternative endpoint to use updating the JAR file (default: http://central.maven.org):
143
+
144
+ $ TD_TOOLBELT_JARUPDATE_ROOT="http://central.maven.org"
145
+
124
146
 
125
147
  = Copyright
126
148
 
data/dist/exe.rake CHANGED
@@ -23,7 +23,7 @@ task 'exe:build' => :build do
23
23
  install_resource 'exe/td-cmd.bat', 'td-cmd.bat', 0755
24
24
  end
25
25
 
26
- zip_files(project_root_path('pkg/td-update-exe.zip'), 'td')
26
+ zip_files(project_root_path("pkg/td-update-exe-#{version}.zip"), 'td')
27
27
 
28
28
  # create td.iss and run Inno Setup
29
29
  install_erb_resource 'exe/td.iss', 'td.iss', 0644, variables
@@ -41,6 +41,6 @@ desc "clean Windows exe package"
41
41
  task "exe:clean" do
42
42
  FileUtils.rm_rf build_dir_path('exe')
43
43
  FileUtils.rm_rf project_root_path("pkg/td-#{version}.exe")
44
- FileUtils.rm_rf project_root_path("pkg/td-update-exe.zip")
44
+ FileUtils.rm_rf project_root_path("pkg/td-update-exe-#{version}.zip")
45
45
  end
46
46
 
data/dist/pkg.rake CHANGED
@@ -16,7 +16,7 @@ task 'pkg:build' => :build do
16
16
  sh "pax -wz -x cpio . > ../bundle/td-client.pkg/Payload"
17
17
  end
18
18
 
19
- zip_files(project_root_path('pkg/td-update-pkg.zip'), 'td-client.build')
19
+ zip_files(project_root_path("pkg/td-update-pkg-#{version}.zip"), 'td-client.build')
20
20
 
21
21
  # create ./bundle/td-client.pkg/Bom
22
22
  sh "mkbom -s td-client.build bundle/td-client.pkg/Bom"
@@ -49,6 +49,6 @@ desc "clean Mac OS X pkg package"
49
49
  task "pkg:clean" do
50
50
  FileUtils.rm_rf build_dir_path('pkg')
51
51
  FileUtils.rm_rf project_root_path("pkg/td-#{version}.pkg")
52
- FileUtils.rm_rf project_root_path("pkg/td-update-pkg.zip")
52
+ FileUtils.rm_rf project_root_path("pkg/td-update-pkg-#{version}.zip")
53
53
  end
54
54
 
@@ -28,11 +28,7 @@ module Command
28
28
  name, db_name, table_name = op.cmd_parse
29
29
 
30
30
  client = get_client
31
-
32
- table = get_table(client, db_name, table_name)
33
-
34
- opts = {}
35
- client.create_bulk_import(name, db_name, table_name, opts)
31
+ client.create_bulk_import(name, db_name, table_name, {})
36
32
 
37
33
  $stderr.puts "Bulk import session '#{name}' is created."
38
34
  end
@@ -20,6 +20,9 @@ module Command
20
20
  class UpdateError < ArgumentError
21
21
  end
22
22
 
23
+ class ImportError < RuntimeError
24
+ end
25
+
23
26
  private
24
27
  def initialize
25
28
  @render_indent = ''
@@ -108,9 +111,9 @@ module Command
108
111
 
109
112
  def normalized_message
110
113
  <<EOS
111
- Your event has large number larger than 2^64.
114
+ Your event has numbers larger than 2^64.
112
115
  These numbers are converted into string type.
113
- So you should use cast operator, e.g. cast(v['key'] as decimal), in your query.
116
+ You should consider using the cast operator in your query: e.g. cast(v['key'] as decimal).
114
117
  EOS
115
118
  end
116
119
 
@@ -125,8 +128,42 @@ EOS
125
128
  $!.backtrace.each {|b|
126
129
  $stderr.puts " #{b}"
127
130
  }
128
- $stderr.puts ""
131
+ $stderr.puts ""
132
+ end
133
+ end
134
+
135
+ def self.humanize_bytesize(size, fractional_digits = 1)
136
+ labels = ["B", "kB", "MB", "GB", "TB"]
137
+ max_power = labels.length - 1
138
+
139
+ size = size.to_i
140
+
141
+ if size == 0
142
+ return "0 B"
143
+ end
144
+
145
+ # integer part
146
+ value = size
147
+ power = 0
148
+ while value > 0 do
149
+ value /= 1024
150
+ power += 1
129
151
  end
152
+ power -= 1
153
+ power = power > max_power ? max_power : power # limit to TB display
154
+ integer = size / (1024 ** power)
155
+ out = integer.to_s
156
+
157
+ # fractional part - remove the integer part to avoid running into floating
158
+ # point precision problems
159
+ value = size % ((1024 ** power) * integer)
160
+ if value > 0 and fractional_digits > 0
161
+ fractional = value.to_f / (1024 ** power)
162
+ fractional *= 10 ** fractional_digits
163
+ out += sprintf ".%0*d", fractional_digits, fractional.to_i
164
+ end
165
+ out += " " + labels[power.to_i]
166
+ out
130
167
  end
131
168
 
132
169
  def self.humanize_time(time, is_ms = false)
@@ -237,6 +274,10 @@ EOS
237
274
  raise ParameterConfigurationError,
238
275
  "API server endpoint URL must use 'http' or 'https' protocol. Example format: 'https://api.treasuredata.com'"
239
276
  end
277
+ unless uri.path =~ /^\/*$/
278
+ raise ParameterConfigurationError,
279
+ "API server path must be empty ('#{uri.path}' provided). Example format: 'https://api.treasuredata.com'"
280
+ end
240
281
 
241
282
  if !(md = /(\d{1,3}).(\d{1,3}).(\d{1,3}).(\d{1,3})/.match(uri.host)).nil? # IP address
242
283
  md[1..-1].each { |v|
@@ -245,15 +286,17 @@ EOS
245
286
  "API server IP address must a 4 integers tuple, with every integer in the [0,255] range. Example format: 'https://1.2.3.4'"
246
287
  end
247
288
  }
248
- else # host name validation
249
- unless uri.host =~ /\.treasure\-?data\.com$/
250
- raise ParameterConfigurationError,
251
- "API server endpoint URL must end with '.treasuredata.com' or '.treasure-data.com'. Example format: 'https://api.treasuredata.com'"
252
- end
253
- unless uri.host =~ /[\d\w\.]+\.treasure\-?data\.com$/
254
- raise ParameterConfigurationError,
255
- "API server endpoint URL must have prefix before '.treasuredata.com' or '.treasure-data.com'. Example format: 'https://api.treasuredata.com'."
256
- end
289
+ end
290
+ end
291
+
292
+ def self.test_api_endpoint(endpoint)
293
+ begin
294
+ # although the API may return 'Server is down' that is a good enough
295
+ # indication that we hit a valid TD endpoint to accept it
296
+ Client.server_status(:endpoint => endpoint)
297
+ rescue
298
+ raise ParameterConfigurationError,
299
+ "The specified API server endpoint (#{endpoint}) does not respond."
257
300
  end
258
301
  end
259
302
 
@@ -270,24 +313,39 @@ EOS
270
313
  end
271
314
  end
272
315
 
316
+ def self.find_files(glob, locations)
317
+ files = []
318
+ locations.each {|loc|
319
+ files = Dir.glob("#{loc}/#{glob}")
320
+ break unless files.empty?
321
+ }
322
+ files
323
+ end
324
+
273
325
  class DownloadProgressIndicator
274
- def initialize(msg, start_time, periodicity)
326
+ def initialize(msg)
275
327
  @base_msg = msg
276
- @start_time = start_time
277
- @last_time = start_time
278
- @periodicity = periodicity
279
-
280
328
  print @base_msg + " " * 10
281
329
  end
282
330
  end
283
331
 
284
332
  class TimeBasedDownloadProgressIndicator < DownloadProgressIndicator
333
+ def initialize(msg, start_time, periodicity = 2)
334
+ @start_time = start_time
335
+ @last_time = start_time
336
+ @periodicity = periodicity
337
+ super(msg)
338
+ end
339
+
285
340
  def update
286
- # progress indicator
287
- if (time = Time.now.to_i) - @last_time > @periodicity
341
+ if (time = Time.now.to_i) - @last_time >= @periodicity
288
342
  msg = "\r#{@base_msg}: #{Command.humanize_elapsed_time(@start_time, time)} elapsed"
289
- print msg + " " * 10
343
+ print "\r" + " " * (msg.length + 10)
344
+ print msg
290
345
  @last_time = time
346
+ true
347
+ else
348
+ false
291
349
  end
292
350
  end
293
351
 
@@ -296,5 +354,43 @@ EOS
296
354
  end
297
355
  end
298
356
 
357
+ class SizeBasedDownloadProgressIndicator < DownloadProgressIndicator
358
+ def initialize(msg, size, perc_step = 1, min_periodicity = nil)
359
+ @size = size
360
+
361
+ # perc_step is how small a percentage increment can be shown
362
+ @perc_step = perc_step
363
+
364
+ # min_periodicity=X limits updates to one every X second
365
+ @start_time = Time.now.to_i
366
+ @min_periodicity = min_periodicity
367
+
368
+ # track progress
369
+ @last_perc_step = 0
370
+ @last_time = @start_time
371
+
372
+ super(msg)
373
+ end
374
+
375
+ def update(curr_size)
376
+ ratio = (curr_size.to_f * 100 / @size).round(1)
377
+ if ratio >= (@last_perc_step + @perc_step) &&
378
+ (!@min_periodicity || (time = Time.now.to_i) - @last_time >= @min_periodicity)
379
+ msg = "\r#{@base_msg}: #{Command.humanize_bytesize(curr_size)} / #{ratio}%"
380
+ print "\r" + " " * (msg.length + 10)
381
+ print msg
382
+ @last_perc_step = ratio
383
+ @last_time = time
384
+ true
385
+ else
386
+ false
387
+ end
388
+ end
389
+
390
+ def finish
391
+ print "\r#{@base_msg}...done" + " " * 20
392
+ end
393
+ end
394
+
299
395
  end # module Command
300
396
  end # module TrasureData
@@ -17,7 +17,7 @@ module Command
17
17
  exit 1
18
18
 
19
19
  else
20
- method = List.get_method(cmd)
20
+ method, cmd_req_connectivity = List.get_method(cmd)
21
21
  method.call(['--help'])
22
22
  end
23
23
  end
@@ -34,15 +34,15 @@ module Command
34
34
  end
35
35
 
36
36
  def import_prepare(op)
37
- import_by_java('prepare')
37
+ import_by_java(op)
38
38
  end
39
39
 
40
40
  def import_upload(op)
41
- import_by_java('upload')
41
+ import_by_java(op)
42
42
  end
43
43
 
44
44
  def import_auto(op)
45
- import_by_java('auto')
45
+ import_by_java(op)
46
46
  end
47
47
 
48
48
  def import_perform(op)
@@ -80,8 +80,17 @@ module Command
80
80
  #
81
81
 
82
82
  private
83
- def import_by_java(subcmd)
84
- check_n_update_jar(true)
83
+ def import_by_java(op)
84
+ subcmd = op.name.split(/:/)[1]
85
+ begin
86
+ check_n_update_jar(true)
87
+ rescue UpdateError => e
88
+ if op.cmd_requires_connectivity
89
+ raise e
90
+ else
91
+ puts "Warning: JAR update skipped for connectivity issues"
92
+ end
93
+ end
85
94
 
86
95
  # check java runtime exists or not
87
96
  check_java
@@ -227,5 +236,41 @@ module Command
227
236
  sysprops << "-Dhttp.proxyPort=#{proxy_port}" if proxy_port
228
237
  end
229
238
 
239
+ #
240
+ # Helpers
241
+ #
242
+
243
+ # find logging.properties file, first in the jarfile_dest_path, then in the
244
+ # installed_path
245
+ def find_logging_property
246
+ installed_path = File.join(File.expand_path('../../..', File.dirname(__FILE__)), 'java')
247
+ config = Command.find_files("logging.properties", [Updater.jarfile_dest_path, installed_path])
248
+ if config.empty?
249
+ puts "Cannot find 'logging.properties' file in '#{Updater.jarfile_dest_path}' or " +
250
+ "'#{installed_path}'." unless ENV['TD_TOOLBELT_DEBUG'].nil?
251
+ []
252
+ else
253
+ config.first
254
+ end
255
+ end
256
+
257
+ def find_td_import_jar
258
+ jar = Command.find_files('td-import.jar', [Updater.jarfile_dest_path])
259
+ if jar.empty?
260
+ $stderr.puts "Cannot find td-import.jar in '#{Updater.jarfile_dest_path}'."
261
+ exit 10
262
+ end
263
+ jar.first
264
+ end
265
+
266
+ def find_version_file
267
+ version = Command.find_files('VERSION', [Updater.jarfile_dest_path])
268
+ if version.empty?
269
+ $stderr.puts "Cannot find VERSION file in '#{Updater.jarfile_dest_path}'."
270
+ exit 10
271
+ end
272
+ version.first
273
+ end
274
+
230
275
  end
231
276
  end