Standardize commit diff api url, change blob api url, add get single commit

Use "/commits/:sha/diff" as opposed to "/commit/:sha", keeping in line
with existing api urls (e.g. "/projects/:id", etc.)

Fix 500 error resulting from a diff api call with an invalid commit hash

Move "/commits/:sha/blob" to "/blobs/:sha", leaving the old path for
backwards compatibility.

Add ability to get a single commit via "/commits/:sha"
This commit is contained in:
Alex Van't Hof 2013-08-27 21:22:42 -04:00
parent 79f0858a18
commit 59f428dca2
3 changed files with 101 additions and 24 deletions

View File

@ -239,12 +239,37 @@ Parameters:
] ]
``` ```
## Get a single commit
Get a specific commit identified by the commit hash or name of a branch or tag.
```
GET /projects/:id/repository/commits/:sha
```
Parameters:
+ `id` (required) - The ID of a project
+ `sha` (required) - The commit hash or name of a repository branch or tag
```json
{
"id": "6104942438c14ec7bd21c6cd5bd995272b3faff6",
"short_id": "6104942438c",
"title": "Sanitize for network graph",
"author_name": "randx",
"author_email": "dmitriy.zaporozhets@gmail.com",
"created_at": "2012-09-20T09:06:12+03:00"
}
```
## Get the diff of a commit ## Get the diff of a commit
Get the diff of a commit in a project. Get the diff of a commit in a project.
``` ```
GET /projects/:id/repository/commit/:sha GET /projects/:id/repository/commits/:sha/diff
``` ```
Parameters: Parameters:
@ -323,7 +348,7 @@ Parameters:
Get the raw file contents for a file. Get the raw file contents for a file.
``` ```
GET /projects/:id/repository/commits/:sha/blob GET /projects/:id/repository/blobs/:sha
``` ```
Parameters: Parameters:

View File

@ -106,13 +106,29 @@ module API
# #
# Parameters: # Parameters:
# id (required) - The ID of a project # id (required) - The ID of a project
# sha (required) - The commit hash or name of a repository branch or tag
# Example Request:
# GET /projects/:id/repository/commits/:sha
get ":id/repository/commits/:sha" do
authorize! :download_code, user_project
sha = params[:sha]
commit = user_project.repository.commit(sha)
not_found! "Commit" unless commit
present commit, with: Entities::RepoCommit
end
# Get the diff for a specific commit of a project
#
# Parameters:
# id (required) - The ID of a project
# sha (required) - The commit or branch name # sha (required) - The commit or branch name
# Example Request: # Example Request:
# GET /projects/:id/repository/commit/:sha # GET /projects/:id/repository/commits/:sha/diff
get ":id/repository/commit/:sha" do get ":id/repository/commits/:sha/diff" do
authorize! :download_code, user_project authorize! :download_code, user_project
sha = params[:sha] sha = params[:sha]
result = CommitLoadContext.new(user_project, current_user, {id: sha}).execute result = CommitLoadContext.new(user_project, current_user, {id: sha}).execute
not_found! "Commit" unless result[:commit]
result[:commit].diffs result[:commit].diffs
end end
@ -148,8 +164,8 @@ module API
# sha (required) - The commit or branch name # sha (required) - The commit or branch name
# filepath (required) - The path to the file to display # filepath (required) - The path to the file to display
# Example Request: # Example Request:
# GET /projects/:id/repository/commits/:sha/blob # GET /projects/:id/repository/blobs/:sha
get ":id/repository/commits/:sha/blob" do get [ ":id/repository/blobs/:sha", ":id/repository/commits/:sha/blob" ] do
authorize! :download_code, user_project authorize! :download_code, user_project
required_attributes! [:filepath] required_attributes! [:filepath]

View File

@ -112,23 +112,51 @@ describe API::API do
end end
end end
describe "GET /projects:id/repository/commit/:sha" do describe "GET /projects:id/repository/commits/:sha" do
context "authorized user" do
it "should return a commit by sha" do
get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}", user)
response.status.should == 200
json_response['id'].should == project.repository.commit.id
json_response['title'].should == project.repository.commit.title
end
it "should return a 404 error if not found" do
get api("/projects/#{project.id}/repository/commits/invalid_sha", user)
response.status.should == 404
end
end
context "unauthorized user" do
it "should not return the selected commit" do
get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}")
response.status.should == 401
end
end
end
describe "GET /projects:id/repository/commits/:sha/diff" do
context "authorized user" do context "authorized user" do
before { project.team << [user2, :reporter] } before { project.team << [user2, :reporter] }
it "should return the diff of the selected commit" do it "should return the diff of the selected commit" do
get api("/projects/#{project.id}/repository/commit/#{project.repository.commit.id}", user) get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/diff", user)
response.status.should == 200 response.status.should == 200
json_response.should be_an Array json_response.should be_an Array
json_response.length.should >= 1 json_response.length.should >= 1
json_response.first.keys.should include "diff" json_response.first.keys.should include "diff"
end end
it "should return a 404 error if invalid commit" do
get api("/projects/#{project.id}/repository/commits/invalid_sha/diff", user)
response.status.should == 404
end
end end
context "unauthorized user" do context "unauthorized user" do
it "should not return the diff of the selected commit" do it "should not return the diff of the selected commit" do
get api("/projects/#{project.id}/repository/commit/#{project.repository.commit.id}") get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/diff")
response.status.should == 401 response.status.should == 401
end end
end end
@ -157,25 +185,33 @@ describe API::API do
end end
end end
describe "GET /projects/:id/repository/blobs/:sha" do
it "should get the raw file contents" do
get api("/projects/#{project.id}/repository/blobs/master?filepath=README.md", user)
response.status.should == 200
end
it "should return 404 for invalid branch_name" do
get api("/projects/#{project.id}/repository/blobs/invalid_branch_name?filepath=README.md", user)
response.status.should == 404
end
it "should return 404 for invalid file" do
get api("/projects/#{project.id}/repository/blobs/master?filepath=README.invalid", user)
response.status.should == 404
end
it "should return a 400 error if filepath is missing" do
get api("/projects/#{project.id}/repository/blobs/master", user)
response.status.should == 400
end
end
describe "GET /projects/:id/repository/commits/:sha/blob" do describe "GET /projects/:id/repository/commits/:sha/blob" do
it "should get the raw file contents" do it "should get the raw file contents" do
get api("/projects/#{project.id}/repository/commits/master/blob?filepath=README.md", user) get api("/projects/#{project.id}/repository/commits/master/blob?filepath=README.md", user)
response.status.should == 200 response.status.should == 200
end end
it "should return 404 for invalid branch_name" do
get api("/projects/#{project.id}/repository/commits/invalid_branch_name/blob?filepath=README.md", user)
response.status.should == 404
end
it "should return 404 for invalid file" do
get api("/projects/#{project.id}/repository/commits/master/blob?filepath=README.invalid", user)
response.status.should == 404
end
it "should return a 400 error if filepath is missing" do
get api("/projects/#{project.id}/repository/commits/master/blob", user)
response.status.should == 400
end
end end
end end