pvn 0.0.9 → 0.0.10

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.
data/lib/pvn.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module PVN
2
- VERSION = '0.0.9'
2
+ VERSION = '0.0.10'
3
3
  end
@@ -84,22 +84,22 @@ module PVN::App
84
84
  def run_help args
85
85
  forwhat = args[0]
86
86
 
87
- cls = SUBCOMMANDS.find do |cls|
88
- cls.getdoc.subcommands.include? forwhat
87
+ SUBCOMMANDS.each do |sc|
88
+ puts sc
89
+ if sc.matches_subcommand? forwhat
90
+ sc.new(%w{ --help })
91
+ exit 0
92
+ end
89
93
  end
90
94
 
91
- if cls
92
- cls.to_doc
93
- else
94
- puts "usage: pvn [--verbose] <command> [<options>] [<args>]"
95
- puts "PVN, version #{PVN::VERSION}"
96
- puts
97
- puts "PVN has the subcommands:"
98
- SUBCOMMANDS.each do |sc|
99
- printf " %-10s %s\n", sc.getdoc.subcommands[0], sc.getdoc.description
100
- end
95
+ puts "usage: pvn [--verbose] <command> [<options>] [<args>]"
96
+ puts "PVN, version #{PVN::VERSION}"
97
+ puts
98
+ puts "PVN has the subcommands:"
99
+ SUBCOMMANDS.each do |sc|
100
+ printf " %-10s %s\n", sc.getdoc.subcommands[0], sc.getdoc.description
101
101
  end
102
- exit(0)
102
+ exit 0
103
103
  end
104
104
  end
105
105
  end
@@ -5,6 +5,8 @@ require 'pvn/io/element'
5
5
  require 'pvn/log/formatter/entries_formatter'
6
6
  require 'pvn/log/options'
7
7
  require 'pvn/command/command'
8
+ require 'pvn/log/entries'
9
+ require 'pvn/log/user_entries'
8
10
 
9
11
  module PVN::Log
10
12
  class Command < PVN::Command::Command
@@ -28,7 +30,7 @@ module PVN::Log
28
30
  example "pvn log -3 foo.rb", "Prints the log entry for revision (HEAD - 3)."
29
31
  example "pvn log +3 foo.rb", "Prints the 3rd log entry."
30
32
  example "pvn log -l 10 --no-color", "Prints the latest 10 entries, uncolorized."
31
- example "pvn log -r 122 -v", "Prints log entry for revision 122, with the files in that change."
33
+ example "pvn log -r 122 -f", "Prints log entry for revision 122, including the files in that change."
32
34
  example "pvn log -u barney", "Prints log entries only for user 'barney', with the default limit."
33
35
 
34
36
  def init options
@@ -39,9 +41,11 @@ module PVN::Log
39
41
  info "paths: #{paths}"
40
42
 
41
43
  allentries = Array.new
44
+
45
+ entcls = options.user ? UserEntries : Entries
42
46
 
43
47
  paths.each do |path|
44
- allentries.concat find_entries_for_path path, options
48
+ allentries.concat entcls.new(path, options).entries
45
49
  end
46
50
 
47
51
  # we can show relative revisions for a single path, without filtering by
@@ -56,51 +60,5 @@ module PVN::Log
56
60
  ef = PVN::Log::EntriesFormatter.new options.color, allentries, from_head, from_tail
57
61
  puts ef.format
58
62
  end
59
-
60
- def find_entries_for_path path, options
61
- cmdargs = Hash.new
62
- cmdargs[:path] = path
63
-
64
- [ :limit, :verbose, :revision ].each do |field|
65
- cmdargs[field] = options.send field
66
- end
67
-
68
- if options.user
69
- cmdargs[:limit] = nil
70
- end
71
-
72
- # we can't cache this, because we don't know if there has been an svn
73
- # update since the previous run:
74
- cmdargs[:use_cache] = false
75
-
76
- logargs = SVNx::LogCommandArgs.new cmdargs
77
- elmt = PVN::IO::Element.new :local => path || '.'
78
- log = elmt.log logargs
79
- entries = log.entries
80
-
81
- info { "options: #{options}" }
82
- info { "options.user: #{options.user}" }
83
-
84
- if options.user
85
- entries = find_entries_for_user entries, options.user, options.limit
86
- info { "entries: #{entries}" }
87
-
88
- # don't show relative revisions, since we've got a slice out of the list:
89
- from_head = nil
90
- from_tail = nil
91
- end
92
-
93
- entries
94
- end
95
-
96
- def find_entries_for_user entries, user, limit
97
- entries = entries.select { |entry| entry.author == user }
98
-
99
- raise "ERROR: no matching log entries for '#{user}'" if entries.empty?
100
-
101
- info { "entries: #{entries}" }
102
-
103
- limit ? entries[0 ... limit] : entries
104
- end
105
63
  end
106
64
  end
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'svnx/log/command'
5
+ require 'svnx/log/entries'
6
+
7
+ module PVN::Log
8
+ class Entries < SVNx::Log::Entries
9
+ include Loggable
10
+
11
+ def initialize path, options
12
+ cmdargs = create_cmd_args options, path
13
+ cmdargs[:path] = path
14
+
15
+ info "cmdargs: #{cmdargs}".magenta
16
+
17
+ logargs = SVNx::LogCommandArgs.new cmdargs
18
+ cmd = SVNx::LogCommand.new logargs
19
+
20
+ super :xmllines => cmd.execute
21
+
22
+ info { "options: #{options}" }
23
+ info { "options.user: #{options.user}".yellow }
24
+ end
25
+
26
+ def create_cmd_args options, path
27
+ cmdargs = Hash.new
28
+ cmdargs[:path] = path
29
+
30
+ [ :limit, :revision ].each do |field|
31
+ cmdargs[field] = options.send field
32
+ end
33
+
34
+ cmdargs[:verbose] = options.files
35
+
36
+ # we can't cache this, because we don't know if there has been an svn
37
+ # update since the previous run:
38
+ cmdargs[:use_cache] = false
39
+ cmdargs
40
+ end
41
+ end
42
+ end
@@ -23,7 +23,7 @@ module PVN::Log
23
23
  end
24
24
 
25
25
  def format
26
- lines = add_field(entry.revision, :revision)
26
+ lines = add_field entry.revision, :revision
27
27
  negidx = (-1 - idx).to_s
28
28
 
29
29
  if from_head
@@ -24,6 +24,12 @@ module PVN::Log
24
24
  end
25
25
  end
26
26
 
27
+ class FilesOption < PVN::BooleanOption
28
+ def initialize optargs = Hash.new
29
+ super :files, '-f', [ "list the files in the change" ], false
30
+ end
31
+ end
32
+
27
33
  class UserOption < PVN::Option
28
34
  def initialize optargs = Hash.new
29
35
  super :user, '-u', "show only changes for the given user", nil, :as_cmdline_option => nil
@@ -36,6 +42,6 @@ module PVN::Log
36
42
  has_option :help, PVN::Command::HelpOption
37
43
  has_option :limit, LimitOption
38
44
  has_option :user, UserOption
39
- has_option :verbose, PVN::BooleanOption, [ :verbose, '-v', [ "include the files in the change" ], false ]
45
+ has_option :files, FilesOption
40
46
  end
41
47
  end
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'pvn/log/entries'
5
+
6
+ module PVN::Log
7
+ class UserEntries < PVN::Log::Entries
8
+ include Loggable
9
+
10
+ def initialize path, options
11
+ @user = options.user
12
+ @limit = options.limit
13
+
14
+ super
15
+
16
+ filter_entries_for_user
17
+ end
18
+
19
+ def create_cmd_args options, path
20
+ cmdargs = super
21
+ cmdargs[:limit] = nil
22
+ cmdargs
23
+ end
24
+
25
+ def filter_entries_for_user
26
+ userentries = Hash.new
27
+ each do |entry|
28
+ break if userentries.size >= @limit
29
+ if entry.author == @user
30
+ userentries[userentries.size] = entry
31
+ end
32
+ end
33
+
34
+ raise "ERROR: no matching log entries for '#{@user}'" if userentries.empty?
35
+
36
+ @entries = userentries
37
+ end
38
+ end
39
+ end
@@ -19,7 +19,8 @@ module PVN::Pct
19
19
 
20
20
  modified.each do |entry|
21
21
  info "entry.path: #{entry.path}"
22
- catcmd = SVNx::CatCommand.new entry.path
22
+ catargs = SVNx::CatCommandArgs.new :path => entry.path, :use_cache => false
23
+ catcmd = SVNx::CatCommand.new catargs
23
24
  svn_count = catcmd.execute.size
24
25
  local_count = Pathname.new(entry.path).readlines.size
25
26
 
@@ -17,6 +17,10 @@ module PVN
17
17
  end
18
18
  end
19
19
 
20
+ def description
21
+ REVISION_DESCRIPTION
22
+ end
23
+
20
24
  def resolve_value optset, unprocessed
21
25
  newvalues = Array.new
22
26
  currvalues = value
@@ -11,7 +11,11 @@ module PVN
11
11
  def initialize revargs = Hash.new
12
12
  @fromdate = nil
13
13
  @todate = nil
14
- super :revision, '-r', REVISION_DESCRIPTION, nil, revargs
14
+ super :revision, '-r', description, nil, revargs
15
+ end
16
+
17
+ def description
18
+ REVISION_DESCRIPTION
15
19
  end
16
20
 
17
21
  def to_svn_revision_date date
@@ -8,13 +8,6 @@ module PVN
8
8
  class RevisionRegexpOption < PVN::RevisionOption
9
9
  TAG_RE = Regexp.new '^(?:([\-\+]\d+)|(-r(.+)))$'
10
10
 
11
- REVISION_DESCRIPTION = [ "revision to apply.",
12
- "ARG can be relative, of the form:",
13
- " +N : N revisions from the BASE",
14
- " -N : N revisions from the HEAD,",
15
- " when -1 is the previous revision" ,
16
- ]
17
-
18
11
  def initialize revargs = Hash.new
19
12
  revargs[:regexp] = TAG_RE
20
13
  super
@@ -3,6 +3,7 @@
3
3
 
4
4
  require 'pvn/seek/options'
5
5
  require 'pvn/command/command'
6
+ require 'pvn/seek/path'
6
7
 
7
8
  module PVN::Seek
8
9
  class Command < PVN::Command::Command
@@ -11,18 +12,15 @@ module PVN::Seek
11
12
  description "Searches through revisions for a pattern match."
12
13
  usage "[OPTIONS] FILE..."
13
14
  summary [ "Goes through a set of revisions, looking for when a pattern",
14
- "first matched a line within a file." ]
15
-
16
- # summary [ "Goes through a set of revisions, looking for when a pattern",
17
- # "matched (the default), or when a pattern does not match.",
18
- # "This command therefore shows when a file changed to add",
19
- # "or remove something such as a method." ]
15
+ "first matched (the default), or when a pattern no longer matched.",
16
+ "This command therefore shows when a file was changed to add",
17
+ "or remove something such as a method." ]
20
18
 
21
19
  optscls
22
20
 
23
- example "pvn seek 'raise \w+Exception' foo.rb", "Shows when 'raise \w+Exception was added, through all revisions."
21
+ example "pvn seek 'raise \\w+Exception' foo.rb", "Shows when 'raise \\w+Exception was added, through all revisions."
24
22
  # example "pvn seek -r137:211 'raise \w+Exception' foo.rb", "As above, but only between revisions 137 and 211."
25
- # example "pvn seek --no-match 'void\s+reinitialize()' *.java", "Looks through Java files for when 'void reinitialize() does _not_ match."
23
+ example "pvn seek --removed 'void\\s+reinitialize()' *.java", "Looks through Java files for the latest revision when 'void reinitialize() does not match."
26
24
 
27
25
  def init options
28
26
  info "options: #{options.inspect}".red
@@ -35,77 +33,13 @@ module PVN::Seek
35
33
  paths = %w{ . } if paths.empty?
36
34
  info "paths: #{paths}".cyan
37
35
 
