subversion 1.6.6-x86-mswin32-60

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/licenses/apr/LICENSE +341 -0
  2. data/licenses/apr/NOTICE +15 -0
  3. data/licenses/apr-util/LICENSE +443 -0
  4. data/licenses/apr-util/NOTICE +14 -0
  5. data/licenses/bdb/LICENSE +102 -0
  6. data/licenses/cyrus-sasl/COPYING +44 -0
  7. data/licenses/neon/COPYING.LIB +482 -0
  8. data/licenses/openssl/LICENSE +127 -0
  9. data/licenses/serf/LICENSE +201 -0
  10. data/licenses/svn/COPYING +57 -0
  11. data/licenses/zlib/README +125 -0
  12. data/ruby/ext/svn/ext/client.dll +0 -0
  13. data/ruby/ext/svn/ext/core.dll +0 -0
  14. data/ruby/ext/svn/ext/delta.dll +0 -0
  15. data/ruby/ext/svn/ext/fs.dll +0 -0
  16. data/ruby/ext/svn/ext/intl3_svn.dll +0 -0
  17. data/ruby/ext/svn/ext/libapr-1.dll +0 -0
  18. data/ruby/ext/svn/ext/libaprutil-1.dll +0 -0
  19. data/ruby/ext/svn/ext/libdb44.dll +0 -0
  20. data/ruby/ext/svn/ext/libsvn_client-1.dll +0 -0
  21. data/ruby/ext/svn/ext/libsvn_delta-1.dll +0 -0
  22. data/ruby/ext/svn/ext/libsvn_diff-1.dll +0 -0
  23. data/ruby/ext/svn/ext/libsvn_fs-1.dll +0 -0
  24. data/ruby/ext/svn/ext/libsvn_ra-1.dll +0 -0
  25. data/ruby/ext/svn/ext/libsvn_repos-1.dll +0 -0
  26. data/ruby/ext/svn/ext/libsvn_subr-1.dll +0 -0
  27. data/ruby/ext/svn/ext/libsvn_swig_ruby-1.dll +0 -0
  28. data/ruby/ext/svn/ext/libsvn_wc-1.dll +0 -0
  29. data/ruby/ext/svn/ext/ra.dll +0 -0
  30. data/ruby/ext/svn/ext/repos.dll +0 -0
  31. data/ruby/ext/svn/ext/wc.dll +0 -0
  32. data/ruby/lib/svn/client.rb +771 -0
  33. data/ruby/lib/svn/core.rb +817 -0
  34. data/ruby/lib/svn/delta.rb +503 -0
  35. data/ruby/lib/svn/error.rb +74 -0
  36. data/ruby/lib/svn/fs.rb +628 -0
  37. data/ruby/lib/svn/info.rb +321 -0
  38. data/ruby/lib/svn/ra.rb +353 -0
  39. data/ruby/lib/svn/repos.rb +472 -0
  40. data/ruby/lib/svn/util.rb +129 -0
  41. data/ruby/lib/svn/wc.rb +689 -0
  42. metadata +96 -0
@@ -0,0 +1,817 @@
1
+ require "English"
2
+ require "time"
3
+ require "stringio"
4
+ require "tempfile"
5
+ require "svn/util"
6
+ require "svn/error"
7
+ require "svn/ext/core"
8
+
9
+ class Time
10
+ MILLION = 1_000_000
11
+
12
+ class << self
13
+ def from_apr_time(apr_time)
14
+ return apr_time if apr_time.is_a?(Time)
15
+ sec, usec = apr_time.divmod(MILLION)
16
+ Time.at(sec, usec)
17
+ end
18
+
19
+ def from_svn_format(str)
20
+ return nil if str.nil?
21
+ return str if str.is_a?(Time)
22
+ from_apr_time(Svn::Core.time_from_cstring(str))
23
+ end
24
+
25
+ def parse_svn_format(str)
26
+ return str if str.is_a?(Time)
27
+ matched, result = Svn::Core.parse_date(str, Time.now.to_apr_time)
28
+ if matched
29
+ from_apr_time(result)
30
+ else
31
+ nil
32
+ end
33
+ end
34
+ end
35
+
36
+ def to_apr_time
37
+ to_i * MILLION + usec
38
+ end
39
+
40
+ def to_svn_format
41
+ Svn::Core.time_to_cstring(self.to_apr_time)
42
+ end
43
+
44
+ def to_svn_human_format
45
+ Svn::Core.time_to_human_cstring(self.to_apr_time)
46
+ end
47
+ end
48
+
49
+ module Svn
50
+ module Core
51
+ Util.set_constants(Ext::Core, self)
52
+ Util.set_methods(Ext::Core, self)
53
+
54
+ nls_init
55
+ Util.reset_message_directory
56
+
57
+ # for backward compatibility
58
+ SWIG_INVALID_REVNUM = INVALID_REVNUM
59
+ SWIG_IGNORED_REVNUM = IGNORED_REVNUM
60
+
61
+ class << self
62
+ alias binary_mime_type? mime_type_is_binary
63
+ alias prop_diffs2 prop_diffs
64
+
65
+ def prop_diffs(target_props, source_props)
66
+ Property.prop_diffs(target_props, source_props)
67
+ end
68
+ end
69
+
70
+
71
+ DEFAULT_CHARSET = default_charset
72
+ LOCALE_CHARSET = locale_charset
73
+
74
+ AuthCredSSLClientCert = AuthCredSslClientCert
75
+ AuthCredSSLClientCertPw = AuthCredSslClientCertPw
76
+ AuthCredSSLServerTrust = AuthCredSslServerTrust
77
+
78
+ dirent_all = 0
79
+ constants.each do |name|
80
+ dirent_all |= const_get(name) if /^DIRENT_/ =~ name
81
+ end
82
+ DIRENT_ALL = dirent_all
83
+
84
+ Pool = Svn::Ext::Core::Apr_pool_wrapper_t
85
+
86
+ class Pool
87
+ RECOMMENDED_MAX_FREE_SIZE = ALLOCATOR_RECOMMENDED_MAX_FREE
88
+ MAX_FREE_UNLIMITED = ALLOCATOR_MAX_FREE_UNLIMITED
89
+
90
+ class << self
91
+ def number_of_pools
92
+ ObjectSpace.each_object(Pool) {}
93
+ end
94
+ end
95
+
96
+ alias _initialize initialize
97
+ private :_initialize
98
+ def initialize(parent=nil)
99
+ _initialize(parent)
100
+ @parent = parent
101
+ end
102
+
103
+ def destroy
104
+ @parent = nil
105
+ _destroy
106
+ end
107
+ private :_destroy
108
+ end
109
+
110
+ class Stream
111
+ if Core.const_defined?(:STREAM_CHUNK_SIZE)
112
+ CHUNK_SIZE = Core::STREAM_CHUNK_SIZE
113
+ else
114
+ CHUNK_SIZE = 8192
115
+ end
116
+
117
+ def write(data)
118
+ Core.stream_write(self, data)
119
+ end
120
+
121
+ def read(len=nil)
122
+ if len.nil?
123
+ read_all
124
+ else
125
+ buf = ""
126
+ while len > CHUNK_SIZE
127
+ buf << _read(CHUNK_SIZE)
128
+ len -= CHUNK_SIZE
129
+ end
130
+ buf << _read(len)
131
+ buf
132
+ end
133
+ end
134
+
135
+ def close
136
+ Core.stream_close(self)
137
+ end
138
+
139
+ def copy(other, &cancel_proc)
140
+ Core.stream_copy2(self, other, cancel_proc)
141
+ end
142
+
143
+ private
144
+ def _read(size)
145
+ Core.stream_read(self, size)
146
+ end
147
+
148
+ def read_all
149
+ buf = ""
150
+ while chunk = _read(CHUNK_SIZE)
151
+ buf << chunk
152
+ end
153
+ buf
154
+ end
155
+ end
156
+
157
+
158
+ class AuthBaton
159
+ attr_reader :providers, :parameters
160
+
161
+ alias _initialize initialize
162
+ private :_initialize
163
+ def initialize(providers=[], parameters={})
164
+ _initialize(providers)
165
+ @providers = providers
166
+ self.parameters = parameters
167
+ end
168
+
169
+ def [](name)
170
+ Core.auth_get_parameter(self, name)
171
+ end
172
+
173
+ def []=(name, value)
174
+ Core.auth_set_parameter(self, name, value)
175
+ @parameters[name] = value
176
+ end
177
+
178
+ def parameters=(params)
179
+ @parameters = {}
180
+ params.each do |key, value|
181
+ self[key] = value
182
+ end
183
+ end
184
+ end
185
+
186
+ module Authenticatable
187
+ attr_accessor :auth_baton
188
+
189
+ def add_simple_provider
190
+ add_provider(Core.auth_get_simple_provider)
191
+ end
192
+
193
+ if Core.respond_to?(:auth_get_windows_simple_provider)
194
+ def add_windows_simple_provider
195
+ add_provider(Core.auth_get_windows_simple_provider)
196
+ end
197
+ end
198
+
199
+ if Core.respond_to?(:auth_get_keychain_simple_provider)
200
+ def add_keychain_simple_provider
201
+ add_provider(Core.auth_get_keychain_simple_provider)
202
+ end
203
+ end
204
+
205
+ def add_username_provider
206
+ add_provider(Core.auth_get_username_provider)
207
+ end
208
+
209
+ def add_ssl_client_cert_file_provider
210
+ add_provider(Core.auth_get_ssl_client_cert_file_provider)
211
+ end
212
+
213
+ def add_ssl_client_cert_pw_file_provider
214
+ add_provider(Core.auth_get_ssl_client_cert_pw_file_provider)
215
+ end
216
+
217
+ def add_ssl_server_trust_file_provider
218
+ add_provider(Core.auth_get_ssl_server_trust_file_provider)
219
+ end
220
+
221
+ if Core.respond_to?(:auth_get_windows_ssl_server_trust_provider)
222
+ def add_windows_ssl_server_trust_provider
223
+ add_provider(Core.auth_get_windows_ssl_server_trust_provider)
224
+ end
225
+ end
226
+
227
+ def add_simple_prompt_provider(retry_limit, prompt=Proc.new)
228
+ args = [retry_limit]
229
+ klass = AuthCredSimple
230
+ add_prompt_provider("simple", args, prompt, klass)
231
+ end
232
+
233
+ def add_username_prompt_provider(retry_limit, prompt=Proc.new)
234
+ args = [retry_limit]
235
+ klass = AuthCredUsername
236
+ add_prompt_provider("username", args, prompt, klass)
237
+ end
238
+
239
+ def add_ssl_server_trust_prompt_provider(prompt=Proc.new)
240
+ args = []
241
+ klass = AuthCredSSLServerTrust
242
+ add_prompt_provider("ssl_server_trust", args, prompt, klass)
243
+ end
244
+
245
+ def add_ssl_client_cert_prompt_provider(retry_limit, prompt=Proc.new)
246
+ args = [retry_limit]
247
+ klass = AuthCredSSLClientCert
248
+ add_prompt_provider("ssl_client_cert", args, prompt, klass)
249
+ end
250
+
251
+ def add_ssl_client_cert_pw_prompt_provider(retry_limit, prompt=Proc.new)
252
+ args = [retry_limit]
253
+ klass = AuthCredSSLClientCertPw
254
+ add_prompt_provider("ssl_client_cert_pw", args, prompt, klass)
255
+ end
256
+
257
+ private
258
+ def add_prompt_provider(name, args, prompt, credential_class)
259
+ real_prompt = Proc.new do |*prompt_args|
260
+ credential = credential_class.new
261
+ prompt.call(credential, *prompt_args)
262
+ credential
263
+ end
264
+ method_name = "swig_rb_auth_get_#{name}_prompt_provider"
265
+ baton, provider = Core.send(method_name, real_prompt, *args)
266
+ provider.instance_variable_set("@baton", baton)
267
+ provider.instance_variable_set("@prompt", real_prompt)
268
+ add_provider(provider)
269
+ end
270
+
271
+ def add_provider(provider)
272
+ if auth_baton
273
+ providers = auth_baton.providers
274
+ parameters = auth_baton.parameters
275
+ else
276
+ providers = []
277
+ parameters = {}
278
+ end
279
+ self.auth_baton = AuthBaton.new(providers + [provider], parameters)
280
+ end
281
+ end
282
+
283
+ class AuthProviderObject
284
+ class << self
285
+ undef new
286
+ end
287
+ end
288
+
289
+
290
+ Diff = SWIG::TYPE_p_svn_diff_t
291
+ class Diff
292
+ attr_accessor :original, :modified, :latest, :ancestor
293
+
294
+ class << self
295
+ def version
296
+ Core.diff_version
297
+ end
298
+
299
+ def file_diff(original, modified, options=nil)
300
+ options ||= Core::DiffFileOptions.new
301
+ diff = Core.diff_file_diff_2(original, modified, options)
302
+ if diff
303
+ diff.original = original
304
+ diff.modified = modified
305
+ end
306
+ diff
307
+ end
308
+
309
+ def file_diff3(original, modified, latest, options=nil)
310
+ options ||= Core::DiffFileOptions.new
311
+ diff = Core.diff_file_diff3_2(original, modified, latest, options)
312
+ if diff
313
+ diff.original = original
314
+ diff.modified = modified
315
+ diff.latest = latest
316
+ end
317
+ diff
318
+ end
319
+
320
+ def file_diff4(original, modified, latest, ancestor, options=nil)
321
+ options ||= Core::DiffFileOptions.new
322
+ args = [original, modified, latest, ancestor, options]
323
+ diff = Core.diff_file_diff4_2(*args)
324
+ if diff
325
+ diff.original = original
326
+ diff.modified = modified
327
+ diff.latest = latest
328
+ diff.ancestor = ancestor
329
+ end
330
+ diff
331
+ end
332
+ end
333
+
334
+ def unified(orig_label, mod_label, header_encoding=nil)
335
+ header_encoding ||= Svn::Core.locale_charset
336
+ output = StringIO.new
337
+ args = [
338
+ output, self, @original, @modified,
339
+ orig_label, mod_label, header_encoding
340
+ ]
341
+ Core.diff_file_output_unified2(*args)
342
+ output.rewind
343
+ output.read
344
+ end
345
+
346
+ def merge(conflict_original=nil, conflict_modified=nil,
347
+ conflict_latest=nil, conflict_separator=nil,
348
+ display_original_in_conflict=true,
349
+ display_resolved_conflicts=true)
350
+ header_encoding ||= Svn::Core.locale_charset
351
+ output = StringIO.new
352
+ args = [
353
+ output, self, @original, @modified, @latest,
354
+ conflict_original, conflict_modified,
355
+ conflict_latest, conflict_separator,
356
+ display_original_in_conflict,
357
+ display_resolved_conflicts,
358
+ ]
359
+ Core.diff_file_output_merge(*args)
360
+ output.rewind
361
+ output.read
362
+ end
363
+
364
+ def conflict?
365
+ Core.diff_contains_conflicts(self)
366
+ end
367
+
368
+ def diff?
369
+ Core.diff_contains_diffs(self)
370
+ end
371
+ end
372
+
373
+ class DiffFileOptions
374
+ class << self
375
+ def parse(*args)
376
+ options = new
377
+ options.parse(*args)
378
+ options
379
+ end
380
+ end
381
+
382
+ def parse(*args)
383
+ args = args.first if args.size == 1 and args.first.is_a?(Array)
384
+ Svn::Core.diff_file_options_parse(self, args)
385
+ end
386
+ end
387
+
388
+ class Version
389
+
390
+ alias _initialize initialize
391
+ def initialize(major=nil, minor=nil, patch=nil, tag=nil)
392
+ _initialize
393
+ self.major = major if major
394
+ self.minor = minor if minor
395
+ self.patch = patch if patch
396
+ self.tag = tag || ""
397
+ end
398
+
399
+ def ==(other)
400
+ valid? and other.valid? and Core.ver_equal(self, other)
401
+ end
402
+
403
+ def compatible?(other)
404
+ valid? and other.valid? and Core.ver_compatible(self, other)
405
+ end
406
+
407
+ def valid?
408
+ (major and minor and patch and tag) ? true : false
409
+ end
410
+
411
+ alias _tag= tag=
412
+ def tag=(value)
413
+ @tag = value
414
+ self._tag = value
415
+ end
416
+
417
+ def to_a
418
+ [major, minor, patch, tag]
419
+ end
420
+
421
+ def to_s
422
+ "#{major}.#{minor}.#{patch}#{tag}"
423
+ end
424
+ end
425
+
426
+ # Following methods are also available:
427
+ #
428
+ # [created_rev]
429
+ # Returns a revision at which the instance was last modified.
430
+ # [have_props?]
431
+ # Returns +true+ if the instance has properties.
432
+ # [last_author]
433
+ # Returns an author who last modified the instance.
434
+ # [size]
435
+ # Returns a size of the instance.
436
+ class Dirent
437
+ alias have_props? has_props
438
+
439
+ # Returns +true+ when the instance is none.
440
+ def none?
441
+ kind == NODE_NONE
442
+ end
443
+
444
+ # Returns +true+ when the instance is a directory.
445
+ def directory?
446
+ kind == NODE_DIR
447
+ end
448
+
449
+ # Returns +true+ when the instance is a file.
450
+ def file?
451
+ kind == NODE_FILE
452
+ end
453
+
454
+ # Returns +true+ when the instance is an unknown node.
455
+ def unknown?
456
+ kind == NODE_UNKNOWN
457
+ end
458
+
459
+ # Returns a Time when the instance was last changed.
460
+ #
461
+ # Svn::Core::Dirent#time is replaced by this method, _deprecated_,
462
+ # and provided for backward compatibility with the 1.3 API.
463
+ def time2
464
+ __time = time
465
+ __time && Time.from_apr_time(__time)
466
+ end
467
+ end
468
+
469
+ Config = SWIG::TYPE_p_svn_config_t
470
+
471
+ class Config
472
+ include Enumerable
473
+
474
+ class << self
475
+ def get(path=nil)
476
+ Core.config_get_config(path)
477
+ end
478
+ alias config get
479
+
480
+ def read(file, must_exist=true)
481
+ Core.config_read(file, must_exist)
482
+ end
483
+
484
+ def ensure(dir)
485
+ Core.config_ensure(dir)
486
+ end
487
+
488
+ def read_auth_data(cred_kind, realm_string, config_dir=nil)
489
+ Core.config_read_auth_data(cred_kind, realm_string, config_dir)
490
+ end
491
+
492
+ def write_auth_data(hash, cred_kind, realm_string, config_dir=nil)
493
+ Core.config_write_auth_data(hash, cred_kind,
494
+ realm_string, config_dir)
495
+ end
496
+ end
497
+
498
+ def merge(file, must_exist=true)
499
+ Core.config_merge(self, file, must_exist)
500
+ end
501
+
502
+ def get(section, option, default=nil)
503
+ Core.config_get(self, section, option, default)
504
+ end
505
+
506
+ def get_bool(section, option, default)
507
+ Core.config_get_bool(self, section, option, default)
508
+ end
509
+
510
+ def set(section, option, value)
511
+ Core.config_set(self, section, option, value)
512
+ end
513
+ alias_method :[]=, :set
514
+
515
+ def set_bool(section, option, value)
516
+ Core.config_set_bool(self, section, option, value)
517
+ end
518
+
519
+ def each
520
+ each_section do |section|
521
+ each_option(section) do |name, value|
522
+ yield(section, name, value)
523
+ true
524
+ end
525
+ true
526
+ end
527
+ end
528
+
529
+ def each_option(section)
530
+ receiver = Proc.new do |name, value|
531
+ yield(name, value)
532
+ end
533
+ Core.config_enumerate2(self, section, receiver)
534
+ end
535
+
536
+ def each_section
537
+ receiver = Proc.new do |name|
538
+ yield(name)
539
+ end
540
+ Core.config_enumerate_sections2(self, receiver)
541
+ end
542
+
543
+ def find_group(key, section)
544
+ Core.config_find_group(self, key, section)
545
+ end
546
+
547
+ def get_server_setting(group, name, default=nil)
548
+ Core.config_get_server_setting(self, group, name, default)
549
+ end
550
+
551
+ def get_server_setting_int(group, name, default)
552
+ Core.config_get_server_setting_int(self, group, name, default)
553
+ end
554
+
555
+ alias_method :_to_s, :to_s
556
+ def to_s
557
+ result = ""
558
+ each_section do |section|
559
+ result << "[#{section}]\n"
560
+ each_option(section) do |name, value|
561
+ result << "#{name} = #{value}\n"
562
+ end
563
+ result << "\n"
564
+ end
565
+ result
566
+ end
567
+
568
+ def inspect
569
+ "#{_to_s}#{to_hash.inspect}"
570
+ end
571
+
572
+ def to_hash
573
+ sections = {}
574
+ each do |section, name, value|
575
+ sections[section] ||= {}
576
+ sections[section][name] = value
577
+ end
578
+ sections
579
+ end
580
+
581
+ def ==(other)
582
+ other.is_a?(self.class) and to_hash == other.to_hash
583
+ end
584
+ end
585
+
586
+ module Property
587
+ module_function
588
+ def kind(name)
589
+ kind, len = Core.property_kind(name)
590
+ [kind, name[0...len]]
591
+ end
592
+
593
+ def svn_prop?(name)
594
+ Core.prop_is_svn_prop(name)
595
+ end
596
+
597
+ def needs_translation?(name)
598
+ Core.prop_needs_translation(name)
599
+ end
600
+
601
+ def categorize(props)
602
+ categorize2(props).collect do |categorized_props|
603
+ Util.hash_to_prop_array(categorized_props)
604
+ end
605
+ end
606
+ alias_method :categorize_props, :categorize
607
+ module_function :categorize_props
608
+
609
+ def categorize2(props)
610
+ Core.categorize_props(props)
611
+ end
612
+
613
+ def diffs(target_props, source_props)
614
+ Util.hash_to_prop_array(diffs2(target_props, source_props))
615
+ end
616
+ alias_method :prop_diffs, :diffs
617
+ module_function :prop_diffs
618
+
619
+ def diffs2(target_props, source_props)
620
+ Core.prop_diffs2(target_props, source_props)
621
+ end
622
+
623
+ def has_svn_prop?(props)
624
+ Core.prop_has_svn_prop(props)
625
+ end
626
+ alias_method :have_svn_prop?, :has_svn_prop?
627
+ module_function :have_svn_prop?
628
+
629
+ def valid_name?(name)
630
+ Core.prop_name_is_valid(name)
631
+ end
632
+ end
633
+
634
+ module Depth
635
+ module_function
636
+ def from_string(str)
637
+ return nil if str.nil?
638
+ Core.depth_from_word(str)
639
+ end
640
+
641
+ def to_string(depth)
642
+ Core.depth_to_word(depth)
643
+ end
644
+
645
+ def infinity_or_empty_from_recurse(depth_or_recurse)
646
+ case depth_or_recurse
647
+ when true : DEPTH_INFINITY
648
+ when false : DEPTH_EMPTY
649
+ else depth_or_recurse
650
+ end
651
+ end
652
+
653
+ def infinity_or_immediates_from_recurse(depth_or_recurse)
654
+ case depth_or_recurse
655
+ when true : DEPTH_INFINITY
656
+ when false : DEPTH_IMMEDIATES
657
+ else depth_or_recurse
658
+ end
659
+ end
660
+ end
661
+
662
+ module MimeType
663
+ module_function
664
+ def parse(source)
665
+ file = Tempfile.new("svn-ruby-mime-type")
666
+ file.print(source)
667
+ file.close
668
+ Core.io_parse_mimetypes_file(file.path)
669
+ end
670
+
671
+ def parse_file(path)
672
+ Core.io_parse_mimetypes_file(path)
673
+ end
674
+
675
+ def detect(path, type_map={})
676
+ Core.io_detect_mimetype2(path, type_map)
677
+ end
678
+ end
679
+
680
+ class CommitInfo
681
+ alias _date date
682
+ def date
683
+ Time.from_svn_format(_date)
684
+ end
685
+ end
686
+
687
+ # Following methods are also available:
688
+ #
689
+ # [action]
690
+ # Returns an action taken to the path at the revision.
691
+ # [copyfrom_path]
692
+ # If the path was added at the revision by the copy action from
693
+ # another path at another revision, returns an original path.
694
+ # Otherwise, returns +nil+.
695
+ # [copyfrom_rev]
696
+ # If the path was added at the revision by the copy action from
697
+ # another path at another revision, returns an original revision.
698
+ # Otherwise, returns <tt>-1</tt>.
699
+ class LogChangedPath
700
+ # Returns +true+ when the path is added by the copy action.
701
+ def copied?
702
+ Util.copy?(copyfrom_path, copyfrom_rev)
703
+ end
704
+ end
705
+
706
+ # For backward compatibility
707
+ class Prop
708
+ attr_accessor :name, :value
709
+ def initialize(name, value)
710
+ @name = name
711
+ @value = value
712
+ end
713
+
714
+ def ==(other)
715
+ other.is_a?(self.class) and
716
+ [@name, @value] == [other.name, other.value]
717
+ end
718
+ end
719
+
720
+ class MergeRange
721
+ def to_a
722
+ [self.start, self.end, self.inheritable]
723
+ end
724
+
725
+ def inspect
726
+ super.gsub(/>$/, ":#{to_a.inspect}>")
727
+ end
728
+
729
+ def ==(other)
730
+ to_a == other.to_a
731
+ end
732
+ end
733
+
734
+ class MergeInfo < Hash
735
+ class << self
736
+ def parse(input)
737
+ new(Core.mergeinfo_parse(input))
738
+ end
739
+ end
740
+
741
+ def initialize(info)
742
+ super()
743
+ info.each do |path, ranges|
744
+ self[path] = RangeList.new(*ranges)
745
+ end
746
+ end
747
+
748
+ def diff(to, consider_inheritance=false)
749
+ Core.mergeinfo_diff(self, to, consider_inheritance).collect do |result|
750
+ self.class.new(result)
751
+ end
752
+ end
753
+
754
+ def merge(changes)
755
+ self.class.new(Core.swig_mergeinfo_merge(self, changes))
756
+ end
757
+
758
+ def remove(eraser)
759
+ self.class.new(Core.mergeinfo_remove(eraser, self))
760
+ end
761
+
762
+ def sort
763
+ self.class.new(Core.swig_mergeinfo_sort(self))
764
+ end
765
+
766
+ def to_s
767
+ Core.mergeinfo_to_string(self)
768
+ end
769
+ end
770
+
771
+ class RangeList < Array
772
+ def initialize(*ranges)
773
+ super()
774
+ ranges.each do |range|
775
+ self << Svn::Core::MergeRange.new(*range.to_a)
776
+ end
777
+ end
778
+
779
+ def diff(to, consider_inheritance=false)
780
+ result = Core.rangelist_diff(self, to, consider_inheritance)
781
+ deleted = result.pop
782
+ added = result
783
+ [added, deleted].collect do |result|
784
+ self.class.new(*result)
785
+ end
786
+ end
787
+
788
+ def merge(changes)
789
+ self.class.new(*Core.swig_rangelist_merge(self, changes))
790
+ end
791
+
792
+ def remove(eraser, consider_inheritance=false)
793
+ self.class.new(*Core.rangelist_remove(eraser, self,
794
+ consider_inheritance))
795
+ end
796
+
797
+ def intersect(other, consider_inheritance=false)
798
+ self.class.new(*Core.rangelist_intersect(self, other,
799
+ consider_inheritance))
800
+ end
801
+
802
+ def reverse
803
+ self.class.new(*Core.swig_rangelist_reverse(self))
804
+ end
805
+
806
+ def to_s
807
+ Core.rangelist_to_string(self)
808
+ end
809
+ end
810
+
811
+ class LogEntry
812
+ alias_method(:revision_properties, :revprops)
813
+ alias_method(:has_children?, :has_children)
814
+ undef_method(:has_children)
815
+ end
816
+ end
817
+ end