svnx 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/svnx.rb +6 -0
- data/lib/svnx/action.rb +48 -0
- data/lib/svnx/cat/command.rb +61 -0
- data/lib/svnx/command.rb +79 -0
- data/lib/svnx/entries.rb +68 -0
- data/lib/svnx/entry.rb +59 -0
- data/lib/svnx/exec.rb +41 -0
- data/lib/svnx/info/command.rb +44 -0
- data/lib/svnx/info/entries.rb +17 -0
- data/lib/svnx/info/entry.rb +31 -0
- data/lib/svnx/log/command.rb +76 -0
- data/lib/svnx/log/entries.rb +17 -0
- data/lib/svnx/log/entry.rb +53 -0
- data/lib/svnx/status/command.rb +28 -0
- data/lib/svnx/status/entries.rb +17 -0
- data/lib/svnx/status/entry.rb +53 -0
- data/lib/system/command/arg.rb +12 -0
- data/lib/system/command/cachefile.rb +50 -0
- data/lib/system/command/caching.rb +36 -0
- data/lib/system/command/line.rb +53 -0
- data/test/unit/svnx/action_test.rb +36 -0
- data/test/unit/svnx/info/entries_test.rb +22 -0
- data/test/unit/svnx/info/entry_test.rb +20 -0
- data/test/unit/svnx/log/entries_test.rb +88 -0
- data/test/unit/svnx/log/entry_test.rb +15 -0
- data/test/unit/svnx/status/entries_test.rb +20 -0
- data/test/unit/svnx/status/entry_test.rb +14 -0
- data/test/unit/system/command/cachefile_test.rb +54 -0
- data/test/unit/system/command/caching_test.rb +92 -0
- data/test/unit/system/command/line_test.rb +34 -0
- metadata +111 -0
@@ -0,0 +1,76 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'system/command/line'
|
5
|
+
require 'system/command/caching'
|
6
|
+
require 'svnx/command'
|
7
|
+
require 'logue/loggable'
|
8
|
+
|
9
|
+
module SVNx
|
10
|
+
module LogCmdLine
|
11
|
+
# this can be either an Array (for which to_a returns itself), or
|
12
|
+
# a CommandArgs, which also has to_a.
|
13
|
+
def initialize args = Array.new
|
14
|
+
super "log", args.to_a
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class LogCommandLine < CommandLine
|
19
|
+
include LogCmdLine
|
20
|
+
end
|
21
|
+
|
22
|
+
class LogCommandLineCaching < CachingCommandLine
|
23
|
+
include LogCmdLine
|
24
|
+
end
|
25
|
+
|
26
|
+
class LogCommandArgs < CommandArgs
|
27
|
+
include Logue::Loggable
|
28
|
+
|
29
|
+
attr_reader :limit
|
30
|
+
attr_reader :verbose
|
31
|
+
attr_reader :revision
|
32
|
+
attr_reader :use_cache
|
33
|
+
|
34
|
+
def initialize args = Hash.new
|
35
|
+
@limit = args[:limit]
|
36
|
+
@verbose = args[:verbose]
|
37
|
+
@use_cache = args[:use_cache].nil? || args[:use_cache]
|
38
|
+
@revision = args[:revision]
|
39
|
+
super
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_a
|
43
|
+
ary = Array.new
|
44
|
+
if @limit
|
45
|
+
ary << '--limit' << @limit
|
46
|
+
end
|
47
|
+
if @verbose
|
48
|
+
ary << '-v'
|
49
|
+
end
|
50
|
+
|
51
|
+
if @revision
|
52
|
+
[ @revision ].flatten.each do |rev|
|
53
|
+
ary << "-r#{rev}"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
if @path
|
58
|
+
ary << @path
|
59
|
+
end
|
60
|
+
|
61
|
+
ary.compact
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class LogCommand < Command
|
66
|
+
def initialize args
|
67
|
+
@use_cache = args.use_cache
|
68
|
+
super
|
69
|
+
end
|
70
|
+
|
71
|
+
def command_line
|
72
|
+
cls = @use_cache ? LogCommandLineCaching : LogCommandLine
|
73
|
+
cls.new @args
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'svnx/entries'
|
5
|
+
require 'svnx/log/entry'
|
6
|
+
|
7
|
+
module SVNx::Log
|
8
|
+
class Entries < SVNx::Entries
|
9
|
+
def get_elements doc
|
10
|
+
doc.elements['log'].elements
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_entry xmlelement
|
14
|
+
Entry.new :xmlelement => xmlelement
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'svnx/entry'
|
5
|
+
|
6
|
+
module SVNx; module Log; end; end
|
7
|
+
|
8
|
+
module SVNx::Log
|
9
|
+
class Entry < SVNx::Entry
|
10
|
+
|
11
|
+
attr_reader :revision, :author, :date, :paths, :msg
|
12
|
+
|
13
|
+
def set_from_element elmt
|
14
|
+
set_attr_var elmt, 'revision'
|
15
|
+
|
16
|
+
%w{ author date msg }.each do |field|
|
17
|
+
set_elmt_var elmt, field
|
18
|
+
end
|
19
|
+
|
20
|
+
@paths = Array.new
|
21
|
+
|
22
|
+
elmt.elements.each('paths/path') do |pe|
|
23
|
+
kind = get_attribute pe, 'kind'
|
24
|
+
action = get_attribute pe, 'action'
|
25
|
+
name = pe.text
|
26
|
+
|
27
|
+
@paths << LogEntryPath.new(:kind => kind, :action => action, :name => name)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def message
|
32
|
+
@msg
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_s
|
36
|
+
[ @revision, @author, @date, @msg, @paths ].collect { |x| x.to_s }.join " "
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class LogEntryPath
|
41
|
+
attr_reader :kind, :action, :name
|
42
|
+
|
43
|
+
def initialize args = Hash.new
|
44
|
+
@kind = args[:kind]
|
45
|
+
@action = args[:action]
|
46
|
+
@name = args[:name]
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_s
|
50
|
+
@name
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'svnx/command'
|
5
|
+
|
6
|
+
module SVNx
|
7
|
+
class StatusCommandLine < CommandLine
|
8
|
+
def initialize args = Array.new
|
9
|
+
super "status", args.to_a
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class StatusCommandArgs < CommandArgs
|
14
|
+
def to_a
|
15
|
+
ary = Array.new
|
16
|
+
if @path
|
17
|
+
ary << @path
|
18
|
+
end
|
19
|
+
ary
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class StatusCommand < Command
|
24
|
+
def command_line
|
25
|
+
StatusCommandLine.new @args
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'svnx/status/entry'
|
5
|
+
require 'svnx/entries'
|
6
|
+
|
7
|
+
module SVNx::Status
|
8
|
+
class Entries < SVNx::Entries
|
9
|
+
def get_elements doc
|
10
|
+
doc.elements['status'].elements['target'].elements
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_entry xmlelement
|
14
|
+
Entry.new :xmlelement => xmlelement
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'svnx/entry'
|
5
|
+
require 'svnx/action'
|
6
|
+
|
7
|
+
module SVNx; module Status; end; end
|
8
|
+
|
9
|
+
module SVNx::Status
|
10
|
+
class Entry < SVNx::Entry
|
11
|
+
|
12
|
+
attr_reader :status
|
13
|
+
attr_reader :path
|
14
|
+
attr_reader :status_revision
|
15
|
+
attr_reader :action
|
16
|
+
|
17
|
+
def initialize args = Hash.new
|
18
|
+
super
|
19
|
+
@action = SVNx::Action.new @status
|
20
|
+
end
|
21
|
+
|
22
|
+
def set_from_xml xmldoc
|
23
|
+
stelmt = xmldoc.elements['status']
|
24
|
+
tgt = stelmt.elements['target']
|
25
|
+
|
26
|
+
set_attr_var tgt, 'path'
|
27
|
+
|
28
|
+
if entry = tgt.elements['entry']
|
29
|
+
set_from_element entry
|
30
|
+
else
|
31
|
+
@status = "unchanged"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def set_from_element elmt
|
36
|
+
set_attr_var elmt, 'path'
|
37
|
+
|
38
|
+
wcstatus = elmt.elements['wc-status']
|
39
|
+
@status = wcstatus.attributes['item']
|
40
|
+
@status_revision = wcstatus.attributes['revision']
|
41
|
+
|
42
|
+
if commit = wcstatus.elements['commit']
|
43
|
+
@commit_revision = commit.attributes['revision']
|
44
|
+
else
|
45
|
+
@commit_revision = nil
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_s
|
50
|
+
"path: #{@path}; status: #{@status}"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'system/command/line'
|
5
|
+
require 'zlib'
|
6
|
+
require 'logue/loggable'
|
7
|
+
|
8
|
+
module System
|
9
|
+
class CacheFile
|
10
|
+
include Logue::Loggable
|
11
|
+
|
12
|
+
attr_reader :output
|
13
|
+
|
14
|
+
def initialize cache_dir, args
|
15
|
+
@args = args
|
16
|
+
@pn = Pathname.new(cache_dir) + (args.join('-').gsub('/', '_slash_') + '.gz')
|
17
|
+
@output = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def save_file
|
21
|
+
@pn.parent.mkpath unless @pn.parent.exist?
|
22
|
+
@pn.unlink if @pn.exist?
|
23
|
+
Zlib::GzipWriter.open(@pn.to_s) do |gz|
|
24
|
+
gz.puts @output
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def read_file
|
29
|
+
Zlib::GzipReader.open(@pn.to_s) do |gz|
|
30
|
+
@output = gz.readlines
|
31
|
+
end
|
32
|
+
@output
|
33
|
+
end
|
34
|
+
|
35
|
+
def readlines
|
36
|
+
if @pn.exist?
|
37
|
+
read_file
|
38
|
+
else
|
39
|
+
cl = CommandLine.new @args
|
40
|
+
@output = cl.execute
|
41
|
+
save_file
|
42
|
+
@output
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_s
|
47
|
+
@pn.to_s
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'system/command/line'
|
5
|
+
require 'system/command/cachefile'
|
6
|
+
|
7
|
+
module System
|
8
|
+
class CachingCommandLine < CommandLine
|
9
|
+
# caches its input and values.
|
10
|
+
|
11
|
+
@@cache_dir = '/tmp' + Pathname.new($0).expand_path.to_s
|
12
|
+
|
13
|
+
class << self
|
14
|
+
def cache_dir
|
15
|
+
@@cache_dir
|
16
|
+
end
|
17
|
+
|
18
|
+
def cache_dir= dir
|
19
|
+
@@cache_dir = dir
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def cache_dir
|
24
|
+
@@cache_dir
|
25
|
+
end
|
26
|
+
|
27
|
+
def cache_file
|
28
|
+
CacheFile.new cache_dir, @args
|
29
|
+
end
|
30
|
+
|
31
|
+
def execute
|
32
|
+
cachefile = cache_file
|
33
|
+
@output = cachefile.readlines
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'system/command/arg'
|
6
|
+
require 'logue/loggable'
|
7
|
+
require 'riel/pathname'
|
8
|
+
require 'open3'
|
9
|
+
require 'rainbow'
|
10
|
+
|
11
|
+
module System
|
12
|
+
class CommandLine
|
13
|
+
include Logue::Loggable
|
14
|
+
|
15
|
+
attr_reader :output
|
16
|
+
|
17
|
+
def initialize args = Array.new
|
18
|
+
@args = args.dup
|
19
|
+
end
|
20
|
+
|
21
|
+
def << arg
|
22
|
+
# @args << Argument.new(arg)
|
23
|
+
@args << arg
|
24
|
+
end
|
25
|
+
|
26
|
+
def execute
|
27
|
+
cmd = to_command
|
28
|
+
|
29
|
+
info "cmd: #{cmd}".color("8A8A43")
|
30
|
+
|
31
|
+
# cmd << " 2>&1"
|
32
|
+
|
33
|
+
# I want to use popen3, but the version that works (sets $?) is in 1.9.x,
|
34
|
+
# not 1.8.x:
|
35
|
+
IO.popen(cmd + " 2>&1") do |io|
|
36
|
+
@output = io.readlines
|
37
|
+
end
|
38
|
+
|
39
|
+
if $? && $?.exitstatus != 0
|
40
|
+
info "cmd: #{cmd}".color(:red)
|
41
|
+
info "$?: #{$?.inspect}".color(:red)
|
42
|
+
info "$?.exitstatus: #{$? && $?.exitstatus}".color(:red)
|
43
|
+
raise "ERROR running command '#{cmd}': #{@output[-1]}"
|
44
|
+
end
|
45
|
+
|
46
|
+
@output
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_command
|
50
|
+
@args.join ' '
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'tc'
|
5
|
+
require 'svnx/action'
|
6
|
+
|
7
|
+
module SVNx
|
8
|
+
class ActionTestCase < PVN::TestCase
|
9
|
+
def assert_action_equals expadd, expdel, expmod, expunver, *vals
|
10
|
+
vals.each do |val|
|
11
|
+
action = Action.new val
|
12
|
+
msg = "value: #{val}"
|
13
|
+
assert_equal expadd, action.added?, msg
|
14
|
+
assert_equal expdel, action.deleted?, msg
|
15
|
+
assert_equal expmod, action.modified?, msg
|
16
|
+
assert_equal expunver, action.unversioned?, msg
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_added
|
21
|
+
assert_action_equals true, false, false, false, 'added', 'A'
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_deleted
|
25
|
+
assert_action_equals false, true, false, false, 'deleted', 'D'
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_modified
|
29
|
+
assert_action_equals false, false, true, false, 'modified', 'M'
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_unversioned
|
33
|
+
assert_action_equals false, false, false, true, 'unversioned', '?'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'svnx/info/tc'
|
5
|
+
require 'svnx/info/entries'
|
6
|
+
|
7
|
+
module SVNx::Info
|
8
|
+
class EntriesTestCase < SVNx::Info::TestCase
|
9
|
+
def assert_info_entry_equals entry, path, kind, revision
|
10
|
+
assert_entry_equals entry, :path => path, :kind => 'file', :url => EXPROOT + '/' + path, :root => EXPROOT, :revision => revision
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_create_from_xml
|
14
|
+
entries = Entries.new :xmllines => Resources::PTP_INFO_SIXTH_TXT_DOG_RB_FIRST_TXT.readlines
|
15
|
+
assert_equal 3, entries.size
|
16
|
+
|
17
|
+
assert_info_entry_equals entries[0], 'dirzero/SixthFile.txt', 'file', '22'
|
18
|
+
assert_info_entry_equals entries[1], 'src/ruby/dog.rb', 'file', '0'
|
19
|
+
assert_info_entry_equals entries[2], 'FirstFile.txt', 'file', '22'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|