Class: Redmine::Scm::Adapters::BazaarAdapter
Constant Summary
collapse
- BZR_BIN =
Redmine::Configuration['scm_bazaar_command'] || "bzr"
Class Method Summary
collapse
Instance Method Summary
collapse
-
#annotate(path, identifier = nil) ⇒ Object
-
#append_revisions_only ⇒ Object
-
#bzr_path_encodig=(encoding) ⇒ Object
-
#cat(path, identifier = nil) ⇒ Object
-
#diff(path, identifier_from, identifier_to = nil) ⇒ Object
-
#entries(path = nil, identifier = nil, options = {}) ⇒ Object
Returns an Entries collection or nil if the given path doesn’t exist in the repository.
-
#info ⇒ Object
Get info about the repository.
-
#initialize(url, root_url = nil, login = nil, password = nil, path_encoding = nil) ⇒ BazaarAdapter
constructor
A new instance of BazaarAdapter.
-
#revisions(path = nil, identifier_from = nil, identifier_to = nil, options = {}) ⇒ Object
#adapter_name, #branches, client_version_above?, client_version_string, #default_branch, #entry, logger, #path_encoding, #properties, #root_url, shell_quote, shell_quote_command, shellout, #supports_annotate?, #supports_cat?, #tags, #url, #valid_name?, #with_leading_slash, #with_trailing_slash, #without_leading_slash, #without_trailing_slash
shell_quote, shell_quote_command
Constructor Details
#initialize(url, root_url = nil, login = nil, password = nil, path_encoding = nil) ⇒ BazaarAdapter
Returns a new instance of BazaarAdapter.
58
59
60
|
# File 'lib/redmine/scm/adapters/bazaar_adapter.rb', line 58
def initialize(url, root_url=nil, login=nil, password=nil, path_encoding=nil)
super(url, url, nil, nil, 'UTF-8')
end
|
Class Method Details
.branch_conf_path(path) ⇒ Object
259
260
261
262
263
264
265
|
# File 'lib/redmine/scm/adapters/bazaar_adapter.rb', line 259
def self.branch_conf_path(path)
return if path.nil?
m = path.match(%r{^(.*[/\\])\.bzr.*$})
bcp = (m ? m[1] : path).gsub(%r{[\/\\]$}, "")
File.join(bcp, ".bzr", "branch", "branch.conf")
end
|
.client_available ⇒ Object
42
43
44
|
# File 'lib/redmine/scm/adapters/bazaar_adapter.rb', line 42
def client_available
!client_version.empty?
end
|
.client_command ⇒ Object
30
31
32
|
# File 'lib/redmine/scm/adapters/bazaar_adapter.rb', line 30
def client_command
@@bin ||= BZR_BIN
end
|
.client_version ⇒ Object
38
39
40
|
# File 'lib/redmine/scm/adapters/bazaar_adapter.rb', line 38
def client_version
@@client_version ||= (scm_command_version || [])
end
|
.scm_command_version ⇒ Object
46
47
48
49
50
51
|
# File 'lib/redmine/scm/adapters/bazaar_adapter.rb', line 46
def scm_command_version
scm_version = scm_version_from_command_line.b
if m = scm_version.match(%r{\A(.*?)((\d+\.)+\d+)})
m[2].scan(%r{\d+}).collect(&:to_i)
end
end
|
.scm_version_from_command_line ⇒ Object
53
54
55
|
# File 'lib/redmine/scm/adapters/bazaar_adapter.rb', line 53
def scm_version_from_command_line
shellout("#{sq_bin} --version") {|io| io.read}.to_s
end
|
.sq_bin ⇒ Object
34
35
36
|
# File 'lib/redmine/scm/adapters/bazaar_adapter.rb', line 34
def sq_bin
@@sq_bin ||= shell_quote_command
end
|
Instance Method Details
#annotate(path, identifier = nil) ⇒ Object
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
|
# File 'lib/redmine/scm/adapters/bazaar_adapter.rb', line 231
def annotate(path, identifier=nil)
blame = Annotate.new
cmd_args = %w|annotate -q --all|
cmd_args << "-r#{identifier.to_i}" if identifier && identifier.to_i > 0
cmd_args << bzr_target(path)
scm_cmd(*cmd_args) do |io|
author = nil
identifier = nil
io.each_line do |line|
next unless line =~ %r{^(\d+) ([^|]+)\| (.*)$}
rev = $1
blame.
add_line(
$3.rstrip,
Revision.new(
:identifier => rev,
:revision => rev,
:author => $2.strip
)
)
end
end
blame
rescue ScmCommandAborted
nil
end
|
#append_revisions_only ⇒ Object
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
|
# File 'lib/redmine/scm/adapters/bazaar_adapter.rb', line 267
def append_revisions_only
return @aro unless @aro.nil?
@aro = false
bcp = self.class.branch_conf_path(url)
if bcp && File.exist?(bcp)
begin
f = File.open(bcp, "r")
cnt = 0
f.each_line do |line|
l = line.chomp.to_s
if l =~ /^\s*append_revisions_only\s*=\s*(\w+)\s*$/
str_aro = $1
if str_aro.casecmp("TRUE") == 0
@aro = true
cnt += 1
elsif str_aro.casecmp("FALSE") == 0
@aro = false
cnt += 1
end
if cnt > 1
@aro = false
break
end
end
end
ensure
f.close
end
end
@aro
end
|
#bzr_path_encodig=(encoding) ⇒ Object
62
63
64
|
# File 'lib/redmine/scm/adapters/bazaar_adapter.rb', line 62
def bzr_path_encodig=(encoding)
@path_encoding = encoding
end
|
#cat(path, identifier = nil) ⇒ Object
217
218
219
220
221
222
223
224
225
226
227
228
229
|
# File 'lib/redmine/scm/adapters/bazaar_adapter.rb', line 217
def cat(path, identifier=nil)
cat = nil
cmd_args = %w|cat|
cmd_args << "-r#{identifier.to_i}" if identifier && identifier.to_i > 0
cmd_args << bzr_target(path)
scm_cmd(*cmd_args) do |io|
io.binmode
cat = io.read
end
cat
rescue ScmCommandAborted
nil
end
|
#diff(path, identifier_from, identifier_to = nil) ⇒ Object
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
|
# File 'lib/redmine/scm/adapters/bazaar_adapter.rb', line 195
def diff(path, identifier_from, identifier_to=nil)
path ||= ''
if identifier_to
identifier_to = identifier_to.to_i
else
identifier_to = identifier_from.to_i - 1
end
if identifier_from
identifier_from = identifier_from.to_i
end
diff = []
cmd_args = %w|diff|
cmd_args << "-r#{identifier_to}..#{identifier_from}"
cmd_args << bzr_target(path)
scm_cmd_no_raise(*cmd_args) do |io|
io.each_line do |line|
diff << line
end
end
diff
end
|
#entries(path = nil, identifier = nil, options = {}) ⇒ Object
Returns an Entries collection or nil if the given path doesn’t exist in the repository
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
124
125
|
# File 'lib/redmine/scm/adapters/bazaar_adapter.rb', line 90
def entries(path=nil, identifier=nil, options={})
path ||= ''
entries = Entries.new
identifier = -1 unless identifier && identifier.to_i > 0
cmd_args = %w|ls -v --show-ids|
cmd_args << "-r#{identifier.to_i}"
cmd_args << bzr_target(path)
scm_cmd(*cmd_args) do |io|
prefix_utf8 = "#{url}/#{path}".tr('\\', '/')
logger.debug "PREFIX: #{prefix_utf8}"
prefix = scm_iconv(@path_encoding, 'UTF-8', prefix_utf8).b
re = %r{^V\s+(#{Regexp.escape(prefix)})?(\/?)([^\/]+)(\/?)\s+(\S+)\r?$}
io.each_line do |line|
next unless line =~ re
name_locale, slash, revision = $3.strip, $4, $5.strip
name = scm_iconv('UTF-8', @path_encoding, name_locale)
entries <<
Entry.new(
{
:name => name,
:path => ((path.empty? ? "" : "#{path}/") + name),
:kind => (slash.blank? ? 'file' : 'dir'),
:size => nil,
:lastrev => Revision.new(:revision => revision)
}
)
end
end
if logger && logger.debug?
logger.debug("Found #{entries.size} entries in the repository for #{target(path)}")
end
entries.sort_by_name
rescue ScmCommandAborted
nil
end
|
#info ⇒ Object
Get info about the repository
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
# File 'lib/redmine/scm/adapters/bazaar_adapter.rb', line 67
def info
cmd_args = %w|revno|
cmd_args << bzr_target('')
info = nil
scm_cmd(*cmd_args) do |io|
if io.read =~ %r{^(\d+)\r?$}
info =
Info.new(
{
:root_url => url,
:lastrev =>
Revision.new({:identifier => $1})
}
)
end
end
info
rescue ScmCommandAborted
nil
end
|
#revisions(path = nil, identifier_from = nil, identifier_to = nil, options = {}) ⇒ Object
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
|
# File 'lib/redmine/scm/adapters/bazaar_adapter.rb', line 127
def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
path ||= ''
identifier_from = (identifier_from and identifier_from.to_i > 0) ? identifier_from.to_i : 'last:1'
identifier_to = (identifier_to and identifier_to.to_i > 0) ? identifier_to.to_i : 1
revisions = Revisions.new
cmd_args = %w|log -v --show-ids|
cmd_args << "-r#{identifier_to}..#{identifier_from}"
cmd_args << bzr_target(path)
scm_cmd(*cmd_args) do |io|
revision = nil
parsing = nil
io.each_line do |line|
if line.start_with?('----')
revisions << revision if revision
revision = Revision.new(:paths => [], :message => '')
parsing = nil
else
next unless revision
if line =~ /^revno: (\d+)($|\s\[merge\]$)/
revision.identifier = $1.to_i
elsif line =~ /^committer: (.+)$/
revision.author = $1.strip
elsif line =~ /^revision-id:(.+)$/
revision.scmid = $1.strip
elsif line =~ /^timestamp: (.+)$/
revision.time = Time.parse($1).localtime
elsif line.start_with?(' -----')
parsing = nil unless parsing == 'message'
elsif line =~ /^(message|added|modified|removed|renamed):/
parsing = $1
elsif line =~ /^ (.*)$/
if parsing == 'message'
revision.message += "#{$1}\n"
else
if $1 =~ /^(.*)\s+(\S+)$/
path_locale = $1.strip
path = scm_iconv('UTF-8', @path_encoding, path_locale)
revid = $2
case parsing
when 'added'
revision.paths << {:action => 'A', :path => "/#{path}", :revision => revid}
when 'modified'
revision.paths << {:action => 'M', :path => "/#{path}", :revision => revid}
when 'removed'
revision.paths << {:action => 'D', :path => "/#{path}", :revision => revid}
when 'renamed'
new_path = path.split('=>').last
if new_path
revision.paths << {:action => 'M', :path => "/#{new_path.strip}",
:revision => revid}
end
end
end
end
else
parsing = nil
end
end
end
revisions << revision if revision
end
revisions
rescue ScmCommandAborted
nil
end
|