subversion 1.6.6-x86-mswin32-60

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 (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