Skip to content
This repository was archived by the owner on Dec 13, 2023. It is now read-only.

Commit a3c86f1

Browse files
committed
[NEW] start adding Bazaar support : parser and basic infrastructure.
Michael
1 parent 95c867a commit a3c86f1

File tree

3 files changed

+69
-0
lines changed

3 files changed

+69
-0
lines changed

lib/scm.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ module Scm
1515
require 'lib/scm/adapters/svn_adapter'
1616
require 'lib/scm/adapters/git_adapter'
1717
require 'lib/scm/adapters/hg_adapter'
18+
require 'lib/scm/adapters/bzr_adapter'
1819
require 'lib/scm/adapters/factory'
1920

2021
require 'lib/scm/parsers/parser'
@@ -25,6 +26,7 @@ module Scm
2526
require 'lib/scm/parsers/git_styled_parser'
2627
require 'lib/scm/parsers/hg_parser'
2728
require 'lib/scm/parsers/hg_styled_parser'
29+
require 'lib/scm/parsers/bzr_parser'
2830

2931
require 'lib/scm/parsers/array_writer'
3032
require 'lib/scm/parsers/xml_writer'

lib/scm/adapters/bzr_adapter.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module Scm::Adapters
2+
class BzrAdapter < AbstractAdapter
3+
def english_name
4+
"Bazaar"
5+
end
6+
end
7+
end

lib/scm/parsers/bzr_parser.rb

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
module Scm::Parsers
2+
# This parser can process the default bzr logs, with or without the --verbose flag.
3+
class BzrParser < Parser
4+
def self.scm
5+
'bzr'
6+
end
7+
8+
def self.internal_parse(buffer, opts)
9+
e = nil
10+
state = :data
11+
action = ''
12+
13+
buffer.each_line do |l|
14+
next_state = state
15+
16+
case l
17+
when /^-+$/
18+
# a new commit begins
19+
yield e if e && block_given?
20+
e = Scm::Commit.new
21+
e.diffs = []
22+
next_state = :data
23+
when /^revno:\s+(\d+)$/
24+
e.token = $1
25+
next_state = :data
26+
when /^committer:\s+(.+?)(\s+<(.+)>)?$/
27+
e.committer_name = $1
28+
e.committer_email = $3
29+
next_state = :data
30+
when /^timestamp:\s+(.+)/
31+
e.committer_date = Time.parse($1)
32+
next_state = :data
33+
when /^added:$/
34+
next_state = :collect_files
35+
action = 'A'
36+
when /^modified:$/
37+
next_state = :collect_files
38+
action = 'M'
39+
when /^removed:$/
40+
next_state = :collect_files
41+
action = 'D'
42+
when /^message:$/
43+
next_state = :collect_message
44+
e.message ||= ''
45+
when /^ (.*)$/
46+
if state == :collect_files and $1.length > 0
47+
e.diffs << Scm::Diff.new(:action => action, :path => $1)
48+
elsif state == :collect_message
49+
e.message << $1
50+
e.message << "\n"
51+
end
52+
end
53+
54+
state = next_state
55+
end
56+
yield e if e && block_given?
57+
end
58+
59+
end
60+
end

0 commit comments

Comments
 (0)