svnx 0.0.4 → 0.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 182d4597707fd26ecddd3a1ea79ca60f9394fe83
4
- data.tar.gz: c2a7e445bf8454ca3e66db6823a0f85fe91a7ba4
3
+ metadata.gz: 9e756a5b2625c284861b85b3a7b0543ef044e8ff
4
+ data.tar.gz: e49bdcff5e52a538fcbd247da3d609afba5ac105
5
5
  SHA512:
6
- metadata.gz: 5e94d144f15aa124cd3c787c4ce983801f6a52bb3b3bc9f83c6d3dc0cc80d17f44b737f58fb12cf19793f4af0c5f38b8a03ac5744c3bcb2f43ba3ba7923f0cef
7
- data.tar.gz: 697d80dddd57c3c4b5b39aae20224540cb9d7d0142b64c6b57be2257424f18930f7d45ca36dee5b1766861d98d1bea72b64e5b34b99b7adf925c77aa2caa2788
6
+ metadata.gz: f062f3d0079b5ef799c366762301782db8251e7efb0cef86d776ca1c46b22d585502b89d97c1619fa14d2b3a7c5c052595a14e9a8a059c67fe4914ddab7ed9d8
7
+ data.tar.gz: e5d72e5378080300fd11e988e54283676b0e2d1749725aa4512e51d78563d27d516756db0d91722c886ba6d07802925963412fedefd69ff67f5abc9856ba9fd3
data/lib/svnx.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # -*- ruby -*-
3
3
 
4
4
  module SVNx
5
- VERSION = "0.0.4"
5
+ VERSION = "0.1.0"
6
6
  end
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'svnx/log/entries'
5
+ require 'svnx/revision/error'
6
+ require 'logue/loggable'
7
+
8
+ module SVNx; module Revision; end; end
9
+
10
+ # We represent what svn calls a revision (-r134:{2010-1-1}) as a Range,
11
+ # consisting of a from and to (optional) Argument.
12
+ module SVNx::Revision
13
+ RELATIVE_REVISION_RE = Regexp.new '^([\+\-])(\d+)$'
14
+
15
+ # Returns the Nth revision from the given logging output.
16
+
17
+ # -n means to count from the end of the list.
18
+ # +n means to count from the beginning of the list.
19
+ # n means the literal revision number.
20
+ class Argument
21
+ include Logue::Loggable, Comparable
22
+
23
+ DATE_REGEXP = Regexp.new '^\{(.*?)\}'
24
+ SVN_ARGUMENT_WORDS = %w{ HEAD BASE COMMITTED PREV }
25
+
26
+ # these are also valid revisions
27
+ # :working_copy
28
+ # :head
29
+
30
+ attr_reader :value
31
+
32
+ class << self
33
+ alias_method :orig_new, :new
34
+
35
+ def new value, args = Hash.new
36
+ # these are log entries:
37
+ entries = args[:entries]
38
+
39
+ case value
40
+ when Fixnum
41
+ if value < 0
42
+ RelativeArgument.orig_new value, entries: entries
43
+ else
44
+ FixnumArgument.orig_new value
45
+ end
46
+ when String
47
+ if SVN_ARGUMENT_WORDS.include? value
48
+ StringArgument.orig_new value
49
+ elsif md = RELATIVE_REVISION_RE.match(value)
50
+ RelativeArgument.orig_new md[0].to_i, entries: entries
51
+ elsif DATE_REGEXP.match value
52
+ StringArgument.orig_new value
53
+ else
54
+ FixnumArgument.orig_new value.to_i
55
+ end
56
+ when Symbol
57
+ raise RevisionError.new "symbol not yet handled"
58
+ when Date
59
+ # $$$ this (and Time) will probably have to be converted to svn's format
60
+ raise RevisionError.new "date not yet handled"
61
+ when Time
62
+ raise RevisionError.new "time not yet handled"
63
+ end
64
+ end
65
+
66
+ def matches_relative? str
67
+ RELATIVE_REVISION_RE.match str
68
+ end
69
+ end
70
+
71
+ def initialize value
72
+ @value = value
73
+ end
74
+
75
+ def to_s
76
+ @value.to_s
77
+ end
78
+
79
+ def <=> other
80
+ @value <=> other.value
81
+ end
82
+ end
83
+
84
+ class FixnumArgument < Argument
85
+ end
86
+
87
+ class StringArgument < Argument
88
+ end
89
+
90
+ class WorkingCopyArgument < Argument
91
+ end
92
+
93
+ # this is of the form -3, which is revision[-3] (second one from the most
94
+ # recent; -1 is the most recent).
95
+ class RelativeArgument < FixnumArgument
96
+ def initialize value, args
97
+ entries = args[:entries]
98
+
99
+ unless entries
100
+ raise RevisionError.new "cannot determine relative revision without entries"
101
+ end
102
+
103
+ nentries = entries.size
104
+
105
+ # logentries are in descending order, so the most recent one is index 0
106
+
107
+ if value.abs > nentries
108
+ raise RevisionError.new "ERROR: no entry for revision: #{value.abs}; number of entries: #{nentries}"
109
+ else
110
+ idx = value < 0 ? -1 + value.abs : nentries - value
111
+ log_entry = entries[idx]
112
+ super log_entry.revision.to_i
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ module SVNx
5
+ module Revision
6
+ class RevisionError < RuntimeError
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'svnx/log/entries'
5
+ require 'svnx/revision/argument'
6
+ require 'logue/loggable'
7
+
8
+ module SVNx; module Revision; end; end
9
+
10
+ module SVNx::Revision
11
+ # this is of the form: -r123:456
12
+ class Range
13
+ include Logue::Loggable
14
+
15
+ attr_reader :from
16
+ attr_reader :to
17
+
18
+ def initialize from, to = nil, entries = nil
19
+ if to
20
+ @from = to_revision from, entries
21
+ @to = to_revision to, entries
22
+ elsif from.kind_of? String
23
+ @from, @to = from.split(':').collect { |x| to_revision x, entries }
24
+ else
25
+ @from = to_revision from, entries
26
+ @to = :working_copy
27
+ end
28
+ end
29
+
30
+ def to_revision val, entries
31
+ val.kind_of?(Argument) || Argument.new(val, entries: entries)
32
+ end
33
+
34
+ def to_s
35
+ str = @from.to_s
36
+ unless working_copy?
37
+ str << ':' << @to.to_s
38
+ end
39
+ str
40
+ end
41
+
42
+ def head?
43
+ @to == :head
44
+ end
45
+
46
+ def working_copy?
47
+ @to == nil || @to == :wc || @to == :working_copy
48
+ end
49
+ end
50
+ end
@@ -5,7 +5,7 @@ require 'tc'
5
5
  require 'svnx/action'
6
6
 
7
7
  module SVNx
8
- class ActionTestCase < PVN::TestCase
8
+ class ActionTestCase < SVNx::TestCase
9
9
  def assert_action_equals expadd, expdel, expmod, expunver, *vals
10
10
  vals.each do |val|
11
11
  action = Action.new val
@@ -5,7 +5,7 @@ require 'tc'
5
5
  require 'svnx/cat/command'
6
6
 
7
7
  module SVNx::Cat
8
- class CommandTestCase < PVN::TestCase
8
+ class CommandTestCase < SVNx::TestCase
9
9
  EXPROOT = 'file:///Programs/Subversion/Repositories/pvntestbed.from'
10
10
 
11
11
  def test_cat_default
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'tc'
5
+ require 'svnx/log/entries'
6
+ require 'svnx/revision/argument'
7
+ require 'resources'
8
+
9
+ module SVNx::Revision
10
+ class ArgumentTestCase < SVNx::TestCase
11
+ def setup
12
+ # This is the equivalent of "log" at revision 22, when this file was added
13
+ # at revision 13. Using this instead of just "log" when regenerating the
14
+ # resource files keeps the revisions from bouncing around.
15
+ xmllines = Resources::PT_LOG_R22_13_SECONDFILE_TXT.readlines
16
+ @entries = SVNx::Log::Entries.new :xmllines => xmllines
17
+ end
18
+
19
+ def create_argument value
20
+ Argument.new value, entries: @entries
21
+ end
22
+
23
+ def assert_argument_value exp_value, value
24
+ arg = create_argument value
25
+ assert_equal exp_value, arg.value
26
+ end
27
+
28
+ def assert_argument_value_raises value
29
+ assert_raises(SVNx::Revision::RevisionError) do
30
+ assert_argument_value nil, value
31
+ end
32
+ end
33
+
34
+ def assert_argument_to_s exp_str, value
35
+ arg = create_argument value
36
+ assert_equal exp_str, arg.to_s
37
+ end
38
+
39
+ def assert_compare op, exp, xval, yval
40
+ x = create_argument xval
41
+ y = create_argument yval
42
+ msg = "xval: #{xval}; yval: #{yval}"
43
+ assert_equal exp, x.send(op, y), msg
44
+ end
45
+
46
+ def assert_argument_eq expeq, xval, yval
47
+ # it's the emoticon programming language
48
+ assert_compare :==, expeq, xval, yval
49
+ end
50
+
51
+ def assert_argument_gt expeq, xval, yval
52
+ assert_compare :>, expeq, xval, yval
53
+ end
54
+
55
+ def test_absolute_midrange
56
+ assert_argument_value 19, 19
57
+ end
58
+
59
+ def test_absolute_most_recent
60
+ assert_argument_value 22, 22
61
+ end
62
+
63
+ def test_absolute_least_recent
64
+ assert_argument_value 13, 13
65
+ end
66
+
67
+ def test_absolute_midrange_as_string
68
+ assert_argument_value 19, '19'
69
+ end
70
+
71
+ def test_absolute_most_recent_as_string
72
+ assert_argument_value 22, '22'
73
+ end
74
+
75
+ def test_absolute_least_recent_as_string
76
+ assert_argument_value 13, '13'
77
+ end
78
+
79
+ def test_svn_word
80
+ %w{ HEAD BASE COMMITTED PREV }.each do |word|
81
+ assert_argument_value word, word
82
+ end
83
+ end
84
+
85
+ def test_negative_most_recent
86
+ assert_argument_value 22, -1
87
+ end
88
+
89
+ def test_negative_second_most_recent
90
+ assert_argument_value 20, -2
91
+ end
92
+
93
+ def test_negative_least_recent
94
+ assert_argument_value 13, -5
95
+ end
96
+
97
+ def test_negative_too_far_back
98
+ assert_argument_value_raises(-6)
99
+ end
100
+
101
+ def test_negative_most_recent_as_string
102
+ assert_argument_value 22, '-1'
103
+ end
104
+
105
+ def test_negative_second_most_recent_as_string
106
+ assert_argument_value 20, '-2'
107
+ end
108
+
109
+ def test_negative_least_recent_as_string
110
+ assert_argument_value 13, '-5'
111
+ end
112
+
113
+ def test_negative_too_far_back_as_string
114
+ assert_argument_value_raises '-6'
115
+ end
116
+
117
+ def test_positive_most_recent
118
+ assert_argument_value 22, '+5'
119
+ end
120
+
121
+ def test_positive_second_most_recent
122
+ assert_argument_value 20, '+4'
123
+ end
124
+
125
+ def test_positive_least_recent
126
+ assert_argument_value 13, '+1'
127
+ end
128
+
129
+ def test_positive_too_far_forward
130
+ assert_argument_value_raises '+6'
131
+ end
132
+
133
+ def xxxtest_range_svn_word_to_number
134
+ assert_argument_value 'BASE:1', 'BASE:1'
135
+ end
136
+
137
+ def xxxtest_date
138
+ assert_argument_to_s '1967-12-10', '1967-12-10'
139
+ end
140
+
141
+ def test_to_s
142
+ assert_argument_to_s '5', '5'
143
+ assert_argument_to_s 'HEAD', 'HEAD'
144
+ end
145
+
146
+ def test_eq
147
+ assert_argument_eq true, '5', '5'
148
+ assert_argument_eq false, '4', '5'
149
+ assert_argument_eq false, '5', '4'
150
+ end
151
+
152
+ def test_gt
153
+ assert_argument_gt true, '17', '16'
154
+ assert_argument_gt false, '13', '14'
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'tc'
5
+ require 'svnx/log/entries'
6
+ require 'svnx/revision/range'
7
+ require 'resources'
8
+
9
+ module SVNx::Revision
10
+ class RangeTestCase < SVNx::TestCase
11
+ def test_init
12
+ rr = Range.new '143:199'
13
+ assert_equal '143', rr.from.to_s
14
+ assert_equal '199', rr.to.to_s
15
+ assert_equal '143:199', rr.to_s
16
+ end
17
+
18
+ def test_to_working_copy
19
+ rr = Range.new '143'
20
+ assert_equal '143', rr.from.to_s
21
+ assert_nil rr.to
22
+ assert_equal '143', rr.to_s
23
+ end
24
+ end
25
+ end
@@ -5,7 +5,7 @@ require 'tc'
5
5
  require 'system/command/line'
6
6
 
7
7
  module System
8
- class CommandLineTestCase < PVN::TestCase
8
+ class CommandLineTestCase < SVNx::TestCase
9
9
  def test_ctor
10
10
  cl = System::CommandLine.new [ "ls" ]
11
11
  assert_equal "ls", cl.to_command
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: svnx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Pace
@@ -58,6 +58,9 @@ files:
58
58
  - lib/svnx/log/command.rb
59
59
  - lib/svnx/log/entries.rb
60
60
  - lib/svnx/log/entry.rb
61
+ - lib/svnx/revision/argument.rb
62
+ - lib/svnx/revision/error.rb
63
+ - lib/svnx/revision/range.rb
61
64
  - lib/svnx/status/command.rb
62
65
  - lib/svnx/status/entries.rb
63
66
  - lib/svnx/status/entry.rb
@@ -73,6 +76,8 @@ files:
73
76
  - test/unit/svnx/info/entries_test.rb
74
77
  - test/unit/svnx/log/entries_test.rb
75
78
  - test/unit/svnx/log/entry_test.rb
79
+ - test/unit/svnx/revision/argument_test.rb
80
+ - test/unit/svnx/revision/range_test.rb
76
81
  - test/unit/svnx/status/entries_test.rb
77
82
  - test/unit/system/command/cachefile_test.rb
78
83
  - test/unit/system/command/caching_test.rb
@@ -110,6 +115,8 @@ test_files:
110
115
  - test/unit/svnx/info/entries_test.rb
111
116
  - test/unit/svnx/log/entries_test.rb
112
117
  - test/unit/svnx/log/entry_test.rb
118
+ - test/unit/svnx/revision/argument_test.rb
119
+ - test/unit/svnx/revision/range_test.rb
113
120
  - test/unit/svnx/status/entries_test.rb
114
121
  - test/unit/system/command/cachefile_test.rb
115
122
  - test/unit/system/command/caching_test.rb