vclog 1.8.1 → 1.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/.ruby +57 -0
  2. data/COPYING.rdoc +32 -0
  3. data/README.rdoc +18 -19
  4. data/features/git.feature +16 -16
  5. data/features/hg.feature +16 -16
  6. data/features/step_definitions/repo_steps.rb +2 -1
  7. data/features/support/aruba.rb +5 -1
  8. data/features/support/repo.rb +7 -3
  9. data/features/svn.feature +16 -16
  10. data/lib/vclog.rb +1 -1
  11. data/lib/vclog/adapters/abstract.rb +0 -19
  12. data/lib/vclog/adapters/git.rb +34 -6
  13. data/lib/vclog/adapters/svn.rb +1 -1
  14. data/lib/vclog/change.rb +43 -23
  15. data/lib/vclog/heuristics.rb +32 -49
  16. data/lib/vclog/heuristics/label.rb +29 -0
  17. data/lib/vclog/heuristics/rule.rb +33 -0
  18. data/lib/vclog/metadata.rb +2 -12
  19. data/lib/vclog/repo.rb +23 -19
  20. data/{ronn → man/man1}/index.txt +0 -0
  21. data/man/man1/vclog-autotag.1.html +117 -0
  22. data/{ronn/vclog-autotag.ronn → man/man1/vclog-autotag.1.ronn} +0 -0
  23. data/man/man1/vclog-bump.1.html +111 -0
  24. data/{ronn/vclog-bump.ronn → man/man1/vclog-bump.1.ronn} +0 -0
  25. data/man/man1/vclog-changelog.1.html +123 -0
  26. data/{ronn/vclog-changelog.ronn → man/man1/vclog-changelog.1.ronn} +0 -0
  27. data/man/man1/vclog-history.1.html +122 -0
  28. data/{ronn/vclog-history.ronn → man/man1/vclog-history.1.ronn} +0 -0
  29. data/man/man1/vclog-version.1.html +100 -0
  30. data/{ronn/vclog-version.ronn → man/man1/vclog-version.1.ronn} +0 -0
  31. data/man/man1/vclog.1.html +122 -0
  32. data/{ronn/vclog.ronn → man/man1/vclog.1.ronn} +0 -0
  33. data/test/unit/case_metadata.rb +11 -0
  34. data/test/unit/helper.rb +4 -0
  35. metadata +132 -122
  36. data/HISTORY.rdoc +0 -158
  37. data/LICENSE +0 -203
  38. data/lib/plugins/syckle/vclog.rb +0 -221
  39. data/lib/vclog/heuristics/default.rb +0 -24
  40. data/lib/vclog/meta/data.rb +0 -25
  41. data/lib/vclog/meta/package +0 -11
  42. data/lib/vclog/meta/profile +0 -18
  43. data/meta/data.rb +0 -25
  44. data/meta/package +0 -11
  45. data/meta/profile +0 -18
@@ -1,5 +1,5 @@
1
1
  module VCLog
2
- require 'vclog/meta/data'
2
+ require 'vclog/metadata'
3
3
  require 'vclog/repo'
4
4
  end
5
5
 
@@ -247,25 +247,6 @@ module Adapters
247
247
  end
248
248
  =end
249
249
 
250
- # Find vclog config directory. This searches up from the current
251
- # working directory for the following paths (in order):
252
- #
253
- # .vclog/
254
- # .config/vclog/
255
- # config/vclog/
256
- #
257
- def lookup_config
258
- conf = nil
259
- Dir.ascend(Dir.pwd) do |path|
260
- check = Dir['{.vclog/,.config/vclog/,config/vclog/}/'].first
261
- if check
262
- conf = path
263
- break
264
- end
265
- end
266
- conf
267
- end
268
-
269
250
  public
270
251
 
271
252
  #
@@ -7,6 +7,12 @@ module Adapters
7
7
  #
8
8
  class Git < Abstract
9
9
 
10
+ GIT_COMMIT_MARKER = '=====%n'
11
+ GIT_FIELD_MARKER = '-----%n'
12
+
13
+ RUBY_COMMIT_MARKER = "=====\n"
14
+ RUBY_FIELD_MARKER = "-----\n"
15
+
10
16
  # TODO: in the future we might use grit, if it improves enough.
11
17
  def initialize_framework
12
18
  #require 'grit'
@@ -22,16 +28,38 @@ module Adapters
22
28
  def extract_changes
23
29
  list = []
24
30
  changelog = `git log --pretty=format:"\036|||%ci|~|%aN|~|%H|~|%s"`.strip
