rubycut-vclog 1.9.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. data/.yardopts +7 -0
  2. data/History.md +249 -0
  3. data/License.txt +23 -0
  4. data/README.md +133 -0
  5. data/bin/vclog +6 -0
  6. data/bin/vclog-autotag +6 -0
  7. data/bin/vclog-bump +6 -0
  8. data/bin/vclog-formats +6 -0
  9. data/bin/vclog-news +6 -0
  10. data/bin/vclog-version +6 -0
  11. data/lib/vclog.rb +6 -0
  12. data/lib/vclog.yml +68 -0
  13. data/lib/vclog/adapters.rb +12 -0
  14. data/lib/vclog/adapters/abstract.rb +131 -0
  15. data/lib/vclog/adapters/darcs.rb +93 -0
  16. data/lib/vclog/adapters/git.rb +190 -0
  17. data/lib/vclog/adapters/hg.rb +129 -0
  18. data/lib/vclog/adapters/svn.rb +155 -0
  19. data/lib/vclog/change.rb +207 -0
  20. data/lib/vclog/change_point.rb +77 -0
  21. data/lib/vclog/changelog.rb +233 -0
  22. data/lib/vclog/cli.rb +8 -0
  23. data/lib/vclog/cli/abstract.rb +92 -0
  24. data/lib/vclog/cli/autotag.rb +36 -0
  25. data/lib/vclog/cli/bump.rb +29 -0
  26. data/lib/vclog/cli/formats.rb +28 -0
  27. data/lib/vclog/cli/log.rb +86 -0
  28. data/lib/vclog/cli/news.rb +29 -0
  29. data/lib/vclog/cli/version.rb +30 -0
  30. data/lib/vclog/config.rb +143 -0
  31. data/lib/vclog/core_ext.rb +11 -0
  32. data/lib/vclog/heuristics.rb +192 -0
  33. data/lib/vclog/heuristics/rule.rb +73 -0
  34. data/lib/vclog/heuristics/type.rb +29 -0
  35. data/lib/vclog/history_file.rb +69 -0
  36. data/lib/vclog/metadata.rb +16 -0
  37. data/lib/vclog/rc.rb +9 -0
  38. data/lib/vclog/release.rb +67 -0
  39. data/lib/vclog/repo.rb +298 -0
  40. data/lib/vclog/report.rb +200 -0
  41. data/lib/vclog/tag.rb +151 -0
  42. data/lib/vclog/templates/changelog.ansi.rb +35 -0
  43. data/lib/vclog/templates/changelog.atom.erb +52 -0
  44. data/lib/vclog/templates/changelog.gnu.rb +24 -0
  45. data/lib/vclog/templates/changelog.html.erb +49 -0
  46. data/lib/vclog/templates/changelog.json.rb +1 -0
  47. data/lib/vclog/templates/changelog.markdown.rb +30 -0
  48. data/lib/vclog/templates/changelog.rdoc.rb +30 -0
  49. data/lib/vclog/templates/changelog.rss.erb +54 -0
  50. data/lib/vclog/templates/changelog.xml.erb +28 -0
  51. data/lib/vclog/templates/changelog.xsl +34 -0
  52. data/lib/vclog/templates/changelog.yaml.rb +1 -0
  53. data/lib/vclog/templates/history.ansi.rb +57 -0
  54. data/lib/vclog/templates/history.atom.erb +84 -0
  55. data/lib/vclog/templates/history.gnu.rb +39 -0
  56. data/lib/vclog/templates/history.html.erb +60 -0
  57. data/lib/vclog/templates/history.json.rb +1 -0
  58. data/lib/vclog/templates/history.markdown.rb +38 -0
  59. data/lib/vclog/templates/history.rdoc.rb +36 -0
  60. data/lib/vclog/templates/history.rss.erb +84 -0
  61. data/lib/vclog/templates/history.xml.erb +43 -0
  62. data/lib/vclog/templates/history.yaml.rb +1 -0
  63. data/man/man1/index.txt +9 -0
  64. data/man/man1/vclog-autotag.1.ronn +29 -0
  65. data/man/man1/vclog-bump.1.ronn +21 -0
  66. data/man/man1/vclog-news.1.ronn +25 -0
  67. data/man/man1/vclog-version.1.ronn +14 -0
  68. data/man/man1/vclog.1.ronn +49 -0
  69. data/spec/feature_git_changes.rb +58 -0
  70. data/spec/feature_git_history.rb +58 -0
  71. data/spec/feature_hg_changes.rb +58 -0
  72. data/spec/feature_hg_history.rb +58 -0
  73. data/spec/featurettes/repo_creation.rb +64 -0
  74. data/spec/featurettes/shellout.rb +16 -0
  75. data/test/case_metadata.rb +10 -0
  76. metadata +265 -0
