Use GrapeDSL for commits
This commit is contained in:
parent
cb8654e856
commit
4de883bc81
1 changed files with 69 additions and 60 deletions
|
@ -6,33 +6,40 @@ module API
|
|||
before { authenticate! }
|
||||
before { authorize! :download_code, user_project }
|
||||
|
||||
params do
|
||||
requires :id, type: String, desc: 'The ID of a project'
|
||||
end
|
||||
resource :projects do
|
||||
# Get a project repository commits
|
||||
#
|
||||
# Parameters:
|
||||
# id (required) - The ID of a project
|
||||
# ref_name (optional) - The name of a repository branch or tag, if not given the default branch is used
|
||||
# since (optional) - Only commits after or in this date will be returned
|
||||
# until (optional) - Only commits before or in this date will be returned
|
||||
# Example Request:
|
||||
# GET /projects/:id/repository/commits
|
||||
desc 'Get a project repository commits' do
|
||||
success Entities::RepoCommit
|
||||
end
|
||||
params do
|
||||
optional :ref_name, type: String, desc: 'The name of a repository branch or tag, if not given the default branch is used'
|
||||
optional :since, type: String, desc: 'Only commits after or in this date will be returned'
|
||||
optional :until, type: String, desc: 'Only commits before or in this date will be returned'
|
||||
optional :page, type: Integer, default: 0, desc: 'The page for pagination'
|
||||
optional :per_page, type: Integer, default: 20, desc: 'The number of results per page'
|
||||
end
|
||||
get ":id/repository/commits" do
|
||||
# TODO remove the next line for 9.0, use DateTime type in the params block
|
||||
datetime_attributes! :since, :until
|
||||
|
||||
page = (params[:page] || 0).to_i
|
||||
per_page = (params[:per_page] || 20).to_i
|
||||
ref = params[:ref_name] || user_project.try(:default_branch) || 'master'
|
||||
after = params[:since]
|
||||
before = params[:until]
|
||||
offset = params[:page] * params[:per_page]
|
||||
|
||||
commits = user_project.repository.commits(ref,
|
||||
limit: params[:per_page],
|
||||
offset: offset,
|
||||
after: params[:since],
|
||||
before: params[:until])
|
||||
|
||||
commits = user_project.repository.commits(ref, limit: per_page, offset: page * per_page, after: after, before: before)
|
||||
present commits, with: Entities::RepoCommit
|
||||
end
|
||||
|
||||
desc 'Commit multiple file changes as one commit' do
|
||||
success Entities::RepoCommitDetail
|
||||
detail 'This feature was introduced in GitLab 8.13'
|
||||
end
|
||||
|
||||
params do
|
||||
requires :id, type: Integer, desc: 'The project ID'
|
||||
requires :branch_name, type: String, desc: 'The name of branch'
|
||||
|
@ -41,7 +48,6 @@ module API
|
|||
optional :author_email, type: String, desc: 'Author email for commit'
|
||||
optional :author_name, type: String, desc: 'Author name for commit'
|
||||
end
|
||||
|
||||
post ":id/repository/commits" do
|
||||
authorize! :push_code, user_project
|
||||
|
||||
|
@ -65,79 +71,82 @@ module API
|
|||
end
|
||||
end
|
||||
|
||||
# Get a specific commit of a project
|
||||
#
|
||||
# Parameters:
|
||||
# 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
|
||||
desc 'Get a specific commit of a project' do
|
||||
success Entities::RepoCommitDetail
|
||||
failure [[404, 'Not Found']]
|
||||
end
|
||||
params do
|
||||
requires :sha, type: String, desc: 'A commit sha, or the name of a branch or tag'
|
||||
end
|
||||
get ":id/repository/commits/:sha" do
|
||||
sha = params[:sha]
|
||||
commit = user_project.commit(sha)
|
||||
commit = user_project.commit(params[:sha])
|
||||
|
||||
not_found! "Commit" unless commit
|
||||
|
||||
present commit, with: Entities::RepoCommitDetail
|
||||
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
|
||||
# Example Request:
|
||||
# GET /projects/:id/repository/commits/:sha/diff
|
||||
desc 'Get the diff for a specific commit of a project' do
|
||||
failure [[404, 'Not Found']]
|
||||
end
|
||||
params do
|
||||
requires :sha, type: String, desc: 'A commit sha, or the name of a branch or tag'
|
||||
end
|
||||
get ":id/repository/commits/:sha/diff" do
|
||||
sha = params[:sha]
|
||||
commit = user_project.commit(sha)
|
||||
commit = user_project.commit(params[:sha])
|
||||
|
||||
not_found! "Commit" unless commit
|
||||
|
||||
commit.raw_diffs.to_a
|
||||
end
|
||||
|
||||
# Get a commit's comments
|
||||
#
|
||||
# Parameters:
|
||||
# id (required) - The ID of a project
|
||||
# sha (required) - The commit hash
|
||||
# Examples:
|
||||
# GET /projects/:id/repository/commits/:sha/comments
|
||||
desc "Get a commit's comments" do
|
||||
success Entities::CommitNote
|
||||
failure [[404, 'Not Found']]
|
||||
end
|
||||
params do
|
||||
requires :sha, type: String, desc: 'A commit sha, or the name of a branch or tag'
|
||||
optional :per_page, type: Integer, desc: 'The amount of items per page for paginaion'
|
||||
optional :page, type: Integer, desc: 'The page number for pagination'
|
||||
end
|
||||
get ':id/repository/commits/:sha/comments' do
|
||||
sha = params[:sha]
|
||||
commit = user_project.commit(sha)
|
||||
commit = user_project.commit(params[:sha])
|
||||
|
||||
not_found! 'Commit' unless commit
|
||||
notes = Note.where(commit_id: commit.id).order(:created_at)
|
||||
|
||||
present paginate(notes), with: Entities::CommitNote
|
||||
end
|
||||
|
||||
# Post comment to commit
|
||||
#
|
||||
# Parameters:
|
||||
# id (required) - The ID of a project
|
||||
# sha (required) - The commit hash
|
||||
# note (required) - Text of comment
|
||||
# path (optional) - The file path
|
||||
# line (optional) - The line number
|
||||
# line_type (optional) - The type of line (new or old)
|
||||
# Examples:
|
||||
# POST /projects/:id/repository/commits/:sha/comments
|
||||
desc 'Post comment to commit' do
|
||||
success Entities::CommitNote
|
||||
end
|
||||
params do
|
||||
requires :sha, type: String, regexp: /\A\h{6,40}\z/, desc: "The commit's SHA"
|
||||
requires :note, type: String, desc: 'The text of the comment'
|
||||
optional :path, type: String, desc: 'The file path'
|
||||
given :path do
|
||||
requires :line, type: Integer, desc: 'The line number'
|
||||
requires :line_type, type: String, values: ['new', 'old'], default: 'new', desc: 'The type of the line'
|
||||
end
|
||||
end
|
||||
post ':id/repository/commits/:sha/comments' do
|
||||
required_attributes! [:note]
|
||||
|
||||
sha = params[:sha]
|
||||
commit = user_project.commit(sha)
|
||||
commit = user_project.commit(params[:sha])
|
||||
not_found! 'Commit' unless commit
|
||||
|
||||
opts = {
|
||||
note: params[:note],
|
||||
noteable_type: 'Commit',
|
||||
commit_id: commit.id
|
||||
}
|
||||
|
||||
if params[:path] && params[:line] && params[:line_type]
|
||||
if params[:path]
|
||||
commit.raw_diffs(all_diffs: true).each do |diff|
|
||||
next unless diff.new_path == params[:path]
|
||||
lines = Gitlab::Diff::Parser.new.parse(diff.diff.each_line)
|
||||
|
||||
lines.each do |line|
|
||||
next unless line.new_pos == params[:line].to_i && line.type == params[:line_type]
|
||||
next unless line.new_pos == params[:line] && line.type == params[:line_type]
|
||||
break opts[:line_code] = Gitlab::Diff::LineCode.generate(diff.new_path, line.new_pos, line.old_pos)
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue