added update-ref
[rubygit.git] / lib / git / branch.rb
blobc2ce8107259173b68550c4b9c0a472173e0b38c3
1 module Git
2   class Branch < Path
3     
4     attr_accessor :full, :remote, :name
5     
6     @base = nil
7     @gcommit = nil
8     
9     def initialize(base, name)
10       @remote = nil
11       @full = name
12       @base = base
13       
14       parts = name.split('/')
15       if parts[1]
16         @remote = Git::Remote.new(@base, parts[0])
17         @name = parts[1]
18       else
19         @name = parts[0]
20       end
21     end
22     
23     def gcommit
24       @gcommit = @base.object(@full) if !@gcommit
25       @gcommit
26     end
27     
28     def checkout
29       check_if_create
30       @base.checkout(@full)
31     end
32     
33     def archive(file, opts = {})
34       @base.lib.archive(@full, file, opts)
35     end
36     
37     # g.branch('new_branch').in_branch do
38     #   # create new file
39     #   # do other stuff
40     #   return true # auto commits and switches back
41     # end
42     def in_branch (message = 'in branch work')
43       old_current = @base.lib.branch_current
44       checkout
45       if yield
46         @base.commit_all(message)
47       else
48         @base.reset_hard
49       end
50       @base.checkout(old_current)
51     end
52     
53     def create
54       check_if_create
55     end
56     
57     def delete
58       @base.lib.branch_delete(@name)
59     end
60     
61     def current
62       determine_current
63     end
64     
65     def merge(branch = nil, message = nil)
66       if branch
67         in_branch do 
68           @base.merge(branch, message)
69           false
70         end
71         # merge a branch into this one
72       else
73         # merge this branch into the current one
74         @base.merge(@name)
75       end
76     end
77     
78     def update_ref(commit)
79       @base.lib.update_ref(@full, commit)
80     end
81     
82     def to_a
83       [@full]
84     end
85     
86     def to_s
87       @full
88     end
89     
90     private 
92       def check_if_create
93         @base.lib.branch_new(@name) rescue nil
94       end
95       
96       def determine_current
97         @base.lib.branch_current == @name
98       end
99     
100   end