rbbt-util 5.23.35 → 5.23.36

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8778e323b3d7445ea05f92a9f4a5db9e4c2ddbc1
4
- data.tar.gz: 863e8f1e3e03559bf9bac87b60f6cb725ec7bf6e
3
+ metadata.gz: a48bd703a6bcf70e3b03ea0a80df3d9e419d2a5d
4
+ data.tar.gz: e5ddc970668f140bd1923ce200b2754d352c8e61
5
5
  SHA512:
6
- metadata.gz: 6866e00f193fca319f313c168d08e7cadbb50dae04dd0299d602a6baee292baf4c1dc9f18dedf186bac95caf21ee0d984ecae42edd12ccbf1fc012b46309cb63
7
- data.tar.gz: 07e1418d61e8188df8bdd77d496243c4c9c09526c6250722449369607d755b867f6620007cafd12828f3b5e6f6b8083a387bee9764e52c1a28dbfec3c733194b
6
+ metadata.gz: 2023508ca619102a57ecc4927e08b97c14b2429cea38c57e14c75ce743006772080ab8daad7e7d17a721a11646da7806a9376dbb17e6f25686129418b2fa04db
7
+ data.tar.gz: 5439545d3471476c701f42c133398d8211bb1cfd5adc4a6d802954ece07fb0a509d0f0c59fa07085f9b7f4ec6097390d9c0cd527e2c90ff735eca8d7e84c0ad4
data/lib/rbbt/monitor.rb CHANGED
@@ -138,18 +138,45 @@ module Rbbt
138
138
  dirs.collect do |dir|
139
139
  next unless Open.exists? dir
140
140
 
141
- dir.glob("*").collect do |workflowdir|
141
+ workflowdirs = if (dir_sub_path = Open.find_repo_dir(workflowdir))
142
+ repo_dir, sub_path = dir_sub_path
143
+ Open.list_repo_files(*dir_sub_path).collect{|f| f.split("/").first}.uniq.collect{|f| File.join(repo_dir, f)}.uniq
144
+ else
145
+ dir.glob("*")
146
+ end
147
+
148
+ workflowdirs.collect do |workflowdir|
142
149
  workflow = File.basename(workflowdir)
143
150
  next if workflows and not workflows.include? workflow
144
151
 
145
- workflowdir.glob("*").collect do |taskdir|
152
+ tasks_dirs = if (dir_sub_path = Open.find_repo_dir(workflowdir))
153
+ repo_dir, sub_path = dir_sub_path
154
+ Open.list_repo_files(*dir_sub_path).collect{|f| f.split("/").first}.uniq.collect{|f| File.join(repo_dir, f)}.uniq
155
+ else
156
+ workflowdir.glob("*")
157
+ end
158
+
159
+ tasks_dirs.collect do |taskdir|
146
160
  task = File.basename(taskdir)
147
161
  next if tasks and not tasks.include? task
148
162
 
149
- #cmd = "find -L '#{ taskdir }/' -not \\( -path \"#{taskdir}/*.files/*\" -prune \\) -not -name '*.pid' -not -name '*.notify' -not -name '\\.*' 2>/dev/null"
150
- cmd = "find -L '#{ taskdir }/' -not \\( -path \"#{taskdir}/.info/*\" -prune \\) -not \\( -path \"#{taskdir}/*.files/*\" -prune \\) -not -name '*.pid' -not -name '*.notify' -not -name '\\.*' \\( -not -type d -o -name '*.files' \\) 2>/dev/null"
151
163
 
152
- files = CMD.cmd(cmd, :pipe => true)
164
+ files = if (dir_sub_path = Open.find_repo_dir(taskdir))
165
+ repo_dir, sub_path = dir_sub_path
166
+ Open.list_repo_files(*dir_sub_path).reject do |f|
167
+ f.include?("/.info/") ||
168
+ f.include?(".files/") ||
169
+ f.include?(".pid/") ||
170
+ File.directory?(f)
171
+ end.collect do |f|
172
+ File.join(repo_dir, f)
173
+ end
174
+ else
175
+ #cmd = "find -L '#{ taskdir }/' -not \\( -path \"#{taskdir}/*.files/*\" -prune \\) -not -name '*.pid' -not -name '*.notify' -not -name '\\.*' 2>/dev/null"
176
+ cmd = "find -L '#{ taskdir }/' -not \\( -path \"#{taskdir}/.info/*\" -prune \\) -not \\( -path \"#{taskdir}/*.files/*\" -prune \\) -not -name '*.pid' -not -name '*.notify' -not -name '\\.*' \\( -not -type d -o -name '*.files' \\) 2>/dev/null"
177
+
178
+ CMD.cmd(cmd, :pipe => true)
179
+ end
153
180
  TSV.traverse files, :type => :array, :into => jobs, :_bar => "Finding jobs in #{ taskdir }" do |file|
154
181
  _files << file
155
182
  if m = file.match(/(.*)\.(info|pid|files)$/)
