Class: GithubApi

Inherits:
Object
  • Object
show all
Includes:
GithubUtil, Octopi
Defined in:
lib/github_repo.rb

Defined Under Namespace

Classes: CloneError, CreateError, DeleteError, FindError, FirstCommitError, FirstPushOriginError, InitRepoError, RenameError

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from GithubUtil

#configure, #info, #log, #post, #post_repo_show, #post_repo_user

Constructor Details

#initialize(options = {}) ⇒ GithubApi

Returns a new instance of GithubApi.



42
43
44
45
# File 'lib/github_repo.rb', line 42

def initialize(options = {})
  @config = configure
  @log_level = options[:log_level] || 0
end

Instance Attribute Details

#configObject

Returns the value of attribute config.



40
41
42
# File 'lib/github_repo.rb', line 40

def config
  @config
end

#log_levelObject

Returns the value of attribute log_level.



40
41
42
# File 'lib/github_repo.rb', line 40

def log_level
  @log_level
end

Instance Method Details

#branches(repo, options = {}) ⇒ Object



297
298
299
# File 'lib/github_repo.rb', line 297

def branches(repo, options = {})    
  post_repo_show repo, 'branches', options
end

#clone(repo_name, user_name = nil, clone_name = nil) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/github_repo.rb', line 99

def clone(repo_name, user_name = nil, clone_name = nil)
  begin
    info "cloning: #{repo_name}"
    clone_user = user(user_name)
    repo = clone_user.repositories.find(repo_name)    
    url = get_clone_url(repo, clone_user)
    name = clone_name ? clone_name : repo_name 
    `git clone #{url} #{name}`  
    log "cloned #{repo_name} ok"
    return url
  rescue Octopi::APIError
    raise CloneError
  end
end

#clone_url(repo_name, user_name = nil, options = {:retries => 3}) ⇒ Object



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/github_repo.rb', line 120

def clone_url(repo_name, user_name = nil, options = {:retries => 3} )
  begin   
    authenticated do
      clone_user = user(user_name)
      repo = clone_user.repositories.find(repo_name)    
      get_clone_url(repo, clone_user)
    end
  rescue Octopi::APIError 
    return "git://github.com/#{repo.owner}/#{repo.name}.git" if options[:retries] == 0     
    info "retry get clone url for #{repo_name} in 10 secs"
    sleep 10        
    options.merge! :retries => options[:retries] -1                           
    clone_url(repo_name, user_name, options)
  end
end

#collaborators(repo, options = {}) ⇒ Object



285
286
287
# File 'lib/github_repo.rb', line 285

def collaborators(repo, options = {})    
  post_repo_show repo, 'collaborators', options    
end

#create(name, options = {}) ⇒ Object



136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/github_repo.rb', line 136

def create(name, options = {})           
  log "creating repo: #{name}"
  authenticated do
    begin
      if user.repositories.find(name) 
        unless options[:overwrite]
          info "repo #{name} not created since it already exists"
          return true
        else
          info "repo #{name} already exists, but will be overwritten with new repo!"            
          delete!(name, options)
          create(name, options)
        end
      end
    rescue Octopi::APIError
      create_it(name, options)
    end
  end
end

#create_it(name, options = {:retries => 2}) ⇒ Object



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/github_repo.rb', line 156

def create_it(name, options = {:retries => 2})
  begin  
    status = nil
    authenticated do 
      repo_options = {:name => name}
      [:description, :homepage ].each{|o| repo_options[o] = options[o] if options[o]}
      repo_options[:public] = 0 if options[:private]                    
      log repo_options.inspect   
      status = Repository.create(repo_options)
      status.to_s == name ? status : nil
    end
  rescue Octopi::APIError => e 
    info "create error: #{e}"
  ensure
    options.merge! :retries => options[:retries] -1
    if status.to_s == name
      log "created repo ok"
      return status
    else
      info "bad status #{status}, should be #{name} - try again!"
      sleep 32         
      return create_it(name, options )        
    end   
  end
end

#delete!(name) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
# File 'lib/github_repo.rb', line 60

def delete!(name)                  
  begin             
    if !user.repositories.find(name)
      info "repo #{name} not found"
      return nil 
    end     
    delete_it!(name) 
  rescue Octopi::APIError 
    return nil
  end
end

#delete_it!(name) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/github_repo.rb', line 72

def delete_it!(name) 
  begin
    info "deleting repo: #{name}"
    result = post "http://github.com/api/v2/yaml/repos/delete/#{name}"
    token = result.parse_single_result('delete_token')                               
    return true if token && token.length > 20
    raise DeleteError, "delete error" if !token
    status = post "http://github.com/api/v2/yaml/repos/delete/#{name}", 'delete_token' => token 
    return true if status.to_s.length > 100
    log "repo #{name} deleted ok"
    status
  rescue Octopi::APIError 
    log "delete error!"
    raise DeleteError, "delete error"
  end
end

#first_commit(msg = 'first commit') ⇒ Object



182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/github_repo.rb', line 182