25
- changes = changelog.split("\036|||")
26
- #changes = changelog.split(/^commit/m)
31
+
32
+ command = 'git log --name-only --pretty=format:"' +
33
+ GIT_COMMIT_MARKER +
34
+ '%ci' +
35
+ GIT_FIELD_MARKER +
36
+ '%aN' +
37
+ GIT_FIELD_MARKER +
38
+ '%H' +
39
+ GIT_FIELD_MARKER +
40
+ '%s' +
41
+ GIT_FIELD_MARKER +
42
+ '"'
43
+
44
+ changes = `#{command}`.split(RUBY_COMMIT_MARKER)
27
45
  changes.shift # throw the first (empty) entry away
28
46
  changes.each do |entry|
29
- date, who, id, msg = entry.split('|~|')
30
- date = Time.parse(date)
31
- list << Change.new(:id=>id, :date=>date, :who=>who, :msg=>msg)
47
+ date, who, id, msg, files = entry.split(RUBY_FIELD_MARKER)
48
+ date = Time.parse(date)
49
+ files = files.split("\n")
50
+ list << Change.new(:id=>id, :date=>date, :who=>who, :msg=>msg, :files=>files)
32
51
  end
33
52
  list
34
- end
53
+ end
54
+
55
+ #
56
+ #def extract_files(change_list)
57
+ # change_list.each do |change|
58
+ # files = `git show --pretty="format:" --name-only #{c.id}`
59
+ # files = files.split("\n")
60
+ # change.files = files
61
+ # end
62
+ #end
35
63
 
36
64
  # TODO
37
65
  #def extract_changes
@@ -16,7 +16,7 @@ module Adapters
16
16
  begin
17
17
  require 'xmlsimple'
18
18
  rescue LoadError
19
- "VCLog requires xmlsimple for SVN support"
19
+ raise LoadError, "VCLog requires xml-simple for SVN support."
20
20
  end
21
21
  super(root)
22
22
  end
@@ -2,23 +2,33 @@ require 'vclog/kernel'
2
2
 
3
3
  module VCLog
4
4
 
5
- # The Change class models an extry in a change log.
5
+ # The Change class models an entry in a change log.
6
6
  #
7
7
  class Change
8
8
 
9
9
  include Comparable
10
10
 
11
+ # Commit reference id.
11
12
  attr_accessor :id
13
+
14
+ # Date/time of commit.
12
15
  attr_accessor :date
16
+
17
+ # Committer.
13
18
  attr_accessor :author
19
+
20
+ # Commit message.
14
21
  attr_accessor :message
15
22
 
23
+ # List of files changed in the commit.
24
+ attr_accessor :files
25
+
16
26
  attr_accessor :type
17
27
  attr_accessor :level
18
28
  attr_accessor :label
19
29
 
20
30
  #
21
- def initialize(data={}) #rev, date, author, message, type, level, label
31
+ def initialize(data={})
22
32
  data.each do |k,v|
23
33
  __send__("#{k}=", v)
24
34
  end
@@ -35,10 +45,20 @@ module VCLog
35
45
  end
36
46
 
37
47
  # Alternate name for id.
48
+ alias_method :ref, :id
49
+ alias_method :ref=, :id=
50
+ alias_method :reference, :id
51
+ alias_method :reference=, :id=
52
+
53
+ # Alternate name for id.
54
+ #
55
+ # @deprecated
38
56
  alias_method :rev, :id
39
57
  alias_method :rev=, :id=
40
58
 
41
59
  # Alternate name for id.
60
+ #
61
+ # @deprecated
42
62
  alias_method :revision, :id
43
63
  alias_method :revision=, :id=
44
64
 
@@ -46,7 +66,6 @@ module VCLog
46
66
  alias_method :msg, :message
47
67
  alias_method :msg=, :message=
48
68
 
49
-
50
69
  # Alias for author.
51
70
  alias_method :who, :author
52
71
  alias_method :who=, :author=
@@ -63,26 +82,6 @@ module VCLog
63
82
  # end
64
83
  #end
65
84
 
66
- =begin
67
- #
68
- def type_phrase
69
- case type.to_s
70
- when 'maj', 'major'
71
- 'Major Enhancements'
72
- when 'min', 'minor'
73
- 'Minor Enhancements'
74
- when 'bug'
75
- 'Bug Fixes'
76
- when ''
77
- 'General Enhancements'
78
- when '-'
79
- 'Administrative Changes'
80
- else
81
- "#{type.to_s.capitalize} Enhancements"
82
- end
83
- end
84
- =end
85
-
86
85
  #
87
86
  def <=>(other)
88
87
  other.date <=> date
@@ -92,6 +91,9 @@ module VCLog
92
91
  "#<Change:#{object_id} #{date}>"
93
92
  end
