rbbt-util 5.34.5 → 5.34.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/rbbt/hpc/batch.rb +7 -7
- data/lib/rbbt/hpc/lsf.rb +4 -4
- data/lib/rbbt/hpc/slurm.rb +4 -4
- data/lib/rbbt/persist/tsv/tokyocabinet.rb +1 -1
- data/lib/rbbt/persist.rb +2 -2
- data/lib/rbbt/resource.rb +1 -1
- data/lib/rbbt/tsv/accessor.rb +3 -0
- data/lib/rbbt/tsv/manipulate.rb +13 -5
- data/lib/rbbt/tsv/parallel/traverse.rb +1 -1
- data/lib/rbbt/util/config.rb +1 -1
- data/lib/rbbt/util/migrate.rb +1 -1
- data/lib/rbbt/util/misc/development.rb +17 -12
- data/lib/rbbt/util/misc/inspect.rb +2 -2
- data/lib/rbbt/util/misc/pipes.rb +4 -4
- data/lib/rbbt/util/open.rb +3 -3
- data/lib/rbbt/util/tar.rb +1 -1
- data/lib/rbbt/workflow/integration/nextflow.rb +2 -2
- data/lib/rbbt/workflow/remote_workflow/driver/rest.rb +18 -1
- data/lib/rbbt/workflow/remote_workflow/remote_step/rest.rb +2 -1
- data/lib/rbbt/workflow/step/dependencies.rb +1 -1
- data/lib/rbbt/workflow/step/run.rb +1 -1
- data/lib/rbbt/workflow/step/save_load_inputs.rb +6 -6
- data/lib/rbbt/workflow/step/status.rb +1 -0
- data/lib/rbbt/workflow/util/archive.rb +8 -8
- data/lib/rbbt/workflow.rb +5 -5
- data/share/rbbt_commands/app/start +2 -0
- data/share/rbbt_commands/hpc/clean +8 -8
- data/share/rbbt_commands/hpc/list +9 -9
- data/share/rbbt_commands/hpc/tail +1 -1
- data/share/rbbt_commands/lsf/clean +8 -8
- data/share/rbbt_commands/lsf/list +9 -9
- data/share/rbbt_commands/lsf/tail +1 -1
- data/share/rbbt_commands/slurm/clean +8 -8
- data/share/rbbt_commands/slurm/list +9 -9
- data/share/rbbt_commands/slurm/tail +1 -1
- data/share/rbbt_commands/tsv/select +48 -0
- data/share/rbbt_commands/tsv/view +4 -3
- data/share/rbbt_commands/workflow/archive_all +1 -1
- data/share/rbbt_commands/workflow/prov +2 -2
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 94c61252b24c9d379d614a059bcb90bf97acd614811833d870171150da1a44a9
|
|
4
|
+
data.tar.gz: fed2c0c9a2fd2571621dcfa06583f827e667cff12c602b339ccf3e0aa9940a2c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4e8af59ed302f4ea9ab71cdae6254282e94223eb5b99954501a14a57df820482fc7fe2cb1b300ecdc989ee1e7ba8d41bfd88c40aae0792d568a1df3cc75a966b
|
|
7
|
+
data.tar.gz: 99a860373bf4fd8b95168d0c09d3226aa7ea8207e5c7afee5c44dee67720d85bc2793389c70ce0e4b848a7a316a5513d1acb6d6f748cb0d4026d4cddf867b609
|
data/lib/rbbt/hpc/batch.rb
CHANGED
|
@@ -514,7 +514,7 @@ env > #{batch_options[:fenv]}
|
|
|
514
514
|
|
|
515
515
|
%w(std.out std.err job.id job.status dependencies.list canfail_dependencies.list exit.status sync.log inputs_dir).each do |filename|
|
|
516
516
|
path = File.join(batch_dir, filename)
|
|
517
|
-
Open.rm_rf path if File.
|
|
517
|
+
Open.rm_rf path if File.exist? path
|
|
518
518
|
end if clean_batch_job
|
|
519
519
|
|
|
520
520
|
batch_dependencies = [] if batch_dependencies.nil?
|
|
@@ -584,14 +584,14 @@ env > #{batch_options[:fenv]}
|
|
|
584
584
|
|
|
585
585
|
job = Open.read(fjob).strip if Open.exists?(fjob)
|
|
586
586
|
|
|
587
|
-
if job && ! File.
|
|
587
|
+
if job && ! File.exist?(fexit)
|
|
588
588
|
begin
|
|
589
589
|
status_txt = job_status(job)
|
|
590
590
|
STDERR.puts Log.color(:magenta, "Status [#{job.to_i}]:")
|
|
591
591
|
STDERR.puts status_txt
|
|
592
592
|
lines = status_txt.split("\n").length
|
|
593
593
|
rescue
|
|
594
|
-
if ! File.
|
|
594
|
+
if ! File.exist?(fexit)
|
|
595
595
|
STDERR.puts Log.color(:magenta, "Job #{job.to_i} not done and not running. STDERR:")
|
|
596
596
|
STDERR.puts Open.read(ferr)
|
|
597
597
|
end
|
|
@@ -599,7 +599,7 @@ env > #{batch_options[:fenv]}
|
|
|
599
599
|
end
|
|
600
600
|
end
|
|
601
601
|
|
|
602
|
-
if File.
|
|
602
|
+
if File.exist?(fexit)
|
|
603
603
|
exit_status = Open.read(fexit)
|
|
604
604
|
if exit_status.to_i == 0
|
|
605
605
|
STDERR.puts Log.color(:magenta, "Job #{job} done with exit_status 0. STDOUT:")
|
|
@@ -613,7 +613,7 @@ env > #{batch_options[:fenv]}
|
|
|
613
613
|
|
|
614
614
|
if tail
|
|
615
615
|
Log.severity = 10
|
|
616
|
-
while ! File.
|
|
616
|
+
while ! File.exist? fout
|
|
617
617
|
if job
|
|
618
618
|
STDERR.puts
|
|
619
619
|
Log.clear_line(STDERR)
|
|
@@ -638,8 +638,8 @@ env > #{batch_options[:fenv]}
|
|
|
638
638
|
begin
|
|
639
639
|
status_txt = job_status(job)
|
|
640
640
|
Open.write(fstatus, status_txt) unless status_txt.nil? || status_txt.empty?
|
|
641
|
-
out = CMD.cmd("tail -f '#{fout}'", :pipe => true) if File.
|
|
642
|
-
err = CMD.cmd("tail -f '#{ferr}'", :pipe => true) if File.
|
|
641
|
+
out = CMD.cmd("tail -f '#{fout}'", :pipe => true) if File.exist?(fout) and not tail == :STDERR
|
|
642
|
+
err = CMD.cmd("tail -f '#{ferr}'", :pipe => true) if File.exist?(ferr)
|
|
643
643
|
|
|
644
644
|
terr = Misc.consume_stream(err, true, STDERR) if err
|
|
645
645
|
tout = Misc.consume_stream(out, true, STDOUT) if out
|
data/lib/rbbt/hpc/lsf.rb
CHANGED
|
@@ -70,12 +70,12 @@ export BATCH_SYSTEM=LSF
|
|
|
70
70
|
STDERR.puts Log.color(:magenta, "Issuing LSF file: #{fcmd}")
|
|
71
71
|
STDERR.puts Open.read(fcmd)
|
|
72
72
|
|
|
73
|
-
if File.
|
|
73
|
+
if File.exist?(fjob)
|
|
74
74
|
job = Open.read(fjob).to_i
|
|
75
75
|
else
|
|
76
76
|
|
|
77
|
-
dependencies = Open.read(fdep).split("\n") if File.
|
|
78
|
-
canfail_dependencies = Open.read(fcfdep).split("\n") if File.
|
|
77
|
+
dependencies = Open.read(fdep).split("\n") if File.exist? fdep
|
|
78
|
+
canfail_dependencies = Open.read(fcfdep).split("\n") if File.exist? fcfdep
|
|
79
79
|
|
|
80
80
|
normal_dep_list = dependencies && dependencies.any? ? dependencies.collect{|d| "post_done(#{d})"} : []
|
|
81
81
|
canfail_dep_list = canfail_dependencies && canfail_dependencies.any? ? canfail_dependencies.collect{|d| "done(#{d})"} : []
|
|
@@ -90,7 +90,7 @@ export BATCH_SYSTEM=LSF
|
|
|
90
90
|
|
|
91
91
|
cmd = "bsub #{dep_str} < '#{fcmd}'"
|
|
92
92
|
|
|
93
|
-
if File.
|
|
93
|
+
if File.exist?(fout)
|
|
94
94
|
return
|
|
95
95
|
elsif dry_run
|
|
96
96
|
STDERR.puts Log.color(:magenta, "To execute run: ") + Log.color(:blue, cmd)
|
data/lib/rbbt/hpc/slurm.rb
CHANGED
|
@@ -101,12 +101,12 @@ export BATCH_SYSTEM=SLURM
|
|
|
101
101
|
Log.info "Issuing SLURM file: #{fcmd}"
|
|
102
102
|
Log.debug Open.read(fcmd)
|
|
103
103
|
|
|
104
|
-
if File.
|
|
104
|
+
if File.exist?(fjob)
|
|
105
105
|
job = Open.read(fjob).to_i
|
|
106
106
|
else
|
|
107
107
|
|
|
108
|
-
dependencies = Open.read(fdep).split("\n") if File.
|
|
109
|
-
canfail_dependencies = Open.read(fcfdep).split("\n") if File.
|
|
108
|
+
dependencies = Open.read(fdep).split("\n") if File.exist? fdep
|
|
109
|
+
canfail_dependencies = Open.read(fcfdep).split("\n") if File.exist? fcfdep
|
|
110
110
|
|
|
111
111
|
normal_dep_str = dependencies && dependencies.any? ? "afterok:" + dependencies * ":" : nil
|
|
112
112
|
canfail_dep_str = canfail_dependencies && canfail_dependencies.any? ? "afterany:" + canfail_dependencies * ":" : nil
|
|
@@ -119,7 +119,7 @@ export BATCH_SYSTEM=SLURM
|
|
|
119
119
|
|
|
120
120
|
cmd = "sbatch #{dep_str} '#{fcmd}'"
|
|
121
121
|
|
|
122
|
-
if File.
|
|
122
|
+
if File.exist?(fout)
|
|
123
123
|
return
|
|
124
124
|
elsif dry_run
|
|
125
125
|
STDERR.puts Log.color(:magenta, "To execute run: ") + Log.color(:blue, "sbatch '#{fcmd}'")
|
|
@@ -16,7 +16,7 @@ module Persist
|
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
dir = File.dirname(File.expand_path(path))
|
|
19
|
-
File.mkdir(dir) unless File.
|
|
19
|
+
File.mkdir(dir) unless File.exist?(dir)
|
|
20
20
|
|
|
21
21
|
tokyocabinet_class = TokyoCabinet::HDB if tokyocabinet_class == "HDB" or tokyocabinet_class.nil?
|
|
22
22
|
tokyocabinet_class = TokyoCabinet::BDB if tokyocabinet_class == "BDB"
|
data/lib/rbbt/persist.rb
CHANGED
|
@@ -31,8 +31,8 @@ module Persist
|
|
|
31
31
|
path = path.find if Path === path
|
|
32
32
|
file = file.find if Path === file
|
|
33
33
|
if by_link
|
|
34
|
-
patht = File.
|
|
35
|
-
filet = File.
|
|
34
|
+
patht = File.exist?(path) ? File.lstat(path).mtime : nil
|
|
35
|
+
filet = File.exist?(file) ? File.lstat(file).mtime : nil
|
|
36
36
|
else
|
|
37
37
|
patht = Open.mtime(path)
|
|
38
38
|
filet = Open.mtime(file)
|
data/lib/rbbt/resource.rb
CHANGED
|
@@ -233,7 +233,7 @@ module Resource
|
|
|
233
233
|
when :install
|
|
234
234
|
Log.debug "Installing software: #{path}"
|
|
235
235
|
|
|
236
|
-
$set_software_env = false unless File.
|
|
236
|
+
$set_software_env = false unless File.exist? path
|
|
237
237
|
|
|
238
238
|
software_dir = path.resource.root.software.find :user
|
|
239
239
|
helper_file = File.expand_path(Rbbt.share.install.software.lib.install_helpers.find(:lib, caller_lib_dir(__FILE__)))
|
data/lib/rbbt/tsv/accessor.rb
CHANGED
data/lib/rbbt/tsv/manipulate.rb
CHANGED
|
@@ -527,13 +527,21 @@ module TSV
|
|
|
527
527
|
self.unnamed = old_unnamed
|
|
528
528
|
|
|
529
529
|
when String === method
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
530
|
+
if method =~ /^([<>]=?)(.*)/
|
|
531
|
+
with_unnamed do
|
|
532
|
+
through :key, key do |key, values|
|
|
533
|
+
value = Array === values ? values.flatten.first : values
|
|
534
|
+
new[key] = self[key] if value.to_f.send($1, $2.to_f)
|
|
535
|
+
end
|
|
536
|
+
end
|
|
537
|
+
else
|
|
538
|
+
with_unnamed do
|
|
539
|
+
through :key, key do |key, values|
|
|
540
|
+
values = [values] if type == :single
|
|
541
|
+
new[key] = self[key] if invert ^ (values.flatten.select{|v| v == method}.length > 0)
|
|
542
|
+
end
|
|
534
543
|
end
|
|
535
544
|
end
|
|
536
|
-
|
|
537
545
|
when Numeric === method
|
|
538
546
|
with_unnamed do
|
|
539
547
|
through :key, key do |key, values|
|
|
@@ -389,7 +389,7 @@ module TSV
|
|
|
389
389
|
when Set
|
|
390
390
|
traverse_array(obj.to_a, options, &block)
|
|
391
391
|
when String
|
|
392
|
-
if Open.remote?(obj)
|
|
392
|
+
if Open.remote?(obj) || Open.ssh?(obj) || Misc.is_filename?(obj)
|
|
393
393
|
Open.open(obj) do |s|
|
|
394
394
|
traverse_obj(s, options, &block)
|
|
395
395
|
end
|
data/lib/rbbt/util/config.rb
CHANGED
|
@@ -145,7 +145,7 @@ module Rbbt::Config
|
|
|
145
145
|
end
|
|
146
146
|
|
|
147
147
|
def self.process_config(config)
|
|
148
|
-
if Misc.is_filename?(config) && File.
|
|
148
|
+
if Misc.is_filename?(config) && File.exist?(config)
|
|
149
149
|
Rbbt::Config.load_file(config)
|
|
150
150
|
elsif Rbbt.etc.config_profile[config].exists?
|
|
151
151
|
Rbbt::Config.load_file(Rbbt.etc.config_profile[config].find)
|
data/lib/rbbt/util/migrate.rb
CHANGED
|
@@ -135,20 +135,25 @@ def self.add_libdir(dir=nil)
|
|
|
135
135
|
end
|
|
136
136
|
|
|
137
137
|
def self.insist(times = 4, sleep = nil, msg = nil)
|
|
138
|
-
|
|
139
|
-
sleep_array = times
|
|
140
|
-
times = sleep_array.length
|
|
141
|
-
sleep = sleep_array.shift
|
|
142
|
-
end
|
|
143
|
-
try = 0
|
|
144
|
-
|
|
145
|
-
if sleep.nil?
|
|
146
|
-
sleep_array = ([0] + [0.001, 0.01, 0.1, 0.5] * (times / 3)).sort[0..times-1]
|
|
147
|
-
sleep = sleep_array.shift
|
|
148
|
-
end
|
|
138
|
+
sleep_array = nil
|
|
149
139
|
|
|
140
|
+
try = 0
|
|
150
141
|
begin
|
|
151
|
-
|
|
142
|
+
begin
|
|
143
|
+
yield
|
|
144
|
+
rescue Exception
|
|
145
|
+
if Array === times
|
|
146
|
+
sleep_array = times
|
|
147
|
+
times = sleep_array.length
|
|
148
|
+
sleep = sleep_array.shift
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
if sleep.nil?
|
|
152
|
+
sleep_array = ([0] + [0.001, 0.01, 0.1, 0.5] * (times / 3)).sort[0..times-1]
|
|
153
|
+
sleep = sleep_array.shift
|
|
154
|
+
end
|
|
155
|
+
raise $!
|
|
156
|
+
end
|
|
152
157
|
rescue TryAgain
|
|
153
158
|
sleep sleep
|
|
154
159
|
retry
|
|
@@ -266,7 +266,7 @@ module Misc
|
|
|
266
266
|
|
|
267
267
|
def self.mtime_str(path)
|
|
268
268
|
path = path.find if Path === path
|
|
269
|
-
if File.
|
|
269
|
+
if File.exist? path
|
|
270
270
|
"mtime: " << File.mtime(path).to_s
|
|
271
271
|
else
|
|
272
272
|
"mtime: not present"
|
|
@@ -416,7 +416,7 @@ module Misc
|
|
|
416
416
|
end
|
|
417
417
|
|
|
418
418
|
def self.file2md5(file)
|
|
419
|
-
if File.
|
|
419
|
+
if File.exist?(file + '.md5')
|
|
420
420
|
Open.read(file + '.md5')
|
|
421
421
|
else
|
|
422
422
|
md5 = CMD.cmd("md5sum '#{file}'").read.strip.split(" ").first
|
data/lib/rbbt/util/misc/pipes.rb
CHANGED
|
@@ -39,11 +39,11 @@ module Misc
|
|
|
39
39
|
begin
|
|
40
40
|
erase = path.nil?
|
|
41
41
|
path = TmpFile.tmp_file if path.nil?
|
|
42
|
-
File.rm path if clean && File.
|
|
42
|
+
File.rm path if clean && File.exist?(path)
|
|
43
43
|
File.mkfifo path
|
|
44
44
|
yield path
|
|
45
45
|
ensure
|
|
46
|
-
FileUtils.rm path if erase && File.
|
|
46
|
+
FileUtils.rm path if erase && File.exist?(path)
|
|
47
47
|
end
|
|
48
48
|
end
|
|
49
49
|
|
|
@@ -340,11 +340,11 @@ module Misc
|
|
|
340
340
|
Log.medium "Consume stream aborted #{Misc.fingerprint io}"
|
|
341
341
|
io.abort if io.respond_to? :abort
|
|
342
342
|
#io.close unless io.closed?
|
|
343
|
-
FileUtils.rm into_path if into_path and File.
|
|
343
|
+
FileUtils.rm into_path if into_path and File.exist? into_path
|
|
344
344
|
rescue Exception
|
|
345
345
|
Log.medium "Exception consuming stream: #{Misc.fingerprint io}: #{$!.message}"
|
|
346
346
|
io.abort $! if io.respond_to? :abort
|
|
347
|
-
FileUtils.rm into_path if into_path and File.
|
|
347
|
+
FileUtils.rm into_path if into_path and File.exist? into_path
|
|
348
348
|
raise $!
|
|
349
349
|
end
|
|
350
350
|
end
|
data/lib/rbbt/util/open.rb
CHANGED
|
@@ -389,8 +389,8 @@ module Open
|
|
|
389
389
|
# source = source.find if Path === source
|
|
390
390
|
# target = target.find if Path === target
|
|
391
391
|
|
|
392
|
-
# FileUtils.mkdir_p File.dirname(target) unless File.
|
|
393
|
-
# FileUtils.rm target if File.
|
|
392
|
+
# FileUtils.mkdir_p File.dirname(target) unless File.exist?(File.dirname(target))
|
|
393
|
+
# FileUtils.rm target if File.exist?(target)
|
|
394
394
|
# FileUtils.cp source, target
|
|
395
395
|
#end
|
|
396
396
|
|
|
@@ -522,7 +522,7 @@ module Open
|
|
|
522
522
|
# Questions
|
|
523
523
|
|
|
524
524
|
def self.remote?(file)
|
|
525
|
-
!! (file =~ /^(?:https?|ftp):\/\//)
|
|
525
|
+
!! (file =~ /^(?:https?|ftp|ssh):\/\//)
|
|
526
526
|
end
|
|
527
527
|
|
|
528
528
|
def self.ssh?(file)
|
data/lib/rbbt/util/tar.rb
CHANGED
|
@@ -13,7 +13,7 @@ module Workflow
|
|
|
13
13
|
nextflow_includes(file).inject(params) do |params,info|
|
|
14
14
|
name_str, included_file = info
|
|
15
15
|
included_file = File.join(dir, included_file)
|
|
16
|
-
included_file += '.nf' unless File.
|
|
16
|
+
included_file += '.nf' unless File.exist?(included_file) || ! File.exist?(included_file + '.nf')
|
|
17
17
|
name_str.split(";").each do |name|
|
|
18
18
|
name = name.strip
|
|
19
19
|
include_params = nextflow_recursive_params(included_file).collect{|p| [p,name] * "-"}
|
|
@@ -32,7 +32,7 @@ module Workflow
|
|
|
32
32
|
result = :text
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
file = file + '.nf' unless File.
|
|
35
|
+
file = file + '.nf' unless File.exist?(file) || ! File.exist?(file + '.nf')
|
|
36
36
|
file = File.expand_path(file)
|
|
37
37
|
name ||= File.basename(file).sub(/\.nf$/,'').gsub(/\s/,'_')
|
|
38
38
|
params = Workflow.nextflow_recursive_params(file)
|
|
@@ -18,7 +18,24 @@ class RemoteWorkflow
|
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
+
def self.escape_url(url)
|
|
22
|
+
base, _sep, query = url.partition("?")
|
|
23
|
+
protocol, path = base.split("://")
|
|
24
|
+
path = protocol if path.nil?
|
|
25
|
+
path = path.split("/").collect{|p| CGI.escape(p) }* "/"
|
|
26
|
+
base = protocol ? [protocol, path] * "://" : path
|
|
27
|
+
|
|
28
|
+
if query && ! query.empty?
|
|
29
|
+
query = query.split("&").collect{|e| e.split("=").collect{|pe| CGI.escape(pe) } * "=" } * "&"
|
|
30
|
+
[base, query] * "?"
|
|
31
|
+
else
|
|
32
|
+
base
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
21
36
|
def self.encode(url)
|
|
37
|
+
# ToDo: Check this
|
|
38
|
+
return escape_url(url)
|
|
22
39
|
begin
|
|
23
40
|
URI::DEFAULT_PARSER.escape(url)
|
|
24
41
|
rescue
|
|
@@ -135,7 +152,7 @@ class RemoteWorkflow
|
|
|
135
152
|
|
|
136
153
|
def self.execute_job(base_url, task, task_params, cache_type)
|
|
137
154
|
RemoteWorkflow.capture_exception do
|
|
138
|
-
task_url =
|
|
155
|
+
task_url = self.escape_url(File.join(base_url, task.to_s))
|
|
139
156
|
|
|
140
157
|
sout, sin = Misc.pipe
|
|
141
158
|
|
|
@@ -132,7 +132,7 @@ class RemoteStep
|
|
|
132
132
|
def _run_job(cache_type = :asynchronous)
|
|
133
133
|
get_streams
|
|
134
134
|
|
|
135
|
-
task_url =
|
|
135
|
+
task_url = RemoteWorkflow::REST.escape_url(File.join(base_url, task.to_s))
|
|
136
136
|
@adaptor.__prepare_inputs_for_restclient(inputs)
|
|
137
137
|
task_params = inputs.merge(:_cache_type => cache_type, :jobname => base_name, :_format => [:string, :boolean, :tsv, :annotations].include?(result_type) ? :raw : :json)
|
|
138
138
|
|
|
@@ -147,6 +147,7 @@ class RemoteStep
|
|
|
147
147
|
|
|
148
148
|
def produce(*args)
|
|
149
149
|
@started = true
|
|
150
|
+
init_job
|
|
150
151
|
_run_job
|
|
151
152
|
end
|
|
152
153
|
|
|
@@ -92,7 +92,7 @@ class Step
|
|
|
92
92
|
(!(job.noinfo? || job.done? || job.error? || job.aborted? || job.running?))
|
|
93
93
|
|
|
94
94
|
if ! (job.resumable? && (job.updated? && ! job.dirty?))
|
|
95
|
-
Log.high "About to clean -- status: #{status}, present #{File.
|
|
95
|
+
Log.high "About to clean -- status: #{status}, present #{File.exist?(job.path)}, " +
|
|
96
96
|
%w(done? error? recoverable_error? noinfo? updated? dirty? aborted? running? resumable?).
|
|
97
97
|
collect{|v| [v, job.send(v)]*": "} * ", " if RBBT_DEBUG_CLEAN
|
|
98
98
|
|
|
@@ -421,7 +421,7 @@ class Step
|
|
|
421
421
|
config_keys = Rbbt::Config::GOT_KEYS[config_keys_pre.length..-1]
|
|
422
422
|
set_info :config_keys, config_keys.uniq
|
|
423
423
|
|
|
424
|
-
if result.nil? && File.
|
|
424
|
+
if result.nil? && File.exist?(self.tmp_path) && ! File.exist?(self.path)
|
|
425
425
|
Open.mv self.tmp_path, self.path
|
|
426
426
|
end
|
|
427
427
|
result
|
|
@@ -2,12 +2,12 @@ module Workflow
|
|
|
2
2
|
|
|
3
3
|
def self.load_inputs(dir, input_names, input_types)
|
|
4
4
|
inputs = {}
|
|
5
|
-
if File.
|
|
5
|
+
if File.exist?(dir) && ! File.directory?(dir)
|
|
6
6
|
Log.debug "Loading inputs from #{dir}, not a directory trying as tar.gz"
|
|
7
7
|
tarfile = dir
|
|
8
8
|
digest = CMD.cmd("md5sum '#{tarfile}'").read.split(" ").first
|
|
9
9
|
tmpdir = Rbbt.tmp.input_bundle[digest].find
|
|
10
|
-
Misc.untar(tarfile, tmpdir) unless File.
|
|
10
|
+
Misc.untar(tarfile, tmpdir) unless File.exist? tmpdir
|
|
11
11
|
files = tmpdir.glob("*")
|
|
12
12
|
if files.length == 1 && File.directory?(files.first)
|
|
13
13
|
tmpdir = files.first
|
|
@@ -177,7 +177,7 @@ class Step
|
|
|
177
177
|
|
|
178
178
|
Log.debug "Saving job input #{name} (#{type}) into #{path}"
|
|
179
179
|
|
|
180
|
-
if value.respond_to?
|
|
180
|
+
if IO === value && value.respond_to?(:filename) && value.filename
|
|
181
181
|
Open.write(path, value.filename)
|
|
182
182
|
elsif IO === value
|
|
183
183
|
Open.write(path, value)
|
|
@@ -256,7 +256,7 @@ class Step
|
|
|
256
256
|
# when Step === value
|
|
257
257
|
# Open.ln_s(value.path, path)
|
|
258
258
|
# when type.to_s == "binary"
|
|
259
|
-
# if String === value && File.
|
|
259
|
+
# if String === value && File.exist?(value)
|
|
260
260
|
# value = File.expand_path(value)
|
|
261
261
|
# Open.ln_s(value, path)
|
|
262
262
|
# elsif String === value && Misc.is_filename?(value, false)
|
|
@@ -269,7 +269,7 @@ class Step
|
|
|
269
269
|
# when Array === value
|
|
270
270
|
# Open.write(path, value.collect{|v| Step === v ? v.path : v.to_s} * "\n")
|
|
271
271
|
# when %w(file tsv array).include?(type.to_s)
|
|
272
|
-
# if String === value && File.
|
|
272
|
+
# if String === value && File.exist?(value)
|
|
273
273
|
# value = File.expand_path(value)
|
|
274
274
|
# Open.ln_s(value, path)
|
|
275
275
|
# elsif String === value && Misc.is_filename?(value, false)
|
|
@@ -280,7 +280,7 @@ class Step
|
|
|
280
280
|
# Open.write(path + '.yaml', value.to_yaml)
|
|
281
281
|
# end
|
|
282
282
|
# when IO === value
|
|
283
|
-
# if value.filename && String === value.filename && File.
|
|
283
|
+
# if value.filename && String === value.filename && File.exist?(value.filename)
|
|
284
284
|
# Open.ln_s(value.filename, path)
|
|
285
285
|
# else
|
|
286
286
|
# Open.write(path, value)
|
|
@@ -75,6 +75,7 @@ class Step
|
|
|
75
75
|
|
|
76
76
|
def dirty?
|
|
77
77
|
return true if Open.exists?(pid_file) && ! ( Open.exists?(info_file) || done? )
|
|
78
|
+
return true if done? && ! (status == :done || status == :noinfo)
|
|
78
79
|
return false unless done? || status == :done
|
|
79
80
|
return false unless ENV["RBBT_UPDATE"] == "true"
|
|
80
81
|
|
|
@@ -13,9 +13,9 @@ class Step
|
|
|
13
13
|
return if target_dir[workflow][task][name].exists? || File.symlink?(target_dir[workflow][task][name].find)
|
|
14
14
|
Log.debug "Linking #{ path }"
|
|
15
15
|
FileUtils.mkdir_p target_dir[workflow][task] unless target_dir[workflow][task].exists?
|
|
16
|
-
FileUtils.ln_s path, target_dir[workflow][task][name].find if File.
|
|
17
|
-
FileUtils.ln_s path + '.files', target_dir[workflow][task][name].find + '.files' if File.
|
|
18
|
-
FileUtils.ln_s path + '.info', target_dir[workflow][task][name].find + '.info' if File.
|
|
16
|
+
FileUtils.ln_s path, target_dir[workflow][task][name].find if File.exist?(path)
|
|
17
|
+
FileUtils.ln_s path + '.files', target_dir[workflow][task][name].find + '.files' if File.exist?(path + '.files')
|
|
18
|
+
FileUtils.ln_s path + '.info', target_dir[workflow][task][name].find + '.info' if File.exist?(path + '.info')
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def archive(target = nil)
|
|
@@ -65,15 +65,15 @@ class Step
|
|
|
65
65
|
end.uniq
|
|
66
66
|
|
|
67
67
|
jobs.each do |step|
|
|
68
|
-
next unless File.
|
|
68
|
+
next unless File.exist?(step.path)
|
|
69
69
|
next if skip_overriden && step.overriden
|
|
70
70
|
|
|
71
71
|
job_files << step.path
|
|
72
|
-
job_files << step.info_file if File.
|
|
73
|
-
job_files << Step.md5_file(step.path) if File.
|
|
72
|
+
job_files << step.info_file if File.exist?(step.info_file)
|
|
73
|
+
job_files << Step.md5_file(step.path) if File.exist?(Step.md5_file step.path)
|
|
74
74
|
job_file_dir_content = Dir.glob(step.files_dir + '/**/*')
|
|
75
75
|
job_files += job_file_dir_content
|
|
76
|
-
job_files << step.files_dir if File.
|
|
76
|
+
job_files << step.files_dir if File.exist?(step.files_dir)
|
|
77
77
|
rec_dependencies = Set.new
|
|
78
78
|
|
|
79
79
|
next unless recursive
|
|
@@ -99,7 +99,7 @@ class Step
|
|
|
99
99
|
dep = Workflow.load_step path
|
|
100
100
|
job_files << dep.path
|
|
101
101
|
job_files << dep.files_dir if Dir.glob(dep.files_dir + '/*').any?
|
|
102
|
-
job_files << dep.info_file if File.
|
|
102
|
+
job_files << dep.info_file if File.exist?(dep.info_file)
|
|
103
103
|
end
|
|
104
104
|
end
|
|
105
105
|
|
data/lib/rbbt/workflow.rb
CHANGED
|
@@ -543,13 +543,13 @@ module Workflow
|
|
|
543
543
|
persist = input_values.nil? ? false : true
|
|
544
544
|
persist = false
|
|
545
545
|
|
|
546
|
-
if ! (Path === step_path ? step_path.find : File.
|
|
546
|
+
if ! (Path === step_path ? step_path.find : File.exist?(step_path)) && step_path.split("/").length == 3 && File.exist?(new_path = Rbbt.var.jobs[step_path].find)
|
|
547
547
|
step_path = new_path
|
|
548
548
|
end
|
|
549
549
|
|
|
550
550
|
key = Path === step_path ? step_path.find : step_path
|
|
551
551
|
|
|
552
|
-
if ! File.
|
|
552
|
+
if ! File.exist?(step_path) && step_path.split("/").length == 3 && File.exist?(new_path = Rbbt.var.jobs[step_path].find)
|
|
553
553
|
step_path = new_path
|
|
554
554
|
end
|
|
555
555
|
|
|
@@ -602,7 +602,7 @@ module Workflow
|
|
|
602
602
|
pother = other.split(/\/+/)
|
|
603
603
|
end_part = pother[-3..-1] * "/"
|
|
604
604
|
new_path = prefix + "/" << end_part
|
|
605
|
-
if File.
|
|
605
|
+
if File.exist? new_path
|
|
606
606
|
new_path
|
|
607
607
|
else
|
|
608
608
|
Rbbt.var.jobs[end_part].find
|
|
@@ -615,7 +615,7 @@ module Workflow
|
|
|
615
615
|
pother = other.split(/\/+/)
|
|
616
616
|
end_part = pother[-3..-1] * "/"
|
|
617
617
|
new_path = preal[0..-4] * "/" << "/" << end_part
|
|
618
|
-
return new_path if File.
|
|
618
|
+
return new_path if File.exist?(new_path) || File.exist?(new_path + '.info')
|
|
619
619
|
Rbbt.var.jobs[end_part].find
|
|
620
620
|
end
|
|
621
621
|
|
|
@@ -713,7 +713,7 @@ module Workflow
|
|
|
713
713
|
def self.load_step(path)
|
|
714
714
|
path = Path.setup(path.dup) unless Path === path
|
|
715
715
|
|
|
716
|
-
if ! (Path === path ? path.exists? : File.
|
|
716
|
+
if ! (Path === path ? path.exists? : File.exist?(path)) && path.split("/").length == 3
|
|
717
717
|
new_path = Rbbt.var.jobs[path]
|
|
718
718
|
if new_path.exists? || new_path.set_extension('info').exists?
|
|
719
719
|
path = new_path
|
|
@@ -96,6 +96,8 @@ Misc.in_dir(app_dir) do
|
|
|
96
96
|
system ENV, "env RBBT_LOG=0 passenger start -R '#{config_ru_file}' -p #{options[:Port] || "2887"}"
|
|
97
97
|
when 'puma_alt'
|
|
98
98
|
system ENV, "puma '#{config_ru_file}' -p #{options[:Port] || "2887"} -w 3 -t 8:32 --preload"
|
|
99
|
+
when 'puma_production'
|
|
100
|
+
CMD.cmd_log("env RBBT_LOG=#{Log.severity.to_s} puma '#{config_ru_file}' -p #{options[:Port] || "2887"} -w 20 -t 10:160 --preload")
|
|
99
101
|
else
|
|
100
102
|
options[:config] = config_ru_file
|
|
101
103
|
options[:threads] = "8:8"
|
|
@@ -97,19 +97,19 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
97
97
|
|
|
98
98
|
different_system = job_batch_system != batch_system
|
|
99
99
|
|
|
100
|
-
if File.
|
|
100
|
+
if File.exist?(fid = File.join(dir, 'job.id'))
|
|
101
101
|
id = Open.read(fid).chomp
|
|
102
102
|
else
|
|
103
103
|
id = nil
|
|
104
104
|
end
|
|
105
105
|
|
|
106
|
-
if File.
|
|
106
|
+
if File.exist?(fstatus = File.join(dir, 'exit.status'))
|
|
107
107
|
exit_status = Open.read(fstatus).to_i
|
|
108
108
|
else
|
|
109
109
|
exit_status = nil
|
|
110
110
|
end
|
|
111
111
|
|
|
112
|
-
if File.
|
|
112
|
+
if File.exist?(fstatus = File.join(dir, 'job.status'))
|
|
113
113
|
fstatus_txt = Open.read(fstatus)
|
|
114
114
|
begin
|
|
115
115
|
if job_batch_system == "lsf"
|
|
@@ -126,17 +126,17 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
126
126
|
nodes = []
|
|
127
127
|
end
|
|
128
128
|
|
|
129
|
-
if File.
|
|
129
|
+
if File.exist?(File.join(dir, 'std.out'))
|
|
130
130
|
outt = File.mtime File.join(dir, 'std.out')
|
|
131
131
|
errt = File.mtime File.join(dir, 'std.err')
|
|
132
132
|
time_diff = Time.now - [outt, errt].max
|
|
133
133
|
end
|
|
134
134
|
|
|
135
135
|
fdep = File.join(dir, 'dependencies.list')
|
|
136
|
-
deps = Open.read(fdep).split("\n") if File.
|
|
136
|
+
deps = Open.read(fdep).split("\n") if File.exist?(fdep)
|
|
137
137
|
|
|
138
138
|
fcadep = File.join(dir, 'canfail_dependencies.list')
|
|
139
|
-
cadeps = Open.read(fcadep).split("\n") if File.
|
|
139
|
+
cadeps = Open.read(fcadep).split("\n") if File.exist?(fcadep)
|
|
140
140
|
|
|
141
141
|
aborted = error = true if aborted.nil? && error.nil?
|
|
142
142
|
#if done || error || aborted || running || queued || jobid || search
|
|
@@ -177,7 +177,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
177
177
|
puts Log.color(:magenta, "Dependencies: ") << deps * ", " if deps
|
|
178
178
|
puts Log.color(:magenta, "Dependencies (can fail): ") << cadeps * ", " if cadeps
|
|
179
179
|
puts Log.color(:magenta, "Nodes: ") << nodes * ", "
|
|
180
|
-
puts Log.color(:magenta, "Output: ") << File.
|
|
180
|
+
puts Log.color(:magenta, "Output: ") << File.exist?(File.join(dir, 'std.out')).to_s << (id.nil? ? "" : " (last update " + Misc.format_seconds(time_diff) + " ago)")
|
|
181
181
|
|
|
182
182
|
if options[:batch_parameters]
|
|
183
183
|
puts Log.color(:magenta, "BATCH parameters: ")
|
|
@@ -189,7 +189,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
189
189
|
end
|
|
190
190
|
end
|
|
191
191
|
|
|
192
|
-
if tail && File.
|
|
192
|
+
if tail && File.exist?(File.join(dir, 'std.err'))
|
|
193
193
|
if exit_status && exit_status != 0
|
|
194
194
|
puts Log.color(:magenta, "First error or exception found: ")
|
|
195
195
|
puts CMD.cmd("grep -i -w 'error\\|[a-z]*exception' #{File.join(dir, 'std.err')} -A #{tail.to_i} |head -n #{tail.to_i}", :no_fail => true).read
|
|
@@ -118,19 +118,19 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
118
118
|
container_home = nil
|
|
119
119
|
end
|
|
120
120
|
|
|
121
|
-
if File.
|
|
121
|
+
if File.exist?(fid = File.join(dir, 'job.id'))
|
|
122
122
|
id = Open.read(fid).chomp
|
|
123
123
|
else
|
|
124
124
|
id = nil
|
|
125
125
|
end
|
|
126
126
|
|
|
127
|
-
if File.
|
|
127
|
+
if File.exist?(fstatus = File.join(dir, 'exit.status'))
|
|
128
128
|
exit_status = Open.read(fstatus).to_i
|
|
129
129
|
else
|
|
130
130
|
exit_status = nil
|
|
131
131
|
end
|
|
132
132
|
|
|
133
|
-
if File.
|
|
133
|
+
if File.exist?(fstatus = File.join(dir, 'job.status'))
|
|
134
134
|
fstatus_txt = Open.read(fstatus)
|
|
135
135
|
begin
|
|
136
136
|
if job_batch_system == "lsf"
|
|
@@ -147,13 +147,13 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
147
147
|
nodes = []
|
|
148
148
|
end
|
|
149
149
|
|
|
150
|
-
if File.
|
|
150
|
+
if File.exist?(File.join(dir, 'exit.status'))
|
|
151
151
|
now = File.ctime(File.join(dir, 'exit.status'))
|
|
152
152
|
else
|
|
153
153
|
now = Time.now
|
|
154
154
|
end
|
|
155
155
|
|
|
156
|
-
if File.
|
|
156
|
+
if File.exist?(File.join(dir, 'std.out'))
|
|
157
157
|
cerrt = File.ctime File.join(dir, 'std.err')
|
|
158
158
|
coutt = File.ctime File.join(dir, 'std.out')
|
|
159
159
|
outt = File.mtime File.join(dir, 'std.out')
|
|
@@ -163,10 +163,10 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
163
163
|
end
|
|
164
164
|
|
|
165
165
|
fdep = File.join(dir, 'dependencies.list')
|
|
166
|
-
deps = Open.read(fdep).split("\n") if File.
|
|
166
|
+
deps = Open.read(fdep).split("\n") if File.exist?(fdep)
|
|
167
167
|
|
|
168
168
|
fcadep = File.join(dir, 'canfail_dependencies.list')
|
|
169
|
-
cadeps = Open.read(fcadep).split("\n") if File.
|
|
169
|
+
cadeps = Open.read(fcadep).split("\n") if File.exist?(fcadep)
|
|
170
170
|
|
|
171
171
|
if done || error || aborted || running || queued || jobid
|
|
172
172
|
select = false
|
|
@@ -244,7 +244,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
244
244
|
puts Log.color(:magenta, "Dependencies (can fail): ") << cadeps * ", " if cadeps
|
|
245
245
|
puts Log.color(:magenta, "Nodes: ") << nodes * ", " if long
|
|
246
246
|
puts Log.color(:magenta, "Time elapsed: ") << Misc.format_seconds(time_elapsed) if time_elapsed
|
|
247
|
-
puts Log.color(:magenta, "Output: ") << File.
|
|
247
|
+
puts Log.color(:magenta, "Output: ") << File.exist?(File.join(dir, 'std.out')).to_s << (id.nil? || File.exist?(File.join(dir, 'exit.status')) ? "" : " (last update " + Misc.format_seconds(time_diff) + " ago)") if long
|
|
248
248
|
|
|
249
249
|
if options[:batch_parameters]
|
|
250
250
|
puts Log.color(:magenta, "BATCH parameters: ")
|
|
@@ -316,7 +316,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
316
316
|
end
|
|
317
317
|
|
|
318
318
|
|
|
319
|
-
if tail && File.
|
|
319
|
+
if tail && File.exist?(File.join(dir, 'std.err'))
|
|
320
320
|
if exit_status && exit_status != 0
|
|
321
321
|
puts Log.color(:magenta, "First error or exception found: ")
|
|
322
322
|
puts CMD.cmd("grep -i -w 'error\\|[a-z]*exception' #{File.join(dir, 'std.err')} -A #{tail.to_i} |head -n #{tail.to_i}", :no_fail => true).read
|
|
@@ -46,7 +46,7 @@ if directory =~ /^[0-9]*$/
|
|
|
46
46
|
end
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
-
raise ParameterException, "Could not identify job #{directory}" unless File.
|
|
49
|
+
raise ParameterException, "Could not identify job #{directory}" unless File.exist?(directory)
|
|
50
50
|
|
|
51
51
|
require 'rbbt/hpc/slurm'
|
|
52
52
|
|
|
@@ -97,19 +97,19 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
97
97
|
|
|
98
98
|
different_system = job_batch_system != batch_system
|
|
99
99
|
|
|
100
|
-
if File.
|
|
100
|
+
if File.exist?(fid = File.join(dir, 'job.id'))
|
|
101
101
|
id = Open.read(fid).chomp
|
|
102
102
|
else
|
|
103
103
|
id = nil
|
|
104
104
|
end
|
|
105
105
|
|
|
106
|
-
if File.
|
|
106
|
+
if File.exist?(fstatus = File.join(dir, 'exit.status'))
|
|
107
107
|
exit_status = Open.read(fstatus).to_i
|
|
108
108
|
else
|
|
109
109
|
exit_status = nil
|
|
110
110
|
end
|
|
111
111
|
|
|
112
|
-
if File.
|
|
112
|
+
if File.exist?(fstatus = File.join(dir, 'job.status'))
|
|
113
113
|
fstatus_txt = Open.read(fstatus)
|
|
114
114
|
begin
|
|
115
115
|
if job_batch_system == "lsf"
|
|
@@ -126,17 +126,17 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
126
126
|
nodes = []
|
|
127
127
|
end
|
|
128
128
|
|
|
129
|
-
if File.
|
|
129
|
+
if File.exist?(File.join(dir, 'std.out'))
|
|
130
130
|
outt = File.mtime File.join(dir, 'std.out')
|
|
131
131
|
errt = File.mtime File.join(dir, 'std.err')
|
|
132
132
|
time_diff = Time.now - [outt, errt].max
|
|
133
133
|
end
|
|
134
134
|
|
|
135
135
|
fdep = File.join(dir, 'dependencies.list')
|
|
136
|
-
deps = Open.read(fdep).split("\n") if File.
|
|
136
|
+
deps = Open.read(fdep).split("\n") if File.exist?(fdep)
|
|
137
137
|
|
|
138
138
|
fcadep = File.join(dir, 'canfail_dependencies.list')
|
|
139
|
-
cadeps = Open.read(fcadep).split("\n") if File.
|
|
139
|
+
cadeps = Open.read(fcadep).split("\n") if File.exist?(fcadep)
|
|
140
140
|
|
|
141
141
|
aborted = error = true if aborted.nil? && error.nil?
|
|
142
142
|
#if done || error || aborted || running || queued || jobid || search
|
|
@@ -177,7 +177,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
177
177
|
puts Log.color(:magenta, "Dependencies: ") << deps * ", " if deps
|
|
178
178
|
puts Log.color(:magenta, "Dependencies (can fail): ") << cadeps * ", " if cadeps
|
|
179
179
|
puts Log.color(:magenta, "Nodes: ") << nodes * ", "
|
|
180
|
-
puts Log.color(:magenta, "Output: ") << File.
|
|
180
|
+
puts Log.color(:magenta, "Output: ") << File.exist?(File.join(dir, 'std.out')).to_s << (id.nil? ? "" : " (last update " + Misc.format_seconds(time_diff) + " ago)")
|
|
181
181
|
|
|
182
182
|
if options[:batch_parameters]
|
|
183
183
|
puts Log.color(:magenta, "BATCH parameters: ")
|
|
@@ -189,7 +189,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
189
189
|
end
|
|
190
190
|
end
|
|
191
191
|
|
|
192
|
-
if tail && File.
|
|
192
|
+
if tail && File.exist?(File.join(dir, 'std.err'))
|
|
193
193
|
if exit_status && exit_status != 0
|
|
194
194
|
puts Log.color(:magenta, "First error or exception found: ")
|
|
195
195
|
puts CMD.cmd("grep -i -w 'error\\|[a-z]*exception' #{File.join(dir, 'std.err')} -A #{tail.to_i} |head -n #{tail.to_i}", :no_fail => true).read
|
|
@@ -118,19 +118,19 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
118
118
|
container_home = nil
|
|
119
119
|
end
|
|
120
120
|
|
|
121
|
-
if File.
|
|
121
|
+
if File.exist?(fid = File.join(dir, 'job.id'))
|
|
122
122
|
id = Open.read(fid).chomp
|
|
123
123
|
else
|
|
124
124
|
id = nil
|
|
125
125
|
end
|
|
126
126
|
|
|
127
|
-
if File.
|
|
127
|
+
if File.exist?(fstatus = File.join(dir, 'exit.status'))
|
|
128
128
|
exit_status = Open.read(fstatus).to_i
|
|
129
129
|
else
|
|
130
130
|
exit_status = nil
|
|
131
131
|
end
|
|
132
132
|
|
|
133
|
-
if File.
|
|
133
|
+
if File.exist?(fstatus = File.join(dir, 'job.status'))
|
|
134
134
|
fstatus_txt = Open.read(fstatus)
|
|
135
135
|
begin
|
|
136
136
|
if job_batch_system == "lsf"
|
|
@@ -147,13 +147,13 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
147
147
|
nodes = []
|
|
148
148
|
end
|
|
149
149
|
|
|
150
|
-
if File.
|
|
150
|
+
if File.exist?(File.join(dir, 'exit.status'))
|
|
151
151
|
now = File.ctime(File.join(dir, 'exit.status'))
|
|
152
152
|
else
|
|
153
153
|
now = Time.now
|
|
154
154
|
end
|
|
155
155
|
|
|
156
|
-
if File.
|
|
156
|
+
if File.exist?(File.join(dir, 'std.out'))
|
|
157
157
|
cerrt = File.ctime File.join(dir, 'std.err')
|
|
158
158
|
coutt = File.ctime File.join(dir, 'std.out')
|
|
159
159
|
outt = File.mtime File.join(dir, 'std.out')
|
|
@@ -163,10 +163,10 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
163
163
|
end
|
|
164
164
|
|
|
165
165
|
fdep = File.join(dir, 'dependencies.list')
|
|
166
|
-
deps = Open.read(fdep).split("\n") if File.
|
|
166
|
+
deps = Open.read(fdep).split("\n") if File.exist?(fdep)
|
|
167
167
|
|
|
168
168
|
fcadep = File.join(dir, 'canfail_dependencies.list')
|
|
169
|
-
cadeps = Open.read(fcadep).split("\n") if File.
|
|
169
|
+
cadeps = Open.read(fcadep).split("\n") if File.exist?(fcadep)
|
|
170
170
|
|
|
171
171
|
if done || error || aborted || running || queued || jobid
|
|
172
172
|
select = false
|
|
@@ -244,7 +244,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
244
244
|
puts Log.color(:magenta, "Dependencies (can fail): ") << cadeps * ", " if cadeps
|
|
245
245
|
puts Log.color(:magenta, "Nodes: ") << nodes * ", " if long
|
|
246
246
|
puts Log.color(:magenta, "Time elapsed: ") << Misc.format_seconds(time_elapsed) if time_elapsed
|
|
247
|
-
puts Log.color(:magenta, "Output: ") << File.
|
|
247
|
+
puts Log.color(:magenta, "Output: ") << File.exist?(File.join(dir, 'std.out')).to_s << (id.nil? || File.exist?(File.join(dir, 'exit.status')) ? "" : " (last update " + Misc.format_seconds(time_diff) + " ago)") if long
|
|
248
248
|
|
|
249
249
|
if options[:batch_parameters]
|
|
250
250
|
puts Log.color(:magenta, "BATCH parameters: ")
|
|
@@ -316,7 +316,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
316
316
|
end
|
|
317
317
|
|
|
318
318
|
|
|
319
|
-
if tail && File.
|
|
319
|
+
if tail && File.exist?(File.join(dir, 'std.err'))
|
|
320
320
|
if exit_status && exit_status != 0
|
|
321
321
|
puts Log.color(:magenta, "First error or exception found: ")
|
|
322
322
|
puts CMD.cmd("grep -i -w 'error\\|[a-z]*exception' #{File.join(dir, 'std.err')} -A #{tail.to_i} |head -n #{tail.to_i}", :no_fail => true).read
|
|
@@ -46,7 +46,7 @@ if directory =~ /^[0-9]*$/
|
|
|
46
46
|
end
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
-
raise ParameterException, "Could not identify job #{directory}" unless File.
|
|
49
|
+
raise ParameterException, "Could not identify job #{directory}" unless File.exist?(directory)
|
|
50
50
|
|
|
51
51
|
require 'rbbt/hpc/slurm'
|
|
52
52
|
|
|
@@ -97,19 +97,19 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
97
97
|
|
|
98
98
|
different_system = job_batch_system != batch_system
|
|
99
99
|
|
|
100
|
-
if File.
|
|
100
|
+
if File.exist?(fid = File.join(dir, 'job.id'))
|
|
101
101
|
id = Open.read(fid).chomp
|
|
102
102
|
else
|
|
103
103
|
id = nil
|
|
104
104
|
end
|
|
105
105
|
|
|
106
|
-
if File.
|
|
106
|
+
if File.exist?(fstatus = File.join(dir, 'exit.status'))
|
|
107
107
|
exit_status = Open.read(fstatus).to_i
|
|
108
108
|
else
|
|
109
109
|
exit_status = nil
|
|
110
110
|
end
|
|
111
111
|
|
|
112
|
-
if File.
|
|
112
|
+
if File.exist?(fstatus = File.join(dir, 'job.status'))
|
|
113
113
|
fstatus_txt = Open.read(fstatus)
|
|
114
114
|
begin
|
|
115
115
|
if job_batch_system == "lsf"
|
|
@@ -126,17 +126,17 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
126
126
|
nodes = []
|
|
127
127
|
end
|
|
128
128
|
|
|
129
|
-
if File.
|
|
129
|
+
if File.exist?(File.join(dir, 'std.out'))
|
|
130
130
|
outt = File.mtime File.join(dir, 'std.out')
|
|
131
131
|
errt = File.mtime File.join(dir, 'std.err')
|
|
132
132
|
time_diff = Time.now - [outt, errt].max
|
|
133
133
|
end
|
|
134
134
|
|
|
135
135
|
fdep = File.join(dir, 'dependencies.list')
|
|
136
|
-
deps = Open.read(fdep).split("\n") if File.
|
|
136
|
+
deps = Open.read(fdep).split("\n") if File.exist?(fdep)
|
|
137
137
|
|
|
138
138
|
fcadep = File.join(dir, 'canfail_dependencies.list')
|
|
139
|
-
cadeps = Open.read(fcadep).split("\n") if File.
|
|
139
|
+
cadeps = Open.read(fcadep).split("\n") if File.exist?(fcadep)
|
|
140
140
|
|
|
141
141
|
aborted = error = true if aborted.nil? && error.nil?
|
|
142
142
|
#if done || error || aborted || running || queued || jobid || search
|
|
@@ -177,7 +177,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
177
177
|
puts Log.color(:magenta, "Dependencies: ") << deps * ", " if deps
|
|
178
178
|
puts Log.color(:magenta, "Dependencies (can fail): ") << cadeps * ", " if cadeps
|
|
179
179
|
puts Log.color(:magenta, "Nodes: ") << nodes * ", "
|
|
180
|
-
puts Log.color(:magenta, "Output: ") << File.
|
|
180
|
+
puts Log.color(:magenta, "Output: ") << File.exist?(File.join(dir, 'std.out')).to_s << (id.nil? ? "" : " (last update " + Misc.format_seconds(time_diff) + " ago)")
|
|
181
181
|
|
|
182
182
|
if options[:batch_parameters]
|
|
183
183
|
puts Log.color(:magenta, "BATCH parameters: ")
|
|
@@ -189,7 +189,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
189
189
|
end
|
|
190
190
|
end
|
|
191
191
|
|
|
192
|
-
if tail && File.
|
|
192
|
+
if tail && File.exist?(File.join(dir, 'std.err'))
|
|
193
193
|
if exit_status && exit_status != 0
|
|
194
194
|
puts Log.color(:magenta, "First error or exception found: ")
|
|
195
195
|
puts CMD.cmd("grep -i -w 'error\\|[a-z]*exception' #{File.join(dir, 'std.err')} -A #{tail.to_i} |head -n #{tail.to_i}", :no_fail => true).read
|
|
@@ -118,19 +118,19 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
118
118
|
container_home = nil
|
|
119
119
|
end
|
|
120
120
|
|
|
121
|
-
if File.
|
|
121
|
+
if File.exist?(fid = File.join(dir, 'job.id'))
|
|
122
122
|
id = Open.read(fid).chomp
|
|
123
123
|
else
|
|
124
124
|
id = nil
|
|
125
125
|
end
|
|
126
126
|
|
|
127
|
-
if File.
|
|
127
|
+
if File.exist?(fstatus = File.join(dir, 'exit.status'))
|
|
128
128
|
exit_status = Open.read(fstatus).to_i
|
|
129
129
|
else
|
|
130
130
|
exit_status = nil
|
|
131
131
|
end
|
|
132
132
|
|
|
133
|
-
if File.
|
|
133
|
+
if File.exist?(fstatus = File.join(dir, 'job.status'))
|
|
134
134
|
fstatus_txt = Open.read(fstatus)
|
|
135
135
|
begin
|
|
136
136
|
if job_batch_system == "lsf"
|
|
@@ -147,13 +147,13 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
147
147
|
nodes = []
|
|
148
148
|
end
|
|
149
149
|
|
|
150
|
-
if File.
|
|
150
|
+
if File.exist?(File.join(dir, 'exit.status'))
|
|
151
151
|
now = File.ctime(File.join(dir, 'exit.status'))
|
|
152
152
|
else
|
|
153
153
|
now = Time.now
|
|
154
154
|
end
|
|
155
155
|
|
|
156
|
-
if File.
|
|
156
|
+
if File.exist?(File.join(dir, 'std.out'))
|
|
157
157
|
cerrt = File.ctime File.join(dir, 'std.err')
|
|
158
158
|
coutt = File.ctime File.join(dir, 'std.out')
|
|
159
159
|
outt = File.mtime File.join(dir, 'std.out')
|
|
@@ -163,10 +163,10 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
163
163
|
end
|
|
164
164
|
|
|
165
165
|
fdep = File.join(dir, 'dependencies.list')
|
|
166
|
-
deps = Open.read(fdep).split("\n") if File.
|
|
166
|
+
deps = Open.read(fdep).split("\n") if File.exist?(fdep)
|
|
167
167
|
|
|
168
168
|
fcadep = File.join(dir, 'canfail_dependencies.list')
|
|
169
|
-
cadeps = Open.read(fcadep).split("\n") if File.
|
|
169
|
+
cadeps = Open.read(fcadep).split("\n") if File.exist?(fcadep)
|
|
170
170
|
|
|
171
171
|
if done || error || aborted || running || queued || jobid
|
|
172
172
|
select = false
|
|
@@ -244,7 +244,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
244
244
|
puts Log.color(:magenta, "Dependencies (can fail): ") << cadeps * ", " if cadeps
|
|
245
245
|
puts Log.color(:magenta, "Nodes: ") << nodes * ", " if long
|
|
246
246
|
puts Log.color(:magenta, "Time elapsed: ") << Misc.format_seconds(time_elapsed) if time_elapsed
|
|
247
|
-
puts Log.color(:magenta, "Output: ") << File.
|
|
247
|
+
puts Log.color(:magenta, "Output: ") << File.exist?(File.join(dir, 'std.out')).to_s << (id.nil? || File.exist?(File.join(dir, 'exit.status')) ? "" : " (last update " + Misc.format_seconds(time_diff) + " ago)") if long
|
|
248
248
|
|
|
249
249
|
if options[:batch_parameters]
|
|
250
250
|
puts Log.color(:magenta, "BATCH parameters: ")
|
|
@@ -316,7 +316,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
|
316
316
|
end
|
|
317
317
|
|
|
318
318
|
|
|
319
|
-
if tail && File.
|
|
319
|
+
if tail && File.exist?(File.join(dir, 'std.err'))
|
|
320
320
|
if exit_status && exit_status != 0
|
|
321
321
|
puts Log.color(:magenta, "First error or exception found: ")
|
|
322
322
|
puts CMD.cmd("grep -i -w 'error\\|[a-z]*exception' #{File.join(dir, 'std.err')} -A #{tail.to_i} |head -n #{tail.to_i}", :no_fail => true).read
|
|
@@ -46,7 +46,7 @@ if directory =~ /^[0-9]*$/
|
|
|
46
46
|
end
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
-
raise ParameterException, "Could not identify job #{directory}" unless File.
|
|
49
|
+
raise ParameterException, "Could not identify job #{directory}" unless File.exist?(directory)
|
|
50
50
|
|
|
51
51
|
require 'rbbt/hpc/slurm'
|
|
52
52
|
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'rbbt-util'
|
|
4
|
+
require 'rbbt/util/simpleopt'
|
|
5
|
+
|
|
6
|
+
$0 = "rbbt #{$previous_commands*""} #{ File.basename(__FILE__) }" if $previous_commands
|
|
7
|
+
|
|
8
|
+
options = SOPT.setup <<EOF
|
|
9
|
+
Select entries in a tsv based on some criteria
|
|
10
|
+
|
|
11
|
+
$ rbbt tsv subset [options] file.tsv <key> <criteria>
|
|
12
|
+
|
|
13
|
+
Subsets entries from a TSV file from a given list. Works with Tokyocabinet HDB and BDB as well.
|
|
14
|
+
|
|
15
|
+
-tch--tokyocabinet File is a TC HDB
|
|
16
|
+
-tcb--tokyocabinet_bd File is a TC BDB
|
|
17
|
+
-hh--header_hash* Change the character used to mark the header line (defaults to #)
|
|
18
|
+
-s--subset* Subset of keys (Comma-separated or file)
|
|
19
|
+
-m--merge Merge TSV rows
|
|
20
|
+
-h--help Help
|
|
21
|
+
EOF
|
|
22
|
+
|
|
23
|
+
SOPT.usage if options[:help]
|
|
24
|
+
|
|
25
|
+
file, key, criteria = ARGV
|
|
26
|
+
|
|
27
|
+
key, criteria, file = [file, key, nil] if criteria.nil?
|
|
28
|
+
|
|
29
|
+
file = STDIN if file == '-' || file.nil?
|
|
30
|
+
|
|
31
|
+
raise ParameterException, "Please specify the tsv file as argument" if file.nil?
|
|
32
|
+
|
|
33
|
+
options[:fields] = options[:fields].split(/,\|/) if options[:fields]
|
|
34
|
+
options[:header_hash] = options["header_hash"]
|
|
35
|
+
|
|
36
|
+
case
|
|
37
|
+
when options[:tokyocabinet]
|
|
38
|
+
tsv = Persist.open_tokyocabinet(file, false)
|
|
39
|
+
puts tsv.summary
|
|
40
|
+
when options[:tokyocabinet_bd]
|
|
41
|
+
tsv = Persist.open_tokyocabinet(file, false, nil, TokyoCabinet::BDB)
|
|
42
|
+
puts tsv.summary
|
|
43
|
+
else
|
|
44
|
+
tsv = TSV.open(file, options)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
criteria = criteria.to_regexp.to_regexp if criteria =~ /\/.*\/.*/
|
|
48
|
+
puts tsv.select(key => criteria)
|
|
@@ -28,7 +28,7 @@ end
|
|
|
28
28
|
|
|
29
29
|
file = ARGV.shift
|
|
30
30
|
|
|
31
|
-
file = STDIN if file == '-'
|
|
31
|
+
file = STDIN if file == '-' || file.nil?
|
|
32
32
|
|
|
33
33
|
case
|
|
34
34
|
when options[:tokyocabinet]
|
|
@@ -38,15 +38,16 @@ when options[:tokyocabinet_bd]
|
|
|
38
38
|
else
|
|
39
39
|
if String === file
|
|
40
40
|
file = file.dup
|
|
41
|
-
Path.setup(File.expand_path(file))
|
|
41
|
+
file = Path.setup(File.expand_path(file))
|
|
42
42
|
end
|
|
43
43
|
tsv = file
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
-
tsv = TSV.open(tsv) if IO === tsv
|
|
46
|
+
tsv = TSV.open(tsv) if IO === tsv || Path === tsv
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
begin
|
|
50
|
+
require 'rbbt/workflow'
|
|
50
51
|
Workflow.require_workflow "Genomics"
|
|
51
52
|
tsv = Genomics.job(:names, nil, :tsv => tsv).run
|
|
52
53
|
rescue
|
|
@@ -28,5 +28,5 @@ SOPT.usage if options[:help]
|
|
|
28
28
|
|
|
29
29
|
target, *files = ARGV
|
|
30
30
|
|
|
31
|
-
raise "Target already exists: #{ target }" if File.
|
|
31
|
+
raise "Target already exists: #{ target }" if File.exist?(target) and not File.directory?(target)
|
|
32
32
|
Step.archive(files, target)
|
|
@@ -36,14 +36,14 @@ file = ARGV.shift
|
|
|
36
36
|
|
|
37
37
|
$seen = []
|
|
38
38
|
def get_step(file)
|
|
39
|
-
file = File.expand_path(file) if File.
|
|
39
|
+
file = File.expand_path(file) if File.exist?(file)
|
|
40
40
|
file = file.sub(/\.(info|files)$/,'')
|
|
41
41
|
$seen << file
|
|
42
42
|
Workflow.load_step file
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
def touch(step)
|
|
46
|
-
return unless File.
|
|
46
|
+
return unless File.exist?(step.path)
|
|
47
47
|
step.dependencies.each do |dep|
|
|
48
48
|
next unless Open.exists?(dep.path)
|
|
49
49
|
if Open.mtime(dep.path) > Open.mtime(step.path) + 1
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rbbt-util
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 5.34.
|
|
4
|
+
version: 5.34.9
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Miguel Vazquez
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-07-
|
|
11
|
+
date: 2022-07-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|
|
@@ -452,6 +452,7 @@ files:
|
|
|
452
452
|
- share/rbbt_commands/tsv/query
|
|
453
453
|
- share/rbbt_commands/tsv/read
|
|
454
454
|
- share/rbbt_commands/tsv/read_excel
|
|
455
|
+
- share/rbbt_commands/tsv/select
|
|
455
456
|
- share/rbbt_commands/tsv/slice
|
|
456
457
|
- share/rbbt_commands/tsv/sort
|
|
457
458
|
- share/rbbt_commands/tsv/subset
|