def first_commit(msg = 'first commit')
  begin
    info "first commit"
    `git init`
    `touch README`    
    `git add .`
    `git commit -m '#{msg}'`            
    log "first push commit completed ok"      
  rescue
    raise FirstCommitError
  end      
end

#first_push_origin(name) ⇒ Object



195
196
197
198
199
200
201
202
203
204
205
206
# File 'lib/github_repo.rb', line 195

def first_push_origin(name) 
  begin
    info "first push origin"    
    origin = clone_url(name) 
    `git remote rm origin`   
    `git remote add origin #{origin}`
    `git push origin master`
    log "first push origin completed ok"
  rescue
    raise FirstPushOriginError
  end      
end

#fork(repo, options = {}) ⇒ Object



281
282
283
# File 'lib/github_repo.rb', line 281

def fork(repo, options = {})                               
  post_repo_user 'repos/fork', options
end

#get_clone_url(repo, user) ⇒ Object



114
115
116
117
118
# File 'lib/github_repo.rb', line 114

def get_clone_url(repo, user)   
  # log "user: '#{user}' == repo_user: '#{repo.owner.login}', #{user.to_s == repo.owner.login.to_s}"
  url = user.to_s == repo.owner..to_s ? "[email protected]:" : "git://github.com/"
  url += "#{repo.owner}/#{repo.name}.git"
end

#init_repo(name, options = {:overwrite => true}) ⇒ Object



208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# File 'lib/github_repo.rb', line 208

def init_repo(name, options = {:overwrite => true})  
  begin
    if File.directory?(name) && options[:overwrite]
      log "removing local repo: #{name}"
      FileUtils.rm_rf(name) 
    end
    clone name
    FileUtils.cd name do
      first_commit
      first_push_origin name
    end  
    log "init repo complete!"
  rescue
    raise InitRepoError
  end
end

#languages(repo, options = {}) ⇒ Object



289
290
291
# File 'lib/github_repo.rb', line 289

def languages(repo, options = {})    
  post_repo_show repo, 'languages', options
end

#log_offObject



56
57
58
# File 'lib/github_repo.rb', line 56

def log_off
  self.log_level = 0
end

#log_onObject



47
48
49
# File 'lib/github_repo.rb', line 47

def log_on   
  self.log_level = 1
end

#rename!(repo_name, new_repo_name, user_name = nil, options = {:overwrite => true}) ⇒ Object



226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
# File 'lib/github_repo.rb', line 226

def rename!(repo_name, new_repo_name, user_name = nil, options = {:overwrite => true})
  begin
    delete!(new_repo_name) if options[:overwrite]   
    info "waiting 20 secs for delete to take effect before creating new repo"
    sleep 20   
    return nil if !create(new_repo_name)   
    log "created new repo: #{new_repo_name}"
    
    # clone old repo
    info "current dir: #{Dir.pwd}"
    if File.directory?(repo_name) 
      if overwrite
        info "removing local repo: #{repo_name}"
        FileUtils.rm_rf(repo_name)  
        old_clone_url = clone(repo_name, user_name)                  
      else
        old_clone_url = clone_url(repo_name, user_name)                 
      end
    else
      old_clone_url = clone(repo_name, user_name)                  
    end        
    log "cloned old repo from : #{old_clone_url}"
    # create new repo with new name
    raise RenameError, "Error getting hold of old repository" if !old_clone_url

    info "get clone_url for new repo: #{repo_name}"
    new_clone_url = clone_url(new_repo_name, user_name)                 
    raise RenameError, "Error getting new repository url for: #{new_repo_name}" if !new_clone_url
    
    # change remote origin of repo
    info "current dir: #{Dir.pwd}"      
    return "no local clone dir for #{repo_name}" if !File.directory? repo_name 
    FileUtils.cd repo_name do 
      info "update old local repo to point to new repo" 
      `git remote rm origin`      
      info "removed old origin"
      `git remote add origin #{new_clone_url}`
      info "added new origin"
      `git push origin master --force`
      log "pushed to new origin master: #{new_clone_url}"      
      status = delete!(repo_name)
      log "old repo #{repo_name} deleted" if status              
    end
    
    FileUtils.rm_rf repo_name if options[:delete_local]
    log "old local repo directory deleted"

    info "making sure old repo is deleted"
    log delete!(repo_name)                          
  rescue StandardError => e 
    log e
    true
  end      
end

#tags(repo, options = {}) ⇒ Object



293
294
295
# File 'lib/github_repo.rb', line 293

def tags(repo, options = {})    
  post_repo_show repo, 'tags', options
end

#user(user_name = nil) ⇒ Object



89
90
91
92
93
94
95
96
97
# File 'lib/github_repo.rb', line 89

def user(user_name = nil)
  if user_name 
    User.find(user_name) 
  else      
    authenticated do
      Api.api.user
    end
  end
end

#verbose_log_onObject



51
52
53
# File 'lib/github_repo.rb', line 51

def verbose_log_on
  self.log_level = 2
end