xli-dtr 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README +6 -115
- data/Rakefile +22 -154
- data/TODO +16 -1
- data/bin/dtr +22 -61
- data/dtr.gemspec +7 -6
- data/lib/dtr/agent/brain.rb +66 -0
- data/lib/dtr/agent/herald.rb +50 -0
- data/lib/dtr/agent/runner.rb +100 -0
- data/lib/dtr/agent/sync_codebase.rb +44 -0
- data/lib/dtr/agent/sync_logger.rb +40 -0
- data/lib/dtr/agent/test_unit.rb +42 -0
- data/lib/dtr/agent/worker.rb +92 -0
- data/lib/dtr/agent/working_env_ext.rb +45 -0
- data/lib/dtr/agent.rb +37 -0
- data/lib/dtr/master.rb +40 -0
- data/lib/dtr/monitor.rb +37 -0
- data/lib/dtr/raketasks.rb +74 -13
- data/lib/dtr/shared/adapter.rb +112 -0
- data/lib/dtr/shared/configuration.rb +76 -0
- data/lib/dtr/shared/message_decorator.rb +28 -0
- data/lib/dtr/shared/ruby_ext.rb +153 -0
- data/lib/dtr/shared/service/agent.rb +33 -0
- data/lib/dtr/shared/service/file.rb +28 -0
- data/lib/dtr/shared/service/rinda.rb +40 -0
- data/lib/dtr/shared/service/runner.rb +33 -0
- data/lib/dtr/shared/service/working_env.rb +28 -0
- data/lib/dtr/shared/service.rb +19 -0
- data/lib/dtr/shared/sync_codebase/codebase.rb +32 -0
- data/lib/dtr/shared/sync_codebase/master_ext.rb +52 -0
- data/lib/dtr/shared/sync_codebase/package.rb +39 -0
- data/lib/dtr/shared/sync_codebase/sync_service.rb +41 -0
- data/lib/dtr/shared/sync_codebase.rb +18 -0
- data/lib/dtr/shared/sync_logger.rb +72 -0
- data/lib/dtr/shared/utils/cmd.rb +30 -0
- data/lib/dtr/shared/utils/env_store.rb +60 -0
- data/lib/dtr/shared/utils/logger.rb +71 -0
- data/lib/dtr/shared/utils.rb +17 -0
- data/lib/dtr/shared/working_env.rb +38 -0
- data/lib/dtr/shared.rb +24 -0
- data/lib/dtr/test_unit/drb_test_runner.rb +57 -0
- data/lib/dtr/test_unit/injection.rb +30 -0
- data/lib/dtr/test_unit/test_case_injection.rb +37 -0
- data/lib/dtr/test_unit/testrunnermediator_injection.rb +72 -0
- data/lib/dtr/test_unit/thread_safe_test_result.rb +40 -0
- data/lib/dtr/test_unit/worker_club.rb +72 -0
- data/lib/dtr/test_unit.rb +8 -275
- data/lib/dtr/test_unit_injection.rb +0 -1
- data/lib/dtr.rb +23 -81
- data/test/acceptance/agent_working_env_test.rb +92 -0
- data/test/acceptance/dtr_package_task_test.rb +26 -0
- data/test/acceptance/general_test.rb +275 -0
- data/test/acceptance/sync_codebase_test.rb +67 -0
- data/test/acceptance/sync_logger_test.rb +41 -0
- data/test/agent_helper.rb +39 -0
- data/test/logger_stub.rb +30 -0
- data/test/test_helper.rb +43 -0
- data/test/unit/adapter_test.rb +107 -0
- data/test/unit/test_unit_test.rb +47 -0
- data/test/unit/working_env_test.rb +71 -0
- data/testdata/Rakefile +15 -0
- data/testdata/a_failed_test_case.rb +8 -0
- data/testdata/a_file_system_test_case.rb +8 -0
- data/testdata/a_test_case.rb +13 -0
- data/testdata/a_test_case2.rb +6 -0
- data/testdata/an_error_test_case.rb +9 -0
- data/testdata/another_project/Rakefile +6 -0
- data/testdata/another_project/passed_test_case.rb +7 -0
- data/testdata/is_required_by_a_test.rb +9 -0
- data/testdata/lib/lib_test_case.rb +7 -0
- data/testdata/package_task_test_rakefile +8 -0
- data/testdata/scenario_test_case.rb +34 -0
- data/testdata/setup_agent_env_test_case.rb +9 -0
- data/testdata/should_not_sync_codebase_and_setup_working_dir_when_agent_is_in_same_dir_with_master_process/Rakefile +6 -0
- data/testdata/should_not_sync_codebase_and_setup_working_dir_when_agent_is_in_same_dir_with_master_process/verify_dir_pwd_test_case.rb +10 -0
- metadata +72 -18
- data/lib/dtr/base.rb +0 -172
- data/lib/dtr/runner.rb +0 -270
- data/lib/dtr/service_provider.rb +0 -160
@@ -0,0 +1,71 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
require 'dtr/agent/working_env_ext'
|
3
|
+
DTR::WorkingEnv.send(:include, DTR::Agent::WorkingEnvExt)
|
4
|
+
|
5
|
+
class WorkingEnvTest < Test::Unit::TestCase
|
6
|
+
def test_identifier_of_working_env
|
7
|
+
assert_not_equal DTR::WorkingEnv.new[:identifier], DTR::WorkingEnv.new[:identifier]
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_working_env_equal
|
11
|
+
env1 = DTR::WorkingEnv.new
|
12
|
+
env2 = DTR::WorkingEnv.new
|
13
|
+
assert_not_equal env1, env2
|
14
|
+
env2[:identifier] = env1[:identifier]
|
15
|
+
assert env1 == env2
|
16
|
+
assert env2 != nil
|
17
|
+
assert nil != env2
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_working_dir_within_env_should_be_based_on_host_and_pwd
|
21
|
+
env = DTR::WorkingEnv.new
|
22
|
+
env[:pwd] = 'pwd'
|
23
|
+
env[:host] = 'hostname'
|
24
|
+
working_dir = nil
|
25
|
+
env.within do
|
26
|
+
working_dir = Dir.pwd
|
27
|
+
end
|
28
|
+
assert_equal File.expand_path('hostname/pwd'), working_dir
|
29
|
+
ensure
|
30
|
+
FileUtils.rm_rf File.expand_path('hostname')
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_should_truncate_pwd_if_it_is_too_long_for_working_dir
|
34
|
+
env = DTR::WorkingEnv.new
|
35
|
+
env[:pwd] = 'pwd_pwd_pwd_pwd_pwd_pwd_pwd_pwd_pwd_pwd' #40
|
36
|
+
env[:host] = 'hostname'
|
37
|
+
working_dir = nil
|
38
|
+
env.within do
|
39
|
+
working_dir = Dir.pwd
|
40
|
+
end
|
41
|
+
assert_equal File.expand_path('hostname/_pwd_pwd_pwd_pwd_pwd'), working_dir
|
42
|
+
ensure
|
43
|
+
FileUtils.rm_rf File.expand_path('hostname')
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_should_convert_non_word_and_number_in_dir_string_to_underscore
|
47
|
+
env = DTR::WorkingEnv.new
|
48
|
+
env[:pwd] = 'pwd pwd' #40
|
49
|
+
env[:host] = 'xli.local:1234'
|
50
|
+
working_dir = nil
|
51
|
+
env.within do
|
52
|
+
working_dir = Dir.pwd
|
53
|
+
end
|
54
|
+
assert_equal File.expand_path('xli_local_1234/pwd_pwd'), working_dir
|
55
|
+
ensure
|
56
|
+
FileUtils.rm_rf File.expand_path('xli_local_1234')
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_working_dir_should_be_created_if_it_does_not_exist
|
60
|
+
env = DTR::WorkingEnv.new
|
61
|
+
env[:pwd] = 'pwd'
|
62
|
+
env[:host] = 'hostname'
|
63
|
+
|
64
|
+
assert !File.exists?(File.expand_path('hostname'))
|
65
|
+
env.within do
|
66
|
+
assert File.exists?(Dir.pwd)
|
67
|
+
end
|
68
|
+
ensure
|
69
|
+
FileUtils.rm_rf File.expand_path('hostname')
|
70
|
+
end
|
71
|
+
end
|
data/testdata/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
2
|
+
require 'dtr/raketasks'
|
3
|
+
require 'rake/testtask'
|
4
|
+
|
5
|
+
desc "Default Task"
|
6
|
+
task :default => :dtr
|
7
|
+
|
8
|
+
DTR::TestTask.new :dtr do |t|
|
9
|
+
t.test_files = FileList['*test_case.rb']
|
10
|
+
t.processes = 2
|
11
|
+
end
|
12
|
+
|
13
|
+
DTR::PackageTask.new do |p|
|
14
|
+
p.package_files.include("**/*")
|
15
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.dirname(__FILE__) + '/is_required_by_a_test.rb'
|
3
|
+
class ATestCase < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_succeeded
|
6
|
+
require 'pp'
|
7
|
+
assert eval('true')
|
8
|
+
assert IsRequiredByATest.ok?
|
9
|
+
assert_equal 'test', ENV["RAILS_ENV"]
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
class ScenarioTestCase < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_run_test_failed
|
5
|
+
assert_equal '1', '2'
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_run_test_passed
|
9
|
+
assert_eqaul '1', '1'
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_run_test_error
|
13
|
+
assert false
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_runner_should_setup_env
|
17
|
+
'should'.raise.error
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_runner_should_not_setup_env_twice
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_runner_should_update_code
|
24
|
+
assert_equal ['1'], '1' + nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_execution
|
28
|
+
assert nil.empty?
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_runner_should_rollback_popped_test
|
32
|
+
assert_equal ['1'], '1'
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
|
3
|
+
class VerifyDirPwdTestCase < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_should_not_sync_codebase_and_setup_working_dir_when_agent_is_in_same_dir_with_master_process
|
6
|
+
assert_equal 'should_not_sync_codebase_and_setup_working_dir_when_agent_is_in_same_dir_with_master_process', Dir.pwd.split('/').last
|
7
|
+
end
|
8
|
+
|
9
|
+
end
|
10
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xli-dtr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Li Xiao
|
@@ -11,16 +11,8 @@ cert_chain: []
|
|
11
11
|
|
12
12
|
date: 2008-08-13 00:00:00 -07:00
|
13
13
|
default_executable: dtr
|
14
|
-
dependencies:
|
15
|
-
|
16
|
-
name: daemons
|
17
|
-
version_requirement:
|
18
|
-
version_requirements: !ruby/object:Gem::Requirement
|
19
|
-
requirements:
|
20
|
-
- - ">"
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: 1.0.7
|
23
|
-
version:
|
14
|
+
dependencies: []
|
15
|
+
|
24
16
|
description:
|
25
17
|
email: iam@li-xiao.com
|
26
18
|
executables:
|
@@ -30,17 +22,51 @@ extensions: []
|
|
30
22
|
extra_rdoc_files: []
|
31
23
|
|
32
24
|
files:
|
33
|
-
- lib/dtr/
|
25
|
+
- lib/dtr/agent/brain.rb
|
26
|
+
- lib/dtr/agent/herald.rb
|
27
|
+
- lib/dtr/agent/runner.rb
|
28
|
+
- lib/dtr/agent/sync_codebase.rb
|
29
|
+
- lib/dtr/agent/sync_logger.rb
|
30
|
+
- lib/dtr/agent/test_unit.rb
|
31
|
+
- lib/dtr/agent/worker.rb
|
32
|
+
- lib/dtr/agent/working_env_ext.rb
|
33
|
+
- lib/dtr/agent.rb
|
34
|
+
- lib/dtr/master.rb
|
35
|
+
- lib/dtr/monitor.rb
|
34
36
|
- lib/dtr/raketasks.rb
|
35
|
-
- lib/dtr/
|
36
|
-
- lib/dtr/
|
37
|
+
- lib/dtr/shared/adapter.rb
|
38
|
+
- lib/dtr/shared/configuration.rb
|
39
|
+
- lib/dtr/shared/message_decorator.rb
|
40
|
+
- lib/dtr/shared/ruby_ext.rb
|
41
|
+
- lib/dtr/shared/service/agent.rb
|
42
|
+
- lib/dtr/shared/service/file.rb
|
43
|
+
- lib/dtr/shared/service/rinda.rb
|
44
|
+
- lib/dtr/shared/service/runner.rb
|
45
|
+
- lib/dtr/shared/service/working_env.rb
|
46
|
+
- lib/dtr/shared/service.rb
|
47
|
+
- lib/dtr/shared/sync_codebase/codebase.rb
|
48
|
+
- lib/dtr/shared/sync_codebase/master_ext.rb
|
49
|
+
- lib/dtr/shared/sync_codebase/package.rb
|
50
|
+
- lib/dtr/shared/sync_codebase/sync_service.rb
|
51
|
+
- lib/dtr/shared/sync_codebase.rb
|
52
|
+
- lib/dtr/shared/sync_logger.rb
|
53
|
+
- lib/dtr/shared/utils/cmd.rb
|
54
|
+
- lib/dtr/shared/utils/env_store.rb
|
55
|
+
- lib/dtr/shared/utils/logger.rb
|
56
|
+
- lib/dtr/shared/utils.rb
|
57
|
+
- lib/dtr/shared/working_env.rb
|
58
|
+
- lib/dtr/shared.rb
|
59
|
+
- lib/dtr/test_unit/drb_test_runner.rb
|
60
|
+
- lib/dtr/test_unit/injection.rb
|
61
|
+
- lib/dtr/test_unit/test_case_injection.rb
|
62
|
+
- lib/dtr/test_unit/testrunnermediator_injection.rb
|
63
|
+
- lib/dtr/test_unit/thread_safe_test_result.rb
|
64
|
+
- lib/dtr/test_unit/worker_club.rb
|
37
65
|
- lib/dtr/test_unit.rb
|
38
66
|
- lib/dtr/test_unit_injection.rb
|
39
67
|
- lib/dtr.rb
|
40
68
|
- bin/dtr
|
41
|
-
- bin
|
42
69
|
- CHANGES
|
43
|
-
- doc
|
44
70
|
- dtr.gemspec
|
45
71
|
- install.rb
|
46
72
|
- lib
|
@@ -74,5 +100,33 @@ rubygems_version: 1.2.0
|
|
74
100
|
signing_key:
|
75
101
|
specification_version: 2
|
76
102
|
summary: DTR is a distributed test runner to run tests on distributed computers for decreasing build time.
|
77
|
-
test_files:
|
78
|
-
|
103
|
+
test_files:
|
104
|
+
- test/acceptance/agent_working_env_test.rb
|
105
|
+
- test/acceptance/dtr_package_task_test.rb
|
106
|
+
- test/acceptance/general_test.rb
|
107
|
+
- test/acceptance/sync_codebase_test.rb
|
108
|
+
- test/acceptance/sync_logger_test.rb
|
109
|
+
- test/agent_helper.rb
|
110
|
+
- test/logger_stub.rb
|
111
|
+
- test/test_helper.rb
|
112
|
+
- test/unit/adapter_test.rb
|
113
|
+
- test/unit/test_unit_test.rb
|
114
|
+
- test/unit/working_env_test.rb
|
115
|
+
- testdata/a_failed_test_case.rb
|
116
|
+
- testdata/a_file_system_test_case.rb
|
117
|
+
- testdata/a_test_case.rb
|
118
|
+
- testdata/a_test_case2.rb
|
119
|
+
- testdata/an_error_test_case.rb
|
120
|
+
- testdata/another_project
|
121
|
+
- testdata/another_project/passed_test_case.rb
|
122
|
+
- testdata/another_project/Rakefile
|
123
|
+
- testdata/is_required_by_a_test.rb
|
124
|
+
- testdata/lib
|
125
|
+
- testdata/lib/lib_test_case.rb
|
126
|
+
- testdata/package_task_test_rakefile
|
127
|
+
- testdata/Rakefile
|
128
|
+
- testdata/scenario_test_case.rb
|
129
|
+
- testdata/setup_agent_env_test_case.rb
|
130
|
+
- testdata/should_not_sync_codebase_and_setup_working_dir_when_agent_is_in_same_dir_with_master_process
|
131
|
+
- testdata/should_not_sync_codebase_and_setup_working_dir_when_agent_is_in_same_dir_with_master_process/Rakefile
|
132
|
+
- testdata/should_not_sync_codebase_and_setup_working_dir_when_agent_is_in_same_dir_with_master_process/verify_dir_pwd_test_case.rb
|
data/lib/dtr/base.rb
DELETED
@@ -1,172 +0,0 @@
|
|
1
|
-
# Copyright (c) 2007-2008 Li Xiao
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at
|
6
|
-
#
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
|
15
|
-
require 'pstore'
|
16
|
-
|
17
|
-
require 'logger'
|
18
|
-
|
19
|
-
class Array
|
20
|
-
def blank?
|
21
|
-
empty?
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
class NilClass
|
26
|
-
def blank?
|
27
|
-
true
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
module DTR
|
32
|
-
|
33
|
-
MESSAGE_KEY = :message
|
34
|
-
|
35
|
-
def logger
|
36
|
-
return DTROPTIONS[:logger] if DTROPTIONS[:logger]
|
37
|
-
DTROPTIONS[:logger] = if DTROPTIONS[:log_level] == Logger::DEBUG
|
38
|
-
Logger.new(STDOUT)
|
39
|
-
else
|
40
|
-
log_file = if File.exist?('log')
|
41
|
-
File.join("log", DTROPTIONS[:log_file] || 'dtr.log')
|
42
|
-
else
|
43
|
-
DTROPTIONS[:log_file] || 'dtr.log'
|
44
|
-
end
|
45
|
-
Logger.new("./#{log_file}", 1, 5*1024*1024)
|
46
|
-
end
|
47
|
-
DTROPTIONS[:logger].datetime_format = "%m-%d %H:%M:%S"
|
48
|
-
DTROPTIONS[:logger].level = DTROPTIONS[:log_level] || Logger::INFO
|
49
|
-
DTROPTIONS[:logger]
|
50
|
-
end
|
51
|
-
|
52
|
-
def debug(message=nil, &block)
|
53
|
-
output(:debug, message, &block)
|
54
|
-
end
|
55
|
-
|
56
|
-
def info(message=nil, &block)
|
57
|
-
output(:info, message, &block)
|
58
|
-
end
|
59
|
-
|
60
|
-
def error(message=nil, &block)
|
61
|
-
output(:error, message, &block)
|
62
|
-
end
|
63
|
-
|
64
|
-
def output(level, msg=nil, &block)
|
65
|
-
logger.send(level) do
|
66
|
-
message = block_given? ? block.call : msg.to_s
|
67
|
-
EnvStore.new << [MESSAGE_KEY, "[#{Process.pid}-#{level.to_s.upcase}] #{message}"] if DTROPTIONS[:run_with_monitor]
|
68
|
-
message
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def silent?
|
73
|
-
logger.level == Logger::ERROR
|
74
|
-
end
|
75
|
-
|
76
|
-
def with_monitor
|
77
|
-
DTROPTIONS[:run_with_monitor] = true
|
78
|
-
EnvStore.new[MESSAGE_KEY] = []
|
79
|
-
yield
|
80
|
-
rescue Exception => e
|
81
|
-
info {"stopping by Exception => #{e.class.name}, message => #{e.message}"}
|
82
|
-
wait_times = 0
|
83
|
-
until EnvStore.new[MESSAGE_KEY].empty? || wait_times > 14
|
84
|
-
wait_times += 1
|
85
|
-
sleep(1)
|
86
|
-
end
|
87
|
-
raise e
|
88
|
-
end
|
89
|
-
|
90
|
-
module_function :debug, :info, :error, :output, :with_monitor, :logger, :silent?
|
91
|
-
|
92
|
-
class CmdInterrupt < StandardError; end
|
93
|
-
|
94
|
-
class Cmd
|
95
|
-
def self.execute(cmd)
|
96
|
-
return true if cmd.nil? || cmd.empty?
|
97
|
-
DTR.info {"Executing: #{cmd.inspect}"}
|
98
|
-
output = %x[#{cmd} 2>&1]
|
99
|
-
DTR.info {"Execution is done, status: #{$?.exitstatus}"}
|
100
|
-
DTR.error {"#{cmd.inspect} output:\n#{output}"} if $?.exitstatus != 0
|
101
|
-
$?.exitstatus == 0
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
class EnvStore
|
106
|
-
|
107
|
-
FILE_NAME = '.dtr_env_pstore'
|
108
|
-
|
109
|
-
def self.destroy
|
110
|
-
File.delete(FILE_NAME) if File.exist?(FILE_NAME)
|
111
|
-
end
|
112
|
-
|
113
|
-
def [](key)
|
114
|
-
return nil unless File.exist?(FILE_NAME)
|
115
|
-
|
116
|
-
repository = PStore.new(FILE_NAME)
|
117
|
-
repository.transaction(true) do
|
118
|
-
repository[key]
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
def []=(key, value)
|
123
|
-
repository = PStore.new(FILE_NAME)
|
124
|
-
repository.transaction do
|
125
|
-
repository[key] = value
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def <<(key_value)
|
130
|
-
key, value = key_value
|
131
|
-
repository = PStore.new(FILE_NAME)
|
132
|
-
repository.transaction do
|
133
|
-
repository[key] = (repository[key] || []) << value
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
def shift(key)
|
138
|
-
repository = PStore.new(FILE_NAME)
|
139
|
-
repository.transaction do
|
140
|
-
if array = repository[key]
|
141
|
-
array.shift
|
142
|
-
repository[key] = array
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
class WorkingEnv
|
149
|
-
|
150
|
-
@@current = nil
|
151
|
-
def self.refresh
|
152
|
-
@@current = self.new
|
153
|
-
end
|
154
|
-
|
155
|
-
def self.current
|
156
|
-
@@current
|
157
|
-
end
|
158
|
-
|
159
|
-
def initialize
|
160
|
-
files = (defined?($argv_dup) ? $argv_dup : []).dup
|
161
|
-
@env = {:libs => $LOAD_PATH.dup, :files => files, :created_at => Time.now.to_s, :dtr_master_env => ENV['DTR_MASTER_ENV'], :identifier => "#{Time.now.to_s}:#{rand}:#{object_id}"}
|
162
|
-
end
|
163
|
-
|
164
|
-
def [](key)
|
165
|
-
@env[key]
|
166
|
-
end
|
167
|
-
|
168
|
-
def to_s
|
169
|
-
@env.inspect
|
170
|
-
end
|
171
|
-
end
|
172
|
-
end
|