svnx 0.0.2
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 +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
|