schacon-git 1.0.6
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/README +238 -0
- data/lib/git/author.rb +14 -0
- data/lib/git/base.rb +464 -0
- data/lib/git/branch.rb +106 -0
- data/lib/git/branches.rb +57 -0
- data/lib/git/diff.rb +143 -0
- data/lib/git/index.rb +5 -0
- data/lib/git/lib.rb +638 -0
- data/lib/git/log.rb +94 -0
- data/lib/git/object.rb +296 -0
- data/lib/git/path.rb +27 -0
- data/lib/git/remote.rb +42 -0
- data/lib/git/repository.rb +4 -0
- data/lib/git/stash.rb +26 -0
- data/lib/git/stashes.rb +49 -0
- data/lib/git/status.rb +118 -0
- data/lib/git/working_directory.rb +4 -0
- data/lib/git.rb +96 -0
- data/tests/all_tests.rb +4 -0
- data/tests/test_helper.rb +77 -0
- metadata +72 -0
data/lib/git/branch.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
module Git
|
2
|
+
class Branch < Path
|
3
|
+
|
4
|
+
attr_accessor :full, :remote, :name
|
5
|
+
|
6
|
+
@base = nil
|
7
|
+
@gcommit = nil
|
8
|
+
@stashes = nil
|
9
|
+
|
10
|
+
def initialize(base, name)
|
11
|
+
@remote = nil
|
12
|
+
@full = name
|
13
|
+
@base = base
|
14
|
+
|
15
|
+
parts = name.split('/')
|
16
|
+
if parts[1]
|
17
|
+
@remote = Git::Remote.new(@base, parts[0])
|
18
|
+
@name = parts[1]
|
19
|
+
else
|
20
|
+
@name = parts[0]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def gcommit
|
25
|
+
@gcommit = @base.gcommit(@full) if !@gcommit
|
26
|
+
@gcommit
|
27
|
+
end
|
28
|
+
|
29
|
+
def stashes
|
30
|
+
@stashes ||= Git::Stashes.new(@base)
|
31
|
+
end
|
32
|
+
|
33
|
+
def checkout
|
34
|
+
check_if_create
|
35
|
+
@base.checkout(@full)
|
36
|
+
end
|
37
|
+
|
38
|
+
def archive(file, opts = {})
|
39
|
+
@base.lib.archive(@full, file, opts)
|
40
|
+
end
|
41
|
+
|
42
|
+
# g.branch('new_branch').in_branch do
|
43
|
+
# # create new file
|
44
|
+
# # do other stuff
|
45
|
+
# return true # auto commits and switches back
|
46
|
+
# end
|
47
|
+
def in_branch (message = 'in branch work')
|
48
|
+
old_current = @base.lib.branch_current
|
49
|
+
checkout
|
50
|
+
if yield
|
51
|
+
@base.commit_all(message)
|
52
|
+
else
|
53
|
+
@base.reset_hard
|
54
|
+
end
|
55
|
+
@base.checkout(old_current)
|
56
|
+
end
|
57
|
+
|
58
|
+
def create
|
59
|
+
check_if_create
|
60
|
+
end
|
61
|
+
|
62
|
+
def delete
|
63
|
+
@base.lib.branch_delete(@name)
|
64
|
+
end
|
65
|
+
|
66
|
+
def current
|
67
|
+
determine_current
|
68
|
+
end
|
69
|
+
|
70
|
+
def merge(branch = nil, message = nil)
|
71
|
+
if branch
|
72
|
+
in_branch do
|
73
|
+
@base.merge(branch, message)
|
74
|
+
false
|
75
|
+
end
|
76
|
+
# merge a branch into this one
|
77
|
+
else
|
78
|
+
# merge this branch into the current one
|
79
|
+
@base.merge(@name)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def update_ref(commit)
|
84
|
+
@base.lib.update_ref(@full, commit)
|
85
|
+
end
|
86
|
+
|
87
|
+
def to_a
|
88
|
+
[@full]
|
89
|
+
end
|
90
|
+
|
91
|
+
def to_s
|
92
|
+
@full
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
|
97
|
+
def check_if_create
|
98
|
+
@base.lib.branch_new(@name) rescue nil
|
99
|
+
end
|
100
|
+
|
101
|
+
def determine_current
|
102
|
+
@base.lib.branch_current == @name
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
data/lib/git/branches.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
module Git
|
2
|
+
|
3
|
+
# object that holds all the available branches
|
4
|
+
class Branches
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
@base = nil
|
8
|
+
@branches = nil
|
9
|
+
|
10
|
+
def initialize(base)
|
11
|
+
@branches = {}
|
12
|
+
|
13
|
+
@base = base
|
14
|
+
|
15
|
+
@base.lib.branches_all.each do |b|
|
16
|
+
@branches[b[0]] = Git::Branch.new(@base, b[0])
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def local
|
21
|
+
self.select { |b| !b.remote }
|
22
|
+
end
|
23
|
+
|
24
|
+
def remote
|
25
|
+
self.select { |b| b.remote }
|
26
|
+
end
|
27
|
+
|
28
|
+
# array like methods
|
29
|
+
|
30
|
+
def size
|
31
|
+
@branches.size
|
32
|
+
end
|
33
|
+
|
34
|
+
def each
|
35
|
+
@branches.each do |k, b|
|
36
|
+
yield b
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def [](symbol)
|
41
|
+
@branches[symbol.to_s]
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_s
|
45
|
+
out = ''
|
46
|
+
@branches.each do |k, b|
|
47
|
+
if b.current
|
48
|
+
out += "* " + b.to_s + "\n"
|
49
|
+
else
|
50
|
+
out += " " + b.to_s + "\n"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
out
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
data/lib/git/diff.rb
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
module Git
|
2
|
+
|
3
|
+
# object that holds the last X commits on given branch
|
4
|
+
class Diff
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
@base = nil
|
8
|
+
@from = nil
|
9
|
+
@to = nil
|
10
|
+
@path = nil
|
11
|
+
|
12
|
+
@full_diff = nil
|
13
|
+
@full_diff_files = nil
|
14
|
+
@stats = nil
|
15
|
+
|
16
|
+
def initialize(base, from = nil, to = nil)
|
17
|
+
@base = base
|
18
|
+
@from = from.to_s
|
19
|
+
@to = to.to_s
|
20
|
+
end
|
21
|
+
|
22
|
+
def path(path)
|
23
|
+
@path = path
|
24
|
+
return self
|
25
|
+
end
|
26
|
+
|
27
|
+
def size
|
28
|
+
cache_stats
|
29
|
+
@stats[:total][:files]
|
30
|
+
end
|
31
|
+
|
32
|
+
def lines
|
33
|
+
cache_stats
|
34
|
+
@stats[:total][:lines]
|
35
|
+
end
|
36
|
+
|
37
|
+
def deletions
|
38
|
+
cache_stats
|
39
|
+
@stats[:total][:deletions]
|
40
|
+
end
|
41
|
+
|
42
|
+
def insertions
|
43
|
+
cache_stats
|
44
|
+
@stats[:total][:insertions]
|
45
|
+
end
|
46
|
+
|
47
|
+
def stats
|
48
|
+
cache_stats
|
49
|
+
@stats
|
50
|
+
end
|
51
|
+
|
52
|
+
# if file is provided and is writable, it will write the patch into the file
|
53
|
+
def patch(file = nil)
|
54
|
+
cache_full
|
55
|
+
@full_diff
|
56
|
+
end
|
57
|
+
alias_method :to_s, :patch
|
58
|
+
|
59
|
+
# enumerable methods
|
60
|
+
|
61
|
+
def [](key)
|
62
|
+
process_full
|
63
|
+
@full_diff_files.assoc(key)[1]
|
64
|
+
end
|
65
|
+
|
66
|
+
def each
|
67
|
+
process_full
|
68
|
+
@full_diff_files.each do |file|
|
69
|
+
yield file[1]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
class DiffFile
|
74
|
+
attr_accessor :patch, :path, :mode, :src, :dst, :type
|
75
|
+
@base = nil
|
76
|
+
|
77
|
+
def initialize(base, hash)
|
78
|
+
@base = base
|
79
|
+
@patch = hash[:patch]
|
80
|
+
@path = hash[:path]
|
81
|
+
@mode = hash[:mode]
|
82
|
+
@src = hash[:src]
|
83
|
+
@dst = hash[:dst]
|
84
|
+
@type = hash[:type]
|
85
|
+
end
|
86
|
+
|
87
|
+
def blob(type = :dst)
|
88
|
+
if type == :src
|
89
|
+
@base.object(@src) if @src != '0000000'
|
90
|
+
else
|
91
|
+
@base.object(@dst) if @dst != '0000000'
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def cache_full
|
99
|
+
if !@full_diff
|
100
|
+
@full_diff = @base.lib.diff_full(@from, @to, {:path_limiter => @path})
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def process_full
|
105
|
+
if !@full_diff_files
|
106
|
+
cache_full
|
107
|
+
@full_diff_files = process_full_diff
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def cache_stats
|
112
|
+
if !@stats
|
113
|
+
@stats = @base.lib.diff_stats(@from, @to, {:path_limiter => @path})
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# break up @diff_full
|
118
|
+
def process_full_diff
|
119
|
+
final = {}
|
120
|
+
current_file = nil
|
121
|
+
@full_diff.split("\n").each do |line|
|
122
|
+
if m = /diff --git a\/(.*?) b\/(.*?)/.match(line)
|
123
|
+
current_file = m[1]
|
124
|
+
final[current_file] = {:patch => line, :path => current_file,
|
125
|
+
:mode => '', :src => '', :dst => '', :type => 'modified'}
|
126
|
+
else
|
127
|
+
if m = /index (.......)\.\.(.......)( ......)*/.match(line)
|
128
|
+
final[current_file][:src] = m[1]
|
129
|
+
final[current_file][:dst] = m[2]
|
130
|
+
final[current_file][:mode] = m[3].strip if m[3]
|
131
|
+
end
|
132
|
+
if m = /(.*?) file mode (......)/.match(line)
|
133
|
+
final[current_file][:type] = m[1]
|
134
|
+
final[current_file][:mode] = m[2]
|
135
|
+
end
|
136
|
+
final[current_file][:patch] << "\n" + line
|
137
|
+
end
|
138
|
+
end
|
139
|
+
final.map { |e| [e[0], DiffFile.new(@base, e[1])] }
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
143
|
+
end
|