38
- # can handle only one path for now
39
-
40
- @path = paths[0]
41
-
42
- # should I embed glark in pvn?
43
-
44
- entries = find_log_entries @path
45
- seek entries, pattern, 0, entries.size
46
- end
47
-
48
- def matches? contents, pattern
49
- contents.each_with_index do |line, idx|
50
- # info "line: #{line}".cyan
51
- if line.index pattern
52
- info "line: #{line}".red
53
- return [ idx, line ]
54
- end
55
- end
56
- false
57
- end
58
-
59
- def cat revision
60
- info "path: #{@path}"
61
- info "revision: #{revision}"
62
- catargs = SVNx::CatCommandArgs.new :path => @path, :use_cache => false, :revision => revision
63
- cmd = SVNx::CatCommand.new catargs
64
- cmd.execute
65
- end
66
-
67
- def seek entries, pattern, from, to
68
- info "from: #{from}".cyan
69
- info "to: #{to}".cyan
36
+ info "options.revision: #{options.revision}".bold.black.on_cyan
70
37
 
71
- midpt = from + (to - from) / 2
72
- return nil if midpt + 1 >= to
38
+ seektype = options.removed ? :removed : :added
73
39
 
74
- entry = entries[midpt]
75
-
76
- lines = cat entry.revision
77
- info "entry.revision: #{entry.revision}"
78
- info "lines: #{lines.size}"
79
-
80
- if ref = matches?(lines, pattern)
81
- prevrev = entries[midpt + 1].revision
82
- info "prevrev: #{prevrev}"
83
- prevlines = cat prevrev
84
- info "prevlines: #{prevlines.size}"
85
-
86
- if !matches?(prevlines, pattern)
87
- info "ref: #{ref}"
88
- $io.puts "path: #{@path} revision: #{entry.revision}"
89
- $io.puts "#{@path}:#{ref[0]}: #{ref[1]}"
90
- else
91
- seek entries, pattern, midpt, to
92
- end
93
- else
94
- seek entries, pattern, from, midpt + 1
95
- end
96
- end
97
-
98
- ### $$$ this is sliced from Log::Command, from which many options will apply
99
- ### here (limit, user, revision)
100
- def find_log_entries path
101
- cmdargs = Hash.new
102
- cmdargs[:path] = path
103
- cmdargs[:use_cache] = false
104
-
105
- logargs = SVNx::LogCommandArgs.new cmdargs
106
- elmt = PVN::IO::Element.new :local => path || '.'
107
- log = elmt.log logargs
108
- entries = log.entries
40
+ # can handle only one path for now
41
+ seekpath = Path.new paths[0], pattern, options.revision
42
+ seekpath.seek seektype, options.color
109
43
  end
110
44
  end
111
45
  end
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/ruby -w
2
2
  # -*- ruby -*-
3
3
 
4
- require 'pvn/revision/revision_regexp_option'
4
+ require 'pvn/revision/multiple_revisions_option'
5
5
  require 'pvn/command/options'
6
+ require 'pvn/command/color_option'
6
7
 
7
8
  module PVN::Seek
8
9
  class MatchOption < PVN::BooleanOption
@@ -13,9 +14,35 @@ module PVN::Seek
13
14
  end
14
15
  end
15
16
 
17
+ class RemovedOption < PVN::BooleanOption
18
+ def initialize optargs = Hash.new
19
+ opts = Hash.new
20
+ super :removed, '-M', 'find where the pattern did not match', false, opts
21
+ end
22
+ end
23
+
24
+ class SeekRevisionOption < PVN::MultipleRevisionsRegexpOption
25
+ REVISION_DESCRIPTION = PVN::RevisionRegexpOption::REVISION_DESCRIPTION +
26
+ [
27
+ 'Zero, one, or two revisions may be specified:',
28
+ ' A single revision is the equivalent of -rN:HEAD.',
29
+ ' Multiple revisions are the equivalent of -rM:N.'
30
+ ]
31
+
32
+ def resolve_value optset, unprocessed
33
+ super optset, unprocessed[-1, 1]
34
+ end
35
+
36
+ def description
37
+ REVISION_DESCRIPTION
38
+ end
39
+ end
40
+
16
41
  class OptionSet < PVN::Command::OptionSet
17
- # has_option :revision, PVN::RevisionRegexpOption
42
+ has_option :revision, SeekRevisionOption
43
+ has_option :color, PVN::Command::ColorOption
18
44
  # has_option :match, MatchOption
45
+ has_option :removed, RemovedOption
19
46
  has_option :help, PVN::Command::HelpOption
20
47
  end
21
48
  end
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'svnx/cat/command'
5
+ require 'pvn/log/entries'
6
+
7
+ module PVN::Seek
8
+ class Match
9
+ attr_reader :index
10
+ attr_reader :lnum
11
+ attr_reader :line
12
+ attr_reader :entry
13
+
14
+ def initialize index, lnum, line, entry
15
+ @index = index
16
+ @lnum = lnum
17
+ @line = line
18
+ @entry = entry
19
+ end
20
+ end
21
+
22
+ class PathLogOptions
23
+ def initialize revision
24
+ @revision = revision
25
+ end
26
+
27
+ def limit; nil; end
28
+ def verbose; nil; end
29
+ def revision; @revision; end
30
+ def user; nil; end
31
+ def use_cache; nil; end
32
+ end
33
+
34
+ class Path
35
+ include Loggable
36
+
37
+ def initialize path, pattern, revision
38
+ @path = path
39
+ @pattern = pattern
40
+ @revision = revision
41
+ get_log_entries
42
+ end
43
+
44
+ def matches? entry
45
+ contents = cat entry.revision
46
+ contents.each_with_index do |line, lnum|
47
+ if line.index @pattern
48
+ info "line: #{line}".red
49
+ return [ entry, lnum, line ]
50
+ end
51
+ end
52
+ nil
53
+ end
54
+
55
+ def cat revision
56
+ info "path: #{@path}"
57
+ info "revision: #{revision}"
58
+ catargs = SVNx::CatCommandArgs.new :path => @path, :use_cache => true, :revision => revision
59
+ cmd = SVNx::CatCommand.new catargs
60
+ cmd.execute
61
+ end
62
+
63
+ def get_seek_criteria type = :added
64
+ if type == :added
65
+ Proc.new { |preventry, currentry| !currentry && preventry }
66
+ else
67
+ Proc.new { |preventry, currentry| !preventry && currentry }
68
+ end
69
+ end
70
+
71
+ def seek type, use_color
72
+ criteria = get_seek_criteria type
73
+ ref = seek_for criteria
74
+ if ref
75
+ # todo: use previous or current entry, and run through entry formatter in log:
76
+ log ref.entry.inspect.red
77
+ entry = @entries[ref.index]
78
+ info "entry: #{entry}"
79
+
80
+ info "use_color: #{use_color}"
81
+ fromrev = @entries[ref.index + 1].revision
82
+ torev = @entries[ref.index].revision
83
+ pathrev = nil
84
+ line = nil
85
+
86
+ if use_color
87
+ pathrev = "#{@path.yellow} -r#{fromrev.magenta}:#{torev.green}"
88
+ line = "#{ref.lnum}: #{ref.line.chomp.bold}"
89
+ else
90
+ pathrev = "#{@path} -r#{fromrev}:#{torev}"
91
+ line = "#{ref.lnum}: #{ref.line.chomp}"
92
+ end
93
+
94
+ $io.puts pathrev
95
+ $io.puts line
96
+ else
97
+ msg = type == :added ? "not found" : "not removed"
98
+ fromrev = @entries[-1].revision
99
+ torev = @entries[0].revision
100
+ $io.puts "#{msg} in revisions: #{fromrev} .. #{torev}"
101
+ end
102
+ end
103
+
104
+ def seek_for criteria
105
+ prevref = nil
106
+
107
+ (0 ... @entries.size).each do |idx|
108
+ entry = @entries[idx]
109
+ ref = matches? entry
110
+
111
+ if idx == 0
112
+ prevref = ref
113
+ next
114
+ end
115
+
116
+ info "idx: #{idx}; entry: #{entry}"
117
+ info "ref: #{ref}"
118
+ info "prevref: #{prevref}"
119
+
120
+ if matchref = criteria.call(prevref, ref)
121
+ info "matchref: #{matchref}"
122
+ return Match.new idx - 1, matchref[1], matchref[2], matchref[0]
123
+ end
124
+
125
+ info "ref: #{ref}"
126
+
127
+ if ref
128
+ prevref = ref
129
+ end
130
+ end
131
+ nil
132
+ end
133
+
134
+ def get_log_entries
135
+ rev = if @revision
136
+ if @revision.size == 1
137
+ [ @revision[0], 'HEAD' ].join(':')
138
+ else
139
+ @revision.join(':')
140
+ end
141
+ else
142
+ nil
143
+ end
144
+
145
+ logentries = PVN::Log::Entries.new @path, PathLogOptions.new(rev)
146
+ @entries = logentries.entries
147
+ end
148
+ end
149
+ end
@@ -4,10 +4,11 @@
4
4
  require 'svnx/command'
5
5
 
6
6
  module SVNx
7
- class CatCommandLine < CommandLine
7
+ module CatCmdLine
8
8
  # this can be either an Array (for which to_a returns itself), or
9
9
  # a CommandArgs, which also has to_a.
10
10
  def initialize args = Array.new
11
+ info "args: #{args}"
11
12
  super "cat", args.to_a
12
13
  end
13
14
 
@@ -15,6 +16,14 @@ module SVNx
15
16
  false
16
17
  end
17
18
  end
19
+
20
+ class CatCommandLine < CommandLine
21
+ include CatCmdLine
22
+ end
23
+
24
+ class CatCommandLineCaching < CachingCommandLine
25
+ include CatCmdLine
26
+ end
18
27
 
19
28
  class CatCommandArgs < CommandArgs
20
29
  attr_reader :revision
@@ -41,8 +50,14 @@ module SVNx
41
50
  end
42
51
 
43
52
  class CatCommand < Command
53
+ def initialize args
54
+ @use_cache = args.use_cache
55
+ super
56
+ end
57
+
44
58
  def command_line
45
- CatCommandLine.new @args
59
+ cls = @use_cache ? CatCommandLineCaching : CatCommandLine
60
+ cls.new @args
46
61
  end
47
62
  end
48
63
  end
data/lib/svnx/command.rb CHANGED
@@ -8,11 +8,17 @@ require 'system/command/line'
8
8
  # this replaces svnx/lib/command/svncommand.
9
9
 
10
10
  module SVNx
11
- class CommandLine < System::CommandLine
12
- def initialize subcmd, args = Array.new
11
+ DEFAULT_CACHE_DIR = '/tmp/svnx'
12
+ TMP_DIR_ENV_VARNAME = 'SVNX_TMP_DIR'
13
+
14
+ module CmdLine
15
+ include Loggable
16
+
17
+ def initialize subcmd, args
13
18
  info "args: #{args}"
14
19
  cmdargs = [ 'svn', subcmd ]
15
20
  cmdargs << '--xml' if uses_xml?
21
+ info "cmdargs: #{cmdargs}"
16
22
  cmdargs.concat args
17
23
  info "cmdargs: #{cmdargs}"
18
24
  super cmdargs
@@ -21,20 +27,18 @@ module SVNx
21
27
  def uses_xml?
22
28
  true
23
29
  end
24
- end
25
30
 
26
- class CachingCommandLine < System::CachingCommandLine
27
- def initialize subcmd, args = Array.new
28
- info "args: #{args}"
29
- cmdargs << '--xml' if uses_xml?
30
- cmdargs.concat args
31
- info "cmdargs: #{cmdargs}"
32
- super cmdargs
31
+ def cache_dir
32
+ ENV[TMP_DIR_ENV_VARNAME] || DEFAULT_CACHE_DIR
33
33
  end
34
+ end
34
35
 
35
- def uses_xml?
36
- true
37
- end
36
+ class CommandLine < System::CommandLine
37
+ include CmdLine
38
+ end
39
+
40
+ class CachingCommandLine < System::CachingCommandLine
41
+ include CmdLine
38
42
  end
39
43
 
40
44
  class CommandArgs
data/lib/svnx/entries.rb CHANGED
@@ -13,12 +13,10 @@ module SVNx
13
13
  attr_reader :size
14
14
 
15
15
  def initialize args = Hash.new
16
- # it's a hash, but indexed with integers.
16
+ # it's a hash, but indexed with integers, for non-sequential access:
17
17
  @entries = Hash.new
18
18
 
19
19
  if xmllines = args[:xmllines]
20
- # this is preferred
21
-
22
20
  if xmllines.kind_of? Array
23
21
  xmllines = xmllines.join ''
24
22
  end
