Add API to list merge request diff versions
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
This commit is contained in:
parent
159998a460
commit
9a5f40878c
5 changed files with 159 additions and 0 deletions
|
@ -894,3 +894,93 @@ Example response:
|
|||
"created_at": "2016-07-01T11:14:15.530Z"
|
||||
}
|
||||
```
|
||||
|
||||
## Get MR diff versions
|
||||
|
||||
Get a list of merge request diff versions.
|
||||
|
||||
```
|
||||
GET /projects/:id/merge_requests/:merge_request_id/versions
|
||||
```
|
||||
|
||||
Parameters:
|
||||
|
||||
- `id` (required) - The ID of a project
|
||||
- `merge_request_id` (required) - The ID of MR
|
||||
|
||||
|
||||
```json
|
||||
[{
|
||||
"id": 110,
|
||||
"head_commit_sha": "33e2ee8579fda5bc36accc9c6fbd0b4fefda9e30",
|
||||
"base_commit_sha": "eeb57dffe83deb686a60a71c16c32f71046868fd",
|
||||
"start_commit_sha": "eeb57dffe83deb686a60a71c16c32f71046868fd",
|
||||
"created_at": "2016-07-26T14:44:48.926Z",
|
||||
"merge_request_id": 105,
|
||||
"state": "collected",
|
||||
"real_size": "1",
|
||||
"commits": [{
|
||||
"id": "33e2ee8579fda5bc36accc9c6fbd0b4fefda9e30",
|
||||
"short_id": "33e2ee85",
|
||||
"title": "Change year to 2018",
|
||||
"author_name": "Administrator",
|
||||
"author_email": "admin@example.com",
|
||||
"created_at": "2016-07-26T17:44:29.000+03:00",
|
||||
"message": "Change year to 2018"
|
||||
}, {
|
||||
"id": "aa24655de48b36335556ac8a3cd8bb521f977cbd",
|
||||
"short_id": "aa24655d",
|
||||
"title": "Update LICENSE",
|
||||
"author_name": "Administrator",
|
||||
"author_email": "admin@example.com",
|
||||
"created_at": "2016-07-25T17:21:53.000+03:00",
|
||||
"message": "Update LICENSE"
|
||||
}, {
|
||||
"id": "3eed087b29835c48015768f839d76e5ea8f07a24",
|
||||
"short_id": "3eed087b",
|
||||
"title": "Add license",
|
||||
"author_name": "Administrator",
|
||||
"author_email": "admin@example.com",
|
||||
"created_at": "2016-07-25T17:21:20.000+03:00",
|
||||
"message": "Add license"
|
||||
}],
|
||||
"diffs": [{
|
||||
"old_path": "LICENSE",
|
||||
"new_path": "LICENSE",
|
||||
"a_mode": "0",
|
||||
"b_mode": "100644",
|
||||
"diff": "--- /dev/null\n+++ b/LICENSE\n@@ -0,0 +1,21 @@\n+The MIT License (MIT)\n+\n+Copyright (c) 2018 Administrator\n+\n+Permission is hereby granted, free of charge, to any person obtaining a copy\n+of this software and associated documentation files (the \"Software\"), to deal\n+in the Software without restriction, including without limitation the rights\n+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n+copies of the Software, and to permit persons to whom the Software is\n+furnished to do so, subject to the following conditions:\n+\n+The above copyright notice and this permission notice shall be included in all\n+copies or substantial portions of the Software.\n+\n+THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n+SOFTWARE.\n",
|
||||
"new_file": true,
|
||||
"renamed_file": false,
|
||||
"deleted_file": false
|
||||
}]
|
||||
}, {
|
||||
"id": 108,
|
||||
"head_commit_sha": "3eed087b29835c48015768f839d76e5ea8f07a24",
|
||||
"base_commit_sha": "eeb57dffe83deb686a60a71c16c32f71046868fd",
|
||||
"start_commit_sha": "eeb57dffe83deb686a60a71c16c32f71046868fd",
|
||||
"created_at": "2016-07-25T14:21:33.028Z",
|
||||
"merge_request_id": 105,
|
||||
"state": "collected",
|
||||
"real_size": "1",
|
||||
"commits": [{
|
||||
"id": "3eed087b29835c48015768f839d76e5ea8f07a24",
|
||||
"short_id": "3eed087b",
|
||||
"title": "Add license",
|
||||
"author_name": "Administrator",
|
||||
"author_email": "admin@example.com",
|
||||
"created_at": "2016-07-25T17:21:20.000+03:00",
|
||||
"message": "Add license"
|
||||
}],
|
||||
"diffs": [{
|
||||
"old_path": "LICENSE",
|
||||
"new_path": "LICENSE",
|
||||
"a_mode": "0",
|
||||
"b_mode": "100644",
|
||||
"diff": "--- /dev/null\n+++ b/LICENSE\n@@ -0,0 +1,21 @@\n+The MIT License (MIT)\n+\n+Copyright (c) 2016 Administrator\n+\n+Permission is hereby granted, free of charge, to any person obtaining a copy\n+of this software and associated documentation files (the \"Software\"), to deal\n+in the Software without restriction, including without limitation the rights\n+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n+copies of the Software, and to permit persons to whom the Software is\n+furnished to do so, subject to the following conditions:\n+\n+The above copyright notice and this permission notice shall be included in all\n+copies or substantial portions of the Software.\n+\n+THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n+SOFTWARE.\n",
|
||||
"new_file": true,
|
||||
"renamed_file": false,
|
||||
"deleted_file": false
|
||||
}]
|
||||
}]
|
||||
```
|
||||
|
|
|
@ -67,5 +67,6 @@ module API
|
|||
mount ::API::Triggers
|
||||
mount ::API::Users
|
||||
mount ::API::Variables
|
||||
mount ::API::MergeRequestDiffs
|
||||
end
|
||||
end
|
||||
|
|
|
@ -228,6 +228,17 @@ module API
|
|||
end
|
||||
end
|
||||
|
||||
class MergeRequestDiff < Grape::Entity
|
||||
expose :id, :head_commit_sha, :base_commit_sha, :start_commit_sha,
|
||||
:created_at, :merge_request_id, :state, :real_size
|
||||
|
||||
expose :commits, using: Entities::RepoCommit
|
||||
|
||||
expose :diffs, using: Entities::RepoDiff do |compare, _|
|
||||
compare.diffs(all_diffs: true).to_a
|
||||
end
|
||||
end
|
||||
|
||||
class SSHKey < Grape::Entity
|
||||
expose :id, :title, :key, :created_at
|
||||
end
|
||||
|
|
25
lib/api/merge_request_diffs.rb
Normal file
25
lib/api/merge_request_diffs.rb
Normal file
|
@ -0,0 +1,25 @@
|
|||
module API
|
||||
# MergeRequestDiff API
|
||||
class MergeRequestDiffs < Grape::API
|
||||
before { authenticate! }
|
||||
|
||||
resource :projects do
|
||||
# List merge requests diff versions
|
||||
#
|
||||
# Parameters:
|
||||
# id (required) - The ID of a project
|
||||
# merge_request_id (required) - The ID of MR
|
||||
#
|
||||
# Example:
|
||||
# GET /projects/:id/merge_requests/:merge_request_id/versions
|
||||
#
|
||||
get ":id/merge_requests/:merge_request_id/versions" do
|
||||
merge_request = user_project.merge_requests.
|
||||
find(params[:merge_request_id])
|
||||
|
||||
authorize! :read_merge_request, merge_request
|
||||
present merge_request.merge_request_diffs, with: Entities::MergeRequestDiff
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
32
spec/requests/api/merge_request_diffs_spec.rb
Normal file
32
spec/requests/api/merge_request_diffs_spec.rb
Normal file
|
@ -0,0 +1,32 @@
|
|||
require "spec_helper"
|
||||
|
||||
describe API::API, 'MergeRequestDiffs', api: true do
|
||||
include ApiHelpers
|
||||
|
||||
let!(:user) { create(:user) }
|
||||
let!(:merge_request) { create(:merge_request, importing: true) }
|
||||
let!(:project) { merge_request.target_project }
|
||||
|
||||
before do
|
||||
merge_request.merge_request_diffs.create(head_commit_sha: '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9')
|
||||
merge_request.merge_request_diffs.create(head_commit_sha: '5937ac0a7beb003549fc5fd26fc247adbce4a52e')
|
||||
project.team << [user, :master]
|
||||
end
|
||||
|
||||
describe 'GET /projects/:id/merge_requests/:merge_request_id/versions' do
|
||||
context 'valid merge request' do
|
||||
before { get api("/projects/#{project.id}/merge_requests/#{merge_request.id}/versions", user) }
|
||||
let(:merge_request_diff) { merge_request.merge_request_diffs.first }
|
||||
|
||||
it { expect(response.status).to eq 200 }
|
||||
it { expect(json_response.size).to eq(merge_request.merge_request_diffs.size) }
|
||||
it { expect(json_response.first['id']).to eq(merge_request_diff.id) }
|
||||
it { expect(json_response.first['head_commit_sha']).to eq(merge_request_diff.head_commit_sha) }
|
||||
end
|
||||
|
||||
it 'returns a 404 when merge_request_id not found' do
|
||||
get api("/projects/#{project.id}/merge_requests/999/versions", user)
|
||||
expect(response).to have_http_status(404)
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue