summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-07-10 17:50:50 +0200
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-07-10 17:50:50 +0200
commitf6609c9882c1d85b7f31072e6341fe5c91b37b41 (patch)
treee9f58390c7c4ac220406e9012f016dceeea6bca4
parent77025ad8e33cc99c645febe9b51fbf9931a62bcf (diff)
downloadgitlab-ce-search-git-grep.tar.gz
Implement search of code via git grepsearch-git-grep
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
-rw-r--r--app/models/repository.rb34
-rw-r--r--app/views/search/results/_blob.html.haml1
2 files changed, 35 insertions, 0 deletions
diff --git a/app/models/repository.rb b/app/models/repository.rb
index c767d1051d1..a7b990b1ba5 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -431,6 +431,40 @@ class Repository
end
end
+ def search_files(query, ref)
+ offset = 2
+ args = %W(git grep -i -n --before-context #{offset} --after-context #{offset} #{query} #{ref || root_ref})
+ Gitlab::Popen.popen(args, path_to_repo).first.scrub.split(/^--$/)
+ end
+
+ def search_to_blob(result)
+ ref = nil
+ filename = nil
+ startline = 0
+
+ lines = result.lstrip.lines
+ lines.each_with_index do |line, index|
+ if line =~ /^.*:.*:\d+:/
+ ref, filename, startline = line.split(':')
+ startline = startline.to_i - index
+ break
+ end
+ end
+
+ data = lines.map do |line|
+ line.sub(ref, '').sub(filename, '').sub(/^:-\d+-/, '').sub(/^::\d+:/, '')
+ end
+
+ data = data.join("")
+
+ OpenStruct.new(
+ filename: filename,
+ ref: ref,
+ startline: startline,
+ data: data
+ )
+ end
+
private
def cache
diff --git a/app/views/search/results/_blob.html.haml b/app/views/search/results/_blob.html.haml
index 84e9be82c44..9be13207070 100644
--- a/app/views/search/results/_blob.html.haml
+++ b/app/views/search/results/_blob.html.haml
@@ -1,3 +1,4 @@
+- blob = @project.repository.search_to_blob(blob)
.blob-result
.file-holder
.file-title