@@ -167,10 +194,10 @@ module Rbbt
167
194
  info[:task] = task
168
195
  info[:name] = name
169
196
 
170
- if File.exists? file
197
+ if Open.exists? file
171
198
  info = info.merge(file_time(file))
172
199
  info[:done] = true
173
- info[:info_file] = File.exist?(info_file) ? info_file : nil
200
+ info[:info_file] = Open.exist?(info_file) ? info_file : nil
174
201
  else
175
202
  info = info.merge({:info_file => info_file, :done => false})
176
203
  end
@@ -86,7 +86,6 @@ module Persist
86
86
  end
87
87
 
88
88
  def read_and_close
89
- #mutex.synchronize do
90
89
  read if closed? or not read?
91
90
  res = begin
92
91
  yield
@@ -94,7 +93,6 @@ module Persist
94
93
  close
95
94
  end
96
95
  res
97
- #end
98
96
  end
99
97
 
100
98
 
@@ -207,6 +207,15 @@ module Open
207
207
  end
208
208
  end
209
209
 
210
+ def self.list_repo_files(dir, sub_path = nil)
211
+ repo = get_repo_from_dir(dir)
212
+ files = repo.keys
213
+ files.reject!{|f| f[0] == "."}
214
+ return files unless sub_path
215
+
216
+ files.select{|file| file.start_with?(sub_path) }
217
+ end
218
+
210
219
  def self.exists_in_repo(dir, sub_path, content)
211
220
  repo = get_repo_from_dir(dir)
212
221
  repo.read_and_close do
@@ -219,7 +228,7 @@ module Open
219
228
  dir = dir + '/' unless dir.chars[-1] == "/"
220
229
 
221
230
  begin
222
- if file.start_with? dir
231
+ if file.start_with?(dir) || file == dir[0..-2]
223
232
  sub_path = file.to_s[dir.length..-1]
224
233
  return [dir, sub_path]
225
234
  else
@@ -376,10 +385,12 @@ module Open
376
385
  repo_source = get_repo_from_dir(dir_sub_path_source[0])
377
386
  repo_target = get_repo_from_dir(dir_sub_path_target[0])
378
387
 
379
- repo_source.read_and_close do
380
- repo_target.write_and_close do
381
- repo_source[dir_sub_path_source[1]] = repo_target[dir_sub_path_target[1]]
382
- end
388
+ content = repo_source.read_and_close do
389
+ repo_target[dir_sub_path_target[1]]
390
+ end
391
+
392
+ repo_target.write_and_close do
393
+ repo_source[dir_sub_path_source[1]] = content
383
394
  end
384
395
 
385
396
  return nil
@@ -410,10 +421,15 @@ module Open
410
421
  repo_source = get_repo_from_dir(dir_sub_path_source[0])
411
422
  repo_target = get_repo_from_dir(dir_sub_path_target[0])
412
423
 
424
+ content = repo_source.read_and_close do
425
+ repo_target[dir_sub_path_target[1]]
426
+ end
427
+
428
+ repo_target.write_and_close do
429
+ repo_source[dir_sub_path_source[1]] = content
430
+ end
431
+
413
432
  repo_source.write_and_close do
414
- repo_target.write_and_close do
415
- repo_source[dir_sub_path_source[1]] = repo_target[dir_sub_path_target[1]]
416
- end
417
433
  repo_source.delete dir_sub_path_source[1]
418
434
  end
419
435
 
@@ -9,7 +9,7 @@ class Step
9
9
  return if target_dir[workflow][task][name].exists? || File.symlink?(target_dir[workflow][task][name].find)
10
10
  Log.debug "Linking #{ path }"
11
11
  FileUtils.mkdir_p target_dir[workflow][task] unless target_dir[workflow][task].exists?
12
- FileUtils.ln_s path, target_dir[workflow][task][name].find
12
+ FileUtils.ln_s path, target_dir[workflow][task][name].find if File.exists?(path)
13
13
  FileUtils.ln_s path + '.files', target_dir[workflow][task][name].find + '.files' if File.exists?(path + '.files')
14
14
  FileUtils.ln_s path + '.info', target_dir[workflow][task][name].find + '.info' if File.exists?(path + '.info')
15
15
  end
@@ -118,8 +118,8 @@ TSV.traverse jobs, :_bar => "Checking job status" do |file,i|
118
118
  status = status.to_s
119
119
  end
120
120
 
121
- if time and File.exists?(file)
122
- old = Time.now - File.atime(file)
121
+ if time and Open.exists?(file)
122
+ old = Time.now - Open.atime(file)
123
123
  if old > time
124
124
  status = 'old'
125
125
  end
@@ -67,6 +67,35 @@ def status_msg(status)
67
67
  end
68
68
  Log.color(color, status.to_s)
69
69
  end
70
+
71
+ def input_msg(file, inputs)
72
+
73
+ str = ""
74
+ job_inputs = Workflow.load_step(file).recursive_inputs.to_hash
75
+ IndiferentHash.setup(job_inputs)
76
+
77
+ inputs.each do |input|
78
+ value = job_inputs[input]
79
+ next if value.nil?
80
+ value_str = Misc.fingerprint(value)
81
+ str << "\t#{Log.color :magenta, input}=#{value_str}"
82
+ end
83
+ str
84
+ end
85
+
86
+ def info_msg(info, info_fields)
87
+
88
+ str = ""
89
+ info_fields.each do |field|
90
+ value = info[field]
91
+ next if value.nil?
92
+ value_str = Misc.fingerprint(value)
93
+ str << "\t#{Log.color :magenta, field}=#{value_str}"
94
+ end
95
+ str
96
+ end
97
+
98
+
70
99
  puts Log.color(:magenta, "# System report")
71
100
  puts
72
101
  sort_files = Proc.new do |a,b|
@@ -143,6 +172,21 @@ workflows.sort.each do |workflow,tasks|
143
172
  if options[:quick] and i[:done]
144
173
  status = 'done'
145
174
  str << " #{ status_msg status }"
175
+ if inputs and inputs.any?
176
+ str << input_msg(file, inputs)
177
+ end
178
+
179
+ if info_fields and info_fields.any?
180
+ info = begin
181
+ Open.open(i[:info_file]) do |f|
182
+ Step::INFO_SERIALIAZER.load(f)
183
+ end
184
+ rescue
185
+ {:status => :noinfo}
186
+ end
187
+ IndiferentHash.setup(info)
188
+ str << info_msg(info, info_fields)
189
+ end
146
190
  else
147
191
  info = begin
148
192
  Open.open(i[:info_file]) do |f|
@@ -155,7 +199,7 @@ workflows.sort.each do |workflow,tasks|
155
199
 
156
200
  pid = info[:pid]
157
201
  status = info[:status]
158
- status = :missing if status == :done and not File.exist? file
202
+ status = :missing if status == :done and not Open.exist? file
159
203
  status = status.to_s
160
204
  if status != "done" and pid and not Misc.pid_exists?(pid)
161
205
  if File.exist? file
@@ -167,25 +211,12 @@ workflows.sort.each do |workflow,tasks|
167
211
  str << " #{ status_msg status }"
168
212
  str << " (dirty)" if status == 'done' && Workflow.load_step(file).dirty?
169
213
 
170
- if inputs and inputs.any? and info[:inputs]
171
- job_inputs = Workflow.load_step(file).recursive_inputs.to_hash
172
- IndiferentHash.setup(job_inputs)
173
-
174
- inputs.each do |input|
175
- value = job_inputs[input]
176
- next if value.nil?
177
- value_str = Misc.fingerprint(value)
178
- str << "\t#{Log.color :magenta, input}=#{value_str}"
179
- end
214
+ if inputs and inputs.any?
215
+ str << input_msg(file, inputs)
180
216
  end
181
217
 
182
218
  if info_fields and info_fields.any?
183
- info_fields.each do |field|
184
- value = info[field]
185
- next if value.nil?
186
- value_str = Misc.fingerprint(value)
187
- str << "\t#{Log.color :magenta, field}=#{value_str}"
188
- end
219
+ str << info_msg(info, info_fields)
189
220
  end
190
221
  end
191
222
  str << "; #{pid_msg pid}" unless status == "done"
@@ -22,6 +22,7 @@ $ rbbt workflow prov <job-result>
22
22
  -p--plot* draw the dependency plot into <file.png>
23
23
  -i--inputs* List of inputs to print
24
24
  -if--info_fields* List of info fields to print
25
+ -t--touch Update modification times to be consistent
25
26
  EOF
26
27
 
27
28
  SOPT.usage if options[:help]
@@ -106,6 +107,18 @@ def report_msg(status, name, path, info = nil)
106
107
  str << "\n"
107
108
  end
108
109
 
110
+ def touch(step)
111
+ return unless File.exists?(step.path)
112
+ step.dependencies.each do |dep|
113
+ next unless Open.exists?(dep.path)
114
+ touch(dep)
115
+ if Open.mtime(step.path) < Open.mtime(dep.path)
116
+ Log.debug("Updating #{step.path} to #{dep.path}")
117
+ CMD.cmd("touch -r '#{dep.path}' '#{step.path}'")
118
+ end
119
+ end if step.dependencies
120
+ end
121
+
109
122
  def report(step, offset = 0, task = nil)
110
123
  info = step.info || {}
111
124
  info[:task_name] = task
@@ -164,6 +177,10 @@ def adjacency(step)
164
177
  [id, edges, node_info]
165
178
  end
166
179
 
180
+ if options[:touch]
181
+ touch(step)
182
+ end
183
+
167
184
  if options[:plot]
168
185
  id, edges, node_info = adjacency(step)
169
186
  node_info[id][:color] = 'red'
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.23.35
4
+ version: 5.23.36
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-26 00:00:00.000000000 Z
11
+ date: 2018-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake