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
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7568851539f67dc7fd63364ea9f321cbd2778eb2
|
4
|
+
data.tar.gz: 250ae23ce41faca126887be909434539400b30df
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7349591f27fcaf6c89152c07cef03928814eb5bceaee3efcf49421396734604f57e8c580927d8ead613321857afa981b999a5b774e592ce0047e8415e49c49e6
|
7
|
+
data.tar.gz: b25d5d269537dc85b929a135a34f0aa49db11ad9c2721a39255b68eb9172a083f9e37ea93f79c89fa0a86fe4c05c3afd56850f334b8f9967f58908550a6b4d4a
|
data/lib/svnx.rb
ADDED
data/lib/svnx/action.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'riel'
|
6
|
+
require 'logue/loggable'
|
7
|
+
|
8
|
+
module SVNx
|
9
|
+
class Action
|
10
|
+
include Logue::Loggable, Comparable
|
11
|
+
|
12
|
+
attr_reader :type
|
13
|
+
|
14
|
+
STATUS_TO_TYPE = Hash.new
|
15
|
+
|
16
|
+
def self.add_type sym, str, char
|
17
|
+
[ sym, str, char ].each do |key|
|
18
|
+
STATUS_TO_TYPE[key] = sym
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
add_type :added, 'added', 'A'
|
23
|
+
add_type :deleted, 'deleted', 'D'
|
24
|
+
add_type :modified, 'modified', 'M'
|
25
|
+
add_type :unversioned, 'unversioned', '?'
|
26
|
+
|
27
|
+
STATUS_TO_TYPE.values.uniq.each do |val|
|
28
|
+
methname = val.to_s + '?'
|
29
|
+
define_method methname do
|
30
|
+
instance_eval do
|
31
|
+
@type == STATUS_TO_TYPE[val]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def initialize str
|
37
|
+
@type = STATUS_TO_TYPE[str]
|
38
|
+
end
|
39
|
+
|
40
|
+
def <=> other
|
41
|
+
@type.to_s <=> other.type.to_s
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_s
|
45
|
+
@type.to_s
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'svnx/command'
|
5
|
+
require 'system/command/caching'
|
6
|
+
|
7
|
+
module SVNx
|
8
|
+
module CatCmdLine
|
9
|
+
# this can be either an Array (for which to_a returns itself), or a
|
10
|
+
# CommandArgs, which also has to_a.
|
11
|
+
def initialize args = Array.new
|
12
|
+
super "cat", args.to_a
|
13
|
+
end
|
14
|
+
|
15
|
+
def uses_xml?
|
16
|
+
false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class CatCommandLine < CommandLine
|
21
|
+
include CatCmdLine
|
22
|
+
end
|
23
|
+
|
24
|
+
class CatCommandLineCaching < CachingCommandLine
|
25
|
+
include CatCmdLine
|
26
|
+
end
|
27
|
+
|
28
|
+
class CatCommandArgs < CommandArgs
|
29
|
+
attr_reader :revision
|
30
|
+
attr_reader :use_cache
|
31
|
+
|
32
|
+
def initialize args = Hash.new
|
33
|
+
@use_cache = args[:use_cache].nil? || args[:use_cache]
|
34
|
+
@revision = args[:revision]
|
35
|
+
super
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_a
|
39
|
+
ary = Array.new
|
40
|
+
if @revision
|
41
|
+
ary << "-r#{@revision}"
|
42
|
+
end
|
43
|
+
|
44
|
+
if @path
|
45
|
+
ary << @path
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class CatCommand < Command
|
51
|
+
def initialize args
|
52
|
+
@use_cache = args.use_cache
|
53
|
+
super
|
54
|
+
end
|
55
|
+
|
56
|
+
def command_line
|
57
|
+
cls = @use_cache ? CatCommandLineCaching : CatCommandLine
|
58
|
+
cls.new @args
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/svnx/command.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'riel'
|
6
|
+
require 'system/command/line'
|
7
|
+
require 'logue/loggable'
|
8
|
+
require 'system/command/caching'
|
9
|
+
|
10
|
+
# this replaces svnx/lib/command/svncommand.
|
11
|
+
|
12
|
+
module SVNx
|
13
|
+
DEFAULT_CACHE_DIR = '/tmp/svnx'
|
14
|
+
TMP_DIR_ENV_VARNAME = 'SVNX_TMP_DIR'
|
15
|
+
|
16
|
+
module CmdLine
|
17
|
+
include Logue::Loggable
|
18
|
+
|
19
|
+
def initialize subcmd, args
|
20
|
+
# info "args: #{args}"
|
21
|
+
cmdargs = [ 'svn', subcmd ]
|
22
|
+
cmdargs << '--xml' if uses_xml?
|
23
|
+
# info "cmdargs: #{cmdargs}"
|
24
|
+
cmdargs.concat args
|
25
|
+
# info "cmdargs: #{cmdargs}"
|
26
|
+
super cmdargs
|
27
|
+
end
|
28
|
+
|
29
|
+
def uses_xml?
|
30
|
+
true
|
31
|
+
end
|
32
|
+
|
33
|
+
def cache_dir
|
34
|
+
ENV[TMP_DIR_ENV_VARNAME] || DEFAULT_CACHE_DIR
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class CommandLine < System::CommandLine
|
39
|
+
include CmdLine
|
40
|
+
end
|
41
|
+
|
42
|
+
class CachingCommandLine < System::CachingCommandLine
|
43
|
+
include CmdLine
|
44
|
+
end
|
45
|
+
|
46
|
+
class CommandArgs
|
47
|
+
include Logue::Loggable
|
48
|
+
|
49
|
+
attr_accessor :path
|
50
|
+
|
51
|
+
def initialize args = Hash.new
|
52
|
+
@path = args[:path]
|
53
|
+
end
|
54
|
+
|
55
|
+
def to_a
|
56
|
+
[ @path ].compact
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class Command
|
61
|
+
include Logue::Loggable
|
62
|
+
|
63
|
+
attr_reader :output
|
64
|
+
|
65
|
+
def initialize args
|
66
|
+
@args = args
|
67
|
+
end
|
68
|
+
|
69
|
+
def command_line
|
70
|
+
raise "must be implemented"
|
71
|
+
end
|
72
|
+
|
73
|
+
def execute
|
74
|
+
cmdline = command_line
|
75
|
+
cmdline.execute
|
76
|
+
@output = cmdline.output
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
data/lib/svnx/entries.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'rexml/document'
|
5
|
+
require 'logue/loggable'
|
6
|
+
|
7
|
+
module SVNx
|
8
|
+
# this is a parse/process on-demand list of entries, acting like an
|
9
|
+
# Enumerable.
|
10
|
+
|
11
|
+
class Entries
|
12
|
+
include Logue::Loggable, Enumerable
|
13
|
+
|
14
|
+
attr_reader :size
|
15
|
+
|
16
|
+
def initialize args = Hash.new
|
17
|
+
# it's a hash, but indexed with integers, for non-sequential access:
|
18
|
+
@entries = Hash.new
|
19
|
+
|
20
|
+
if xmllines = args[:xmllines]
|
21
|
+
if xmllines.kind_of? Array
|
22
|
+
xmllines = xmllines.join ''
|
23
|
+
end
|
24
|
+
|
25
|
+
doc = REXML::Document.new xmllines
|
26
|
+
|
27
|
+
@elements = get_elements doc
|
28
|
+
@size = @elements.size
|
29
|
+
elsif args[:xmlentries]
|
30
|
+
raise "argument xmlentries is no longer supported"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_elements doc
|
35
|
+
raise "get_elements must be implemented for: #{self.class}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def create_entry xmlelement
|
39
|
+
raise "create_entry must be implemented for: #{self.class}"
|
40
|
+
end
|
41
|
+
|
42
|
+
# this doesn't handle negative indices
|
43
|
+
def [] idx
|
44
|
+
if entry = @entries[idx]
|
45
|
+
return entry
|
46
|
+
end
|
47
|
+
if idx < 0 && idx >= size
|
48
|
+
raise "error: index #{idx} is not in range(0 .. #{size})"
|
49
|
+
end
|
50
|
+
@entries[idx] = create_entry(@elements[idx + 1])
|
51
|
+
end
|
52
|
+
|
53
|
+
def each(&blk)
|
54
|
+
# all elements must be processed before each can run:
|
55
|
+
if @elements
|
56
|
+
# a little confusing here: REXML does each_with_index with idx
|
57
|
+
# zero-based, but elements[0] is invalid.
|
58
|
+
@elements.each_with_index do |element, idx|
|
59
|
+
@entries[idx] ||= create_entry(element)
|
60
|
+
end
|
61
|
+
|
62
|
+
@elements = nil
|
63
|
+
end
|
64
|
+
|
65
|
+
@entries.keys.sort.collect { |idx| @entries[idx] }.each(&blk)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/lib/svnx/entry.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'riel'
|
6
|
+
require 'rexml/document'
|
7
|
+
require 'logue/loggable'
|
8
|
+
|
9
|
+
module SVNx
|
10
|
+
class Entry
|
11
|
+
include Logue::Loggable
|
12
|
+
|
13
|
+
def initialize args = Hash.new
|
14
|
+
if xmllines = args[:xmllines]
|
15
|
+
if xmllines.kind_of? Array
|
16
|
+
xmllines = xmllines.join ''
|
17
|
+
end
|
18
|
+
|
19
|
+
doc = REXML::Document.new xmllines
|
20
|
+
|
21
|
+
set_from_xml doc
|
22
|
+
elsif elmt = args[:xmlelement]
|
23
|
+
set_from_element elmt
|
24
|
+
else
|
25
|
+
raise "must be initialized with xmllines or xmlelement"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def set_from_xml xmldoc
|
30
|
+
raise "must be implemented"
|
31
|
+
end
|
32
|
+
|
33
|
+
def set_from_element elmt
|
34
|
+
raise "must be implemented"
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_attribute xmlelement, attrname
|
38
|
+
xmlelement.attributes[attrname]
|
39
|
+
end
|
40
|
+
|
41
|
+
def get_element_text xmlelement, elmtname
|
42
|
+
elmt = xmlelement.elements[elmtname]
|
43
|
+
# in my test svn repository, revision 1 doesn't have an author element:
|
44
|
+
(elmt && elmt.text) || ""
|
45
|
+
end
|
46
|
+
|
47
|
+
def set_attr_var xmlelement, varname
|
48
|
+
set_var varname, get_attribute(xmlelement, varname)
|
49
|
+
end
|
50
|
+
|
51
|
+
def set_elmt_var xmlelement, varname
|
52
|
+
set_var varname, get_element_text(xmlelement, varname)
|
53
|
+
end
|
54
|
+
|
55
|
+
def set_var varname, value
|
56
|
+
instance_variable_set '@' + varname, value
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/lib/svnx/exec.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'riel'
|
6
|
+
require 'svnx/cat/command'
|
7
|
+
require 'svnx/log/command'
|
8
|
+
require 'svnx/info/command'
|
9
|
+
require 'svnx/status/command'
|
10
|
+
|
11
|
+
# executes 'svn <command>' and returns the output as XML lines (by default,
|
12
|
+
# according to the underlying option).
|
13
|
+
module SVNx
|
14
|
+
class Exec
|
15
|
+
def cat path, revision, use_cache
|
16
|
+
cmdargs = CatCommandArgs.new :path => path, :revision => revision, :use_cache => use_cache
|
17
|
+
run_command CatCommand, cmdargs
|
18
|
+
end
|
19
|
+
|
20
|
+
def log path, revision, limit, verbose, use_cache
|
21
|
+
cmdargs = LogCommandArgs.new :path => path, :revision => revision, :limit => limit, :verbose => verbose, :use_cache => use_cache
|
22
|
+
run_command LogCommand, cmdargs
|
23
|
+
end
|
24
|
+
|
25
|
+
def info path, revision
|
26
|
+
cmdargs = InfoCommandArgs.new :path => path, :revision => revision
|
27
|
+
run_command InfoCommand, cmdargs
|
28
|
+
end
|
29
|
+
|
30
|
+
def status path, use_cache
|
31
|
+
cmdargs = StatusCommandArgs.new :path => path, :use_cache => use_cache
|
32
|
+
run_command StatusCommand, cmdargs
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
def run_command cmdcls, args
|
37
|
+
cmd = cmdcls.new args
|
38
|
+
cmd.execute
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'svnx/command'
|
5
|
+
require 'rainbow'
|
6
|
+
|
7
|
+
module SVNx
|
8
|
+
class InfoCommandLine < CommandLine
|
9
|
+
def initialize args = Array.new
|
10
|
+
info "args.to_a: #{args.to_a}".color(:blue)
|
11
|
+
super "info", args.to_a
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class InfoCommandArgs < CommandArgs
|
16
|
+
attr_reader :revision
|
17
|
+
|
18
|
+
def initialize args = Hash.new
|
19
|
+
@revision = args[:revision]
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_a
|
24
|
+
ary = Array.new
|
25
|
+
|
26
|
+
if @revision
|
27
|
+
[ @revision ].flatten.each do |rev|
|
28
|
+
ary << "-r#{rev}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
if @path
|
33
|
+
ary << @path
|
34
|
+
end
|
35
|
+
ary
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class InfoCommand < Command
|
40
|
+
def command_line
|
41
|
+
InfoCommandLine.new @args
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'svnx/info/entry'
|
5
|
+
require 'svnx/entries'
|
6
|
+
|
7
|
+
module SVNx::Info
|
8
|
+
class Entries < SVNx::Entries
|
9
|
+
def get_elements doc
|
10
|
+
doc.elements['info'].elements
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_entry xmlelement
|
14
|
+
Entry.new :xmlelement => xmlelement
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'svnx/entry'
|
5
|
+
|
6
|
+
module SVNx; module Info; end; end
|
7
|
+
|
8
|
+
module SVNx::Info
|
9
|
+
class Entry < SVNx::Entry
|
10
|
+
attr_reader :url
|
11
|
+
attr_reader :root
|
12
|
+
attr_reader :kind
|
13
|
+
attr_reader :path
|
14
|
+
attr_reader :revision
|
15
|
+
|
16
|
+
def set_from_xml xmldoc
|
17
|
+
entry = xmldoc.elements['info/entry']
|
18
|
+
set_from_element entry
|
19
|
+
end
|
20
|
+
|
21
|
+
def set_from_element elmt
|
22
|
+
set_attr_var elmt, 'kind'
|
23
|
+
set_attr_var elmt, 'path'
|
24
|
+
set_attr_var elmt, 'revision'
|
25
|
+
set_elmt_var elmt, 'url'
|
26
|
+
|
27
|
+
repo = elmt.elements['repository']
|
28
|
+
set_elmt_var repo, 'root'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|