vcs 0.1 → 0.2.148

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.
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
+