Read about our upcoming Code of Conduct on this issue

Commit 7f57fe50 authored by Javier Castro's avatar Javier Castro Committed by Dmitriy Zaporozhets
Browse files

Implemented code search feature

parent b8ffea9db003
......@@ -6,7 +6,7 @@ before_install:
- gem install charlock_holmes -v="0.6.9"
branches:
only:
- 'master'
- 'code-search'
rvm:
- 1.9.3-p392
- 2.0.0
......
......@@ -23,7 +23,7 @@ gem 'omniauth-github'
# Extracting information from a git repository
# We cannot use original git since some bugs
gem "grit", '~> 2.5.0', git: 'https://github.com/gitlabhq/grit.git', ref: '42297cdcee16284d2e4eff23d41377f52fc28b9d'
gem "grit", '~> 2.5.0', git: 'https://github.com/gitlabhq/grit.git'
gem 'gitlab_git', '~> 1.0.6'
# Ruby/Rack Git Smart-HTTP Server Handler
......
......@@ -8,8 +8,7 @@ GIT
GIT
remote: https://github.com/gitlabhq/grit.git
revision: 42297cdcee16284d2e4eff23d41377f52fc28b9d
ref: 42297cdcee16284d2e4eff23d41377f52fc28b9d
revision: e873bb84ac3c4f8249311490d6a7c6ac9127625f
specs:
grit (2.5.0)
diff-lcs (~> 1.1)
......
......@@ -10,7 +10,11 @@ def execute
return result unless query.present?
result[:projects] = Project.where(id: project_ids).search(query).limit(10)
projects = Project.where(id: project_ids)
result[:projects] = projects.search(query).limit(10)
if projects.length == 1
result[:snippets] = projects.first.files(query, params[:branch_ref])
end
result[:merge_requests] = MergeRequest.where(project_id: project_ids).search(query).limit(10)
result[:issues] = Issue.where(project_id: project_ids).search(query).limit(10)
result[:wiki_pages] = []
......@@ -22,7 +26,8 @@ def result
projects: [],
merge_requests: [],
issues: [],
wiki_pages: []
wiki_pages: [],
snippets: []
}
end
end
......
......@@ -18,5 +18,6 @@ def show
@merge_requests = result[:merge_requests]
@issues = result[:issues]
@wiki_pages = result[:wiki_pages]
@snippets = result[:snippets]
end
end
......@@ -411,4 +411,15 @@ def forked?
!(forked_project_link.nil? || forked_project_link.forked_from_project.nil?)
end
def files(query, treeish)
snippets = []
tree = treeish.present? ? treeish : default_branch
if repository && !tree.nil?
greps = repository.repo.grep(query, 3, tree)
greps.each do |g|
snippets << Gitlab::BlobSnippet.new(self, tree, g.content, g.startline, g.filename)
end
end
snippets
end
end
......@@ -3,4 +3,13 @@
= text_field_tag "search", nil, placeholder: "Search", class: "search-input"
= hidden_field_tag :group_id, @group.try(:id)
= hidden_field_tag :project_id, @project.try(:id)
.search-autocomplete-json.hide{:'data-autocomplete-opts' => search_autocomplete_source }
- if @ref
- @branch_ref = @ref
- else
- @branch_ref = @project.try(:default_branch)
- if @branch_ref.blank?
- @branch_ref = 'master'
= hidden_field_tag :branch_ref, @branch_ref
- if ENV['RAILS_ENV'] == 'test'
= submit_tag 'Go'
.search-autocomplete-json.hide{:'data-autocomplete-opts' => search_autocomplete_source }
\ No newline at end of file
......@@ -32,6 +32,15 @@
%strong.term
= truncate wiki_page.title, length: 50
%span.light (#{wiki_page.project.name_with_namespace})
- @snippets.each do |snippet|
%li
code:
= link_to project_blob_path(snippet.project, tree_join(snippet.tree, snippet.filename), :anchor => "L" + snippet.startline.to_s) do
%strong.term
= snippet.filename
.file_content.code
%div{class: user_color_scheme_class}
= raw snippet.colorize( formatter: :gitlab, options: { first_line_number: snippet.startline } )
:javascript
$(function() {
......
Feature: Project Search code
Background:
Given I sign in as a user
And I own project "Shop"
Given I visit project source page
Scenario: Search for term "Welcome to Gitlab"
When I search for term "Welcome to Gitlab"
Then I should see files from repository containing "Welcome to Gitlab"
class ProjectSearchCode < Spinach::FeatureSteps
include SharedAuthentication
include SharedProject
include SharedPaths
When 'I search for term "Welcome to Gitlab"' do
fill_in "search", with: "Welcome to Gitlab"
click_button "Go"
end
Then 'I should see files from repository containing "Welcome to Gitlab"' do
page.should have_content "Welcome to Gitlab"
page.should have_content "GitLab is a free project and repository management application"
end
end
module Gitlab
class BlobSnippet
include Linguist::BlobHelper
attr_accessor :project
attr_accessor :tree
attr_accessor :lines
attr_accessor :filename
attr_accessor :startline
def initialize(project, tree, lines, startline, filename)
@project, @tree, @lines, @startline, @filename = project, tree, lines, startline, filename
end
def data
lines.join("\n")
end
def name
filename
end
def size
data.length
end
def mode
nil
end
end
end
\ No newline at end of file
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