diff options
| -rw-r--r-- | lib/oxidized/hook/githubrepo.rb | 20 | ||||
| -rw-r--r-- | spec/githubrepo_spec.rb | 4 | 
2 files changed, 23 insertions, 1 deletions
| diff --git a/lib/oxidized/hook/githubrepo.rb b/lib/oxidized/hook/githubrepo.rb index bf33b89..83e1078 100644 --- a/lib/oxidized/hook/githubrepo.rb +++ b/lib/oxidized/hook/githubrepo.rb @@ -9,6 +9,24 @@ class GithubRepo < Oxidized::Hook      log "Pushing local repository(#{repo.path})..."      remote = repo.remotes['origin'] || repo.remotes.create('origin', cfg.remote_repo)      log "to remote: #{remote.url}" -    remote.push(['+refs/heads/master'], credentials: credentials) + +    fetch_and_merge_remote(repo, credentials) + +    remote.push([repo.head.name], credentials: credentials) +  end + +  def fetch_and_merge_remote(repo, credentials) +    their_branch = repo.branches["origin/master"] or return + +    repo.fetch('origin', [repo.head.name], credentials: credentials) + +    merge_index = repo.merge_commits(repo.head.target_id, their_branch.target_id) + +    Rugged::Commit.create(repo, { +      parents: [repo.head.target, their_branch.target], +      tree: merge_index.write_tree(repo), +      message: "Merge remote-tracking branch '#{their_branch.name}'", +      update_ref: "HEAD" +    })    end  end diff --git a/spec/githubrepo_spec.rb b/spec/githubrepo_spec.rb index a193cd6..9b509e4 100644 --- a/spec/githubrepo_spec.rb +++ b/spec/githubrepo_spec.rb @@ -17,6 +17,10 @@ describe Oxidized::Node do      remote.expects(:push).returns(true)      repo.expects(:remotes).returns({'origin' => remote})      repo.expects(:path).returns('foo.git') +    repo_head = mock() +    repo_head.expects(:name).returns('origin/master') +    repo.expects(:head).returns(repo_head) +    repo.expects(:branches).returns({})      Rugged::Repository.expects(:new).with('foo.git').returns(repo)    end | 
