Blob of vendor/grit/lib/grit/diff.rb (raw blob data)

1 module Grit
2
3 class Diff
4 attr_reader :a_path, :b_path
5 attr_reader :a_commit, :b_commit
6 attr_reader :a_mode, :b_mode
7 attr_reader :new_file, :deleted_file
8 attr_reader :diff
9
10 def initialize(repo, a_path, b_path, a_commit, b_commit, a_mode, b_mode, new_file, deleted_file, diff)
11 @repo = repo
12 @a_path = a_path
13 @b_path = b_path
14 @a_commit = a_commit =~ /^0{40}$/ ? nil : Commit.create(repo, :id => a_commit)
15 @b_commit = b_commit =~ /^0{40}$/ ? nil : Commit.create(repo, :id => b_commit)
16 @a_mode = a_mode
17 @b_mode = b_mode
18 @new_file = new_file
19 @deleted_file = deleted_file
20 @diff = diff
21 end
22
23 def self.list_from_string(repo, text)
24 lines = text.split("\n")
25
26 diffs = []
27
28 while !lines.empty?
29 m, a_path, b_path = *lines.shift.match(%r{^diff --git a/(.+?) b/(.+)$})
30
31 if lines.first =~ /^old mode/
32 m, a_mode = *lines.shift.match(/^old mode (\d+)/)
33 m, b_mode = *lines.shift.match(/^new mode (\d+)/)
34 end
35
36 if lines.empty? || lines.first =~ /^diff --git/
37 diffs << Diff.new(repo, a_path, b_path, nil, nil, a_mode, b_mode, false, false, nil)
38 next
39 end
40
41 new_file = false
42 deleted_file = false
43
44 if lines.first =~ /^new file/
45 m, b_mode = lines.shift.match(/^new file mode (.+)$/)
46 a_mode = nil
47 new_file = true
48 elsif lines.first =~ /^deleted file/
49 m, a_mode = lines.shift.match(/^deleted file mode (.+)$/)
50 b_mode = nil
51 deleted_file = true
52 end
53
54 m, a_commit, b_commit, b_mode = *lines.shift.match(%r{^index ([0-9A-Fa-f]+)\.\.([0-9A-Fa-f]+) ?(.+)?$})
55 b_mode.strip! if b_mode
56
57 diff_lines = []
58 while lines.first && lines.first !~ /^diff/
59 diff_lines << lines.shift
60 end
61 diff = diff_lines.join("\n")
62
63 diffs << Diff.new(repo, a_path, b_path, a_commit, b_commit, a_mode, b_mode, new_file, deleted_file, diff)
64 end
65
66 diffs
67 end
68 end # Diff
69
70 end # Grit