adding my testing git directory
[rubygit.git] / lib / git / base.rb
blobd97948e2d17abaf640a9d52ce3810caae47405e7
1 module Git
2   
3   class Base
5     @working_directory = nil
6     @repository = nil
7     @index = nil
9     # opens a bare Git Repository - no working directory options
10     def self.bare(git_dir)
11       self.new :repository => git_dir
12     end
13     
14     # opens a new Git Project from a working directory
15     # you can specify non-standard git_dir and index file in the options
16     def self.open(working_dir, opts={})    
17       default = {:working_directory => working_dir}
18       git_options = default.merge(opts)
19       
20       self.new(git_options)
21     end
23     # initializes a git repository
24     #
25     # options:
26     #  :repository
27     #  :index_file
28     #
29     def self.init(working_dir, opts = {})
30       default = {:working_directory => working_dir,
31                  :repository => File.join(working_dir, '.git')}
32       git_options = default.merge(opts)
33       
34       if git_options[:working_directory]
35         # if !working_dir, make it
36         FileUtils.mkdir_p(git_options[:working_directory]) if !File.directory?(git_options[:working_directory])
37       end
38       
39       # run git_init there
40       Git::Lib.new(git_options).init
41        
42       self.new(git_options)
43     end
45     # clones a git repository locally
46     #
47     #  repository - http://repo.or.cz/w/sinatra.git
48     #  name - sinatra
49     #
50     # options:
51     #   :repository
52     #
53     #    :bare
54     #   or 
55     #    :working_directory
56     #    :index_file
57     #
58     def self.clone(repository, name, opts = {})
59       # run git-clone 
60       self.new(Git::Lib.new.clone(repository, name, opts))
61     end
62         
63     def initialize(options = {})
64       if working_dir = options[:working_directory]
65         options[:repository] = File.join(working_dir, '.git') if !options[:repository]
66         options[:index] = File.join(working_dir, '.git', 'index') if !options[:index]
67       end
68       
69       @working_directory = Git::WorkingDirectory.new(options[:working_directory]) if options[:working_directory]
70       @repository = Git::Repository.new(options[:repository]) if options[:repository]
71       @index = Git::Index.new(options[:index], false) if options[:index]
72     end
73   
74   
75     def dir
76       @working_directory
77     end
79     def repo
80       @repository
81     end
82     
83     def index
84       @index
85     end
86     
87     def chdir
88       Dir.chdir(dir.path) do
89         yield dir.path
90       end
91     end
92     
93     def repo_size
94       size = 0
95       Dir.chdir(repo.path) do
96         (size, dot) = `du -d0`.chomp.split
97       end
98       size.to_i
99     end
100     
101     #g.config('user.name', 'Scott Chacon') # sets value
102     #g.config('user.email', 'email@email.com')  # sets value
103     #g.config('user.name')  # returns 'Scott Chacon'
104     #g.config # returns whole config hash
105     def config(name = nil, value = nil)
106       if(name && value)
107         # set value
108         lib.config_set(name, value)
109       elsif (name)
110         # return value
111         lib.config_get(name)
112       else
113         # return hash
114         lib.config_list
115       end
116     end
117     
118     # factory methods
119     
120     def object(objectish)
121       Git::Object.new(self, objectish)
122     end
123     alias_method :gtree, :object
124     alias_method :gcommit, :object
125     alias_method :gblob, :object
126     
127     
128     def log(count = 30)
129       Git::Log.new(self, count)
130     end
132     def status
133       Git::Status.new(self)
134     end
135         
136     def branches
137       Git::Branches.new(self)
138     end
139     
140     def branch(branch_name = 'master')
141       Git::Branch.new(self, branch_name)
142     end
144     def remote(remote_name = 'origin')
145       Git::Remote.new(self, remote_name)
146     end
148     
149     def lib
150       Git::Lib.new(self)
151     end
152     
153     def grep(string)
154       self.object('HEAD').grep(string)
155     end
156     
157     def diff(objectish = 'HEAD', obj2 = nil)
158       Git::Diff.new(self, objectish, obj2)
159     end
160     
161     # adds files from the working directory to the git repository
162     def add(path = '.')
163       self.lib.add(path)
164     end
166     def remove(path = '.', opts = {})
167       self.lib.remove(path, opts)
168     end
170     def reset(commitish = nil, opts = {})
171       self.lib.reset(commitish, opts)
172     end
174     def reset_hard(commitish = nil, opts = {})
175       opts = {:hard => true}.merge(opts)
176       self.lib.reset(commitish, opts)
177     end
179     def commit(message, opts = {})
180       self.lib.commit(message, opts)
181     end
182         
183     def commit_all(message, opts = {})
184       opts = {:add_all => true}.merge(opts)
185       self.lib.commit(message, opts)
186     end
188     def checkout(branch, opts = {})
189       self.lib.checkout(branch, opts)
190     end
191     
192     def fetch(remote = 'origin')
193       self.lib.fetch(remote)
194     end
196     def merge(branch, message = 'merge')
197       self.lib.merge(branch, message)
198     end
200     def pull(remote = 'origin', branch = 'master', message = 'origin pull')
201       fetch(remote)
202       merge(branch, message)
203     end
204     
205     def remotes
206       self.lib.remotes.map { |r| Git::Remote.new(self, r) }
207     end
208     
209     def add_remote(name, url, opts = {})
210       if url.is_a?(Git::Base)
211         url = url.repo.path
212       end
213       self.lib.remote_add(name, url, opts)
214       Git::Remote.new(self, name)
215     end
217     def tags
218       self.lib.tags.map { |r| tag(r) }
219     end
220     
221     def tag(tag_name)
222       Git::Object.new(self, tag_name, true)
223     end
225     def add_tag(tag_name)
226       self.lib.tag(tag_name)
227       tag(tag_name)
228     end
229     
230     # convenience methods
232     def repack
233       self.lib.repack
234     end
235     
236     def revparse(objectish)
237       self.lib.revparse(objectish)
238     end
240     def current_branch
241       self.lib.branch_current
242     end
244     
245   end
246