meta_project 0.4.12 → 0.4.13
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +283 -277
- data/MIT-LICENSE +21 -21
- data/README +130 -126
- data/Rakefile +152 -152
- data/doc/base_attrs.rdoc +2 -2
- data/lib/meta_project.rb +11 -11
- data/lib/meta_project/core_ext/open_uri.rb +22 -22
- data/lib/meta_project/core_ext/pathname.rb +36 -36
- data/lib/meta_project/core_ext/string.rb +4 -4
- data/lib/meta_project/http/multipart.rb +31 -31
- data/lib/meta_project/patois/parser.rb +98 -98
- data/lib/meta_project/project.rb +4 -4
- data/lib/meta_project/project/base.rb +8 -8
- data/lib/meta_project/project/codehaus.rb +1 -1
- data/lib/meta_project/project/codehaus/codehaus_project_svn.rb +30 -30
- data/lib/meta_project/project/trac.rb +1 -1
- data/lib/meta_project/project/trac/trac_project.rb +53 -53
- data/lib/meta_project/project/xforge.rb +5 -5
- data/lib/meta_project/project/xforge/ruby_forge.rb +46 -46
- data/lib/meta_project/project/xforge/session.rb +177 -177
- data/lib/meta_project/project/xforge/source_forge.rb +49 -49
- data/lib/meta_project/project/xforge/xfile.rb +44 -44
- data/lib/meta_project/project/xforge/xforge_base.rb +81 -81
- data/lib/meta_project/project_analyzer.rb +35 -35
- data/lib/meta_project/release/freshmeat.rb +267 -267
- data/lib/meta_project/release/raa.rb +572 -572
- data/lib/meta_project/scm_web.rb +1 -1
- data/lib/meta_project/scm_web/browser.rb +111 -111
- data/lib/meta_project/scm_web/pathname.rb +88 -88
- data/lib/meta_project/tracker.rb +6 -6
- data/lib/meta_project/tracker/base.rb +23 -23
- data/lib/meta_project/tracker/digit_issues.rb +33 -33
- data/lib/meta_project/tracker/issue.rb +56 -56
- data/lib/meta_project/tracker/jira.rb +2 -2
- data/lib/meta_project/tracker/jira/jira_issues.rb +34 -34
- data/lib/meta_project/tracker/jira/jira_tracker.rb +148 -123
- data/lib/meta_project/tracker/trac.rb +1 -1
- data/lib/meta_project/tracker/trac/trac_tracker.rb +32 -32
- data/lib/meta_project/tracker/xforge.rb +3 -3
- data/lib/meta_project/tracker/xforge/ruby_forge_tracker.rb +17 -17
- data/lib/meta_project/tracker/xforge/source_forge_tracker.rb +17 -17
- data/lib/meta_project/tracker/xforge/xforge_tracker.rb +190 -190
- data/lib/meta_project/version_parser.rb +52 -52
- data/lib/rake/contrib/xforge.rb +3 -3
- data/lib/rake/contrib/xforge/base.rb +64 -64
- data/lib/rake/contrib/xforge/news_publisher.rb +97 -97
- data/lib/rake/contrib/xforge/release.rb +134 -134
- metadata +4 -3
data/doc/base_attrs.rdoc
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
* user_name
|
2
|
-
* password
|
1
|
+
* user_name
|
2
|
+
* password
|
data/lib/meta_project.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
require 'meta_project/http/multipart'
|
2
|
-
require 'meta_project/core_ext/string'
|
3
|
-
require 'meta_project/core_ext/pathname'
|
4
|
-
require 'meta_project/core_ext/open_uri'
|
5
|
-
require 'meta_project/project_analyzer'
|
6
|
-
require 'meta_project/patois'
|
7
|
-
require 'meta_project/project'
|
8
|
-
require 'meta_project/tracker'
|
9
|
-
require 'meta_project/scm_web'
|
10
|
-
require 'meta_project/version_parser'
|
11
|
-
require 'rake/contrib/xforge'
|
1
|
+
require 'meta_project/http/multipart'
|
2
|
+
require 'meta_project/core_ext/string'
|
3
|
+
require 'meta_project/core_ext/pathname'
|
4
|
+
require 'meta_project/core_ext/open_uri'
|
5
|
+
require 'meta_project/project_analyzer'
|
6
|
+
require 'meta_project/patois'
|
7
|
+
require 'meta_project/project'
|
8
|
+
require 'meta_project/tracker'
|
9
|
+
require 'meta_project/scm_web'
|
10
|
+
require 'meta_project/version_parser'
|
11
|
+
require 'rake/contrib/xforge'
|
@@ -1,22 +1,22 @@
|
|
1
|
-
require 'open-uri'
|
2
|
-
|
3
|
-
# Wrapper around Kernel.open from open-uri
|
4
|
-
# that can retry and report better errors
|
5
|
-
def better_open(url, headers=nil, retries=2, &block)
|
6
|
-
begin
|
7
|
-
# open-uri's open
|
8
|
-
headers.nil? ? Kernel.open(url, &block) : Kernel.open(url, headers, &block)
|
9
|
-
rescue Errno::ECONNREFUSED, EOFError => e
|
10
|
-
if(retries > 0)
|
11
|
-
STDERR.puts "Connection refused to #{url} - retrying in 1 sec."
|
12
|
-
sleep 1
|
13
|
-
better_open(url, headers, retries-1, &block)
|
14
|
-
else
|
15
|
-
e.message << " (URL:#{url})"
|
16
|
-
raise e
|
17
|
-
end
|
18
|
-
rescue OpenURI::HTTPError => e
|
19
|
-
e.message << " (URL:#{url})"
|
20
|
-
raise e
|
21
|
-
end
|
22
|
-
end
|
1
|
+
require 'open-uri'
|
2
|
+
|
3
|
+
# Wrapper around Kernel.open from open-uri
|
4
|
+
# that can retry and report better errors
|
5
|
+
def better_open(url, headers=nil, retries=2, &block)
|
6
|
+
begin
|
7
|
+
# open-uri's open
|
8
|
+
headers.nil? ? Kernel.open(url, &block) : Kernel.open(url, headers, &block)
|
9
|
+
rescue Errno::ECONNREFUSED, EOFError => e
|
10
|
+
if(retries > 0)
|
11
|
+
STDERR.puts "Connection refused to #{url} - retrying in 1 sec."
|
12
|
+
sleep 1
|
13
|
+
better_open(url, headers, retries-1, &block)
|
14
|
+
else
|
15
|
+
e.message << " (URL:#{url})"
|
16
|
+
raise e
|
17
|
+
end
|
18
|
+
rescue OpenURI::HTTPError => e
|
19
|
+
e.message << " (URL:#{url})"
|
20
|
+
raise e
|
21
|
+
end
|
22
|
+
end
|
@@ -1,36 +1,36 @@
|
|
1
|
-
require 'pathname'
|
2
|
-
|
3
|
-
# TODO: extend this to find comments
|
4
|
-
# http://ostermiller.org/findcomment.html
|
5
|
-
|
6
|
-
module PathnameIterator
|
7
|
-
def iterate(proc, &block)
|
8
|
-
if directory?
|
9
|
-
children.each do |c|
|
10
|
-
c.iterate(proc)
|
11
|
-
end
|
12
|
-
else
|
13
|
-
proc.call(self, &block)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def egrep(regexp, &block)
|
18
|
-
proc = Proc.new do |file|
|
19
|
-
file.open do |io|
|
20
|
-
count = 0
|
21
|
-
while line = io.gets
|
22
|
-
count += 1
|
23
|
-
if line =~ regexp
|
24
|
-
block.call("#{file.cleanpath}:#{count}:#{line}")
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
iterate(proc, &block)
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
class Pathname
|
35
|
-
include PathnameIterator
|
36
|
-
end
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
# TODO: extend this to find comments
|
4
|
+
# http://ostermiller.org/findcomment.html
|
5
|
+
|
6
|
+
module PathnameIterator
|
7
|
+
def iterate(proc, &block)
|
8
|
+
if directory?
|
9
|
+
children.each do |c|
|
10
|
+
c.iterate(proc)
|
11
|
+
end
|
12
|
+
else
|
13
|
+
proc.call(self, &block)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def egrep(regexp, &block)
|
18
|
+
proc = Proc.new do |file|
|
19
|
+
file.open do |io|
|
20
|
+
count = 0
|
21
|
+
while line = io.gets
|
22
|
+
count += 1
|
23
|
+
if line =~ regexp
|
24
|
+
block.call("#{file.cleanpath}:#{count}:#{line}")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
iterate(proc, &block)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
class Pathname
|
35
|
+
include PathnameIterator
|
36
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
class String
|
2
|
-
def strip_trailing_slash
|
3
|
-
self[-1..-1] == "/" ? self[0..-2] : self
|
4
|
-
end
|
1
|
+
class String
|
2
|
+
def strip_trailing_slash
|
3
|
+
self[-1..-1] == "/" ? self[0..-2] : self
|
4
|
+
end
|
5
5
|
end
|
@@ -1,32 +1,32 @@
|
|
1
|
-
module MetaProject
|
2
|
-
module HTTP
|
3
|
-
# TODO make this an extension of Net::HTTP and nicify the API
|
4
|
-
module Multipart
|
5
|
-
BOUNDARY = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor" #:nodoc:
|
6
|
-
|
7
|
-
def post_multipart(http, target, params, headers)
|
8
|
-
headers = headers.merge("Content-Type" => "multipart/form-data; boundary=#{BOUNDARY}")
|
9
|
-
http.post(target, post_data(params), headers)
|
10
|
-
end
|
11
|
-
|
12
|
-
# Converts an Array or Hash into HTTP POST params
|
13
|
-
def post_data(*params)
|
14
|
-
form = []
|
15
|
-
params.each do |param|
|
16
|
-
case param
|
17
|
-
when Array
|
18
|
-
form << param
|
19
|
-
when Hash
|
20
|
-
param.each do |key, value|
|
21
|
-
form <<
|
22
|
-
"--#{BOUNDARY}" <<
|
23
|
-
%Q(Content-Disposition: form-data; name="#{key}") <<
|
24
|
-
"" << value
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
form.flatten.join("\r\n")
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
1
|
+
module MetaProject
|
2
|
+
module HTTP
|
3
|
+
# TODO make this an extension of Net::HTTP and nicify the API
|
4
|
+
module Multipart
|
5
|
+
BOUNDARY = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor" #:nodoc:
|
6
|
+
|
7
|
+
def post_multipart(http, target, params, headers)
|
8
|
+
headers = headers.merge("Content-Type" => "multipart/form-data; boundary=#{BOUNDARY}")
|
9
|
+
http.post(target, post_data(params), headers)
|
10
|
+
end
|
11
|
+
|
12
|
+
# Converts an Array or Hash into HTTP POST params
|
13
|
+
def post_data(*params)
|
14
|
+
form = []
|
15
|
+
params.each do |param|
|
16
|
+
case param
|
17
|
+
when Array
|
18
|
+
form << param
|
19
|
+
when Hash
|
20
|
+
param.each do |key, value|
|
21
|
+
form <<
|
22
|
+
"--#{BOUNDARY}" <<
|
23
|
+
%Q(Content-Disposition: form-data; name="#{key}") <<
|
24
|
+
"" << value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
form.flatten.join("\r\n")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
32
|
end
|
@@ -1,99 +1,99 @@
|
|
1
|
-
module MetaProject
|
2
|
-
# Patois is a domain specific language (DSL)
|
3
|
-
# for configuration and release management. It was first implemented by
|
4
|
-
# <a href="http://projects.edgewall.com/trac/browser/trunk/contrib/trac-post-commit-hook">Trac</a>
|
5
|
-
# and this class is a Ruby port of that Python code.
|
6
|
-
#
|
7
|
-
# A similar idea was created by the DamageControl team in <a href="http://jira.codehaus.org/browse/DC-159">DC-159</a>
|
8
|
-
# before it was implemented in Trac, but the Trac team beat the DamageControl to implement it.
|
9
|
-
#
|
10
|
-
# Anyhow, by giving this mini DSL a name and some better profiling we hope its adoption
|
11
|
-
# will increase. Patois means:
|
12
|
-
#
|
13
|
-
# * a dialect other than the standard or literary dialect
|
14
|
-
# * uneducated or provincial speech
|
15
|
-
# * the characteristic special language of an occupational or social group
|
16
|
-
#
|
17
|
-
# Patois' intended usage is in SCM commit messages. A patois-aware system can parse the commit
|
18
|
-
# messages and try to recognise patois expressions and take appropriate actions.
|
19
|
-
#
|
20
|
-
# Here is a little taste of what you can say and do with Patois.
|
21
|
-
#
|
22
|
-
# == General form
|
23
|
-
#
|
24
|
-
# command #1
|
25
|
-
# command #1, #2
|
26
|
-
# command #1 & #2
|
27
|
-
# command #1 and #2 # == Closing issues in an issue tracker
|
28
|
-
#
|
29
|
-
# You can have more than one command in a message. The following commands
|
30
|
-
# are supported. There is more than one spelling for each command, to make
|
31
|
-
# this as user-friendly as possible.
|
32
|
-
#
|
33
|
-
# close, closed, closes, fix, fixed, fixes
|
34
|
-
# The specified issues are closed with the contents of the
|
35
|
-
# commit message being added to it.
|
36
|
-
#
|
37
|
-
# addresses, re, ref, references, refs, see
|
38
|
-
# The specified issues are left in their current status, but
|
39
|
-
# the contents of the commit message are added to their notes.
|
40
|
-
#
|
41
|
-
# A fairly complicated example of what you can do is with a commit message
|
42
|
-
# of:
|
43
|
-
#
|
44
|
-
# Changed blah and foo to do this or that. Fixes #10 and #12, and refs #12.
|
45
|
-
#
|
46
|
-
# This will close #10 and #12, and add a note to #12
|
47
|
-
#
|
48
|
-
module Patois
|
49
|
-
|
50
|
-
# Parses Patois
|
51
|
-
#
|
52
|
-
class Parser
|
53
|
-
|
54
|
-
SUPPORTED_COMMANDS = {
|
55
|
-
'close' => ':close',
|
56
|
-
'closed' => ':close',
|
57
|
-
'closes' => ':close',
|
58
|
-
'fix' => ':close',
|
59
|
-
'fixed' => ':close',
|
60
|
-
'fixes' => ':close',
|
61
|
-
'addresses' => ':comment',
|
62
|
-
're' => ':comment',
|
63
|
-
'ref' => ':comment',
|
64
|
-
'references' => ':comment',
|
65
|
-
'refs' => ':comment',
|
66
|
-
'see' => ':comment'
|
67
|
-
}
|
68
|
-
|
69
|
-
# Creates a new parser that will parse commands with +command_pattern+
|
70
|
-
# and emit individual commands with +issue_pattern+.
|
71
|
-
def initialize(command_pattern, issue_pattern)
|
72
|
-
@command_pattern = command_pattern
|
73
|
-
@issue_pattern = issue_pattern
|
74
|
-
end
|
75
|
-
|
76
|
-
# Parses a patois String and yields commands.
|
77
|
-
# TODO: Each operation can be executed with +execute+
|
78
|
-
def parse(msg)
|
79
|
-
msg.scan(@command_pattern) do |cmd_group|
|
80
|
-
cmd = SUPPORTED_COMMANDS[cmd_group[0].downcase]
|
81
|
-
if(cmd)
|
82
|
-
cmd_group[1].scan(@issue_pattern) do |issue_id_array|
|
83
|
-
yield Command.new(cmd, issue_id_array[0].upcase, msg)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
class Command
|
90
|
-
|
91
|
-
attr_reader :cmd, :issue_id, :msg
|
92
|
-
|
93
|
-
def initialize(cmd, issue_id, msg)
|
94
|
-
@cmd, @issue_id, @msg = cmd, issue_id, msg
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
1
|
+
module MetaProject
|
2
|
+
# Patois is a domain specific language (DSL)
|
3
|
+
# for configuration and release management. It was first implemented by
|
4
|
+
# <a href="http://projects.edgewall.com/trac/browser/trunk/contrib/trac-post-commit-hook">Trac</a>
|
5
|
+
# and this class is a Ruby port of that Python code.
|
6
|
+
#
|
7
|
+
# A similar idea was created by the DamageControl team in <a href="http://jira.codehaus.org/browse/DC-159">DC-159</a>
|
8
|
+
# before it was implemented in Trac, but the Trac team beat the DamageControl to implement it.
|
9
|
+
#
|
10
|
+
# Anyhow, by giving this mini DSL a name and some better profiling we hope its adoption
|
11
|
+
# will increase. Patois means:
|
12
|
+
#
|
13
|
+
# * a dialect other than the standard or literary dialect
|
14
|
+
# * uneducated or provincial speech
|
15
|
+
# * the characteristic special language of an occupational or social group
|
16
|
+
#
|
17
|
+
# Patois' intended usage is in SCM commit messages. A patois-aware system can parse the commit
|
18
|
+
# messages and try to recognise patois expressions and take appropriate actions.
|
19
|
+
#
|
20
|
+
# Here is a little taste of what you can say and do with Patois.
|
21
|
+
#
|
22
|
+
# == General form
|
23
|
+
#
|
24
|
+
# command #1
|
25
|
+
# command #1, #2
|
26
|
+
# command #1 & #2
|
27
|
+
# command #1 and #2 # == Closing issues in an issue tracker
|
28
|
+
#
|
29
|
+
# You can have more than one command in a message. The following commands
|
30
|
+
# are supported. There is more than one spelling for each command, to make
|
31
|
+
# this as user-friendly as possible.
|
32
|
+
#
|
33
|
+
# close, closed, closes, fix, fixed, fixes
|
34
|
+
# The specified issues are closed with the contents of the
|
35
|
+
# commit message being added to it.
|
36
|
+
#
|
37
|
+
# addresses, re, ref, references, refs, see
|
38
|
+
# The specified issues are left in their current status, but
|
39
|
+
# the contents of the commit message are added to their notes.
|
40
|
+
#
|
41
|
+
# A fairly complicated example of what you can do is with a commit message
|
42
|
+
# of:
|
43
|
+
#
|
44
|
+
# Changed blah and foo to do this or that. Fixes #10 and #12, and refs #12.
|
45
|
+
#
|
46
|
+
# This will close #10 and #12, and add a note to #12
|
47
|
+
#
|
48
|
+
module Patois
|
49
|
+
|
50
|
+
# Parses Patois
|
51
|
+
#
|
52
|
+
class Parser
|
53
|
+
|
54
|
+
SUPPORTED_COMMANDS = {
|
55
|
+
'close' => ':close',
|
56
|
+
'closed' => ':close',
|
57
|
+
'closes' => ':close',
|
58
|
+
'fix' => ':close',
|
59
|
+
'fixed' => ':close',
|
60
|
+
'fixes' => ':close',
|
61
|
+
'addresses' => ':comment',
|
62
|
+
're' => ':comment',
|
63
|
+
'ref' => ':comment',
|
64
|
+
'references' => ':comment',
|
65
|
+
'refs' => ':comment',
|
66
|
+
'see' => ':comment'
|
67
|
+
}
|
68
|
+
|
69
|
+
# Creates a new parser that will parse commands with +command_pattern+
|
70
|
+
# and emit individual commands with +issue_pattern+.
|
71
|
+
def initialize(command_pattern, issue_pattern)
|
72
|
+
@command_pattern = command_pattern
|
73
|
+
@issue_pattern = issue_pattern
|
74
|
+
end
|
75
|
+
|
76
|
+
# Parses a patois String and yields commands.
|
77
|
+
# TODO: Each operation can be executed with +execute+
|
78
|
+
def parse(msg)
|
79
|
+
msg.scan(@command_pattern) do |cmd_group|
|
80
|
+
cmd = SUPPORTED_COMMANDS[cmd_group[0].downcase]
|
81
|
+
if(cmd)
|
82
|
+
cmd_group[1].scan(@issue_pattern) do |issue_id_array|
|
83
|
+
yield Command.new(cmd, issue_id_array[0].upcase, msg)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
class Command
|
90
|
+
|
91
|
+
attr_reader :cmd, :issue_id, :msg
|
92
|
+
|
93
|
+
def initialize(cmd, issue_id, msg)
|
94
|
+
@cmd, @issue_id, @msg = cmd, issue_id, msg
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
99
|
end
|
data/lib/meta_project/project.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'meta_project/project/base'
|
2
|
-
require 'meta_project/project/xforge'
|
3
|
-
require 'meta_project/project/trac'
|
4
|
-
require 'meta_project/project/codehaus'
|
1
|
+
require 'meta_project/project/base'
|
2
|
+
require 'meta_project/project/xforge'
|
3
|
+
require 'meta_project/project/trac'
|
4
|
+
require 'meta_project/project/codehaus'
|
@@ -1,9 +1,9 @@
|
|
1
|
-
module MetaProject
|
2
|
-
module Project
|
3
|
-
class Base
|
4
|
-
attr_reader :scm, :scm_web, :tracker, :name, :home_page
|
5
|
-
end
|
6
|
-
|
7
|
-
class ProjectException < Exception; end
|
8
|
-
end
|
1
|
+
module MetaProject
|
2
|
+
module Project
|
3
|
+
class Base
|
4
|
+
attr_reader :scm, :scm_web, :tracker, :name, :home_page
|
5
|
+
end
|
6
|
+
|
7
|
+
class ProjectException < Exception; end
|
8
|
+
end
|
9
9
|
end
|