94
93
 
94
+ # TODO: Rename revision to `referece` or `ref`.
95
+
96
+ #
95
97
  def to_h
96
98
  { 'author' => @author,
97
99
  'date' => @date,
@@ -119,6 +121,24 @@ module VCLog
119
121
  end
120
122
 
121
123
  =begin
124
+ #
125
+ def type_phrase
126
+ case type.to_s
127
+ when 'maj', 'major'
128
+ 'Major Enhancements'
129
+ when 'min', 'minor'
130
+ 'Minor Enhancements'
131
+ when 'bug'
132
+ 'Bug Fixes'
133
+ when ''
134
+ 'General Enhancements'
135
+ when '-'
136
+ 'Administrative Changes'
137
+ else
138
+ "#{type.to_s.capitalize} Enhancements"
139
+ end
140
+ end
141
+
122
142
  # Looks for a "[type]" indicator at the end of the commit message.
123
143
  # If that is not found, it looks at front of message for
124
144
  # "[type]" or "[type]:". Failing that it tries just "type:".
@@ -1,28 +1,30 @@
1
+ require 'vclog/heuristics/label'
2
+ require 'vclog/heuristics/rule'
3
+
1
4
  module VCLog
2
5
 
3
6
  #
4
7
  class Heuristics
5
8
 
6
- # Load heuristics from a configruation file.
9
+ # Load heuristics from a designated file.
7
10
  #
8
- # config - the configuration directory
11
+ # @param file [String] configuration file
9
12
  #
10
13
  def self.load(file)
11
- if file
12
- raise LoadError unless File.exist?(file)
13
- else
14
- file = File.dirname(__FILE__) + '/heuristics/default.rb'
15
- end
16
-
17
- h = new
18
- h.instance_eval(File.read(file), file)
19
- h
14
+ raise LoadError unless File.exist?(file)
15
+ new{ instance_eval(File.read(file), file) }
20
16
  end
21
17
 
22
18
  #
23
- def initialize
19
+ def initialize(&block)
24
20
  @rules = []
25
21
  @labels = {}
22
+
23
+ if block
24
+ instance_eval(&block)
25
+ else
26
+ default
27
+ end
26
28
  end
27
29
 
28
30
  #
@@ -52,49 +54,30 @@ module VCLog
52
54
  @labels[type.to_sym] = Label.new(type, level, label)
53
55
  end
54
56
 
55
- #
56
- class Label
57
- #
58
- def initialize(type, level, label)
59
- @type = type
60
- @level = level.to_i
61
- @label = label.to_s
57
+ # Default settings.
58
+ def default
59
+ set :major, 1, "Major Enhancements"
60
+ set :bug, 0, "Bug Fixes"
61
+ set :minor, -1, "Minor Enhancements"
62
+ set :doc, -1, "Documentation Changes"
63
+ set :admin, -2, "Administrative Changes"
64
+
65
+ on /^(\w+):/ do |msg, md|
66
+ word = md[1]
67
+ [word.to_sym, md.post_match]
62
68
  end
63
69
 
64
- attr :type
65
-
66
- attr :level
67
-
68
- attr :label
69
-
70
- #
71
- def to_a
72
- [type, level, label]
70
+ on /\[(\w+)\]\s*$/ do |msg, md|
71
+ word = md[1]
72
+ [word.to_sym, md.pre_match]
73
73
  end
74
- end
75
74
 
76
- #
77
- class Rule
78
- #
79
- def initialize(pattern, &block)
80
- @pattern = pattern
81
- @block = block
75
+ on /updated? (README|PROFILE|PACKAGE|VERSION|MANIFEST)/ do
76
+ :admin
82
77
  end
83
78
 
84
- # Process the rule.
85
- def call(message)
86
- if matchdata = @pattern.match(message)
87
- case @block.arity
88
- when 0
89
- @block.call
90
- when 1
91
- @block.call(matchdata)
92
- else
93
- @block.call(message, matchdata)
94
- end
95
- else
96
- nil
97
- end
79
+ on /(bump|bumped|prepare) version/ do
80
+ :admin
98
81
  end
99
82
  end
100
83
 
@@ -0,0 +1,29 @@
1
+ module VCLog
2
+
3
+ class Heuristics
4
+
5
+ #
6
+ #
7
+ class Label
8
+ #
9
+ def initialize(type, level, label)
10
+ @type = type
11
+ @level = level.to_i
12
+ @label = label.to_s
13
+ end
14
+
15
+ attr :type
16
+
17
+ attr :level
18
+
19
+ attr :label
20
+
21
+ #
22
+ def to_a
23
+ [type, level, label]
24
+ end
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,33 @@
1
+ module VCLog
2
+
3
+ class Heuristics
4
+
5
+ #
6
+ class Rule
7
+ #
8
+ def initialize(pattern, &block)
9
+ @pattern = pattern
10
+ @block = block
11
+ end
12
+
13
+ # Process the rule.
14
+ def call(message)
15
+ if matchdata = @pattern.match(message)
16
+ case @block.arity
17
+ when 0
18
+ @block.call
19
+ when 1
20
+ @block.call(matchdata)
21
+ else
22
+ @block.call(message, matchdata)
23
+ end
24
+ else
25
+ nil
26
+ end
27
+ end
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+
@@ -1,14 +1,4 @@
1
1
  module VCLog
2
-
3
- #
4
- class Metadata
5
-
6
- def initialize
7
- if file = Dir['PROFILE{,.yml}'].first
8
- @profile = YAML.load(File.new(file))
9
- end
10
- end
11
-
12
- end
13
-
2
+ VERSION = "1.8.2"
14
3
  end
4
+
@@ -1,3 +1,5 @@
1
+ require 'confection'
2
+
1
3
  require 'vclog/adapters'
2
4
  require 'vclog/heuristics'
3
5
  require 'vclog/history_file'
@@ -10,10 +12,10 @@ module VCLog
10
12
  %w{display}.each{ |name| undef_method(name) }
11
13
 
12
14
  # File glob used to find project root directory.
13
- ROOT_GLOB = '{.vclog/,.config/vclog/,config/vclog/,.git/,.hg/,_darcs/,README*}/'
15
+ ROOT_GLOB = '{.git/,.hg/,_darcs/,.svn/}'
14
16
 
15
17
  # File glob used to find the vclog configuration directory.
16
- CONFIG_GLOB = '{.vclog,.config/vclog,config/vclog}/'
18
+ #CONFIG_GLOB = '{.,.config/,config/,task/,tasks/}vclog{,.rb}'
17
19
 
18
20
  # Project's root directory.
19
21
  attr :root
@@ -30,7 +32,7 @@ module VCLog
30
32
  @root = root || lookup_root
31
33
  @options = options
32
34
 
33
- @config_directory = Dir[File.join(@root, CONFIG_GLOB)]
35
+ #@config_directory = Dir[File.join(@root, CONFIG_GLOB)]
34
36
 
35
37
  @level = (options[:level] || 0).to_i
36
38
 
@@ -46,9 +48,9 @@ module VCLog
46
48
  end
47
49
 
48
50
  #
49
- def config_directory
50
- @config_directory
51
- end
51
+ #def config_directory
52
+ # @config_directory
53
+ #end
52
54
 
53
55
  #
54
56
  def force?
@@ -59,23 +61,25 @@ module VCLog
59
61
  def read_type
60
62
  dir = nil
61
63
  Dir.chdir(root) do
62
- dir = Dir.glob("{.svn,.git,.hg,_darcs}").first
64
+ dir = Dir.glob("{.git,.hg,.svn,_darcs}").first
63
65
  end
64
66
  dir[1..-1] if dir
65
67
  end
66
68
 
67
69
  # Find project root. This searches up from the current working
68
- # directory for the following paths (in order):
70
+ # directory for a Confection configuration file or source control
71
+ # manager directory.
69
72
  #
70
- # .vclog/
71
- # .config/vclog/
72
- # config/vclog/
73
- # .git/|.hg/|_darcs/
74
- # README*
73
+ # .co
74
+ # .git/
75
+ # .hg/
76
+ # .svn/
77
+ # _darcs/
75
78
  #
76
- def lookup_root(dir)
79
+ # If all else fails the current directory is returned.
80
+ def lookup_root
77
81
  root = nil
78
- Dir.ascend(dir || Dir.pwd) do |path|
82
+ Dir.ascend(Dir.pwd) do |path|
79
83
  check = Dir[ROOT_GLOB].first
80
84
  if check
81
85
  root = path
@@ -87,13 +91,13 @@ module VCLog
87
91
 
88
92
  # Load heuristics script.
89
93
  def heuristics
90
- @heuristics ||= Heuristics.load(heuristics_file)
94
+ @heuristics ||= Heuristics.new(&Confection[:vclog])
91
95
  end
92
96
 
93
97
  # Heurtistics script.
94
- def heuristics_file
95
- @heuristics_file ||= Dir[File.join(config_directory, 'rules.rb')].first
96
- end
98
+ #def heuristics_file
99
+ # @heuristics_file ||= Dir[File.join(root, CONFIG_GLOB)].first
100
+ #end
97
101
 
98
102
  # Access to Repo's HISTORY file.
99
103
  def history_file