pvn 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/lib/pvn/app/runner.rb +2 -0
  2. data/lib/pvn/command/command.rb +0 -5
  3. data/lib/pvn/diff/{path_revision.rb → change.rb} +1 -1
  4. data/lib/pvn/diff/changed_paths.rb +64 -0
  5. data/lib/pvn/diff/differ.rb +2 -62
  6. data/lib/pvn/diff/local_differ.rb +5 -63
  7. data/lib/pvn/diff/local_path.rb +69 -0
  8. data/lib/pvn/diff/log_path.rb +145 -0
  9. data/lib/pvn/diff/log_paths.rb +16 -6
  10. data/lib/pvn/diff/name.rb +23 -0
  11. data/lib/pvn/diff/path.rb +51 -19
  12. data/lib/pvn/diff/repository_differ.rb +15 -123
  13. data/lib/pvn/diff/status_paths.rb +5 -27
  14. data/lib/pvn/pct/differ.rb +1 -1
  15. data/lib/pvn/pct/local_differ.rb +0 -1
  16. data/lib/pvn/pct/repository_differ.rb +17 -14
  17. data/lib/pvn/seek/command.rb +111 -0
  18. data/lib/pvn/seek/options.rb +21 -0
  19. data/lib/pvn/{pct → util}/diffcount.rb +0 -0
  20. data/lib/pvn.rb +1 -1
  21. data/lib/svnx/action.rb +20 -25
  22. data/test/integration/pvn/diff/changed_paths_test.rb +109 -0
  23. data/test/integration/pvn/diff/local_differ_test.rb +4 -4
  24. data/test/integration/pvn/diff/log_paths_test.rb +2 -2
  25. data/test/integration/pvn/diff/repository_differ_test.rb +4 -13
  26. data/test/integration/pvn/diff/status_paths_test.rb +7 -7
  27. data/test/integration/pvn/pct/local_differ_test.rb +21 -0
  28. data/test/integration/pvn/pct/repository_differ_test.rb +40 -0
  29. data/test/unit/pvn/diff/change_test.rb +43 -0
  30. data/test/unit/pvn/diff/path_test.rb +4 -4
  31. data/test/unit/svnx/action_test.rb +14 -43
  32. metadata +20 -17
  33. data/lib/pvn/diff/revision.rb +0 -36
  34. data/lib/system/cachecmd.rb +0 -65
  35. data/lib/system/cmdexec.rb +0 -13
  36. data/lib/system/cmdline.rb +0 -70
  37. data/lib/system/command.rb +0 -72
  38. data/test/integration/pvn/pct/command_test.rb +0 -30
  39. data/test/unit/pvn/diff/path_revision_test.rb +0 -45
  40. data/test/unit/pvn/diff/revision_test.rb +0 -35
@@ -11,6 +11,7 @@ require 'pvn/log/command'
11
11
  require 'pvn/pct/command'
12
12
  require 'pvn/status/command'
13
13
  require 'pvn/diff/command'
14
+ require 'pvn/seek/command'
14
15
 
15
16
  # the old ones:
16
17
  # require 'pvn/diff/diffcmd'
@@ -31,6 +32,7 @@ module PVN::App
31
32
  PVN::Pct::Command,
32
33
  PVN::Status::Command,
33
34
  PVN::Diff::Command,
35
+ PVN::Seek::Command,
34
36
  # DescribeCommand,
35
37
  # WhereCommand,
36
38
  # UndeleteCommand,
@@ -32,11 +32,6 @@ module PVN::Command
32
32
  getdoc.summary = smry
33
33
  end
34
34
 
35
- ### $$$ remove this:
36
- def options opts
37
- getdoc.options.concat opts
38
- end
39
-
40
35
  def optscls
41
36
  getdoc.options.concat optset.options
42
37
  end
@@ -7,7 +7,7 @@ module PVN; module Diff; end; end
7
7
 
8
8
  # A Path Revision is the change to a path within a changelist.
9
9
  module PVN::Diff
10
- class PathRevision
10
+ class Change
11
11
  include Loggable
12
12
 
13
13
  attr_reader :revision
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'pvn/diff/log_paths'
5
+ require 'pvn/diff/status_paths'
6
+ require 'pvn/diff/local_path'
7
+ require 'pvn/revision/range'
8
+
9
+ module PVN::Diff
10
+ # represents both LogPaths and StatusPaths
11
+ class ChangedPaths
12
+ include Loggable
13
+
14
+ def initialize paths
15
+ @paths = paths
16
+ end
17
+
18
+ def diff_revision_to_working_copy revision, whitespace
19
+ fromrev = revision.from.value
20
+
21
+ info "revision: #{revision}".cyan
22
+ rev = PVN::Revision::Range.new revision.to_s, 'HEAD'
23
+ info "rev: #{rev}".cyan
24
+
25
+ logpaths = LogPaths.new rev, @paths
26
+ name_to_logpath = logpaths.to_map
27
+
28
+ statuspaths = StatusPaths.new revision, @paths
29
+ name_to_statuspath = statuspaths.to_map
30
+
31
+ ### $$$ log names and status names should have a Name class
32
+
33
+ names = Set.new
34
+ names.merge name_to_logpath.keys.collect { |name| name[1 .. -1] }
35
+ info "names: #{names.inspect}"
36
+
37
+ names.merge name_to_statuspath.keys
38
+ info "names: #{names.inspect}"
39
+
40
+ names.sort.each do |name|
41
+ info "name: #{name}"
42
+
43
+ ### $$$ silliness because I don't have Diff::Name integrated:
44
+ logname = '/' + name
45
+
46
+ logpath = name_to_logpath[logname]
47
+ info "logpaths: #{logpaths}"
48
+
49
+ stpath = name_to_statuspath[name]
50
+ info "stpath: #{stpath}"
51
+
52
+ frrev = nil
53
+
54
+ if logpath
55
+ chgrevs = logpath.revisions_later_than fromrev
56
+ logpath.diff_revision_to_working_copy revision, whitespace
57
+ else
58
+ # it's a local file only
59
+ stpath.show_diff whitespace
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -16,68 +16,8 @@ module PVN::Diff
16
16
  attr_reader :revision
17
17
 
18
18
  def initialize options
19
- end
20
-
21
- def to_revision_string rev
22
- rev ? "revision #{rev}" : "working copy"
23
- end
24
-
25
- def write_to_temp entry, lines
26
- Tempfile.open('pvn') do |to|
27
- topath = to.path
28
- to.puts lines
29
- to.close
30
- cmd = "diff -u"
31
- label = " -L '#{entry.path} (revision 0)'"
32
- 2.times do
33
- cmd << label
34
- end
35
- cmd << " #{frpath}"
36
- cmd << " #{entry.path}"
37
- IO.popen(cmd) do |io|
38
- puts io.readlines
39
- end
40
- end
41
- end
42
-
43
- def run_diff_command displaypath, fromrev, torev, frompath, topath
44
- cmd = "diff -u"
45
- if whitespace
46
- cmd << " -w"
47
- end
48
-
49
- [ fromrev, torev ].each do |rev|
50
- revstr = to_revision_string rev
51
- cmd << " -L '#{displaypath}\t(#{revstr})'"
52
- end
53
- cmd << " #{frompath}"
54
- cmd << " #{topath}"
55
-
56
- info "cmd: #{cmd}"
57
-
58
- $io.puts "Index: #{displaypath}"
59
- $io.puts "==================================================================="
60
- IO.popen(cmd) do |io|
61
- $io.puts io.readlines
62
- end
63
- end
64
-
65
- def run_diff displaypath, fromlines, fromrev, tolines, torev
66
- Tempfile.open('pvn') do |from|
67
- if fromlines
68
- from.puts fromlines
69
- end
70
- from.close
71
-
72
- Tempfile.open('pvn') do |to|
73
- if tolines
74
- to.puts tolines
75
- end
76
- to.close
77
-
78
- run_diff_command displaypath, fromrev, torev, from.path, to.path
79
- end
80
- end
19
+ @whitespace = options.whitespace
20
+ @options = options
81
21
  end
82
22
  end
83
23
  end
@@ -4,6 +4,8 @@
4
4
  require 'pvn/io/element'
5
5
  require 'pvn/diff/options'
6
6
  require 'pvn/diff/differ'
7
+ require 'pvn/diff/local_path'
8
+ # require 'pvn/diff/status_path'
7
9
 
8
10
  module PVN::Diff
9
11
  class LocalDiffer < Differ
@@ -18,29 +20,16 @@ module PVN::Diff
18
20
  # we sort only the sub-entries, so the order in which paths were specified
19
21
  # is preserved
20
22
 
21
- @whitespace = options.whitespace
22
-
23
23
  paths.each do |path|
24
24
  elmt = PVN::IO::Element.new :local => path
25
25
  entries = elmt.find_files_by_status
26
-
27
26
  allentries.concat entries.sort_by { |n| n.path }
28
27
  end
29
28
 
30
29
  allentries.each do |entry|
31
- show_entry entry
32
- end
33
- end
34
-
35
- def show_entry entry
36
- info "entry: #{entry.inspect}"
37
- case entry.status
38
- when 'modified'
39
- show_as_modified entry
40
- when 'deleted'
41
- show_as_deleted entry
42
- when 'added'
43
- show_as_added entry
30
+ next if entry.status == 'unversioned'
31
+ path = LocalPath.new entry
32
+ path.show_diff @whitespace
44
33
  end
45
34
  end
46
35
 
@@ -48,52 +37,5 @@ module PVN::Diff
48
37
  def use_cache?
49
38
  super && !against_head?
50
39
  end
51
-
52
- def against_head?
53
- @options.change.value.nil? && @options.revision.head?
54
- end
55
-
56
- def read_working_copy entry
57
- pn = Pathname.new entry.path
58
- pn.readlines
59
- end
60
-
61
- def create_element entry
62
- PVN::IO::Element.new :local => entry.path
63
- end
64
-
65
- def cat elmt
66
- elmt = PVN::IO::Element.new :local => elmt.local
67
- elmt.cat nil, :use_cache => false
68
- end
69
-
70
- def show_as_added entry
71
- fromlines = nil
72
- tolines = read_working_copy entry
73
-
74
- run_diff entry.path, fromlines, 0, tolines, 0
75
- end
76
-
77
- def get_latest_revision elmt
78
- svninfo = elmt.get_info
79
- svninfo.revision
80
- end
81
-
82
- def show_as_deleted entry
83
- elmt = create_element entry
84
-
85
- fromrev = get_latest_revision elmt
86
- lines = cat elmt
87
-
88
- run_diff entry.path, lines, fromrev, nil, nil
89
- end
90
-
91
- def show_as_modified entry
92
- elmt = create_element entry
93
- remotelines = cat elmt
94
- fromrev = get_latest_revision elmt
95
- wclines = read_working_copy entry
96
- run_diff entry.path, remotelines, fromrev, wclines, nil
97
- end
98
40
  end
99
41
  end
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'pvn/io/element'
5
+ require 'pvn/diff/path'
6
+
7
+ module PVN::Diff
8
+ class LocalPath < Path
9
+ # that's a Status::Entry
10
+ def initialize entry
11
+ @entry = entry
12
+ @elmt = create_element
13
+ name = entry.path
14
+ action = SVNx::Action.new @entry.status
15
+ revision = action.added? ? 0 : @elmt.get_info.revision
16
+ super name, revision, action, nil
17
+ end
18
+
19
+ def show_diff whitespace = nil
20
+ case @entry.status
21
+ when 'modified'
22
+ show_as_modified whitespace
23
+ when 'deleted'
24
+ show_as_deleted
25
+ when 'added'
26
+ show_as_added
27
+ end
28
+ end
29
+
30
+ ### $$$ todo: integrate these, from old diff/diffcmd
31
+ def use_cache?
32
+ super && !against_head?
33
+ end
34
+
35
+ def read_working_copy
36
+ pn = Pathname.new @entry.path
37
+ pn.readlines
38
+ end
39
+
40
+ def create_element
41
+ PVN::IO::Element.new :local => @entry.path
42
+ end
43
+
44
+ def get_latest_revision
45
+ svninfo = @elmt.get_info
46
+ svninfo.revision
47
+ end
48
+
49
+ def show_as_added
50
+ fromlines = nil
51
+ tolines = read_working_copy
52
+ run_diff @entry.path, fromlines, 0, tolines, 0, nil
53
+ end
54
+
55
+ def show_as_deleted
56
+ fromrev = changes[0].revision
57
+ # revision = nil; use_cache = false
58
+ lines = @elmt.cat nil, false
59
+ run_diff @entry.path, lines, fromrev, nil, nil, nil
60
+ end
61
+
62
+ def show_as_modified whitespace
63
+ remotelines = @elmt.cat nil, false
64
+ fromrev = changes[0].revision
65
+ wclines = read_working_copy
66
+ run_diff @entry.path, remotelines, fromrev, wclines, nil, whitespace
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'pvn/io/element'
5
+ require 'pvn/diff/path'
6
+
7
+ module PVN::Diff
8
+ # this is a path wrapping a log entry; it could also be a RemotePath or a
9
+ # RepoPath.
10
+ class LogPath < Path
11
+
12
+ # the "path" parameter is the displayed name; "logpath" is the LogPath.
13
+ # These are in the process of refactoring.
14
+ def show_as_modified elmt, path, fromrev, torev, revision, whitespace
15
+ fromlines = elmt.cat fromrev
16
+ tolines = elmt.cat torev
17
+ fromrev = revision.from.value.to_i
18
+ run_diff path, fromlines, fromrev, tolines, revision.to, whitespace
19
+ end
20
+
21
+ def show_as_added elmt, path, revision, whitespace
22
+ info "path: #{path}".on_blue
23
+ tolines = elmt.cat revision.to
24
+ info "tolines: #{tolines}".blue
25
+ run_diff path, nil, 0, tolines, revision.to, whitespace
26
+ end
27
+
28
+ def show_as_deleted elmt, path, revision, whitespace
29
+ fromrev = revision.from.value.to_i
30
+ fromlines = elmt.cat fromrev
31
+ run_diff path, fromlines, fromrev, nil, revision.to, whitespace
32
+ end
33
+
34
+ # log entries have names of the form /foo/bar.rb, relative to the URL.
35
+ def get_display_path
36
+ name[1 .. -1]
37
+ end
38
+
39
+ def diff_revision_to_revision revision, whitespace
40
+ logpath = self
41
+ info "name: #{name}"
42
+
43
+ # all the paths will be the same, so any can be selected (actually, a
44
+ # logpath should have multiple changes)
45
+ svnpath = url + name
46
+ info "svnpath: #{svnpath}"
47
+ elmt = PVN::IO::Element.new :svn => svnpath
48
+
49
+ displaypath = get_display_path
50
+
51
+ info "revision.from: #{revision.from}".cyan
52
+
53
+ rev_change = changes.detect do |chg|
54
+ revarg = PVN::Revision::Argument.new chg.revision
55
+ revarg > revision.from
56
+ end
57
+
58
+ info "rev_change: #{rev_change}".green
59
+
60
+ # we ignore unversioned logpaths
61
+
62
+ # I'm sure there is a bunch of permutations here, so this is probably
63
+ # overly simplistic.
64
+ action = rev_change.action
65
+
66
+ case
67
+ when action.added?
68
+ show_as_added elmt, displaypath, revision, whitespace
69
+ when action.deleted?
70
+ show_as_deleted elmt, displaypath, revision, whitespace
71
+ when action.modified?
72
+ firstrev = changes[0].revision
73
+ lastrev = changes[-1].revision
74
+ fromrev, torev = if firstrev == lastrev
75
+ [ revision.from.value.to_i - 1, revision.to ]
76
+ else
77
+ [ firstrev.to_i - 1, lastrev ]
78
+ end
79
+ show_as_modified elmt, displaypath, firstrev, torev, revision, whitespace
80
+ end
81
+ end
82
+
83
+ def get_diff_revision change, revision
84
+ info "change: #{change}"
85
+ info "revision: #{revision}"
86
+ # find the first revision where logpath was in svn, no earlier than the
87
+ # revision.from value
88
+ if change.action.added?
89
+ return change.revision.to_i
90
+ elsif change.revision.to_i >= revision.from.value
91
+ return revision.from.value
92
+ else
93
+ nil
94
+ end
95
+ end
96
+
97
+ def diff_revision_to_working_copy revision, whitespace
98
+ fromrev = revision.from.value.to_i
99
+
100
+ ### $$$ this doesn't handle the case where a file has been added, then
101
+ ### modified.
102
+
103
+ change = revisions_later_than(fromrev).first
104
+ info "change: #{change}".red
105
+
106
+ # revision should be a class here, not a primitive
107
+ diffrev = get_diff_revision change, revision
108
+
109
+ display_path = get_display_path
110
+
111
+ pn = Pathname.new display_path
112
+
113
+ svnpath = url + name
114
+ info "svnpath: #{svnpath}"
115
+ elmt = PVN::IO::Element.new :svn => svnpath
116
+
117
+ if change.action.added?
118
+ show_as_added elmt, display_path, revision, whitespace
119
+ else
120
+ fromlines = elmt.cat diffrev
121
+ info "fromlines.size: #{fromlines.size}"
122
+ pp fromlines
123
+
124
+ tolines = pn.readlines
125
+ info "tolines.size: #{tolines.size}"
126
+ pp tolines
127
+
128
+ run_diff display_path, fromlines, diffrev, tolines, nil, whitespace
129
+ end
130
+ end
131
+
132
+ def is_revision_later_than? revision
133
+ revisions_later_than(revision).first
134
+ end
135
+
136
+ def revisions_later_than revision
137
+ changes.select do |chg|
138
+ info "chg: #{chg.revision.inspect}"
139
+ x = PVN::Revision::Argument.new chg.revision
140
+ y = PVN::Revision::Argument.new revision
141
+ x > y
142
+ end
143
+ end
144
+ end
145
+ end
@@ -3,7 +3,7 @@
3
3
 
4
4
  require 'pvn/io/element'
5
5
  require 'pvn/diff/paths'
6
- require 'pvn/diff/path'
6
+ require 'pvn/diff/log_path'
7
7
 
8
8
  module PVN::Diff
9
9
  # represents the log entries from one revision through another.
@@ -30,17 +30,27 @@ module PVN::Diff
30
30
  action = logentrypath.action
31
31
  url = pathinfo.url
32
32
 
33
- info "action: #{action}".blue
33
+ info "action: #{action}"
34
34
 
35
35
  path = @elements.detect { |element| element.name == name }
36
36
  if path
37
- info "path: #{path}".on_blue
38
- path.add_revision logentry.revision, action
37
+ info "path: #{path}"
38
+ path.add_change logentry.revision, action
39
39
  else
40
- path = Path.new(name, logentry.revision, action, url)
41
- info "path: #{path}".on_cyan
40
+ path = LogPath.new(name, logentry.revision, action, url)
41
+ info "path: #{path}"
42
42
  @elements << path
43
43
  end
44
44
  end
45
+
46
+ def diff_revision_to_revision revision, whitespace
47
+ name_to_logpath = to_map
48
+
49
+ name_to_logpath.sort.each do |name, logpath|
50
+ if logpath.is_revision_later_than? revision.from.value
51
+ logpath.diff_revision_to_revision revision, whitespace
52
+ end
53
+ end
54
+ end
45
55
  end
46
56
  end
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'rubygems'
5
+ require 'riel'
6
+
7
+ module PVN; module Diff; end; end
8
+
9
+ module PVN::Diff
10
+ # represents names in LogPaths and StatusPaths.
11
+ ### $$$ todo: integrate with those classes.
12
+ class Name
13
+ include Loggable
14
+
15
+ def initialize namestr
16
+ @namestr = namestr
17
+ end
18
+
19
+ def to_s
20
+ @namestr
21
+ end
22
+ end
23
+ end
data/lib/pvn/diff/path.rb CHANGED
@@ -2,7 +2,7 @@
2
2
  # -*- ruby -*-
3
3
 
4
4
  require 'svnx/action'
5
- require 'pvn/diff/path_revision'
5
+ require 'pvn/diff/change'
6
6
 
7
7
  module PVN; module Diff; end; end
8
8
 
@@ -11,32 +11,20 @@ module PVN::Diff
11
11
  include Loggable
12
12
 
13
13
  attr_reader :name
14
- # attr_reader :revisions
15
- attr_reader :action
16
14
  attr_reader :url
17
- ### $$$ this will be renamed revisions, when the old one is gone.
18
- attr_reader :path_revisions
15
+ attr_reader :changes
19
16
 
20
17
  # that's the root url
21
18
  def initialize name, revision, action, url
22
19
  @name = name
23
- @revisions = Array.new
24
- @path_revisions = Array.new
25
- add_revision revision, action
26
- @action = action.kind_of?(SVNx::Action) || SVNx::Action.new(action)
20
+ @changes = Array.new
21
+ add_change revision, action
27
22
  @url = url
28
23
  end
29
24
 
30
- def add_revision rev, action
31
- info "rev: #{rev}".on_green
32
- if rev.kind_of?(Array)
33
- rev.each do |rv|
34
- @revisions << to_revision(rv)
35
- end
36
- else
37
- @revisions << to_revision(rev)
38
- end
39
- @path_revisions << PathRevision.new(to_revision(rev), action)
25
+ def add_change rev, action
26
+ info "rev: #{rev}"
27
+ @changes << Change.new(to_revision(rev), action)
40
28
  end
41
29
 
42
30
  def to_revision rev
@@ -48,5 +36,49 @@ module PVN::Diff
48
36
  def to_s
49
37
  inspect
50
38
  end
39
+
40
+ def to_revision_string rev
41
+ rev ? "revision #{rev}" : "working copy"
42
+ end
43
+
44
+ def run_diff_command displaypath, fromrev, torev, frompath, topath, whitespace
45
+ cmd = "diff -u"
46
+ if whitespace
47
+ cmd << " -w"
48
+ end
49
+
50
+ [ fromrev, torev ].each do |rev|
51
+ revstr = to_revision_string rev
52
+ cmd << " -L '#{displaypath}\t(#{revstr})'"
53
+ end
54
+ cmd << " #{frompath}"
55
+ cmd << " #{topath}"
56
+
57
+ info "cmd: #{cmd}"
58
+
59
+ $io.puts "Index: #{displaypath}"
60
+ $io.puts "==================================================================="
61
+ IO.popen(cmd) do |io|
62
+ $io.puts io.readlines
63
+ end
64
+ end
65
+
66
+ def run_diff displaypath, fromlines, fromrev, tolines, torev, whitespace
67
+ Tempfile.open('pvn') do |from|
68
+ if fromlines
69
+ from.puts fromlines
70
+ end
71
+ from.close
72
+
73
+ Tempfile.open('pvn') do |to|
74
+ if tolines
75
+ to.puts tolines
76
+ end
77
+ to.close
78
+
79
+ run_diff_command displaypath, fromrev, torev, from.path, to.path, whitespace
80
+ end
81
+ end
82
+ end
51
83
  end
52
84
  end