vclog 1.0.0
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/COPYING +674 -0
- data/HISTORY +20 -0
- data/MANIFEST +32 -0
- data/README +38 -0
- data/RELEASE +11 -0
- data/bin/vclog +131 -0
- data/lib/vclog/changelog.rb +484 -0
- data/lib/vclog/core_ext.rb +106 -0
- data/lib/vclog/vcs/darcs.rb +83 -0
- data/lib/vclog/vcs/git.rb +54 -0
- data/lib/vclog/vcs/hg.rb +0 -0
- data/lib/vclog/vcs/svn.rb +58 -0
- data/lib/vclog/vcs.rb +82 -0
- data/meta/authors +1 -0
- data/meta/created +1 -0
- data/meta/description +1 -0
- data/meta/homepage +1 -0
- data/meta/license +1 -0
- data/meta/mailinglist +1 -0
- data/meta/package +1 -0
- data/meta/project +1 -0
- data/meta/repository +2 -0
- data/meta/requires +1 -0
- data/meta/sitemap +1 -0
- data/meta/summary +1 -0
- data/meta/title +1 -0
- data/meta/version +1 -0
- metadata +98 -0
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'facets/string/indent'
|
2
|
+
require 'facets/string/tabto'
|
3
|
+
require 'facets/string/margin'
|
4
|
+
require 'facets/enumerable/group_by'
|
5
|
+
|
6
|
+
=begin
|
7
|
+
|
8
|
+
module VCLog
|
9
|
+
|
10
|
+
# Extensions for String class.
|
11
|
+
# Taken from Facets.
|
12
|
+
module String
|
13
|
+
|
14
|
+
# Provides a margin controlled string.
|
15
|
+
#
|
16
|
+
# x = %Q{
|
17
|
+
# | This
|
18
|
+
# | is
|
19
|
+
# | margin controlled!
|
20
|
+
# }.margin
|
21
|
+
#
|
22
|
+
#
|
23
|
+
# NOTE: This may still need a bit of tweaking.
|
24
|
+
#
|
25
|
+
# CREDIT: Trans
|
26
|
+
|
27
|
+
def margin(n=0)
|
28
|
+
#d = /\A.*\n\s*(.)/.match( self )[1]
|
29
|
+
#d = /\A\s*(.)/.match( self)[1] unless d
|
30
|
+
d = ((/\A.*\n\s*(.)/.match(self)) ||
|
31
|
+
(/\A\s*(.)/.match(self)))[1]
|
32
|
+
return '' unless d
|
33
|
+
if n == 0
|
34
|
+
gsub(/\n\s*\Z/,'').gsub(/^\s*[#{d}]/, '')
|
35
|
+
else
|
36
|
+
gsub(/\n\s*\Z/,'').gsub(/^\s*[#{d}]/, ' ' * n)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Preserves relative tabbing.
|
41
|
+
# The first non-empty line ends up with n spaces before nonspace.
|
42
|
+
#
|
43
|
+
# CREDIT: Gavin Sinclair
|
44
|
+
|
45
|
+
def tabto(n)
|
46
|
+
if self =~ /^( *)\S/
|
47
|
+
indent(n - $1.length)
|
48
|
+
else
|
49
|
+
self
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# Indent left or right by n spaces.
|
54
|
+
# (This used to be called #tab and aliased as #indent.)
|
55
|
+
#
|
56
|
+
# CREDIT: Gavin Sinclair
|
57
|
+
# CREDIT: Trans
|
58
|
+
|
59
|
+
def indent(n)
|
60
|
+
if n >= 0
|
61
|
+
gsub(/^/, ' ' * n)
|
62
|
+
else
|
63
|
+
gsub(/^ {0,#{-n}}/, "")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
class String #:nodoc:
|
72
|
+
include VCLog::String
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
# Core extension
|
77
|
+
|
78
|
+
module Enumerable
|
79
|
+
|
80
|
+
unless defined?(group_by) or defined?(::ActiveSupport) # 1.9 or ActiveSupport
|
81
|
+
|
82
|
+
# #group_by is used to group items in a collection by something they
|
83
|
+
# have in common. The common factor is the key in the resulting hash, the
|
84
|
+
# array of like elements is the value.
|
85
|
+
#
|
86
|
+
# (1..5).group_by { |n| n % 3 }
|
87
|
+
# #=> { 0 => [3], 1 => [1, 4], 2 => [2,5] }
|
88
|
+
#
|
89
|
+
# ["I had", 1, "dollar and", 50, "cents"].group_by { |e| e.class }
|
90
|
+
# #=> { String => ["I had","dollar and","cents"], Fixnum => [1,50] }
|
91
|
+
#
|
92
|
+
# CREDIT: Erik Veenstra
|
93
|
+
|
94
|
+
def group_by #:yield:
|
95
|
+
#h = k = e = nil
|
96
|
+
r = Hash.new
|
97
|
+
each{ |e| (r[yield(e)] ||= []) << e }
|
98
|
+
r
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
=end
|
106
|
+
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module VCLog
|
2
|
+
|
3
|
+
class VCS
|
4
|
+
|
5
|
+
# = DARCS
|
6
|
+
#
|
7
|
+
# Provide Darcs SCM revision tools.
|
8
|
+
#
|
9
|
+
# TODO: This needs to be fixed.
|
10
|
+
#
|
11
|
+
class DARCS
|
12
|
+
|
13
|
+
### Is a darcs repository?
|
14
|
+
def repository?
|
15
|
+
File.directory?('_darcs')
|
16
|
+
end
|
17
|
+
|
18
|
+
### This is also a module function.
|
19
|
+
module_function :repository?
|
20
|
+
|
21
|
+
### Cached Changelog.
|
22
|
+
def changelog
|
23
|
+
@changelog ||= generate_changelog
|
24
|
+
end
|
25
|
+
|
26
|
+
### Generate Changelog object.
|
27
|
+
def generate_changelog
|
28
|
+
raise "not a darcs repository" unless repository?
|
29
|
+
|
30
|
+
log = Changelog.new
|
31
|
+
|
32
|
+
txt = `darcs changes` #--repo=#{@repository}`
|
33
|
+
|
34
|
+
txt.each_line do |line|
|
35
|
+
case line
|
36
|
+
when /^\s*$/
|
37
|
+
when /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun)/
|
38
|
+
when /^\s*tagged/
|
39
|
+
log << $'
|
40
|
+
log << "\n"
|
41
|
+
else
|
42
|
+
log << line
|
43
|
+
log << "\n"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
return log
|
48
|
+
end
|
49
|
+
|
50
|
+
### Retrieve the "revision number" from the darcs tree.
|
51
|
+
def calculate_version
|
52
|
+
raise "not a darcs repository" unless repository?
|
53
|
+
|
54
|
+
status = info.status
|
55
|
+
|
56
|
+
changes = `darcs changes`
|
57
|
+
count = 0
|
58
|
+
tag = "0.0"
|
59
|
+
|
60
|
+
changes.each("\n\n") do |change|
|
61
|
+
head, title, desc = change.split("\n", 3)
|
62
|
+
if title =~ /^ \*/
|
63
|
+
# Normal change.
|
64
|
+
count += 1
|
65
|
+
elsif title =~ /tagged (.*)/
|
66
|
+
# Tag. We look for these.
|
67
|
+
tag = $1
|
68
|
+
break
|
69
|
+
else
|
70
|
+
warn "Unparsable change: #{change}"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
ver = "#{tag}.#{count.to_s}"
|
74
|
+
|
75
|
+
return ver
|
76
|
+
#format_version_stamp(ver, status) # ,released)
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module VCLog
|
2
|
+
|
3
|
+
class VCS
|
4
|
+
|
5
|
+
### = GIT
|
6
|
+
###
|
7
|
+
class GIT
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
#
|
14
|
+
def changelog
|
15
|
+
@changelog ||= generate_changelog
|
16
|
+
end
|
17
|
+
|
18
|
+
#
|
19
|
+
def generate_changelog
|
20
|
+
log = Changelog.new
|
21
|
+
|
22
|
+
changelog ||= `git-log`.strip
|
23
|
+
|
24
|
+
changes = changelog.split(/^commit/m)
|
25
|
+
|
26
|
+
changes.shift # throw the first (empty) entry away
|
27
|
+
|
28
|
+
changes.each do |text|
|
29
|
+
date, who, rev, msg = nil, nil, nil, []
|
30
|
+
text.each_line do |line|
|
31
|
+
unless rev
|
32
|
+
rev = line.strip
|
33
|
+
next
|
34
|
+
end
|
35
|
+
if md = /^Author:(.*?)$/.match(line)
|
36
|
+
who = md[1]
|
37
|
+
elsif md = /^Date:(.*?)$/m.match(line)
|
38
|
+
date = Time.parse(md[1])
|
39
|
+
else
|
40
|
+
msg << line.strip
|
41
|
+
end
|
42
|
+
end
|
43
|
+
log.change(date, who, rev, msg.join("\n"))
|
44
|
+
end
|
45
|
+
|
46
|
+
@changelog = log
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
data/lib/vclog/vcs/hg.rb
ADDED
File without changes
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module VCLog
|
2
|
+
|
3
|
+
class VCS
|
4
|
+
|
5
|
+
# = SVN
|
6
|
+
#
|
7
|
+
# Raw SVN format:
|
8
|
+
#
|
9
|
+
# ------------------------------------------------------------------------
|
10
|
+
# r34 | transami | 2006-08-02 22:10:11 -0400 (Wed, 02 Aug 2006) | 2 lines
|
11
|
+
#
|
12
|
+
# change foo to work better
|
13
|
+
#
|
14
|
+
class SVN
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
end
|
18
|
+
|
19
|
+
###
|
20
|
+
def changelog
|
21
|
+
@changelog ||= generate_changelog
|
22
|
+
end
|
23
|
+
|
24
|
+
###
|
25
|
+
def generate_changelog
|
26
|
+
log = Changelog.new
|
27
|
+
|
28
|
+
txt = `svn log`.strip
|
29
|
+
|
30
|
+
com = txt.split(/^[-]+$/)
|
31
|
+
|
32
|
+
com.each do |msg|
|
33
|
+
msg = msg.strip
|
34
|
+
|
35
|
+
next if msg.empty?
|
36
|
+
|
37
|
+
idx = msg.index("\n")
|
38
|
+
head = msg.slice!(0...idx)
|
39
|
+
rev, who, date, cnt = *head.split('|')
|
40
|
+
|
41
|
+
rev = rev.strip
|
42
|
+
who = who.strip
|
43
|
+
msg = msg.strip
|
44
|
+
|
45
|
+
date = Time.parse(date)
|
46
|
+
|
47
|
+
log.change(date, who, rev, msg)
|
48
|
+
end
|
49
|
+
|
50
|
+
@changelog = log
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
data/lib/vclog/vcs.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
module VCLog
|
2
|
+
|
3
|
+
require 'time'
|
4
|
+
require 'vclog/changelog'
|
5
|
+
require 'vclog/vcs/svn'
|
6
|
+
require 'vclog/vcs/git'
|
7
|
+
#require 'vclog/vcs/hg'
|
8
|
+
#require 'vclog/vcs/darcs'
|
9
|
+
|
10
|
+
# TODO: Might we have a NO-VCS changelog based on
|
11
|
+
# LOG: entries in source files?
|
12
|
+
|
13
|
+
# = Version Control System
|
14
|
+
class VCS
|
15
|
+
|
16
|
+
attr :type
|
17
|
+
|
18
|
+
def initialize(root=nil)
|
19
|
+
@root = root || Dir.pwd
|
20
|
+
@type = read_type
|
21
|
+
raise ArgumentError, "Not a recognized version control system." unless @type
|
22
|
+
end
|
23
|
+
|
24
|
+
def read_type
|
25
|
+
dir = nil
|
26
|
+
Dir.chdir(@root) do
|
27
|
+
dir = Dir.glob("{.svn,.git,.hg,_darcs}").first
|
28
|
+
end
|
29
|
+
dir[1..-1] if dir
|
30
|
+
end
|
31
|
+
|
32
|
+
def delegate
|
33
|
+
@delegate ||= VCS.const_get(type.upcase).new
|
34
|
+
end
|
35
|
+
|
36
|
+
#
|
37
|
+
def method_missing(s, *a, &b)
|
38
|
+
delegate.send(s, *a, &b)
|
39
|
+
end
|
40
|
+
|
41
|
+
=begin
|
42
|
+
# Write the ChangeLog to file.
|
43
|
+
|
44
|
+
def write_changelog( log, file )
|
45
|
+
if File.directory?(file)
|
46
|
+
file = File.join( file, DEFAULT_CHANGELOG_FILE )
|
47
|
+
end
|
48
|
+
File.open(file,'w+'){ |f| f << log }
|
49
|
+
puts "Change log written to #{file}."
|
50
|
+
end
|
51
|
+
|
52
|
+
# Write version stamp to file.
|
53
|
+
|
54
|
+
def write_version( stamp, file )
|
55
|
+
if File.directory?(file)
|
56
|
+
file = File.join( file, DEFAULT_VERSION_FILE )
|
57
|
+
end
|
58
|
+
File.open(file,'w'){ |f| f << stamp }
|
59
|
+
puts "#{file} saved."
|
60
|
+
end
|
61
|
+
|
62
|
+
# Format the version stamp.
|
63
|
+
|
64
|
+
def format_version_stamp( version, status=nil, date=nil )
|
65
|
+
if date.respond_to?(:strftime)
|
66
|
+
date = date.strftime("%Y-%m-%d")
|
67
|
+
else
|
68
|
+
date = Time.now.strftime("%Y-%m-%d")
|
69
|
+
end
|
70
|
+
status = nil if status.to_s.strip.empty?
|
71
|
+
stamp = []
|
72
|
+
stamp << version
|
73
|
+
stamp << status if status
|
74
|
+
stamp << "(#{date})"
|
75
|
+
stamp.join(' ')
|
76
|
+
end
|
77
|
+
=end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
data/meta/authors
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Trans <transfire@gmail.com>
|
data/meta/created
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2006-05-09
|
data/meta/description
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
VCLog is a cross-VCS/SCM ChangeLog generator.
|
data/meta/homepage
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
http://proutils.rubyforge.org/vclog
|
data/meta/license
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
GPL
|
data/meta/mailinglist
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
tigerops-community@rubyforge.org
|
data/meta/package
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
vclog
|
data/meta/project
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
proutils
|
data/meta/repository
ADDED
data/meta/requires
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
facets > 2.4
|
data/meta/sitemap
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
doc/rdoc: vclog
|
data/meta/summary
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Cross-VCS/SCM ChangeLog Generator
|
data/meta/title
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
VCLog
|
data/meta/version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.0.0
|
metadata
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vclog
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Trans <transfire@gmail.com>
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-08-05 00:00:00 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: facets
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
description: VCLog is a cross-VCS/SCM ChangeLog generator.
|
26
|
+
email: transfire@gmail.com
|
27
|
+
executables:
|
28
|
+
- vclog
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files:
|
32
|
+
- README
|
33
|
+
- MANIFEST
|
34
|
+
- RELEASE
|
35
|
+
- HISTORY
|
36
|
+
- COPYING
|
37
|
+
files:
|
38
|
+
- RELEASE
|
39
|
+
- README
|
40
|
+
- HISTORY
|
41
|
+
- meta/created
|
42
|
+
- meta/repository
|
43
|
+
- meta/homepage
|
44
|
+
- meta/summary
|
45
|
+
- meta/package
|
46
|
+
- meta/title
|
47
|
+
- meta/version
|
48
|
+
- meta/license
|
49
|
+
- meta/sitemap
|
50
|
+
- meta/mailinglist
|
51
|
+
- meta/authors
|
52
|
+
- meta/requires
|
53
|
+
- meta/project
|
54
|
+
- meta/description
|
55
|
+
- lib/vclog/changelog.rb
|
56
|
+
- lib/vclog/core_ext.rb
|
57
|
+
- lib/vclog/vcs/darcs.rb
|
58
|
+
- lib/vclog/vcs/git.rb
|
59
|
+
- lib/vclog/vcs/svn.rb
|
60
|
+
- lib/vclog/vcs/hg.rb
|
61
|
+
- lib/vclog/vcs.rb
|
62
|
+
- bin/vclog
|
63
|
+
- COPYING
|
64
|
+
- MANIFEST
|
65
|
+
has_rdoc: true
|
66
|
+
homepage: http://proutils.rubyforge.org/vclog
|
67
|
+
licenses: []
|
68
|
+
|
69
|
+
post_install_message:
|
70
|
+
rdoc_options:
|
71
|
+
- --inline-source
|
72
|
+
- --title
|
73
|
+
- vclog api
|
74
|
+
- --main
|
75
|
+
- README
|
76
|
+
require_paths:
|
77
|
+
- lib
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: "0"
|
83
|
+
version:
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: "0"
|
89
|
+
version:
|
90
|
+
requirements: []
|
91
|
+
|
92
|
+
rubyforge_project: proutils
|
93
|
+
rubygems_version: 1.3.4
|
94
|
+
signing_key:
|
95
|
+
specification_version: 3
|
96
|
+
summary: VCLog is a cross-VCS/SCM ChangeLog generator.
|
97
|
+
test_files: []
|
98
|
+
|