Commit a7e6e2b4 authored by Sean McGivern's avatar Sean McGivern

Merge branch 'ee-42934-search-api-fix' into 'master'

EE port of: API - Include project in commits&blobs search results

See merge request gitlab-org/gitlab-ee!4515
parents 052487b7 f138f82d
...@@ -116,6 +116,10 @@ class Commit ...@@ -116,6 +116,10 @@ class Commit
raw.id raw.id
end end
def project_id
project.id
end
def ==(other) def ==(other)
other.is_a?(self.class) && raw == other.raw other.is_a?(self.class) && raw == other.raw
end end
......
...@@ -54,6 +54,7 @@ following locations: ...@@ -54,6 +54,7 @@ following locations:
- [Repositories](repositories.md) - [Repositories](repositories.md)
- [Repository Files](repository_files.md) - [Repository Files](repository_files.md)
- [Runners](runners.md) - [Runners](runners.md)
- [Search](search.md)
- [Services](services.md) - [Services](services.md)
- [Settings](settings.md) - [Settings](settings.md)
- [Sidekiq metrics](sidekiq_metrics.md) - [Sidekiq metrics](sidekiq_metrics.md)
......
...@@ -302,7 +302,8 @@ Example response: ...@@ -302,7 +302,8 @@ Example response:
"filename": "home.md", "filename": "home.md",
"id": null, "id": null,
"ref": "master", "ref": "master",
"startline": 5 "startline": 5,
"project_id": 6
} }
] ]
``` ```
...@@ -334,7 +335,8 @@ Example response: ...@@ -334,7 +335,8 @@ Example response:
"authored_date": "2013-02-18T22:02:54.000Z", "authored_date": "2013-02-18T22:02:54.000Z",
"committer_name": "angus croll", "committer_name": "angus croll",
"committer_email": "anguscroll@gmail.com", "committer_email": "anguscroll@gmail.com",
"committed_date": "2013-02-18T22:02:54.000Z" "committed_date": "2013-02-18T22:02:54.000Z",
"project_id": 6
} }
] ]
``` ```
...@@ -358,7 +360,8 @@ Example response: ...@@ -358,7 +360,8 @@ Example response:
"filename": "README.md", "filename": "README.md",
"id": null, "id": null,
"ref": "master", "ref": "master",
"startline": 46 "startline": 46,
"project_id": 6
} }
] ]
``` ```
...@@ -603,7 +606,8 @@ Example response: ...@@ -603,7 +606,8 @@ Example response:
"filename": "home.md", "filename": "home.md",
"id": null, "id": null,
"ref": "master", "ref": "master",
"startline": 5 "startline": 5,
"project_id": 6
} }
] ]
``` ```
...@@ -635,7 +639,8 @@ Example response: ...@@ -635,7 +639,8 @@ Example response:
"authored_date": "2013-02-18T22:02:54.000Z", "authored_date": "2013-02-18T22:02:54.000Z",
"committer_name": "angus croll", "committer_name": "angus croll",
"committer_email": "anguscroll@gmail.com", "committer_email": "anguscroll@gmail.com",
"committed_date": "2013-02-18T22:02:54.000Z" "committed_date": "2013-02-18T22:02:54.000Z",
"project_id": 6
} }
] ]
``` ```
...@@ -659,7 +664,8 @@ Example response: ...@@ -659,7 +664,8 @@ Example response:
"filename": "README.md", "filename": "README.md",
"id": null, "id": null,
"ref": "master", "ref": "master",
"startline": 46 "startline": 46,
"project_id": 6
} }
] ]
``` ```
...@@ -901,7 +907,8 @@ Example response: ...@@ -901,7 +907,8 @@ Example response:
"filename": "home.md", "filename": "home.md",
"id": null, "id": null,
"ref": "master", "ref": "master",
"startline": 5 "startline": 5,
"project_id": 6
} }
] ]
``` ```
...@@ -931,7 +938,8 @@ Example response: ...@@ -931,7 +938,8 @@ Example response:
"authored_date": "2013-02-18T22:02:54.000Z", "authored_date": "2013-02-18T22:02:54.000Z",
"committer_name": "angus croll", "committer_name": "angus croll",
"committer_email": "anguscroll@gmail.com", "committer_email": "anguscroll@gmail.com",
"committed_date": "2013-02-18T22:02:54.000Z" "committed_date": "2013-02-18T22:02:54.000Z",
"project_id": 6
} }
] ]
``` ```
...@@ -953,7 +961,8 @@ Example response: ...@@ -953,7 +961,8 @@ Example response:
"filename": "README.md", "filename": "README.md",
"id": null, "id": null,
"ref": "master", "ref": "master",
"startline": 46 "startline": 46,
"project_id": 6
} }
] ]
``` ```
......
...@@ -77,6 +77,7 @@ module Gitlab ...@@ -77,6 +77,7 @@ module Gitlab
extname = File.extname(filename) extname = File.extname(filename)
basename = filename.sub(/#{extname}$/, '') basename = filename.sub(/#{extname}$/, '')
content = result["_source"]["blob"]["content"] content = result["_source"]["blob"]["content"]
project_id = result["_parent"].to_i
total_lines = content.lines.size total_lines = content.lines.size
term = term =
...@@ -113,7 +114,8 @@ module Gitlab ...@@ -113,7 +114,8 @@ module Gitlab
basename: basename, basename: basename,
ref: ref, ref: ref,
startline: from + 1, startline: from + 1,
data: data.join data: data.join,
project_id: project_id
) )
end end
......
...@@ -303,6 +303,7 @@ module API ...@@ -303,6 +303,7 @@ module API
expose :stats, using: Entities::CommitStats, if: :stats expose :stats, using: Entities::CommitStats, if: :stats
expose :status expose :status
expose :last_pipeline, using: 'API::Entities::PipelineBasic' expose :last_pipeline, using: 'API::Entities::PipelineBasic'
expose :project_id
end end
class Branch < Grape::Entity class Branch < Grape::Entity
...@@ -1450,6 +1451,7 @@ module API ...@@ -1450,6 +1451,7 @@ module API
expose :id expose :id
expose :ref expose :ref
expose :startline expose :startline
expose :project_id
end end
end end
end end
...@@ -11,7 +11,7 @@ module API ...@@ -11,7 +11,7 @@ module API
projects: Entities::BasicProjectDetails, projects: Entities::BasicProjectDetails,
milestones: Entities::Milestone, milestones: Entities::Milestone,
notes: Entities::Note, notes: Entities::Note,
commits: Entities::Commit, commits: Entities::CommitDetail,
blobs: Entities::Blob, blobs: Entities::Blob,
wiki_blobs: Entities::Blob, wiki_blobs: Entities::Blob,
snippet_titles: Entities::Snippet, snippet_titles: Entities::Snippet,
...@@ -43,7 +43,7 @@ module API ...@@ -43,7 +43,7 @@ module API
case params[:scope] case params[:scope]
when 'wiki_blobs' when 'wiki_blobs'
paginate(results).map { |blob| Gitlab::ProjectSearchResults.parse_search_result(blob) } paginate(results).map { |blob| Gitlab::ProjectSearchResults.parse_search_result(blob, user_project) }
when 'blobs' when 'blobs'
paginate(results).map { |blob| blob[1] } paginate(results).map { |blob| blob[1] }
else else
...@@ -110,9 +110,7 @@ module API ...@@ -110,9 +110,7 @@ module API
get ':id/-/search' do get ':id/-/search' do
check_elasticsearch_scope! check_elasticsearch_scope!
group = find_group!(params[:id]) present search(group_id: user_group.id), with: entity
present search(group_id: group.id), with: entity
end end
end end
...@@ -131,9 +129,7 @@ module API ...@@ -131,9 +129,7 @@ module API
use :pagination use :pagination
end end
get ':id/-/search' do get ':id/-/search' do
project = find_project!(params[:id]) present search(project_id: user_project.id), with: entity
present search(project_id: project.id), with: entity
end end
end end
end end
......
...@@ -28,7 +28,7 @@ module Gitlab ...@@ -28,7 +28,7 @@ module Gitlab
def find_by_content(query) def find_by_content(query)
results = repository.search_files_by_content(query, ref).first(BATCH_SIZE) results = repository.search_files_by_content(query, ref).first(BATCH_SIZE)
results.map { |result| Gitlab::ProjectSearchResults.parse_search_result(result) } results.map { |result| Gitlab::ProjectSearchResults.parse_search_result(result, project) }
end end
def find_by_filename(query, except: []) def find_by_filename(query, except: [])
...@@ -45,7 +45,8 @@ module Gitlab ...@@ -45,7 +45,8 @@ module Gitlab
basename: File.basename(blob.path), basename: File.basename(blob.path),
ref: ref, ref: ref,
startline: 1, startline: 1,
data: blob.data data: blob.data,
project: project
) )
end end
end end
......
...@@ -41,7 +41,7 @@ module Gitlab ...@@ -41,7 +41,7 @@ module Gitlab
@commits_count ||= commits.count @commits_count ||= commits.count
end end
def self.parse_search_result(result) def self.parse_search_result(result, project = nil)
ref = nil ref = nil
filename = nil filename = nil
basename = nil basename = nil
...@@ -66,7 +66,8 @@ module Gitlab ...@@ -66,7 +66,8 @@ module Gitlab
basename: basename, basename: basename,
ref: ref, ref: ref,
startline: startline, startline: startline,
data: data data: data,
project_id: project ? project.id : nil
) )
end end
......
module Gitlab module Gitlab
class SearchResults class SearchResults
class FoundBlob class FoundBlob
attr_reader :id, :filename, :basename, :ref, :startline, :data attr_reader :id, :filename, :basename, :ref, :startline, :data, :project_id
def initialize(opts = {}) def initialize(opts = {})
@id = opts.fetch(:id, nil) @id = opts.fetch(:id, nil)
...@@ -11,6 +11,7 @@ module Gitlab ...@@ -11,6 +11,7 @@ module Gitlab
@startline = opts.fetch(:startline, nil) @startline = opts.fetch(:startline, nil)
@data = opts.fetch(:data, nil) @data = opts.fetch(:data, nil)
@per_page = opts.fetch(:per_page, 20) @per_page = opts.fetch(:per_page, 20)
@project_id = opts.fetch(:project_id, nil)
end end
def path def path
......
...@@ -7,11 +7,12 @@ ...@@ -7,11 +7,12 @@
"data": { "type": "string" }, "data": { "type": "string" },
"filename": { "type": ["string"] }, "filename": { "type": ["string"] },
"id": { "type": ["string", "null"] }, "id": { "type": ["string", "null"] },
"project_id": { "type": "integer" },
"ref": { "type": "string" }, "ref": { "type": "string" },
"startline": { "type": "integer" } "startline": { "type": "integer" }
}, },
"required": [ "required": [
"basename", "data", "filename", "id", "ref", "startline" "basename", "data", "filename", "id", "ref", "startline", "project_id"
], ],
"additionalProperties": false "additionalProperties": false
} }
......
...@@ -4,9 +4,9 @@ ...@@ -4,9 +4,9 @@
{ "$ref": "basic.json" }, { "$ref": "basic.json" },
{ {
"required" : [ "required" : [
"stats",
"status", "status",
"last_pipeline" "last_pipeline",
"project_id"
], ],
"properties": { "properties": {
"stats": { "$ref": "../commit_stats.json" }, "stats": { "$ref": "../commit_stats.json" },
...@@ -16,7 +16,8 @@ ...@@ -16,7 +16,8 @@
{ "type": "null" }, { "type": "null" },
{ "$ref": "../pipeline/basic.json" } { "$ref": "../pipeline/basic.json" }
] ]
} },
"project_id": { "type": "integer" }
} }
} }
] ]
......
{
"type": "array",
"items": { "$ref": "commit/detail.json" }
}
...@@ -66,7 +66,7 @@ describe API::Search do ...@@ -66,7 +66,7 @@ describe API::Search do
get api(endpoint, user), scope: 'commits', search: 'folder' get api(endpoint, user), scope: 'commits', search: 'folder'
end end
it_behaves_like 'response is correct', schema: 'public_api/v4/commits', size: 2 it_behaves_like 'response is correct', schema: 'public_api/v4/commits_details', size: 2
end end
context 'for blobs scope' do context 'for blobs scope' do
...@@ -167,7 +167,7 @@ describe API::Search do ...@@ -167,7 +167,7 @@ describe API::Search do
it_behaves_like 'response is correct', schema: 'public_api/v4/snippets' it_behaves_like 'response is correct', schema: 'public_api/v4/snippets'
end end
context 'when elasticsearch is enabled' do context 'when elasticsearch is disabled' do
it_behaves_like 'elasticsearch disabled' do it_behaves_like 'elasticsearch disabled' do
let(:endpoint) { '/search' } let(:endpoint) { '/search' }
end end
...@@ -391,7 +391,7 @@ describe API::Search do ...@@ -391,7 +391,7 @@ describe API::Search do
get api("/projects/#{repo_project.id}/-/search", user), scope: 'commits', search: '498214de67004b1da3d820901307bed2a68a8ef6' get api("/projects/#{repo_project.id}/-/search", user), scope: 'commits', search: '498214de67004b1da3d820901307bed2a68a8ef6'
end end
it_behaves_like 'response is correct', schema: 'public_api/v4/commits' it_behaves_like 'response is correct', schema: 'public_api/v4/commits_details'
end end
context 'for commits scope with project path as id' do context 'for commits scope with project path as id' do
...@@ -399,7 +399,7 @@ describe API::Search do ...@@ -399,7 +399,7 @@ describe API::Search do
get api("/projects/#{CGI.escape(repo_project.full_path)}/-/search", user), scope: 'commits', search: '498214de67004b1da3d820901307bed2a68a8ef6' get api("/projects/#{CGI.escape(repo_project.full_path)}/-/search", user), scope: 'commits', search: '498214de67004b1da3d820901307bed2a68a8ef6'
end end
it_behaves_like 'response is correct', schema: 'public_api/v4/commits' it_behaves_like 'response is correct', schema: 'public_api/v4/commits_details'
end end
context 'for blobs scope' do context 'for blobs scope' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment