vcs 0.1 → 0.2.148

Sign up to get free protection for your applications and to get access to all the features.
Files changed (132) hide show
  1. data/Rakefile +17 -3
  2. data/bin/vcs +57 -34
  3. data/doc/jamis.rb +564 -0
  4. data/ruby_ex/abstract.rb +254 -0
  5. data/ruby_ex/abstract_node.rb +85 -0
  6. data/ruby_ex/algorithms/simulated_annealing.rb +140 -0
  7. data/ruby_ex/array_each_pair.rb +18 -0
  8. data/ruby_ex/ask.rb +101 -0
  9. data/ruby_ex/attributed_class.rb +302 -0
  10. data/ruby_ex/cache.rb +373 -0
  11. data/ruby_ex/checkout.rb +12 -0
  12. data/ruby_ex/choose.rb +271 -0
  13. data/ruby_ex/commands.rb +18 -0
  14. data/ruby_ex/commands/command.rb +401 -0
  15. data/ruby_ex/commands/datas.rb +16 -0
  16. data/ruby_ex/commands/datas/data.rb +33 -0
  17. data/ruby_ex/commands/datas/factory.rb +66 -0
  18. data/ruby_ex/commands/factory.rb +66 -0
  19. data/ruby_ex/commands/helpers.rb +67 -0
  20. data/ruby_ex/commands/pipe.rb +64 -0
  21. data/ruby_ex/commands/runners.rb +17 -0
  22. data/ruby_ex/commands/runners/exec.rb +49 -0
  23. data/ruby_ex/commands/runners/fork.rb +97 -0
  24. data/ruby_ex/commands/runners/runner.rb +107 -0
  25. data/ruby_ex/commands/seq.rb +27 -0
  26. data/ruby_ex/config_file.rb +96 -0
  27. data/ruby_ex/const_regexp.rb +59 -0
  28. data/ruby_ex/daemon.rb +134 -0
  29. data/ruby_ex/diff.rb +667 -0
  30. data/ruby_ex/dlogger.rb +62 -0
  31. data/ruby_ex/drb/dispatcher.rb +252 -0
  32. data/ruby_ex/drb/dispatcher_server_test.rb +29 -0
  33. data/ruby_ex/drb/drb_observable.rb +97 -0
  34. data/ruby_ex/drb/drb_observable_pool.rb +27 -0
  35. data/ruby_ex/drb/drb_service.rb +43 -0
  36. data/ruby_ex/drb/drb_undumped_attributes.rb +55 -0
  37. data/ruby_ex/drb/drb_undumped_indexed_object.rb +54 -0
  38. data/ruby_ex/drb/insecure_protected_methods.rb +103 -0
  39. data/ruby_ex/drb/session_client_test.rb +40 -0
  40. data/ruby_ex/drb/session_manager.rb +246 -0
  41. data/ruby_ex/drb/session_server.rb +53 -0
  42. data/ruby_ex/dtime.rb +143 -0
  43. data/ruby_ex/dumpable_proc.rb +63 -0
  44. data/ruby_ex/exception.rb +32 -0
  45. data/ruby_ex/filetype.rb +229 -0
  46. data/ruby_ex/fileutils_ex.rb +44 -0
  47. data/ruby_ex/fold.rb +58 -0
  48. data/ruby_ex/generate_id.rb +44 -0
  49. data/ruby_ex/hookable.rb +262 -0
  50. data/ruby_ex/hooker.rb +54 -0
  51. data/ruby_ex/inactive_timeout.rb +137 -0
  52. data/ruby_ex/indexed_node.rb +66 -0
  53. data/ruby_ex/io_marshal.rb +100 -0
  54. data/ruby_ex/ioo.rb +194 -0
  55. data/ruby_ex/labeled_node.rb +63 -0
  56. data/ruby_ex/logger_observer.rb +23 -0
  57. data/ruby_ex/md5sum.rb +66 -0
  58. data/ruby_ex/mktemp.rb +208 -0
  59. data/ruby_ex/module/attr_once.rb +36 -0
  60. data/ruby_ex/module/autoload_tree.rb +75 -0
  61. data/ruby_ex/module/hierarchy.rb +335 -0
  62. data/ruby_ex/module/instance_method_visibility.rb +73 -0
  63. data/ruby_ex/module_ex.rb +11 -0
  64. data/ruby_ex/node.rb +80 -0
  65. data/ruby_ex/object_monitor.rb +145 -0
  66. data/ruby_ex/object_monitor_activity.rb +33 -0
  67. data/ruby_ex/observable.rb +140 -0
  68. data/ruby_ex/observable_pool.rb +293 -0
  69. data/ruby_ex/orderedhash.rb +252 -0
  70. data/ruby_ex/pathname_ex.rb +152 -0
  71. data/ruby_ex/pp_hierarchy.rb +29 -0
  72. data/ruby_ex/pseudo_cache.rb +190 -0
  73. data/ruby_ex/queue.rb +56 -0
  74. data/ruby_ex/random_generators.rb +25 -0
  75. data/ruby_ex/random_generators/random_generator.rb +31 -0
  76. data/ruby_ex/random_generators/ruby.rb +23 -0
  77. data/ruby_ex/safe_eval.rb +348 -0
  78. data/ruby_ex/sendmail.rb +215 -0
  79. data/ruby_ex/service_manager.rb +121 -0
  80. data/ruby_ex/session/administrable.rb +120 -0
  81. data/ruby_ex/session/client.rb +153 -0
  82. data/ruby_ex/session/const.rb +18 -0
  83. data/ruby_ex/session/dispatcher.rb +184 -0
  84. data/ruby_ex/session/error.rb +21 -0
  85. data/ruby_ex/session/fetchable.rb +57 -0
  86. data/ruby_ex/session/fetcher.rb +62 -0
  87. data/ruby_ex/session/hookable.rb +26 -0
  88. data/ruby_ex/session/profile.rb +110 -0
  89. data/ruby_ex/session/server.rb +582 -0
  90. data/ruby_ex/session/test/administrable_test.rb +337 -0
  91. data/ruby_ex/session/test/basic_test.rb +523 -0
  92. data/ruby_ex/session/test/dispatcher_test.rb +409 -0
  93. data/ruby_ex/session/test/fetchable_test.rb +119 -0
  94. data/ruby_ex/session/test/sub_server_test.rb +188 -0
  95. data/ruby_ex/shuffle.rb +30 -0
  96. data/ruby_ex/spring.rb +136 -0
  97. data/ruby_ex/spring_set.rb +137 -0
  98. data/ruby_ex/string_ex.rb +28 -0
  99. data/ruby_ex/symtbl.rb +106 -0
  100. data/ruby_ex/synflow.rb +474 -0
  101. data/ruby_ex/test/unit/ui/yaml/testrunner.rb +164 -0
  102. data/ruby_ex/thread_mutex.rb +10 -0
  103. data/ruby_ex/timeout_ex.rb +81 -0
  104. data/ruby_ex/top_down.rb +73 -0
  105. data/ruby_ex/trace.rb +26 -0
  106. data/ruby_ex/uri/druby.rb +81 -0
  107. data/ruby_ex/uri/file.rb +65 -0
  108. data/ruby_ex/uri/ftp_ex.rb +37 -0
  109. data/ruby_ex/uri/http_ex.rb +43 -0
  110. data/ruby_ex/uri/ssh.rb +92 -0
  111. data/ruby_ex/uri/svn.rb +118 -0
  112. data/ruby_ex/uri_ex.rb +45 -0
  113. data/ruby_ex/verbose_object.rb +30 -0
  114. data/ruby_ex/version.rb +66 -0
  115. data/ruby_ex/yaml/basenode_ext.rb +63 -0
  116. data/ruby_ex/yaml/chop_header.rb +23 -0
  117. data/ruby_ex/yaml/transform.rb +449 -0
  118. data/ruby_ex/yaml/yregexpath.rb +76 -0
  119. data/src/changelog.rb +28 -18
  120. data/src/conflict.rb +20 -0
  121. data/src/diff.rb +18 -0
  122. data/src/diffstat.rb +9 -3
  123. data/src/last_changed_date.rb +18 -0
  124. data/src/mail.rb +33 -65
  125. data/src/message.rb +15 -9
  126. data/src/mycommit.rb +29 -14
  127. data/src/news.rb +24 -3
  128. data/src/status.rb +17 -0
  129. data/src/svn.rb +2 -2
  130. data/src/vcs.rb +24 -3
  131. metadata +124 -5
  132. data/lrdetools.rb +0 -12
@@ -0,0 +1,63 @@
1
+ # Copyright: Copyright (c) 2004 Nicolas Despres. All rights reserved.
2
+ # Author: Nicolas Despres <polrop@lrde.epita.fr>.
3
+ # License: Gnu General Public License.
4
+
5
+ # $LastChangedBy: polrop $
6
+ # $Id: node.rb 171 2005-03-29 09:12:47Z polrop $
7
+
8
+
9
+ require 'abstract_node'
10
+
11
+
12
+ class LabeledNode < AbstractNode
13
+ include Concrete
14
+
15
+ def initialize(data=nil, *sub_nodes)
16
+ if sub_nodes.empty?
17
+ @sub_nodes = {}
18
+ else
19
+ @sub_nodes = sub_nodes.first
20
+ end
21
+ super
22
+ end
23
+
24
+ def merge!(sub_nodes)
25
+ sub_nodes.each { |index, sub_node| check_sub_node_type(sub_node) }
26
+ @sub_nodes.merge(sub_nodes)
27
+ end
28
+
29
+ end # class LabeledNode
30
+
31
+
32
+ if defined? TEST_MODE or __FILE__ == $0
33
+
34
+ require 'test/unit'
35
+
36
+ class LabeledNodeTest < Test::Unit::TestCase
37
+
38
+ def test_simple
39
+ s11 = LabeledNode.new(11)
40
+ s12 = LabeledNode.new(12)
41
+ s = LabeledNode.new(1, 0 => s11, 1 => s12)
42
+ assert_equal(1, s.data)
43
+ assert_equal(s11, s.sub_nodes[0])
44
+ assert_equal(s12, s.sub_nodes[1])
45
+ end
46
+
47
+ def test_crochet_equal
48
+ s = LabeledNode.new(1)
49
+ assert_nothing_raised { s[0] = LabeledNode.new(10) }
50
+ assert_raises(TypeError) { s[1] = nil }
51
+ end
52
+
53
+ def test_merge
54
+ s = LabeledNode.new(1)
55
+ s11 = LabeledNode.new(11)
56
+ s12 = LabeledNode.new(12)
57
+ s.merge!({ 0 => s11, 1 => s12 })
58
+ end
59
+
60
+ end # class LabeledNodeTest
61
+
62
+ end
63
+
@@ -0,0 +1,23 @@
1
+ # Copyright: Copyright (c) 2004 Nicolas Despres. All rights reserved.
2
+ # Author: Nicolas Despres <polrop@lrde.epita.fr>.
3
+ # License: Gnu General Public License.
4
+
5
+ # $LastChangedBy: polrop $
6
+ # $Id: logger_observer.rb 120 2005-01-22 19:43:06Z polrop $
7
+
8
+
9
+ require 'logger'
10
+
11
+
12
+ class Logger
13
+
14
+ def update(*args, &block)
15
+ severity = UNKNOWN
16
+ if args.size > 0
17
+ (severity = Severity.cons_get(args[0].to_s.upcase)) rescue NameError
18
+ end
19
+ add(severity, "#{args.inspect} #{block.inspect if block}", $PROGRAME_NAME)
20
+ end
21
+
22
+ end # class Logger
23
+
@@ -0,0 +1,66 @@
1
+ # Copyright: Copyright (c) 2004 Nicolas Despres. All rights reserved.
2
+ # Author: Nicolas Despres <polrop@lrde.epita.fr>.
3
+ # License: Gnu General Public License.
4
+
5
+ # $LastChangedBy: polrop $
6
+ # $Id: md5sum.rb 88 2005-01-09 21:11:26Z polrop $
7
+
8
+
9
+ require 'md5'
10
+
11
+
12
+ class File
13
+
14
+ def self.md5sum(filename)
15
+ md5 = Digest::MD5.new
16
+ IO.foreach(filename) { |l| md5 << l }
17
+ md5
18
+ end
19
+
20
+ end # module File
21
+
22
+
23
+ class Pathname
24
+
25
+ def md5sum
26
+ md5 = Digest::MD5.new
27
+ each_line { |l| md5 << l }
28
+ md5
29
+ end
30
+
31
+ end # class Pathname
32
+
33
+
34
+ #
35
+ # Unit test suite
36
+ #
37
+ if defined? TEST_MODE or __FILE__ == $0
38
+
39
+
40
+ require 'test/unit/ui/yaml/testrunner'
41
+ require 'mktemp'
42
+
43
+
44
+ class MD5SumTest < Test::Unit::TestCase
45
+
46
+ #
47
+ # Tests
48
+ #
49
+ def test_simple
50
+ TempPath.new('src_md5sum') do |tmp_filename|
51
+ assert(system("man printf > #{tmp_filename} 2> /dev/null"),
52
+ 'can\'t generate a tmp file from man printf')
53
+ ref_md5sum = ''
54
+ IO.popen("md5sum #{tmp_filename}") do |io|
55
+ ref_md5sum = io.gets.chomp.sub(/\s+#{tmp_filename}$/, '')
56
+ end
57
+ assert_equal(ref_md5sum, File.md5sum(tmp_filename).to_s)
58
+ assert_equal(ref_md5sum, tmp_filename.md5sum.to_s)
59
+ end
60
+ end
61
+
62
+ end # class MD5SumTest
63
+
64
+
65
+ end
66
+
@@ -0,0 +1,208 @@
1
+ # Copyright: Copyright (c) 2004 Nicolas Pouillard. All rights reserved.
2
+ # Author: Nicolas Pouillard <ertai@lrde.epita.fr>.
3
+ # License: Gnu General Public License.
4
+
5
+ # $LastChangedBy: ertai $
6
+ # $Id: mktemp.rb 186 2005-04-03 00:07:45Z ertai $
7
+
8
+ require 'pathname'
9
+ require 'tempfile'
10
+ require 'tmpdir'
11
+ require 'set'
12
+ require 'thread'
13
+
14
+ class TempPath < Pathname
15
+
16
+ @@tmps = Set.new
17
+ @@mutex = Mutex.new
18
+ @@progname = Pathname.new($0).basename
19
+ @@tmpdir = Pathname.new(Dir.tmpdir) + "#{@@progname}.#{$$}"
20
+ @@tmpdir.freeze
21
+ @@initialized = false
22
+ @@clean_planned = false
23
+ @@auto_clean = true
24
+
25
+ # You can use a temporary pathname like that:
26
+ #
27
+ # - # No argument are mandatory.
28
+ # tmp = TempPath.new
29
+ # tmp.open('w') { |f| f << 'foo' }
30
+ # tmp.clean
31
+ #
32
+ # - # You can choose the basename and an extension.
33
+ # TmpPath.new('the_base_file_name', 'rb')
34
+ #
35
+ # - # You can supply a block (recomended).
36
+ # TmpPath.new('foo') do |tmp|
37
+ # tmp.open('w') { |f| << 'foo' }
38
+ # tmp.exist? == true
39
+ # $tmp = tmp
40
+ # end
41
+ # $tmp.exist? == false
42
+ #
43
+ # - # You can make a temporary directory.
44
+ # TmpPath.new('adirectory') do |tmpdir|
45
+ # tmpdir.mkpath
46
+ # $file = tmpdir + 'foo'
47
+ # $file.open('w') { |f| f << 'foo' }
48
+ # end
49
+ # $file.exist? == false
50
+ #
51
+ def initialize ( base=@@progname, ext='', &block )
52
+ if base.to_s =~ /\//
53
+ raise ArgumentError, "bad basename, you give me a pathname #{base}"
54
+ end
55
+ self.class.init
56
+ ext = ".#{ext}" unless ext.empty? or ext[0] == ?.
57
+ res = nil
58
+ @@mutex.synchronize do
59
+ id_tmp = object_id
60
+ while (res = @@tmpdir + "#{base}.#{id_tmp}#{ext}").exist? \
61
+ and not @@tmps.include? res
62
+ id_tmp += 1
63
+ end
64
+ super(res)
65
+ @@tmps << self
66
+ end
67
+ if block_given?
68
+ begin
69
+ block[self.dup]
70
+ ensure
71
+ clean
72
+ end
73
+ end
74
+ end
75
+
76
+ # This method remove your temporary pathname.
77
+ # You do not need to call this method if you provide
78
+ # a block when you create a tempfile.
79
+ def clean
80
+ if exist?
81
+ if directory?
82
+ rmtree
83
+ else
84
+ unlink
85
+ end
86
+ end
87
+ end
88
+
89
+ def temp?
90
+ true
91
+ end
92
+
93
+ def self.init #:nodoc:
94
+ return if @@initialized
95
+ @@mutex.synchronize do
96
+ return if @@initialized
97
+ @@tmpdir.mkpath
98
+ @@initialized = true
99
+ at_exit { clean if @@auto_clean }
100
+ end
101
+ end
102
+
103
+ # By default the autoclean is on.
104
+ # But in some case (if you use your temppaths in at_exit)
105
+ # You must disable the autoclean.
106
+ # And manually call TempPath.clean at the very of the program.
107
+ def self.clean ( &block )
108
+ @@mutex.synchronize do
109
+ return if @@clean_planned
110
+ @@clean_planned = true
111
+ end
112
+ begin
113
+ block[] if block_given?
114
+ ensure
115
+ if @@tmpdir.exist?
116
+ @@tmpdir.rmtree
117
+ @@initialized = false
118
+ end
119
+ end
120
+ end
121
+
122
+ def self.auto_clean= ( aBool )
123
+ @@auto_clean = aBool
124
+ end
125
+
126
+ def self.tmpdir
127
+ init
128
+ @@tmpdir
129
+ end
130
+
131
+ end # class TempPath
132
+
133
+
134
+ # This tempfile extension, provide the mktemp function.
135
+ #
136
+ # Example:
137
+ #
138
+ # Tempfile.mktemp('foo', 'rb')
139
+ # => 'foo.111811.432.rb'
140
+ # which follow this format:
141
+ # => 'base.pid.uniq.ext
142
+ #
143
+ # Tempfile.mktemp('bar')
144
+ # => 'foo.111811.134'
145
+ #
146
+ class Tempfile
147
+
148
+ # Almost deprecated use TempPath.
149
+ def self.mktemp ( base=$0, ext='', &block )
150
+ TempPath.new(base, ext, &block)
151
+ end
152
+
153
+ end # class Tempfile
154
+
155
+
156
+ class Pathname
157
+
158
+ def temp?
159
+ false
160
+ end
161
+
162
+ end # class Pathname
163
+
164
+
165
+
166
+ if defined? TEST_MODE or $0 == __FILE__
167
+
168
+ require 'test/unit'
169
+ class MkTempTest < Test::Unit::TestCase
170
+
171
+ def setup
172
+ @list = []
173
+ end
174
+
175
+ def teardown
176
+ @list.each { |l| l.clean }
177
+ end
178
+
179
+ def test_interface
180
+ assert_nothing_raised { @foo = Tempfile.mktemp('foo') }
181
+ assert_nothing_raised { @foobar = Tempfile.mktemp('foo', 'bar') }
182
+ assert_match(/\.#{$$}\/foo\.\d+$/, @foo.to_s)
183
+ assert_match(/\.#{$$}\/foo\.\d+\.bar$/, @foobar.to_s)
184
+ assert_nothing_raised { @foo.open('w') { |f| f.puts 'FooFoo' } }
185
+ @list << @foo
186
+ @list << @foobar
187
+ end
188
+
189
+ def test_many
190
+ (0 .. 100).each do |i|
191
+ tmp = Tempfile.mktemp('many')
192
+ tmp.open('w') { |f| f.puts "i: #{i}" }
193
+ assert(tmp.exist?)
194
+ assert_equal("i: #{i}\n", tmp.readlines.join)
195
+ @list << tmp
196
+ end
197
+ end
198
+
199
+ def test_temp?
200
+ tmp = Tempfile.mktemp('is_temp')
201
+ assert(tmp.temp?, 'not tmp.temp?')
202
+ assert_nothing_raised { Pathname.new(tmp.to_s).temp? }
203
+ assert(!Pathname.new(tmp.to_s).temp?)
204
+ end
205
+
206
+ end # class MkTempTest
207
+
208
+ end
@@ -0,0 +1,36 @@
1
+ # Copyright: Copyright (c) 2004 Nicolas Despres. All rights reserved.
2
+ # Author: Nicolas Despres <polrop@lrde.epita.fr>.
3
+ # License: Gnu General Public License.
4
+
5
+ # $LastChangedBy: polrop $
6
+ # $Id: attr_once.rb 135 2005-01-28 12:43:31Z polrop $
7
+
8
+
9
+ class Module
10
+
11
+ # You can use this method as you use attr_reader. Must be used only with
12
+ # immutable object.
13
+ #
14
+ # This method is imported from the Date implementation. It provides a way
15
+ # to compute only once the value of getter. Basically, the first time, the
16
+ # getter is used, its result is computed and stored in an attribute with the
17
+ # same name. The second times only the attribute is returned.
18
+ def attr_once(*ids)
19
+ for id in ids
20
+ module_eval <<-"end;", __FILE__, __LINE__
21
+ alias_method :__#{id.to_i}__, :#{id.to_s}
22
+ private :__#{id.to_i}__
23
+ def #{id.to_s}(*args, &block)
24
+ if defined? @__#{id.to_i}__
25
+ @__#{id.to_i}__
26
+ elsif ! self.frozen?
27
+ @__#{id.to_i}__ ||= __#{id.to_i}__(*args, &block)
28
+ else
29
+ __#{id.to_i}__(*args, &block)
30
+ end
31
+ end
32
+ end;
33
+ end
34
+ end
35
+
36
+ end # class Module
@@ -0,0 +1,75 @@
1
+ # Copyright: Copyright (c) 2004 Nicolas Despres. All rights reserved.
2
+ # Author: Nicolas Despres <polrop@lrde.epita.fr>.
3
+ # License: Gnu General Public License.
4
+
5
+ # $LastChangedBy: ertai $
6
+ # $Id: autoload_tree.rb 217 2005-05-09 12:01:07Z ertai $
7
+
8
+
9
+ require 'pathname_ex'
10
+
11
+
12
+ class Module
13
+
14
+ def autoload_tree(dir, recursive=true, &block)
15
+ pdir = Pathname.new(dir)
16
+ pdir.each_entry do |p|
17
+ next if p.to_s =~ /^\./
18
+ pfull = pdir + p
19
+ if pfull.directory? and recursive
20
+ name = p.to_s.capitalize!
21
+ const_set(name, Module.new) unless const_defined?(name)
22
+ const_get(name).autoload_tree(pfull, recursive, &block)
23
+ elsif pfull.file? and p.to_s =~ /\.rb$/
24
+ autoload(name.to_s, pfull.to_s) if name = block[p]
25
+ end
26
+ end
27
+ end
28
+
29
+ def autoloaded_module ( file )
30
+ dir = file.sub(/\.rb$/, '').to_path
31
+ autoload_tree(dir) do |path|
32
+ path.basename.to_s.sub(/\.rb$/, '').gsub(/(?:^|_)([a-z])/) { $1.upcase }
33
+ end
34
+ end
35
+
36
+ end # class Module
37
+
38
+
39
+ if (not defined? AUTOLOAD_TREE_TESTED) and
40
+ (defined? TEST_MODE or __FILE__ == $0)
41
+ AUTOLOAD_TREE_TESTED = true
42
+
43
+ require 'test/unit/ui/console/testrunner'
44
+
45
+
46
+ class AutoloadTreeTest < Test::Unit::TestCase
47
+
48
+ if defined? SRC_DIR
49
+ REPO_DIR = SRC_DIR + Pathname.new('../test/resources/autoload_tree')
50
+ else
51
+ REPO_DIR = Pathname.new(__FILE__).dirname +
52
+ Pathname.new('../../test/resources/autoload_tree')
53
+ end
54
+
55
+ module AutoloadTree; end
56
+
57
+ #
58
+ # Test
59
+ #
60
+ def test_autoload_tree
61
+ $: << REPO_DIR
62
+ AutoloadTree.autoload_tree(REPO_DIR) { |p| p.to_s.sub!(/\.rb$/, '') }
63
+ ["Foo", "B", "A"].each do |x|
64
+ assert(AutoloadTree.constants.include?(x), "#{x} is missing")
65
+ end
66
+ assert_equal(["C"], AutoloadTree::Foo.constants)
67
+ $:.delete(REPO_DIR)
68
+ end
69
+
70
+ end # class AutoloadTreeTest
71
+
72
+
73
+ end
74
+
75
+