@@ -33,9 +31,11 @@ module SVNx
33
31
  end
34
32
 
35
33
  def get_elements doc
34
+ raise "get_elements must be implemented for: #{self.class}"
36
35
  end
37
36
 
38
37
  def create_entry xmlelement
38
+ raise "create_entry must be implemented for: #{self.class}"
39
39
  end
40
40
 
41
41
  # this doesn't handle negative indices
@@ -46,12 +46,11 @@ module SVNx
46
46
  if idx < 0 && idx >= size
47
47
  raise "error: index #{idx} is not in range(0 .. #{size})"
48
48
  end
49
-
50
49
  @entries[idx] = create_entry(@elements[idx + 1])
51
50
  end
52
51
 
53
52
  def each(&blk)
54
- # all elements must be processed before this can happen:
53
+ # all elements must be processed before each can run:
55
54
  if @elements
56
55
  # a little confusing here: REXML does each_with_index with idx
57
56
  # zero-based, but elements[0] is invalid.
@@ -1,33 +1,26 @@
1
1
  #!/usr/bin/ruby -w
2
2
  # -*- ruby -*-
3
3
 
4
- require 'rubygems'
5
- require 'riel'
6
4
  require 'system/command/line'
7
5
  require 'system/command/caching'
8
6
  require 'svnx/command'
9
7
 
10
8
  module SVNx
11
- DEFAULT_CACHE_DIR = '/tmp/svnx'
12
-
13
- TMP_DIR_ENV_VARNAME = 'SVNX_TMP_DIR'
14
-
15
- class LogCommandLine < CommandLine
9
+ module LogCmdLine
10
+ # this can be either an Array (for which to_a returns itself), or
11
+ # a CommandArgs, which also has to_a.
16
12
  def initialize args = Array.new
17
13
  info "args: #{args}"
18
14
  super "log", args.to_a
19
15
  end
20
16
  end
21
17
 
22
- class LogCommandLineCaching < CachingCommandLine
23
- def initialize args = Array.new
24
- info "args: #{args}"
25
- super "log", args.to_a
26
- end
18
+ class LogCommandLine < CommandLine
19
+ include LogCmdLine
20
+ end
27
21
 
28
- def cache_dir
29
- ENV[TMP_DIR_ENV_VARNAME] || DEFAULT_CACHE_DIR
30
- end
22
+ class LogCommandLineCaching < CachingCommandLine
23
+ include LogCmdLine
31
24
  end
32
25
 
33
26
  class LogCommandArgs < CommandArgs
@@ -81,7 +74,8 @@ module SVNx
81
74
  end
82
75
 
83
76
  def command_line
84
- @use_cache ? LogCommandLineCaching.new(@args) : LogCommandLine.new(@args)
77
+ cls = @use_cache ? LogCommandLineCaching : LogCommandLine
78
+ cls.new @args
85
79
  end
86
80
  end
87
81
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pvn
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 11
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 9
10
- version: 0.0.9
9
+ - 10
10
+ version: 0.0.10
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jeff Pace
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-10-19 00:00:00 -04:00
18
+ date: 2012-11-05 00:00:00 -05:00
19
19
  default_executable: pvn
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -90,6 +90,7 @@ files:
90
90
  - lib/pvn/util/textlines.rb
91
91
  - lib/pvn/util/color_formatter.rb
92
92
  - lib/pvn/util/diffcount.rb
93
+ - lib/pvn/seek/path.rb
93
94
  - lib/pvn/seek/options.rb
94
95
  - lib/pvn/seek/command.rb
95
96
  - lib/pvn/config.rb
@@ -122,8 +123,10 @@ files:
122
123
  - lib/pvn/pct/command.rb
123
124
  - lib/pvn/pct/differ.rb
124
125
  - lib/pvn/doc.rb
126
+ - lib/pvn/log/user_entries.rb
125
127
  - lib/pvn/log/options.rb
126
128
  - lib/pvn/log/command.rb
129
+ - lib/pvn/log/entries.rb
127
130
  - lib/pvn/log/formatter/entry_formatter.rb
128
131
  - lib/pvn/log/formatter/summary_formatter.rb
129
132
  - lib/pvn/log/formatter/entries_formatter.rb