Merge pull request #2067 from riyad/diff-and-patch-for-commits-and-merge-requests
Diff and patch for commits and merge requests
This commit is contained in:
commit
e750efd9fc
14 changed files with 238 additions and 37 deletions
74
spec/controllers/commit_controller_spec.rb
Normal file
74
spec/controllers/commit_controller_spec.rb
Normal file
|
@ -0,0 +1,74 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe CommitController do
|
||||
let(:project) { create(:project) }
|
||||
let(:user) { create(:user) }
|
||||
let(:commit) { project.last_commit_for("master") }
|
||||
|
||||
before do
|
||||
sign_in(user)
|
||||
|
||||
project.add_access(user, :read, :admin)
|
||||
end
|
||||
|
||||
describe "#show" do
|
||||
shared_examples "export as" do |format|
|
||||
it "should generally work" do
|
||||
get :show, project_id: project.code, id: commit.id, format: format
|
||||
|
||||
expect(response).to be_success
|
||||
end
|
||||
|
||||
it "should generate it" do
|
||||
Commit.any_instance.should_receive(:"to_#{format}")
|
||||
|
||||
get :show, project_id: project.code, id: commit.id, format: format
|
||||
end
|
||||
|
||||
it "should render it" do
|
||||
get :show, project_id: project.code, id: commit.id, format: format
|
||||
|
||||
expect(response.body).to eq(commit.send(:"to_#{format}"))
|
||||
end
|
||||
|
||||
it "should not escape Html" do
|
||||
Commit.any_instance.stub(:"to_#{format}").and_return('HTML entities &<>" ')
|
||||
|
||||
get :show, project_id: project.code, id: commit.id, format: format
|
||||
|
||||
expect(response.body).to_not include('&')
|
||||
expect(response.body).to_not include('>')
|
||||
expect(response.body).to_not include('<')
|
||||
expect(response.body).to_not include('"')
|
||||
end
|
||||
end
|
||||
|
||||
describe "as diff" do
|
||||
include_examples "export as", :diff
|
||||
let(:format) { :diff }
|
||||
|
||||
it "should really only be a git diff" do
|
||||
get :show, project_id: project.code, id: commit.id, format: format
|
||||
|
||||
expect(response.body).to start_with("diff --git")
|
||||
end
|
||||
end
|
||||
|
||||
describe "as patch" do
|
||||
include_examples "export as", :patch
|
||||
let(:format) { :patch }
|
||||
|
||||
it "should really be a git email patch" do
|
||||
get :show, project_id: project.code, id: commit.id, format: format
|
||||
|
||||
expect(response.body).to start_with("From #{commit.id}")
|
||||
end
|
||||
|
||||
it "should contain a git diff" do
|
||||
get :show, project_id: project.code, id: commit.id, format: format
|
||||
|
||||
expect(response.body).to match(/^diff --git/)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
84
spec/controllers/merge_requests_controller_spec.rb
Normal file
84
spec/controllers/merge_requests_controller_spec.rb
Normal file
|
@ -0,0 +1,84 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe MergeRequestsController do
|
||||
let(:project) { create(:project) }
|
||||
let(:user) { create(:user) }
|
||||
let(:merge_request) { create(:merge_request_with_diffs, project: project) }
|
||||
|
||||
before do
|
||||
sign_in(user)
|
||||
|
||||
project.add_access(user, :read, :admin)
|
||||
end
|
||||
|
||||
describe "#show" do
|
||||
shared_examples "export as" do |format|
|
||||
it "should generally work" do
|
||||
get :show, project_id: project.code, id: merge_request.id, format: format
|
||||
|
||||
expect(response).to be_success
|
||||
end
|
||||
|
||||
it "should generate it" do
|
||||
MergeRequest.any_instance.should_receive(:"to_#{format}")
|
||||
|
||||
get :show, project_id: project.code, id: merge_request.id, format: format
|
||||
end
|
||||
|
||||
it "should render it" do
|
||||
get :show, project_id: project.code, id: merge_request.id, format: format
|
||||
|
||||
expect(response.body).to eq(merge_request.send(:"to_#{format}"))
|
||||
end
|
||||
|
||||
it "should not escape Html" do
|
||||
MergeRequest.any_instance.stub(:"to_#{format}").and_return('HTML entities &<>" ')
|
||||
|
||||
get :show, project_id: project.code, id: merge_request.id, format: format
|
||||
|
||||
expect(response.body).to_not include('&')
|
||||
expect(response.body).to_not include('>')
|
||||
expect(response.body).to_not include('<')
|
||||
expect(response.body).to_not include('"')
|
||||
end
|
||||
end
|
||||
|
||||
describe "as diff" do
|
||||
include_examples "export as", :diff
|
||||
let(:format) { :diff }
|
||||
|
||||
it "should really only be a git diff" do
|
||||
get :show, project_id: project.code, id: merge_request.id, format: format
|
||||
|
||||
expect(response.body).to start_with("diff --git")
|
||||
end
|
||||
end
|
||||
|
||||
describe "as patch" do
|
||||
include_examples "export as", :patch
|
||||
let(:format) { :patch }
|
||||
|
||||
it "should really be a git email patch with commit" do
|
||||
get :show, project_id: project.code, id: merge_request.id, format: format
|
||||
|
||||
expect(response.body[0..100]).to start_with("From #{merge_request.commits.last.id}")
|
||||
end
|
||||
|
||||
it "should contain as many patches as there are commits" do
|
||||
get :show, project_id: project.code, id: merge_request.id, format: format
|
||||
|
||||
patch_count = merge_request.commits.count
|
||||
merge_request.commits.each_with_index do |commit, patch_num|
|
||||
expect(response.body).to match(/^From #{commit.id}/)
|
||||
expect(response.body).to match(/^Subject: \[PATCH #{patch_num}\/#{patch_count}\]/)
|
||||
end
|
||||
end
|
||||
|
||||
it "should contain git diffs" do
|
||||
get :show, project_id: project.code, id: merge_request.id, format: format
|
||||
|
||||
expect(response.body).to match(/^diff --git/)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -70,7 +70,22 @@ FactoryGirl.define do
|
|||
closed true
|
||||
end
|
||||
|
||||
# pick 3 commits "at random" (from bcf03b5d~3 to bcf03b5d)
|
||||
trait :with_diffs do
|
||||
target_branch "bcf03b5d~3"
|
||||
source_branch "bcf03b5d"
|
||||
st_commits do
|
||||
[Commit.new(project.repo.commit('bcf03b5d')),
|
||||
Commit.new(project.repo.commit('bcf03b5d~1')),
|
||||
Commit.new(project.repo.commit('bcf03b5d~2'))]
|
||||
end
|
||||
st_diffs do
|
||||
project.repo.diff("bcf03b5d~3", "bcf03b5d")
|
||||
end
|
||||
end
|
||||
|
||||
factory :closed_merge_request, traits: [:closed]
|
||||
factory :merge_request_with_diffs, traits: [:with_diffs]
|
||||
end
|
||||
|
||||
factory :note do
|
||||
|
|
|
@ -208,7 +208,6 @@ end
|
|||
# diffs_project_merge_request GET /:project_id/merge_requests/:id/diffs(.:format) merge_requests#diffs
|
||||
# automerge_project_merge_request GET /:project_id/merge_requests/:id/automerge(.:format) merge_requests#automerge
|
||||
# automerge_check_project_merge_request GET /:project_id/merge_requests/:id/automerge_check(.:format) merge_requests#automerge_check
|
||||
# raw_project_merge_request GET /:project_id/merge_requests/:id/raw(.:format) merge_requests#raw
|
||||
# branch_from_project_merge_requests GET /:project_id/merge_requests/branch_from(.:format) merge_requests#branch_from
|
||||
# branch_to_project_merge_requests GET /:project_id/merge_requests/branch_to(.:format) merge_requests#branch_to
|
||||
# project_merge_requests GET /:project_id/merge_requests(.:format) merge_requests#index
|
||||
|
@ -231,10 +230,6 @@ describe MergeRequestsController, "routing" do
|
|||
get("/gitlabhq/merge_requests/1/automerge_check").should route_to('merge_requests#automerge_check', project_id: 'gitlabhq', id: '1')
|
||||
end
|
||||
|
||||
it "to #raw" do
|
||||
get("/gitlabhq/merge_requests/1/raw").should route_to('merge_requests#raw', project_id: 'gitlabhq', id: '1')
|
||||
end
|
||||
|
||||
it "to #branch_from" do
|
||||
get("/gitlabhq/merge_requests/branch_from").should route_to('merge_requests#branch_from', project_id: 'gitlabhq')
|
||||
end
|
||||
|
@ -243,6 +238,11 @@ describe MergeRequestsController, "routing" do
|
|||
get("/gitlabhq/merge_requests/branch_to").should route_to('merge_requests#branch_to', project_id: 'gitlabhq')
|
||||
end
|
||||
|
||||
it "to #show" do
|
||||
get("/gitlabhq/merge_requests/1.diff").should route_to('merge_requests#show', project_id: 'gitlabhq', id: '1', format: 'diff')
|
||||
get("/gitlabhq/merge_requests/1.patch").should route_to('merge_requests#show', project_id: 'gitlabhq', id: '1', format: 'patch')
|
||||
end
|
||||
|
||||
it_behaves_like "RESTful project resources" do
|
||||
let(:controller) { 'merge_requests' }
|
||||
end
|
||||
|
@ -285,6 +285,7 @@ end
|
|||
describe CommitController, "routing" do
|
||||
it "to #show" do
|
||||
get("/gitlabhq/commit/4246fb").should route_to('commit#show', project_id: 'gitlabhq', id: '4246fb')
|
||||
get("/gitlabhq/commit/4246fb.diff").should route_to('commit#show', project_id: 'gitlabhq', id: '4246fb', format: 'diff')
|
||||
get("/gitlabhq/commit/4246fb.patch").should route_to('commit#show', project_id: 'gitlabhq', id: '4246fb', format: 'patch')
|
||||
get("/gitlabhq/commit/4246fbd13872934f72a8fd0d6fb1317b47b59cb5").should route_to('commit#show', project_id: 'gitlabhq', id: '4246fbd13872934f72a8fd0d6fb1317b47b59cb5')
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue