Commit 69c4cea65a7ba13469f43914fbdccf592053fec8
1 parent
e6edaa3b
Exists in
master
and in
4 other branches
updating project api to include raw blob contents and single branch
Showing
5 changed files
with
128 additions
and
7 deletions
Show diff stats
Gemfile
1 | source "http://rubygems.org" | 1 | source "http://rubygems.org" |
2 | 2 | ||
3 | gem "rails", "3.2.5" | 3 | gem "rails", "3.2.5" |
4 | -gem "rake", "0.8.7" | ||
5 | 4 | ||
6 | # Supported DBs | 5 | # Supported DBs |
7 | gem "sqlite3" | 6 | gem "sqlite3" |
@@ -19,7 +18,7 @@ gem 'yaml_db', :git => "https://github.com/gitlabhq/yaml_db.git" | @@ -19,7 +18,7 @@ gem 'yaml_db', :git => "https://github.com/gitlabhq/yaml_db.git" | ||
19 | gem 'grack', :git => "https://github.com/gitlabhq/grack.git" | 18 | gem 'grack', :git => "https://github.com/gitlabhq/grack.git" |
20 | gem "linguist", "~> 1.0.0", :git => "https://github.com/gitlabhq/linguist.git" | 19 | gem "linguist", "~> 1.0.0", :git => "https://github.com/gitlabhq/linguist.git" |
21 | 20 | ||
22 | -gem "grape" | 21 | +gem "grape", "~> 0.2.1" |
23 | gem "stamp" | 22 | gem "stamp" |
24 | gem "kaminari" | 23 | gem "kaminari" |
25 | gem "haml-rails" | 24 | gem "haml-rails" |
Gemfile.lock
@@ -170,7 +170,7 @@ GEM | @@ -170,7 +170,7 @@ GEM | ||
170 | gherkin (2.11.0) | 170 | gherkin (2.11.0) |
171 | json (>= 1.4.6) | 171 | json (>= 1.4.6) |
172 | git (1.2.5) | 172 | git (1.2.5) |
173 | - grape (0.2.0) | 173 | + grape (0.2.1) |
174 | hashie (~> 1.2) | 174 | hashie (~> 1.2) |
175 | multi_json | 175 | multi_json |
176 | multi_xml | 176 | multi_xml |
@@ -263,7 +263,7 @@ GEM | @@ -263,7 +263,7 @@ GEM | ||
263 | rdoc (~> 3.4) | 263 | rdoc (~> 3.4) |
264 | thor (>= 0.14.6, < 2.0) | 264 | thor (>= 0.14.6, < 2.0) |
265 | raindrops (0.9.0) | 265 | raindrops (0.9.0) |
266 | - rake (0.8.7) | 266 | + rake (0.9.2.2) |
267 | raphael-rails (1.5.2) | 267 | raphael-rails (1.5.2) |
268 | rdoc (3.12) | 268 | rdoc (3.12) |
269 | json (~> 1.4) | 269 | json (~> 1.4) |
@@ -392,7 +392,7 @@ DEPENDENCIES | @@ -392,7 +392,7 @@ DEPENDENCIES | ||
392 | git | 392 | git |
393 | gitolite! | 393 | gitolite! |
394 | grack! | 394 | grack! |
395 | - grape | 395 | + grape (~> 0.2.1) |
396 | grit! | 396 | grit! |
397 | haml-rails | 397 | haml-rails |
398 | httparty | 398 | httparty |
@@ -410,7 +410,6 @@ DEPENDENCIES | @@ -410,7 +410,6 @@ DEPENDENCIES | ||
410 | pygments.rb! | 410 | pygments.rb! |
411 | rails (= 3.2.5) | 411 | rails (= 3.2.5) |
412 | rails-footnotes | 412 | rails-footnotes |
413 | - rake (= 0.8.7) | ||
414 | raphael-rails (= 1.5.2) | 413 | raphael-rails (= 1.5.2) |
415 | redcarpet (~> 2.1.1) | 414 | redcarpet (~> 2.1.1) |
416 | resque (~> 1.20.0) | 415 | resque (~> 1.20.0) |
doc/api/projects.md
@@ -129,6 +129,43 @@ Parameters: | @@ -129,6 +129,43 @@ Parameters: | ||
129 | ] | 129 | ] |
130 | ``` | 130 | ``` |
131 | 131 | ||
132 | +Get a single project repository branch. | ||
133 | + | ||
134 | +``` | ||
135 | +GET /projects/:id/repository/branches/:branch | ||
136 | +``` | ||
137 | + | ||
138 | +Parameters: | ||
139 | + | ||
140 | ++ `id` (required) - The ID or code name of a project | ||
141 | ++ `branch` (required) - The name of the branch | ||
142 | + | ||
143 | +```json | ||
144 | +{ | ||
145 | + "name": "master", | ||
146 | + "commit": { | ||
147 | + "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", | ||
148 | + "parents": [ | ||
149 | + { | ||
150 | + "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8" | ||
151 | + } | ||
152 | + ], | ||
153 | + "tree": "46e82de44b1061621357f24c05515327f2795a95", | ||
154 | + "message": "add projects API", | ||
155 | + "author": { | ||
156 | + "name": "John Smith", | ||
157 | + "email": "john@example.com" | ||
158 | + }, | ||
159 | + "committer": { | ||
160 | + "name": "John Smith", | ||
161 | + "email": "john@example.com" | ||
162 | + }, | ||
163 | + "authored_date": "2012-06-27T05:51:39-07:00", | ||
164 | + "committed_date": "2012-06-28T03:44:20-07:00" | ||
165 | + } | ||
166 | +} | ||
167 | +``` | ||
168 | + | ||
132 | ## Project repository tags | 169 | ## Project repository tags |
133 | 170 | ||
134 | Get a list of project repository tags sorted by name in reverse alphabetical order. | 171 | Get a list of project repository tags sorted by name in reverse alphabetical order. |
@@ -268,3 +305,19 @@ Parameters: | @@ -268,3 +305,19 @@ Parameters: | ||
268 | + `snippet_id` (required) - The ID of a project's snippet | 305 | + `snippet_id` (required) - The ID of a project's snippet |
269 | 306 | ||
270 | Status code `200` will be returned on success. | 307 | Status code `200` will be returned on success. |
308 | + | ||
309 | +## Raw blob content | ||
310 | + | ||
311 | +Get the raw file contents for a file. | ||
312 | + | ||
313 | +``` | ||
314 | +GET /projects/:id/repository/commits/:sha/blob | ||
315 | +``` | ||
316 | + | ||
317 | +Parameters: | ||
318 | + | ||
319 | ++ `id` (required) - The ID or code name of a project | ||
320 | ++ `sha` (required) - The commit or branch name | ||
321 | ++ `filepath` (required) - The path th the file | ||
322 | + | ||
323 | +Will return the raw file contents. |
lib/api/projects.rb
@@ -33,6 +33,18 @@ module Gitlab | @@ -33,6 +33,18 @@ module Gitlab | ||
33 | present user_project.repo.heads.sort_by(&:name), :with => Entities::RepoObject | 33 | present user_project.repo.heads.sort_by(&:name), :with => Entities::RepoObject |
34 | end | 34 | end |
35 | 35 | ||
36 | + # Get a single branch | ||
37 | + # | ||
38 | + # Parameters: | ||
39 | + # id (required) - The ID or code name of a project | ||
40 | + # branch_id (required) - The name of the branch | ||
41 | + # Example Request: | ||
42 | + # GET /projects/:id/repository/branches/:branch_id | ||
43 | + get ":id/repository/branches/:branch_id" do | ||
44 | + @branch = user_project.repo.heads.find { |item| item.name == params[:branch_id] } | ||
45 | + present @branch, :with => Entities::RepoObject | ||
46 | + end | ||
47 | + | ||
36 | # Get a project repository tags | 48 | # Get a project repository tags |
37 | # | 49 | # |
38 | # Parameters: | 50 | # Parameters: |
@@ -131,6 +143,34 @@ module Gitlab | @@ -131,6 +143,34 @@ module Gitlab | ||
131 | @snippet = user_project.snippets.find(params[:snippet_id]) | 143 | @snippet = user_project.snippets.find(params[:snippet_id]) |
132 | present @snippet.content | 144 | present @snippet.content |
133 | end | 145 | end |
146 | + | ||
147 | + # Get a raw file contents | ||
148 | + # | ||
149 | + # Parameters: | ||
150 | + # id (required) - The ID or code name of a project | ||
151 | + # sha (required) - The commit or branch name | ||
152 | + # filepath (required) - The path to the file to display | ||
153 | + # Example Request: | ||
154 | + # GET /projects/:id/repository/commits/:sha/blob | ||
155 | + get ":id/repository/commits/:sha/blob" do | ||
156 | + ref = params[:sha] | ||
157 | + | ||
158 | + commit = user_project.commit ref | ||
159 | + error!('404 Commit Not Found', 404) unless commit | ||
160 | + | ||
161 | + tree = Tree.new commit.tree, user_project, ref, params[:filepath] | ||
162 | + error!('404 File Not Found', 404) unless tree.try(:tree) | ||
163 | + | ||
164 | + if tree.text? | ||
165 | + encoding = Gitlab::Encode.detect_encoding(tree.data) | ||
166 | + content_type encoding ? "text/plain; charset=#{encoding}" : "text/plain" | ||
167 | + else | ||
168 | + content_type tree.mime_type | ||
169 | + end | ||
170 | + | ||
171 | + present tree.data | ||
172 | + end | ||
173 | + | ||
134 | end | 174 | end |
135 | end | 175 | end |
136 | end | 176 | end |
spec/api/projects_spec.rb
@@ -53,6 +53,16 @@ describe Gitlab::API do | @@ -53,6 +53,16 @@ describe Gitlab::API do | ||
53 | end | 53 | end |
54 | end | 54 | end |
55 | 55 | ||
56 | + describe "GET /projects/:id/repository/branches/:branch" do | ||
57 | + it "should return the branch information for a single branch" do | ||
58 | + get "#{api_prefix}/projects/#{project.code}/repository/branches/new_design?private_token=#{user.private_token}" | ||
59 | + response.status.should == 200 | ||
60 | + | ||
61 | + json_response['name'].should == 'new_design' | ||
62 | + json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1' | ||
63 | + end | ||
64 | + end | ||
65 | + | ||
56 | describe "GET /projects/:id/repository/tags" do | 66 | describe "GET /projects/:id/repository/tags" do |
57 | it "should return an array of project tags" do | 67 | it "should return an array of project tags" do |
58 | get "#{api_prefix}/projects/#{project.code}/repository/tags?private_token=#{user.private_token}" | 68 | get "#{api_prefix}/projects/#{project.code}/repository/tags?private_token=#{user.private_token}" |
@@ -93,7 +103,7 @@ describe Gitlab::API do | @@ -93,7 +103,7 @@ describe Gitlab::API do | ||
93 | it "should delete existing project snippet" do | 103 | it "should delete existing project snippet" do |
94 | expect { | 104 | expect { |
95 | delete "#{api_prefix}/projects/#{project.code}/snippets/#{snippet.id}?private_token=#{user.private_token}" | 105 | delete "#{api_prefix}/projects/#{project.code}/snippets/#{snippet.id}?private_token=#{user.private_token}" |
96 | - }.should change { Snippet.count }.by(-1) | 106 | + }.to change { Snippet.count }.by(-1) |
97 | end | 107 | end |
98 | end | 108 | end |
99 | 109 | ||
@@ -103,4 +113,24 @@ describe Gitlab::API do | @@ -103,4 +113,24 @@ describe Gitlab::API do | ||
103 | response.status.should == 200 | 113 | response.status.should == 200 |
104 | end | 114 | end |
105 | end | 115 | end |
116 | + | ||
117 | + describe "GET /projects/:id/:sha/blob" do | ||
118 | + it "should get the raw file contents" do | ||
119 | + get "#{api_prefix}/projects/#{project.code}/repository/commits/master/blob?filepath=README.md&private_token=#{user.private_token}" | ||
120 | + | ||
121 | + response.status.should == 200 | ||
122 | + end | ||
123 | + | ||
124 | + it "should return 404 for invalid branch_name" do | ||
125 | + get "#{api_prefix}/projects/#{project.code}/repository/commits/invalid_branch_name/blob?filepath=README.md&private_token=#{user.private_token}" | ||
126 | + | ||
127 | + response.status.should == 404 | ||
128 | + end | ||
129 | + | ||
130 | + it "should return 404 for invalid file" do | ||
131 | + get "#{api_prefix}/projects/#{project.code}/repository/commits/master/blob?filepath=README.invalid&private_token=#{user.private_token}" | ||
132 | + | ||
133 | + response.status.should == 404 | ||
134 | + end | ||
135 | + end | ||
106 | end | 136 | end |