meta_project 0.4.12 → 0.4.13
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/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
@@ -1,34 +1,34 @@
|
|
1
|
-
module MetaProject
|
2
|
-
module Tracker
|
3
|
-
# This module should be included by trackers that follow a digit-based issue scheme.
|
4
|
-
# TODO: Make issue_pattern and command_pattern attributes so they can be modified. Provide examples.
|
5
|
-
module DigitIssues
|
6
|
-
# Patois issue pattern
|
7
|
-
def issue_pattern
|
8
|
-
@issue_pattern ||= /\#([\d]+)/
|
9
|
-
end
|
10
|
-
module_function :issue_pattern
|
11
|
-
|
12
|
-
# Patois command pattern
|
13
|
-
def command_pattern
|
14
|
-
@command_pattern ||= /([A-Za-z]*).?(\#[\d]+(?:(?:[, &]*|\s?and\s?)\#[\d]+)*)/
|
15
|
-
end
|
16
|
-
module_function :command_pattern
|
17
|
-
|
18
|
-
def identifier_examples
|
19
|
-
["#1926", "#1446"]
|
20
|
-
end
|
21
|
-
|
22
|
-
# TODO: find a way to extract just the issue summaries so they can be stored in dc as an array
|
23
|
-
# embedded in the revision object. that way we don't alter the original commit message
|
24
|
-
def markup(text)
|
25
|
-
text.gsub(issue_pattern) do |match|
|
26
|
-
issue_identifier = $1
|
27
|
-
issue = issue(issue_identifier)
|
28
|
-
link_text = (issue && issue.summary && issue.summary.strip! != "") ? "#{issue_identifier}: #{issue.summary}" : issue_identifier
|
29
|
-
(issue && issue.url) ? "<a href=\"#{issue.url}\">\##{link_text}</a>" : "\##{issue_identifier}"
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
1
|
+
module MetaProject
|
2
|
+
module Tracker
|
3
|
+
# This module should be included by trackers that follow a digit-based issue scheme.
|
4
|
+
# TODO: Make issue_pattern and command_pattern attributes so they can be modified. Provide examples.
|
5
|
+
module DigitIssues
|
6
|
+
# Patois issue pattern
|
7
|
+
def issue_pattern
|
8
|
+
@issue_pattern ||= /\#([\d]+)/
|
9
|
+
end
|
10
|
+
module_function :issue_pattern
|
11
|
+
|
12
|
+
# Patois command pattern
|
13
|
+
def command_pattern
|
14
|
+
@command_pattern ||= /([A-Za-z]*).?(\#[\d]+(?:(?:[, &]*|\s?and\s?)\#[\d]+)*)/
|
15
|
+
end
|
16
|
+
module_function :command_pattern
|
17
|
+
|
18
|
+
def identifier_examples
|
19
|
+
["#1926", "#1446"]
|
20
|
+
end
|
21
|
+
|
22
|
+
# TODO: find a way to extract just the issue summaries so they can be stored in dc as an array
|
23
|
+
# embedded in the revision object. that way we don't alter the original commit message
|
24
|
+
def markup(text)
|
25
|
+
text.gsub(issue_pattern) do |match|
|
26
|
+
issue_identifier = $1
|
27
|
+
issue = issue(issue_identifier)
|
28
|
+
link_text = (issue && issue.summary && issue.summary.strip! != "") ? "#{issue_identifier}: #{issue.summary}" : issue_identifier
|
29
|
+
(issue && issue.url) ? "<a href=\"#{issue.url}\">\##{link_text}</a>" : "\##{issue_identifier}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
34
|
end
|
@@ -1,57 +1,57 @@
|
|
1
|
-
module MetaProject
|
2
|
-
module Tracker
|
3
|
-
|
4
|
-
# An issue represents an entry in an issue tracker such as a bug report or
|
5
|
-
# feature request.
|
6
|
-
class Issue
|
7
|
-
attr_reader :attributes
|
8
|
-
|
9
|
-
def initialize(tracker, attributes={})
|
10
|
-
@tracker = tracker
|
11
|
-
@attributes = attributes
|
12
|
-
end
|
13
|
-
|
14
|
-
# An URL pointing to the issue in the associated tracker, or nil if
|
15
|
-
# the issue doesn't exist.
|
16
|
-
def url
|
17
|
-
@tracker.materialize(self) unless @attributes[:url]
|
18
|
-
@attributes[:url]
|
19
|
-
end
|
20
|
-
|
21
|
-
# The id of the issue in the tracker
|
22
|
-
def identifier
|
23
|
-
@tracker.materialize(self) unless @attributes[:identifier]
|
24
|
-
@attributes[:identifier]
|
25
|
-
end
|
26
|
-
|
27
|
-
# The summary of the issue (typically a one-liner)
|
28
|
-
def summary
|
29
|
-
@tracker.materialize(self) unless @attributes[:summary]
|
30
|
-
@attributes[:summary]
|
31
|
-
end
|
32
|
-
|
33
|
-
# The details of the issue (typically several lines)
|
34
|
-
def detail
|
35
|
-
@tracker.materialize(self) unless @attributes[:detail]
|
36
|
-
@attributes[:detail]
|
37
|
-
end
|
38
|
-
|
39
|
-
# Adds a comment (consisting of the +detail+) to the issue
|
40
|
-
def update(user_name, password)
|
41
|
-
@tracker.update(self, user_name, password)
|
42
|
-
end
|
43
|
-
|
44
|
-
# Creates a new issue (consisting of the +summary+ and +detail+)
|
45
|
-
def create(user_name, password)
|
46
|
-
raise "Summary not set" unless summary
|
47
|
-
raise "Detail not set" unless detail
|
48
|
-
@tracker.create(self, user_name, password)
|
49
|
-
end
|
50
|
-
|
51
|
-
# Closes the issue (adding a comment consisting of the +detail+)
|
52
|
-
def close(user_name, password)
|
53
|
-
@tracker.close(self, user_name, password)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
1
|
+
module MetaProject
|
2
|
+
module Tracker
|
3
|
+
|
4
|
+
# An issue represents an entry in an issue tracker such as a bug report or
|
5
|
+
# feature request.
|
6
|
+
class Issue
|
7
|
+
attr_reader :attributes
|
8
|
+
|
9
|
+
def initialize(tracker, attributes={})
|
10
|
+
@tracker = tracker
|
11
|
+
@attributes = attributes
|
12
|
+
end
|
13
|
+
|
14
|
+
# An URL pointing to the issue in the associated tracker, or nil if
|
15
|
+
# the issue doesn't exist.
|
16
|
+
def url
|
17
|
+
@tracker.materialize(self) unless @attributes[:url]
|
18
|
+
@attributes[:url]
|
19
|
+
end
|
20
|
+
|
21
|
+
# The id of the issue in the tracker
|
22
|
+
def identifier
|
23
|
+
@tracker.materialize(self) unless @attributes[:identifier]
|
24
|
+
@attributes[:identifier]
|
25
|
+
end
|
26
|
+
|
27
|
+
# The summary of the issue (typically a one-liner)
|
28
|
+
def summary
|
29
|
+
@tracker.materialize(self) unless @attributes[:summary]
|
30
|
+
@attributes[:summary]
|
31
|
+
end
|
32
|
+
|
33
|
+
# The details of the issue (typically several lines)
|
34
|
+
def detail
|
35
|
+
@tracker.materialize(self) unless @attributes[:detail]
|
36
|
+
@attributes[:detail]
|
37
|
+
end
|
38
|
+
|
39
|
+
# Adds a comment (consisting of the +detail+) to the issue
|
40
|
+
def update(user_name, password)
|
41
|
+
@tracker.update(self, user_name, password)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Creates a new issue (consisting of the +summary+ and +detail+)
|
45
|
+
def create(user_name, password)
|
46
|
+
raise "Summary not set" unless summary
|
47
|
+
raise "Detail not set" unless detail
|
48
|
+
@tracker.create(self, user_name, password)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Closes the issue (adding a comment consisting of the +detail+)
|
52
|
+
def close(user_name, password)
|
53
|
+
@tracker.close(self, user_name, password)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
57
|
end
|
@@ -1,2 +1,2 @@
|
|
1
|
-
require 'meta_project/tracker/jira/jira_issues'
|
2
|
-
require 'meta_project/tracker/jira/jira_tracker'
|
1
|
+
require 'meta_project/tracker/jira/jira_issues'
|
2
|
+
require 'meta_project/tracker/jira/jira_tracker'
|
@@ -1,35 +1,35 @@
|
|
1
|
-
module MetaProject
|
2
|
-
module Tracker
|
3
|
-
module Jira
|
4
|
-
# This module should be included by trackers that follow a digit-based issue scheme
|
5
|
-
module JiraIssues
|
6
|
-
|
7
|
-
# Patois issue pattern
|
8
|
-
def issue_pattern
|
9
|
-
/([A-Za-z]+-[\d]+)/
|
10
|
-
end
|
11
|
-
module_function :issue_pattern
|
12
|
-
|
13
|
-
# Patois command pattern
|
14
|
-
def command_pattern
|
15
|
-
/([A-Za-z]*).?([A-Za-z]+-[\d]+(?:(?:[, &]*|\s?and\s?)[A-Za-z]+-[\d]+)*)/
|
16
|
-
end
|
17
|
-
module_function :command_pattern
|
18
|
-
|
19
|
-
def identifier_examples
|
20
|
-
["DC-420", "pico-12"]
|
21
|
-
end
|
22
|
-
|
23
|
-
def markup(text)
|
24
|
-
text.gsub(issue_pattern) do |match|
|
25
|
-
issue_identifier = $1.upcase
|
26
|
-
issue = issue(issue_identifier)
|
27
|
-
link_text = (issue.summary && issue.summary.strip! != "") ? "#{issue_identifier}: #{issue.summary}" : issue_identifier
|
28
|
-
issue.url ? "<a href=\"#{issue.url}\">#{link_text}</a>" : issue_identifier
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
1
|
+
module MetaProject
|
2
|
+
module Tracker
|
3
|
+
module Jira
|
4
|
+
# This module should be included by trackers that follow a digit-based issue scheme
|
5
|
+
module JiraIssues
|
6
|
+
|
7
|
+
# Patois issue pattern
|
8
|
+
def issue_pattern
|
9
|
+
/([A-Za-z]+-[\d]+)/
|
10
|
+
end
|
11
|
+
module_function :issue_pattern
|
12
|
+
|
13
|
+
# Patois command pattern
|
14
|
+
def command_pattern
|
15
|
+
/([A-Za-z]*).?([A-Za-z]+-[\d]+(?:(?:[, &]*|\s?and\s?)[A-Za-z]+-[\d]+)*)/
|
16
|
+
end
|
17
|
+
module_function :command_pattern
|
18
|
+
|
19
|
+
def identifier_examples
|
20
|
+
["DC-420", "pico-12"]
|
21
|
+
end
|
22
|
+
|
23
|
+
def markup(text)
|
24
|
+
text.gsub(issue_pattern) do |match|
|
25
|
+
issue_identifier = $1.upcase
|
26
|
+
issue = issue(issue_identifier)
|
27
|
+
link_text = (issue.summary && issue.summary.strip! != "") ? "#{issue_identifier}: #{issue.summary}" : issue_identifier
|
28
|
+
issue.url ? "<a href=\"#{issue.url}\">#{link_text}</a>" : issue_identifier
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
35
|
end
|
@@ -1,124 +1,149 @@
|
|
1
|
-
require 'xmlrpc/client'
|
2
|
-
|
3
|
-
module MetaProject
|
4
|
-
module Tracker
|
5
|
-
module Jira
|
6
|
-
|
7
|
-
# Interface to JIRA. Uses the XML-RPC API defined at:
|
8
|
-
#
|
9
|
-
# http://
|
10
|
-
# http://confluence.atlassian.com/pages/viewpage.action?pageId=
|
11
|
-
# http://
|
12
|
-
class JiraTracker < Base
|
13
|
-
|
14
|
-
include JiraIssues
|
15
|
-
JIRA_API = "jira1"
|
16
|
-
|
17
|
-
attr_accessor :jira_base_url, :jira_project_id
|
18
|
-
|
19
|
-
# Creates a new JiraTracker. In order to successfully get issue info (via XMLRPC),
|
20
|
-
# two env vars must be defined. Example:
|
21
|
-
#
|
22
|
-
# JiraTracker.new("http://jira.codehaus.org", "DC")
|
23
|
-
#
|
24
|
-
# Then the following must be defined:
|
25
|
-
#
|
26
|
-
# JIRA_CODEHAUS_ORG_JIRA_USER
|
27
|
-
# JIRA_CODEHAUS_ORG_JIRA_PASSWORD
|
28
|
-
# TODO: pass in to ctor instead. do this somewhere else!
|
29
|
-
def initialize(jira_base_url=nil, jira_project_id=nil)
|
30
|
-
@jira_base_url, @jira_project_id = jira_base_url, jira_project_id
|
31
|
-
end
|
32
|
-
|
33
|
-
def overview
|
34
|
-
"#{@jira_base_url}/browse/#{@jira_project_id}"
|
35
|
-
end
|
36
|
-
|
37
|
-
def create(issue)
|
38
|
-
issue_struct = {
|
39
|
-
"project" => @jira_project_id,
|
40
|
-
"summary" => issue.summary,
|
41
|
-
"description" => issue.detail,
|
42
|
-
"type" => 2, # magic number!
|
43
|
-
"priority" => 1
|
44
|
-
}
|
45
|
-
login do |session|
|
46
|
-
issue_struct = session.createIssue(issue_struct)
|
47
|
-
issue.attributes[:identifier] = issue_struct["key"]
|
48
|
-
issue
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
"#{
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
1
|
+
require 'xmlrpc/client'
|
2
|
+
|
3
|
+
module MetaProject
|
4
|
+
module Tracker
|
5
|
+
module Jira
|
6
|
+
|
7
|
+
# Interface to JIRA. Uses the XML-RPC API defined at:
|
8
|
+
#
|
9
|
+
# http://www.atlassian.com/software/jira/docs/api/rpc-jira-plugin/latest/com/atlassian/jira/rpc/xmlrpc/XmlRpcService.html
|
10
|
+
# http://confluence.atlassian.com/pages/viewpage.action?pageId=9623
|
11
|
+
# http://confluence.atlassian.com/pages/viewpage.action?pageId=1035
|
12
|
+
class JiraTracker < Base
|
13
|
+
|
14
|
+
include JiraIssues
|
15
|
+
JIRA_API = "jira1"
|
16
|
+
|
17
|
+
attr_accessor :jira_base_url, :jira_project_id
|
18
|
+
|
19
|
+
# Creates a new JiraTracker. In order to successfully get issue info (via XMLRPC),
|
20
|
+
# two env vars must be defined. Example:
|
21
|
+
#
|
22
|
+
# JiraTracker.new("http://jira.codehaus.org", "DC")
|
23
|
+
#
|
24
|
+
# Then the following must be defined:
|
25
|
+
#
|
26
|
+
# JIRA_CODEHAUS_ORG_JIRA_USER
|
27
|
+
# JIRA_CODEHAUS_ORG_JIRA_PASSWORD
|
28
|
+
# TODO: pass in to ctor instead. do this somewhere else!
|
29
|
+
def initialize(jira_base_url=nil, jira_project_id=nil)
|
30
|
+
@jira_base_url, @jira_project_id = jira_base_url, jira_project_id
|
31
|
+
end
|
32
|
+
|
33
|
+
def overview
|
34
|
+
"#{@jira_base_url}/browse/#{@jira_project_id}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def create(issue)
|
38
|
+
issue_struct = {
|
39
|
+
"project" => @jira_project_id,
|
40
|
+
"summary" => issue.summary,
|
41
|
+
"description" => issue.detail,
|
42
|
+
"type" => 2, # magic number!
|
43
|
+
"priority" => 1
|
44
|
+
}
|
45
|
+
login do |session|
|
46
|
+
issue_struct = session.createIssue(issue_struct)
|
47
|
+
issue.attributes[:identifier] = issue_struct["key"]
|
48
|
+
issue
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def close(issue)
|
53
|
+
begin
|
54
|
+
issue_struct = {
|
55
|
+
"project" => @jira_project_id,
|
56
|
+
"summary" => issue.summary,
|
57
|
+
"description" => issue.detail,
|
58
|
+
"type" => 2, # magic number!
|
59
|
+
"priority" => 1,
|
60
|
+
"status" => 6 # magic number for closed? do we have to look it up?
|
61
|
+
}
|
62
|
+
login do |session|
|
63
|
+
# TODO: Can't close JIRA issue.
|
64
|
+
# The following method:
|
65
|
+
# http://www.atlassian.com/software/jira/docs/api/rpc-jira-plugin/latest/com/atlassian/jira/rpc/xmlrpc/XmlRpcService.html#updateIssue(java.lang.String,%20java.lang.String,%20java.util.Hashtable)
|
66
|
+
# doesn't seem to exist on the JIRA on Codehaus (older version probably)
|
67
|
+
issue_struct = session.updateIssue(issue.identifier, issue_struct)
|
68
|
+
issue.attributes[:identifier] = issue_struct["key"]
|
69
|
+
issue
|
70
|
+
end
|
71
|
+
rescue XMLRPC::FaultException => e
|
72
|
+
# Probably bad issue number. Don't set URL.
|
73
|
+
STDERR.puts("WARNING: Exception from JIRA while closing issue #{issue.identifier}: #{e.faultCode}, #{e.faultString}")
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def materialize(issue)
|
78
|
+
issue.attributes[:identifier] = issue.attributes[:identifier].upcase
|
79
|
+
|
80
|
+
# Getting summary and detail requires login
|
81
|
+
begin
|
82
|
+
login do |session|
|
83
|
+
issue_struct = session.getIssue(issue.identifier)
|
84
|
+
issue.attributes[:url] = "#{@jira_base_url}/browse/#{issue.identifier}"
|
85
|
+
issue.attributes[:summary] = issue_struct["summary"] ? issue_struct["summary"].strip : nil
|
86
|
+
issue.attributes[:detail] = issue_struct["description"] ? issue_struct["description"].strip : nil
|
87
|
+
end
|
88
|
+
rescue JiraEnvVarException => e
|
89
|
+
# Couldn't log in because of missing login info. Assume issue exists
|
90
|
+
issue.attributes[:url] = "#{@jira_base_url}/browse/#{issue.identifier}"
|
91
|
+
STDERR.puts("WARNING: #{e.message}")
|
92
|
+
rescue XMLRPC::FaultException => e
|
93
|
+
# Probably bad issue number. Don't set URL.
|
94
|
+
STDERR.puts("WARNING: Exception from JIRA while loading issue details for #{issue.identifier}: #{e.faultCode}, #{e.faultString}")
|
95
|
+
end
|
96
|
+
issue
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
def login
|
102
|
+
client = XMLRPC::Client.new2("#{@jira_base_url}/rpc/xmlrpc")
|
103
|
+
token = client.call("#{JIRA_API}.login", user, password)
|
104
|
+
yield Session.new(client, token)
|
105
|
+
end
|
106
|
+
|
107
|
+
def user
|
108
|
+
var = "#{login_env_var_prefix}_JIRA_USER"
|
109
|
+
ENV[var] || missing_env_var(var)
|
110
|
+
end
|
111
|
+
|
112
|
+
def password
|
113
|
+
var = "#{login_env_var_prefix}_JIRA_PASSWORD"
|
114
|
+
ENV[var] || missing_env_var(var)
|
115
|
+
end
|
116
|
+
|
117
|
+
def login_env_var_prefix
|
118
|
+
if(jira_base_url =~ /http:\/\/([^\/]+)/)
|
119
|
+
$1.gsub(/\./, "_").upcase
|
120
|
+
else
|
121
|
+
raise "Bad jira_base_url: #{jira_base_url}"
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def missing_env_var(var)
|
126
|
+
raise JiraEnvVarException.new("Couldn't log in to JIRA at #{@rooturl}: The " +
|
127
|
+
"#{var} environment variable must be set in order to communicate with JIRA")
|
128
|
+
end
|
129
|
+
|
130
|
+
class JiraEnvVarException < Exception
|
131
|
+
end
|
132
|
+
|
133
|
+
# This wrapper around XMLRPC::Client that allows simpler method calls
|
134
|
+
# via method_missing and doesn't require to manage the token
|
135
|
+
class Session
|
136
|
+
def initialize(client, token)
|
137
|
+
@client, @token = client, token
|
138
|
+
end
|
139
|
+
|
140
|
+
def method_missing(sym, *args, &block)
|
141
|
+
token_args = [@token] + args
|
142
|
+
xmlrpc_method = "#{JIRA_API}.#{sym.to_s}"
|
143
|
+
@client.call(xmlrpc_method, *token_args)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
124
149
|
end
|