Commit c77d957b365bd023b1dc73b5f5111b4fe262bfbe

Authored by Dmitriy Zaporozhets
1 parent 75303241

API: Edit file in repository

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
doc/api/repositories.md
... ... @@ -384,3 +384,16 @@ Parameters:
384 384 + `branch_name` (required) - The name of branch
385 385 + `content` (required) - File content
386 386 + `commit_message` (required) - Commit message
  387 +
  388 +## Update existing file in repository
  389 +
  390 +```
  391 +PUT /projects/:id/repository/files
  392 +```
  393 +
  394 +Parameters:
  395 +
  396 ++ `file_path` (required) - Full path to file. Ex. lib/class.rb
  397 ++ `branch_name` (required) - The name of branch
  398 ++ `content` (required) - New file content
  399 ++ `commit_message` (required) - Commit message
... ...
lib/api/files.rb
... ... @@ -16,9 +16,10 @@ module API
16 16 #
17 17 # Example Request:
18 18 # POST /projects/:id/repository/files
  19 + #
19 20 post ":id/repository/files" do
20   - required_attributes! [:file_name, :branch_name, :content]
21   - attrs = attributes_for_keys [:file_name, :file_path, :branch_name, :content]
  21 + required_attributes! [:file_name, :branch_name, :content, :commit_message]
  22 + attrs = attributes_for_keys [:file_name, :file_path, :branch_name, :content, :commit_message]
22 23 branch_name = attrs.delete(:branch_name)
23 24 file_path = attrs.delete(:file_path)
24 25 result = ::Files::CreateContext.new(user_project, current_user, attrs, branch_name, file_path).execute
... ... @@ -35,6 +36,37 @@ module API
35 36 render_api_error!(result[:error], 400)
36 37 end
37 38 end
  39 +
  40 + # Update existing file in repository
  41 + #
  42 + # Parameters:
  43 + # file_name (required) - The name of new file. Ex. class.rb
  44 + # file_path (optional) - The path to new file. Ex. lib/
  45 + # branch_name (required) - The name of branch
  46 + # content (required) - File content
  47 + # commit_message (required) - Commit message
  48 + #
  49 + # Example Request:
  50 + # PUT /projects/:id/repository/files
  51 + #
  52 + put ":id/repository/files" do
  53 + required_attributes! [:file_path, :branch_name, :content, :commit_message]
  54 + attrs = attributes_for_keys [:file_path, :branch_name, :content, :commit_message]
  55 + branch_name = attrs.delete(:branch_name)
  56 + file_path = attrs.delete(:file_path)
  57 + result = ::Files::UpdateContext.new(user_project, current_user, attrs, branch_name, file_path).execute
  58 +
  59 + if result[:status] == :success
  60 + status(200)
  61 +
  62 + {
  63 + file_path: file_path,
  64 + branch_name: branch_name
  65 + }
  66 + else
  67 + render_api_error!(result[:error], 400)
  68 + end
  69 + end
38 70 end
39 71 end
40 72 end
... ...
spec/requests/api/files_spec.rb
... ... @@ -10,6 +10,15 @@ describe API::API do
10 10 before { project.team << [user, :developer] }
11 11  
12 12 describe "POST /projects/:id/repository/files" do
  13 + let(:valid_params) {
  14 + {
  15 + file_name: 'newfile.rb',
  16 + branch_name: 'master',
  17 + content: 'puts 8',
  18 + commit_message: 'Added newfile'
  19 + }
  20 + }
  21 +
13 22 it "should create a new file in project repo" do
14 23 Gitlab::Satellite::NewFileAction.any_instance.stub(
15 24 commit!: true,
... ... @@ -35,12 +44,38 @@ describe API::API do
35 44 end
36 45 end
37 46  
38   - def valid_params
39   - {
40   - file_name: 'newfile.rb',
41   - branch_name: 'master',
42   - content: 'puts 8',
43   - commit_message: 'Added newfile'
  47 + describe "PUT /projects/:id/repository/files" do
  48 + let(:valid_params) {
  49 + {
  50 + file_path: 'spec/spec_helper.rb',
  51 + branch_name: 'master',
  52 + content: 'puts 8',
  53 + commit_message: 'Changed file'
  54 + }
44 55 }
  56 +
  57 + it "should update existing file in project repo" do
  58 + Gitlab::Satellite::EditFileAction.any_instance.stub(
  59 + commit!: true,
  60 + )
  61 +
  62 + put api("/projects/#{project.id}/repository/files", user), valid_params
  63 + response.status.should == 200
  64 + json_response['file_path'].should == 'spec/spec_helper.rb'
  65 + end
  66 +
  67 + it "should return a 400 bad request if no params given" do
  68 + put api("/projects/#{project.id}/repository/files", user)
  69 + response.status.should == 400
  70 + end
  71 +
  72 + it "should return a 400 if satellite fails to create file" do
  73 + Gitlab::Satellite::EditFileAction.any_instance.stub(
  74 + commit!: false,
  75 + )
  76 +
  77 + put api("/projects/#{project.id}/repository/files", user), valid_params
  78 + response.status.should == 400
  79 + end
45 80 end
46 81 end
... ...