data/bin/vclog-news ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'vclog/cli/news'
4
+
5
+ VCLog::CLI::News.run(ARGV)
6
+
data/bin/vclog-version ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'vclog/cli/version'
4
+
5
+ VCLog::CLI::Version.run(ARGV)
6
+
data/lib/vclog.rb ADDED
@@ -0,0 +1,6 @@
1
+ module VCLog
2
+ require 'vclog/metadata'
3
+ require 'vclog/repo'
4
+ #require 'vclog/cli'
5
+ end
6
+
data/lib/vclog.yml ADDED
@@ -0,0 +1,68 @@
1
+ ---
2
+ revision: 2013
3
+ type: ruby
4
+ sources:
5
+ - index
6
+ authors:
7
+ - name: Trans
8
+ email: transfire@gmail.com
9
+ organizations: []
10
+ requirements:
11
+ - version: ! '>= 2.4'
12
+ name: facets
13
+ - version: ! '>= 1.2'
14
+ name: ansi
15
+ - name: xml-simple
16
+ #- groups:
17
+ # - build
18
+ # development: true
19
+ # name: detroit
20
+ - groups:
21
+ - build
22
+ development: true
23
+ name: ergo
24
+ - groups:
25
+ - test
26
+ development: true
27
+ name: citron
28
+ - groups:
29
+ - test
30
+ development: true
31
+ name: lime
32
+ - groups:
33
+ - test
34
+ development: true
35
+ name: ae
36
+ - groups:
37
+ - test
38
+ development: true
39
+ name: rubytest-cli
40
+ conflicts: []
41
+ alternatives: []
42
+ resources:
43
+ - type: home
44
+ uri: http://rubyworks.github.com/vclog
45
+ label: Homepage
46
+ - type: code
47
+ uri: http://github.com/rubyworks/vclog
48
+ label: Source Code
49
+ repositories:
50
+ - name: upstream
51
+ scm: git
52
+ uri: git://github.com/rubyworks/vclog.git
53
+ categories: []
54
+ copyrights:
55
+ - holder: Rubyworks
56
+ year: '2009'
57
+ license: BSD-2-Clause
58
+ customs: []
59
+ paths:
60
+ lib:
61
+ - lib
62
+ created: '2006-05-09'
63
+ summary: Cross-VCS/SCM ChangeLog Generator
64
+ title: VCLog
65
+ version: 1.9.4
66
+ name: rubycut-vclog
67
+ description: VCLog is a cross-VCS/SCM ChangeLog generator.
68
+ date: '2013-03-22'
@@ -0,0 +1,12 @@
1
+ require 'vclog/adapters/svn'
2
+ require 'vclog/adapters/git'
3
+ require 'vclog/adapters/hg'
4
+ #require 'vclog/adapters/darcs'
5
+
6
+ module VCLog
7
+
8
+ # Namespace for all VCS/SCM adapters.
9
+ module Adapters
10
+ end
11
+
12
+ end
@@ -0,0 +1,131 @@
1
+ module VCLog
2
+
3
+ module Adapters
4
+
5
+ require 'time'
6
+ require 'pathname'
7
+ require 'tempfile'
8
+
9
+ require 'vclog/changelog'
10
+ require 'vclog/change'
11
+ require 'vclog/tag'
12
+
13
+ # TODO: Could we support a "no scm" changelog based on `LOG:` entries in source files?
14
+
15
+ # TODO: Possibly use Amp or SCM gem for future version.
16
+
17
+ # Abstract base class for all version control system adapters.
18
+ #
19
+ class Abstract
20
+
21
+ #
22
+ attr :config
23
+
24
+ # Root location.
25
+ attr :root
26
+
27
+ # Heuristics object.
28
+ attr :heuristics
29
+
30
+ #
31
+ def initialize(repo)
32
+ @repo = repo
33
+ @root = repo.root
34
+ @heuristics = repo.heuristics
35
+
36
+ initialize_framework
37
+ end
38
+
39
+ # This is used if the adapter is using an external library
40
+ # to interface with the repository.
41
+ def initialize_framework
42
+ end
43
+
44
+ #
45
+ def extract_tags
46
+ raise "Not Implemented"
47
+ end
48
+
49
+ #
50
+ def extract_changes
51
+ raise "Not Implemented"
52
+ end
53
+
54
+ #
55
+ def tags
56
+ @tags ||= extract_tags
57
+ end
58
+
59
+ #
60
+ def changes
61
+ @changes ||= extract_changes
62
+ end
63
+
64
+ #
65
+ def change_points
66
+ @change_points ||= (
67
+ changes.inject([]){ |list, change| list.concat(change.points); list }
68
+ )
69
+ end
70
+
71
+ #
72
+ def tag?(name)
73
+ tags.find{ |t| t.name == name }
74
+ end
75
+
76
+ # Returns the current verion string.
77
+ def version
78
+ if tags.last
79
+ v = tags[-1].name # TODO: ensure the latest version
80
+ v = tags[-2].name if v == 'HEAD'
81
+ else
82
+ v = '0.0.0'
83
+ end
84
+ return v
85
+ end
86
+
87
+ # Return the latest commit as of a given date.
88
+ def change_by_date(date)
89
+ list = changes.select{ |c| c.date <= date }
90
+ list.sort_by{ |c| c.date }.last
91
+ end
92
+
93
+ # Fallback for user is `ENV['USER']`.
94
+ def user
95
+ ENV['USER']
96
+ end
97
+
98
+ # Fallback for email address is `ENV['EMAIL']`.
99
+ def email
100
+ ENV['EMAIL']
101
+ end
102
+
103
+ #
104
+ def repository
105
+ nil
106
+ end
107
+
108
+ #
109
+ def uuid
110
+ nil
111
+ end
112
+
113
+ private
114
+
115
+ #
116
+ def version_tag?(tag_name)
117
+ /(v|\d)/i =~ tag_name
118
+ end
119
+
120
+ #
121
+ def tempfile(name, content)
122
+ mfile = Tempfile.new(name)
123
+ File.open(mfile.path, 'w'){ |f| f << content }
124
+ mfile.path
125
+ end
126
+
127
+ end
128
+
129
+ end
130
+
131
+ end
@@ -0,0 +1,93 @@
1
+ require 'vclog/adapters/abstract'
2
+
3
+ module VCLog
4
+
5
+ module Adapters
6
+
7
+ # Darcs SCM adapter.
8
+ #
9
+ # FIXME: This needs to be fixed!!!!!!!
10
+ #
11
+ class Darcs < Abstract
12
+
13
+ #
14
+ def initialize(*)
15
+ raise "Darcs is not yet supported. Please help us fix that!"
16
+ end
17
+
18
+ # Is a darcs repository?
19
+ def repository?
20
+ File.directory?('_darcs')
21
+ end
22
+
23
+ # This is also a module function.
24
+ module_function :repository?
25
+
26
+ # Cached Changelog.
27
+ def changelog
28
+ @changelog ||= generate_changelog
29
+ end
30
+
31
+ # Generate Changelog object.
32
+ def generate_changelog
33
+ raise "not a darcs repository" unless repository?
34
+
35
+ log = Changelog.new
36
+
37
+ txt = `darcs changes` #--repo=#{@repository}`
38
+
39
+ txt.each_line do |line|
40
+ case line
41
+ when /^\s*$/
42
+ when /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun)/
43
+ when /^\s*tagged/
44
+ log << $'
45
+ log << "\n"
46
+ else
47
+ log << line
48
+ log << "\n"
49
+ end
50
+ end
51
+
52
+ return log
53
+ end
54
+
55
+ # Retrieve the "revision number" from the darcs tree.
56
+ def calculate_version
57
+ raise "not a darcs repository" unless repository?
58
+
59
+ status = info.status
60
+
61
+ changes = `darcs changes`
62
+ count = 0
63
+ tag = "0.0"
64
+
65
+ changes.each("\n\n") do |change|
66
+ head, title, desc = change.split("\n", 3)
67
+ if title =~ /^ \*/
68
+ # Normal change.
69
+ count += 1
70
+ elsif title =~ /tagged (.*)/
71
+ # Tag. We look for these.
72
+ tag = $1
73
+ break
74
+ else
75
+ warn "Unparsable change: #{change}"
76
+ end
77
+ end
78
+ ver = "#{tag}.#{count.to_s}"
79
+
80
+ return ver
81
+ #format_version_stamp(ver, status) # ,released)
82
+ end
83
+
84
+ # TODO
85
+ def tag(ref, label, msg)
86
+ `darcs tag #{label}`
87
+ end
88
+
89
+ end
90
+
91
+ end
92
+
93
+ end
@@ -0,0 +1,190 @@
1
+ require 'vclog/adapters/abstract'
2
+
3
+ module VCLog
4
+
5
+ module Adapters
6
+
7
+ # GIT Adapter.
8
+ #
9
+ class Git < Abstract
10
+
11
+ GIT_COMMIT_MARKER = '=====%n'
12
+ GIT_FIELD_MARKER = '-----%n'
13
+
14
+ RUBY_COMMIT_MARKER = "=====\n"
15
+ RUBY_FIELD_MARKER = "-----\n"
16
+
17
+ # Collect changes, i.e. commits.
18
+ def extract_changes
19
+ list = []
20
+
21
+ command = 'git log --name-only --pretty=format:"' +
22
+ GIT_COMMIT_MARKER +
23
+ '%ci' +
24
+ GIT_FIELD_MARKER +
25
+ '%aN' +
26
+ GIT_FIELD_MARKER +
27
+ '%H' +
28
+ GIT_FIELD_MARKER +
29
+ '%s%n%n%b' +
30
+ GIT_FIELD_MARKER +
31
+ '"'
32
+
33
+ changes = `#{command}`.split(RUBY_COMMIT_MARKER)
34
+
35
+ changes.shift # throw the first (empty) entry away
36
+
37
+ changes.each do |entry|
38
+ date, who, id, msg, files = entry.split(RUBY_FIELD_MARKER)
39
+ date = Time.parse(date)
40
+ files = files.split("\n")
41
+ list << Change.new(:id=>id, :date=>date, :who=>who, :msg=>msg, :files=>files)
42
+ end
43
+
44
+ return list
45
+ end
46
+
47
+ #
48
+ #def extract_files(change_list)
49
+ # change_list.each do |change|
50
+ # files = `git show --pretty="format:" --name-only #{c.id}`
51
+ # files = files.split("\n")
52
+ # change.files = files
53
+ # end
54
+ #end
55
+
56
+ # Collect tags.
57
+ #
58
+ # `git show 1.0` produces:
59
+ #
60
+ # tag 1.0
61
+ # Tagger: 7rans <transfire@gmail.com>
62
+ # Date: Sun Oct 25 09:27:58 2009 -0400
63
+ #
64
+ # version 1.0
65
+ # commit
66
+ # ...
67
+ #
68
+ # @todo This code is pretty poor, but it suffices for now.
69
+ # And we need not worry about it the future b/c eventually
70
+ # we will replace it by using the `amp` or `scm` gem.
71
+ def extract_tags
72
+ list = []
73
+ tags = `git tag -l`
74
+ tags.split(/\s+/).each do |tag|
75
+ next unless version_tag?(tag) # only version tags
76
+ id, who, date, rev, msg = nil, nil, nil, nil, nil
77
+ info = `git show #{tag}`
78
+ info, *_ = info.split(/^(commit|diff|----)/)
79
+ if /\Atag/ =~ info
80
+ msg = ''
81
+ info.lines.to_a[1..-1].each do |line|
82
+ case line
83
+ when /^Tagger:/
84
+ who = $'.strip
85
+ when /^Date:/
86
+ date = $'.strip
87
+ when /^\s*[a-f0-9]+/
88
+ id = $0.strip
89
+ else
90
+ msg << line
91
+ end
92
+ end
93
+ msg = msg.strip
94
+
95
+ #info = `git show #{tag}^ --pretty=format:"%ci|~|%H|~|"`
96
+ #cdate, id, *_ = *info.split('|~|')
97
+
98
+ info = git_show("#{tag}")
99
+
100
+ change = Change.new(info)
101
+
102
+ list << Tag.new(:id=>change.id, :name=>tag, :date=>date, :who=>who, :msg=>msg, :commit=>change)
103
+ else
104
+ #info = `git show #{tag} --pretty=format:"%cn|~|%ce|~|%ci|~|%H|~|%s|~|"`
105
+ info = git_show(tag)
106
+ change = Change.new(info)
107
+
108
+ tag_info = {
109
+ :name => tag,
110
+ :who => info[:who],
111
+ :date => info[:date],
112
+ :msg => info[:message],
113
+ :commit => change
114
+ }
115
+ list << Tag.new(tag_info)
116
+ end
117
+
118
+ #if $DEBUG
119
+ # p who, date, rev, msg
120
+ # puts
121
+ #end
122
+
123
+ #list << tag
124
+ end
125
+
126
+ return list
127
+ end
128
+
129
+ # User name of developer.
130
+ def user
131
+ @user ||= `git config user.name`.strip
132
+ end
133
+
134
+ # Email address of developer.
135
+ def email
136
+ @email ||= `git config user.email`.strip
137
+ end
138
+
139
+ #
140
+ def repository
141
+ @repository ||= `git config remote.origin.url`.strip
142
+ end
143
+
144
+ #
145
+ # Create a tag for the given commit reference.
146
+ #
147
+ def tag(ref, label, date, message)
148
+ file = tempfile("message", message)
149
+ date = date.strftime('%Y-%m-%d 23:59') unless String===date
150
+
151
+ cmd = %[GIT_AUTHOR_DATE='#{date}' GIT_COMMITTER_DATE='#{date}' git tag -a -F '#{file}' #{label} #{ref}]
152
+ puts cmd if $DEBUG
153
+ `#{cmd}` unless $DRYRUN
154
+ end
155
+
156
+ private
157
+
158
+ #
159
+ #
160
+ #
161
+ def git_show(ref)
162
+ command = 'git show ' + ref.to_s + ' --name-only --pretty=format:"' +
163
+ '%ci' +
164
+ GIT_FIELD_MARKER +
165
+ '%cn' +
166
+ GIT_FIELD_MARKER +
167
+ '%ce' +
168
+ GIT_FIELD_MARKER +
169
+ '%H' +
170
+ GIT_FIELD_MARKER +
171
+ '%s%n%n%b' +
172
+ GIT_FIELD_MARKER +
173
+ '"'
174
+
175
+ entry = `#{command}`
176
+
177
+ date, who, email, id, msg, files = entry.split(RUBY_FIELD_MARKER)
178
+
179
+ who = who + ' ' + email
180
+ date = Time.parse(date)
181
+ files = files.split("\n")
182
+
183
+ return { :date=>date, :who=>who, :id=>id, :message=>msg, :files=>files }
184
+ end
185
+
186
+ end
187
+
188
+ end
189
+
190
+ end