Merge branch 'zj-workhorse-commit-patch-diff' into 'master'
Workhorse to send raw diff and patch for commits Closes gitaly#1196 See merge request gitlab-org/gitlab-ce!18974
This commit is contained in:
commit
48877dfc7e
6 changed files with 16 additions and 70 deletions
|
@ -23,8 +23,12 @@ class Projects::CommitController < Projects::ApplicationController
|
|||
|
||||
respond_to do |format|
|
||||
format.html { render }
|
||||
format.diff { render text: @commit.to_diff }
|
||||
format.patch { render text: @commit.to_patch }
|
||||
format.diff do
|
||||
send_git_diff(@project.repository, @commit.diff_refs)
|
||||
end
|
||||
format.patch do
|
||||
send_git_patch(@project.repository, @commit.diff_refs)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
5
changelogs/unreleased/zj-workhorse-commit-patch-diff.yml
Normal file
5
changelogs/unreleased/zj-workhorse-commit-patch-diff.yml
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Workhorse to send raw diff and patch for commits
|
||||
merge_request:
|
||||
author:
|
||||
type: other
|
|
@ -342,21 +342,6 @@ module Gitlab
|
|||
parent_ids.first
|
||||
end
|
||||
|
||||
# Shows the diff between the commit's parent and the commit.
|
||||
#
|
||||
# Cuts out the header and stats from #to_patch and returns only the diff.
|
||||
#
|
||||
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/324
|
||||
def to_diff
|
||||
Gitlab::GitalyClient.migrate(:commit_patch, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
|
||||
if is_enabled
|
||||
@repository.gitaly_commit_client.patch(id)
|
||||
else
|
||||
rugged_diff_from_parent.patch
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Returns a diff object for the changes from this commit's first parent.
|
||||
# If there is no parent, then the diff is between this commit and an
|
||||
# empty repo. See Repository#diff for keys allowed in the +options+
|
||||
|
@ -432,16 +417,6 @@ module Gitlab
|
|||
Gitlab::Git::CommitStats.new(@repository, self)
|
||||
end
|
||||
|
||||
def to_patch(options = {})
|
||||
begin
|
||||
rugged_commit.to_mbox(options)
|
||||
rescue Rugged::InvalidError => ex
|
||||
if ex.message =~ /commit \w+ is a merge commit/i
|
||||
'Patch format is not currently supported for merge commits.'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Get ref names collection
|
||||
#
|
||||
# Ex.
|
||||
|
|
|
@ -79,41 +79,18 @@ describe Projects::CommitController do
|
|||
end
|
||||
|
||||
describe "as diff" do
|
||||
include_examples "export as", :diff
|
||||
let(:format) { :diff }
|
||||
it "triggers workhorse to serve the request" do
|
||||
go(id: commit.id, format: :diff)
|
||||
|
||||
it "should really only be a git diff" do
|
||||
go(id: '66eceea0db202bb39c4e445e8ca28689645366c5', format: format)
|
||||
|
||||
expect(response.body).to start_with("diff --git")
|
||||
end
|
||||
|
||||
it "is only be a git diff without whitespace changes" do
|
||||
go(id: '66eceea0db202bb39c4e445e8ca28689645366c5', format: format, w: 1)
|
||||
|
||||
expect(response.body).to start_with("diff --git")
|
||||
|
||||
# without whitespace option, there are more than 2 diff_splits for other formats
|
||||
diff_splits = assigns(:diffs).diff_files.first.diff.diff.split("\n")
|
||||
expect(diff_splits.length).to be <= 2
|
||||
expect(response.headers[Gitlab::Workhorse::SEND_DATA_HEADER]).to start_with("git-diff:")
|
||||
end
|
||||
end
|
||||
|
||||
describe "as patch" do
|
||||
include_examples "export as", :patch
|
||||
let(:format) { :patch }
|
||||
let(:commit2) { project.commit('498214de67004b1da3d820901307bed2a68a8ef6') }
|
||||
|
||||
it "is a git email patch" do
|
||||
go(id: commit2.id, format: format)
|
||||
|
||||
expect(response.body).to start_with("From #{commit2.id}")
|
||||
end
|
||||
|
||||
it "contains a git diff" do
|
||||
go(id: commit2.id, format: format)
|
||||
go(id: commit.id, format: :patch)
|
||||
|
||||
expect(response.body).to match(/^diff --git/)
|
||||
expect(response.headers[Gitlab::Workhorse::SEND_DATA_HEADER]).to start_with("git-format-patch:")
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -554,24 +554,10 @@ describe Gitlab::Git::Commit, seed_helper: true do
|
|||
it_should_behave_like '#stats'
|
||||
end
|
||||
|
||||
describe '#to_diff' do
|
||||
subject { commit.to_diff }
|
||||
|
||||
it { is_expected.not_to include "From #{SeedRepo::Commit::ID}" }
|
||||
it { is_expected.to include 'diff --git a/files/ruby/popen.rb b/files/ruby/popen.rb'}
|
||||
end
|
||||
|
||||
describe '#has_zero_stats?' do
|
||||
it { expect(commit.has_zero_stats?).to eq(false) }
|
||||
end
|
||||
|
||||
describe '#to_patch' do
|
||||
subject { commit.to_patch }
|
||||
|
||||
it { is_expected.to include "From #{SeedRepo::Commit::ID}" }
|
||||
it { is_expected.to include 'diff --git a/files/ruby/popen.rb b/files/ruby/popen.rb'}
|
||||
end
|
||||
|
||||
describe '#to_hash' do
|
||||
let(:hash) { commit.to_hash }
|
||||
subject { hash }
|
||||
|
|
|
@ -182,7 +182,6 @@ eos
|
|||
it { is_expected.to respond_to(:date) }
|
||||
it { is_expected.to respond_to(:diffs) }
|
||||
it { is_expected.to respond_to(:id) }
|
||||
it { is_expected.to respond_to(:to_patch) }
|
||||
end
|
||||
|
||||
describe '#closes_issues' do
|
||||
|
|
Loading…
Reference in a new issue