Skip to content
Snippets Groups Projects
Commit 19c58bec authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets
Browse files

Merge branch 'tsigo-routing_overhaul'

parents 0439387b 2c8d3c33
No related branches found
No related tags found
No related merge requests found
Showing
with 303 additions and 207 deletions
Loading
Loading
@@ -57,7 +57,7 @@ gem "seed-fu"
 
# Markdown to HTML
gem "redcarpet", "~> 2.1.1"
gem "github-markup", "~> 0.7.4"
gem "github-markup", "~> 0.7.4", require: 'github/markup'
 
# Servers
gem "thin"
Loading
Loading
Loading
Loading
@@ -53,7 +53,7 @@ ul.main_menu {
border-left: 0;
}
 
&.current {
&.active {
background-color:#D5D5D5;
border-right: 1px solid #BBB;
border-left: 1px solid #BBB;
Loading
Loading
Loading
Loading
@@ -2,7 +2,6 @@ class ApplicationController < ActionController::Base
before_filter :authenticate_user!
before_filter :reject_blocked!
before_filter :set_current_user_for_mailer
before_filter :check_token_auth
before_filter :set_current_user_for_observers
before_filter :dev_tools if Rails.env == 'development'
 
Loading
Loading
@@ -26,13 +25,6 @@ class ApplicationController < ActionController::Base
 
protected
 
def check_token_auth
# Redirect to login page if not atom feed
if params[:private_token].present? && params[:format] != 'atom'
redirect_to new_user_session_path
end
end
def reject_blocked!
if current_user && current_user.blocked
sign_out current_user
Loading
Loading
@@ -113,7 +105,7 @@ class ApplicationController < ActionController::Base
end
 
def render_404
render file: File.join(Rails.root, "public", "404"), layout: false, status: "404"
render file: Rails.root.join("public", "404"), layout: false, status: "404"
end
 
def require_non_empty_project
Loading
Loading
@@ -126,10 +118,6 @@ class ApplicationController < ActionController::Base
response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
end
 
def render_full_content
@full_content = true
end
def dev_tools
Rack::MiniProfiler.authorize_request
end
Loading
Loading
# Controller for viewing a file's blame
class BlameController < ApplicationController
include ExtractsPath
layout "project"
before_filter :project
# Authorize
before_filter :add_project_abilities
before_filter :authorize_read_project!
before_filter :authorize_code_access!
before_filter :require_non_empty_project
before_filter :assign_ref_vars
def show
@repo = @project.repo
@blame = Grit::Blob.blame(@repo, @commit.id, @path)
end
end
# Controller for viewing a file's blame
class BlobController < ApplicationController
include ExtractsPath
include Gitlab::Encode
layout "project"
before_filter :project
# Authorize
before_filter :add_project_abilities
before_filter :authorize_read_project!
before_filter :authorize_code_access!
before_filter :require_non_empty_project
before_filter :assign_ref_vars
def show
if @tree.is_blob?
if @tree.text?
encoding = detect_encoding(@tree.data)
mime_type = encoding ? "text/plain; charset=#{encoding}" : "text/plain"
else
mime_type = @tree.mime_type
end
send_data(
@tree.data,
type: mime_type,
disposition: 'inline',
filename: @tree.name
)
else
not_found!
end
end
end
# Controller for a specific Commit
#
# Not to be confused with CommitsController, plural.
class CommitController < ApplicationController
before_filter :project
layout "project"
# Authorize
before_filter :add_project_abilities
before_filter :authorize_read_project!
before_filter :authorize_code_access!
before_filter :require_non_empty_project
def show
result = CommitLoad.new(project, current_user, params).execute
@commit = result[:commit]
git_not_found! unless @commit
@suppress_diff = result[:suppress_diff]
@note = result[:note]
@line_notes = result[:line_notes]
@notes_count = result[:notes_count]
@comments_allowed = true
respond_to do |format|
format.html do
if result[:status] == :huge_commit
render "huge_commit" and return
end
end
format.patch
end
end
end
Loading
Loading
@@ -4,19 +4,19 @@ class CommitsController < ApplicationController
before_filter :project
layout "project"
 
include ExtractsPath
# Authorize
before_filter :add_project_abilities
before_filter :authorize_read_project!
before_filter :authorize_code_access!
before_filter :require_non_empty_project
before_filter :load_refs, only: :index # load @branch, @tag & @ref
before_filter :render_full_content
 
def index
@repo = project.repo
def show
@repo = @project.repo
@limit, @offset = (params[:limit] || 40), (params[:offset] || 0)
 
@commits = @project.commits(@ref, params[:path], @limit, @offset)
@commits = @project.commits(@ref, @path, @limit, @offset)
@commits = CommitDecorator.decorate(@commits)
 
respond_to do |format|
Loading
Loading
@@ -25,54 +25,4 @@ class CommitsController < ApplicationController
format.atom { render layout: false }
end
end
def show
result = CommitLoad.new(project, current_user, params).execute
@commit = result[:commit]
if @commit
@suppress_diff = result[:suppress_diff]
@note = result[:note]
@line_notes = result[:line_notes]
@notes_count = result[:notes_count]
@comments_allowed = true
else
return git_not_found!
end
if result[:status] == :huge_commit
render "huge_commit" and return
end
end
def compare
result = Commit.compare(project, params[:from], params[:to])
@commits = result[:commits]
@commit = result[:commit]
@diffs = result[:diffs]
@refs_are_same = result[:same]
@line_notes = []
@commits = CommitDecorator.decorate(@commits)
end
def patch
@commit = project.commit(params[:id])
send_data(
@commit.to_patch,
type: "text/plain",
disposition: 'attachment',
filename: "#{@commit.id}.patch"
)
end
protected
def load_refs
@ref ||= params[:ref].presence || params[:branch].presence || params[:tag].presence
@ref ||= @ref || @project.try(:default_branch) || 'master'
end
end
class CompareController < ApplicationController
before_filter :project
layout "project"
# Authorize
before_filter :add_project_abilities
before_filter :authorize_read_project!
before_filter :authorize_code_access!
before_filter :require_non_empty_project
def index
end
def show
result = Commit.compare(project, params[:from], params[:to])
@commits = result[:commits]
@commit = result[:commit]
@diffs = result[:diffs]
@refs_are_same = result[:same]
@line_notes = []
@commits = CommitDecorator.decorate(@commits)
end
def create
redirect_to project_compare_path(@project, params[:from], params[:to])
end
end
Loading
Loading
@@ -7,7 +7,6 @@ class ProtectedBranchesController < ApplicationController
before_filter :require_non_empty_project
 
before_filter :authorize_admin_project!, only: [:destroy, :create]
before_filter :render_full_content
 
layout "project"
 
Loading
Loading
require 'github/markup'
class RefsController < ApplicationController
include Gitlab::Encode
before_filter :project
Loading
Loading
@@ -11,23 +9,22 @@ class RefsController < ApplicationController
before_filter :require_non_empty_project
 
before_filter :ref
before_filter :define_tree_vars, only: [:tree, :blob, :blame, :logs_tree]
before_filter :render_full_content
before_filter :define_tree_vars, only: [:blob, :logs_tree]
 
layout "project"
 
def switch
respond_to do |format|
format.html do
def switch
respond_to do |format|
format.html do
new_path = if params[:destination] == "tree"
tree_project_ref_path(@project, params[:ref])
project_tree_path(@project, @ref)
else
project_commits_path(@project, ref: params[:ref])
project_commits_path(@project, @ref)
end
 
redirect_to new_path
redirect_to new_path
end
format.js do
format.js do
@ref = params[:ref]
define_tree_vars
render "tree"
Loading
Loading
@@ -35,19 +32,6 @@ class RefsController < ApplicationController
end
end
 
#
# Repository preview
#
def tree
respond_to do |format|
format.html
format.js do
# disable cache to allow back button works
no_cache_headers
end
end
end
def logs_tree
contents = @tree.contents
@logs = contents.map do |content|
Loading
Loading
@@ -55,36 +39,12 @@ class RefsController < ApplicationController
last_commit = @project.commits(@commit.id, file, 1).last
last_commit = CommitDecorator.decorate(last_commit)
{
file_name: content.name,
file_name: content.name,
commit: last_commit
}
end
end
 
def blob
if @tree.is_blob?
if @tree.text?
encoding = detect_encoding(@tree.data)
mime_type = encoding ? "text/plain; charset=#{encoding}" : "text/plain"
else
mime_type = @tree.mime_type
end
send_data(
@tree.data,
type: mime_type,
disposition: 'inline',
filename: @tree.name
)
else
head(404)
end
end
def blame
@blame = Grit::Blob.blame(@repo, @commit.id, params[:path])
end
protected
 
def define_tree_vars
Loading
Loading
@@ -95,20 +55,20 @@ class RefsController < ApplicationController
@commit = CommitDecorator.decorate(@commit)
@tree = Tree.new(@commit.tree, project, @ref, params[:path])
@tree = TreeDecorator.new(@tree)
@hex_path = Digest::SHA1.hexdigest(params[:path] || "/")
@hex_path = Digest::SHA1.hexdigest(params[:path] || "")
 
if params[:path]
@history_path = tree_file_project_ref_path(@project, @ref, params[:path])
@logs_path = logs_file_project_ref_path(@project, @ref, params[:path])
@history_path = project_tree_path(@project, File.join(@ref, params[:path]))
@logs_path = logs_file_project_ref_path(@project, @ref, params[:path])
else
@history_path = tree_project_ref_path(@project, @ref)
@logs_path = logs_tree_project_ref_path(@project, @ref)
@history_path = project_tree_path(@project, @ref)
@logs_path = logs_tree_project_ref_path(@project, @ref)
end
rescue
return render_404
end
def ref
@ref = params[:id]
@ref = params[:id] || params[:ref]
end
end
Loading
Loading
@@ -6,7 +6,6 @@ class RepositoriesController < ApplicationController
before_filter :authorize_read_project!
before_filter :authorize_code_access!
before_filter :require_non_empty_project
before_filter :render_full_content
 
layout "project"
 
Loading
Loading
@@ -15,11 +14,11 @@ class RepositoriesController < ApplicationController
end
 
def branches
@branches = @project.repo.heads.sort_by(&:name)
@branches = @project.branches
end
 
def tags
@tags = @project.repo.tags.sort_by(&:name).reverse
@tags = @project.tags
end
 
def archive
Loading
Loading
Loading
Loading
@@ -55,7 +55,6 @@ class SnippetsController < ApplicationController
 
def show
@note = @project.notes.new(noteable: @snippet)
render_full_content
end
 
def destroy
Loading
Loading
# Controller for viewing a repository's file structure
class TreeController < ApplicationController
include ExtractsPath
layout "project"
before_filter :project
# Authorize
before_filter :add_project_abilities
before_filter :authorize_read_project!
before_filter :authorize_code_access!
before_filter :require_non_empty_project
before_filter :assign_ref_vars
def show
@hex_path = Digest::SHA1.hexdigest(@path)
@history_path = project_tree_path(@project, @id)
@logs_path = logs_file_project_ref_path(@project, @ref, @path)
respond_to do |format|
format.html
# Disable cache so browser history works
format.js { no_cache_headers }
end
end
end
Loading
Loading
@@ -21,7 +21,7 @@ class EventDecorator < ApplicationDecorator
elsif self.merge_request?
h.project_merge_request_url(self.project, self.merge_request)
elsif self.push?
h.project_commits_url(self.project, ref: self.ref_name)
h.project_commits_url(self.project, self.ref_name)
end
end
end
Loading
Loading
@@ -6,7 +6,7 @@ class TreeDecorator < ApplicationDecorator
part_path = ""
parts = path.split("\/")
 
#parts = parts[0...-1] if is_blob?
#parts = parts[0...-1] if is_blob?
 
yield(h.link_to("..", "#", remote: :true)) if parts.count > max_links
 
Loading
Loading
@@ -15,29 +15,29 @@ class TreeDecorator < ApplicationDecorator
part_path = part if part_path.empty?
 
next unless parts.last(2).include?(part) if parts.count > max_links
yield(h.link_to(h.truncate(part, length: 40), h.tree_file_project_ref_path(project, ref, path: part_path), remote: :true))
yield(h.link_to(h.truncate(part, length: 40), h.project_tree_path(project, h.tree_join(ref, part_path)), remote: :true))
end
end
end
 
def up_dir?
!!path
path.present?
end
 
def up_dir_path
file = File.join(path, "..")
h.tree_file_project_ref_path(project, ref, file)
h.project_tree_path(project, h.tree_join(ref, file))
end
 
def history_path
h.project_commits_path(project, path: path, ref: ref)
h.project_commits_path(project, h.tree_join(ref, path))
end
 
def mb_size
size = (tree.size / 1024)
if size < 1024
"#{size} KB"
else
"#{size} KB"
else
"#{size/1024} MB"
end
end
Loading
Loading
require 'digest/md5'
module ApplicationHelper
 
# Check if a particular controller is the current one
#
# args - One or more controller names to check
#
# Examples
#
# # On TreeController
# current_controller?(:tree) # => true
# current_controller?(:commits) # => false
# current_controller?(:commits, :tree) # => true
def current_controller?(*args)
args.any? { |v| v.to_s.downcase == controller.controller_name }
end
# Check if a partcular action is the current one
#
# args - One or more action names to check
#
# Examples
#
# # On Projects#new
# current_action?(:new) # => true
# current_action?(:create) # => false
# current_action?(:new, :create) # => true
def current_action?(*args)
args.any? { |v| v.to_s.downcase == action_name }
end
def gravatar_icon(user_email = '', size = 40)
if Gitlab.config.disable_gravatar? || user_email.blank?
'no_avatar.png'
Loading
Loading
@@ -31,8 +60,8 @@ module ApplicationHelper
 
def grouped_options_refs(destination = :tree)
options = [
["Branch", @project.repo.heads.map(&:name) ],
[ "Tag", @project.tags ]
["Branch", @project.branch_names ],
[ "Tag", @project.tag_names ]
]
 
# If reference is commit id -
Loading
Loading
@@ -58,11 +87,11 @@ module ApplicationHelper
 
if @project && !@project.new_record?
project_nav = [
{ label: "#{@project.name} / Issues", url: project_issues_path(@project) },
{ label: "#{@project.name} / Wall", url: wall_project_path(@project) },
{ label: "#{@project.name} / Tree", url: tree_project_ref_path(@project, @project.root_ref) },
{ label: "#{@project.name} / Commits", url: project_commits_path(@project) },
{ label: "#{@project.name} / Team", url: project_team_index_path(@project) }
{ label: "#{@project.name} / Issues", url: project_issues_path(@project) },
{ label: "#{@project.name} / Wall", url: wall_project_path(@project) },
{ label: "#{@project.name} / Tree", url: project_tree_path(@project, @ref || @project.root_ref) },
{ label: "#{@project.name} / Commits", url: project_commits_path(@project, @ref || @project.root_ref) },
{ label: "#{@project.name} / Team", url: project_team_index_path(@project) }
]
end
 
Loading
Loading
@@ -85,45 +114,6 @@ module ApplicationHelper
event.project.merge_requests_enabled
end
 
def tab_class(tab_key)
active = case tab_key
# Project Area
when :wall; wall_tab?
when :wiki; controller.controller_name == "wikis"
when :issues; issues_tab?
when :network; current_page?(controller: "projects", action: "graph", id: @project)
when :merge_requests; controller.controller_name == "merge_requests"
# Dashboard Area
when :help; controller.controller_name == "help"
when :search; current_page?(search_path)
when :dash_issues; current_page?(dashboard_issues_path)
when :dash_mr; current_page?(dashboard_merge_requests_path)
when :root; current_page?(dashboard_path) || current_page?(root_path)
# Profile Area
when :profile; current_page?(controller: "profile", action: :show)
when :history; current_page?(controller: "profile", action: :history)
when :account; current_page?(controller: "profile", action: :account)
when :token; current_page?(controller: "profile", action: :token)
when :design; current_page?(controller: "profile", action: :design)
when :ssh_keys; controller.controller_name == "keys"
# Admin Area
when :admin_root; controller.controller_name == "dashboard"
when :admin_users; controller.controller_name == 'users'
when :admin_projects; controller.controller_name == "projects"
when :admin_hooks; controller.controller_name == 'hooks'
when :admin_resque; controller.controller_name == 'resque'
when :admin_logs; controller.controller_name == 'logs'
else
false
end
active ? "current" : nil
end
def hexdigest(string)
Digest::SHA1.hexdigest string
end
Loading
Loading
module TabHelper
def issues_tab?
controller.controller_name == "issues" || controller.controller_name == "milestones"
end
# Navigation link helper
#
# Returns an `li` element with an 'active' class if the supplied
# controller(s) and/or action(s) currently active. The contents of the
# element is the value passed to the block.
#
# options - The options hash used to determine if the element is "active" (default: {})
# :controller - One or more controller names to check (optional).
# :action - One or more action names to check (optional).
# :path - A shorthand path, such as 'dashboard#index', to check (optional).
# :html_options - Extra options to be passed to the list element (optional).
# block - An optional block that will become the contents of the returned
# `li` element.
#
# When both :controller and :action are specified, BOTH must match in order
# to be marked as active. When only one is given, either can match.
#
# Examples
#
# # Assuming we're on TreeController#show
#
# # Controller matches, but action doesn't
# nav_link(controller: [:tree, :refs], action: :edit) { "Hello" }
# # => '<li>Hello</li>'
#
# # Controller matches
# nav_link(controller: [:tree, :refs]) { "Hello" }
# # => '<li class="active">Hello</li>'
#
# # Shorthand path
# nav_link(path: 'tree#show') { "Hello" }
# # => '<li class="active">Hello</li>'
#
# # Supplying custom options for the list element
# nav_link(controller: :tree, html_options: {class: 'home'}) { "Hello" }
# # => '<li class="home active">Hello</li>'
#
# Returns a list item element String
def nav_link(options = {}, &block)
if path = options.delete(:path)
c, a, _ = path.split('#')
else
c = options.delete(:controller)
a = options.delete(:action)
end
if c && a
# When given both options, make sure BOTH are active
klass = current_controller?(*c) && current_action?(*a) ? 'active' : ''
else
# Otherwise check EITHER option
klass = current_controller?(*c) || current_action?(*a) ? 'active' : ''
end
# Add our custom class into the html_options, which may or may not exist
# and which may or may not already have a :class key
o = options.delete(:html_options) || {}
o[:class] ||= ''
o[:class] += ' ' + klass
o[:class].strip!
 
def wall_tab?
current_page?(controller: "projects", action: "wall", id: @project)
if block_given?
content_tag(:li, capture(&block), o)
else
content_tag(:li, nil, o)
end
end
 
def project_tab_class
[:show, :files, :edit, :update].each do |action|
return "current" if current_page?(controller: "projects", action: action, id: @project)
return "active" if current_page?(controller: "projects", action: action, id: @project)
end
 
if ['snippets', 'hooks', 'deploy_keys', 'team_members'].include? controller.controller_name
"current"
end
end
def tree_tab_class
controller.controller_name == "refs" ? "current" : nil
end
def commit_tab_class
if ['commits', 'repositories', 'protected_branches'].include? controller.controller_name
"current"
"active"
end
end
 
def branches_tab_class
if current_page?(branches_project_repository_path(@project)) ||
controller.controller_name == "protected_branches" ||
current_controller?(:protected_branches) ||
current_page?(project_repository_path(@project))
'active'
end
Loading
Loading
Loading
Loading
@@ -39,4 +39,9 @@ module TreeHelper
def gitlab_markdown?(filename)
filename.end_with?(*%w(.mdown .md .markdown))
end
# Simple shortcut to File.join
def tree_join(*args)
File.join(*args)
end
end
require File.join(Rails.root, "app/models/commit")
require Rails.root.join("app/models/commit")
 
class MergeRequest < ActiveRecord::Base
include IssueCommonality
Loading
Loading
class Tree
include Linguist::BlobHelper
include Linguist::BlobHelper
attr_accessor :path, :tree, :project, :ref
 
delegate :contents,
Loading
Loading
@@ -14,8 +14,8 @@ class Tree
to: :tree
 
def initialize(raw_tree, project, ref = nil, path = nil)
@project, @ref, @path = project, ref, path,
@tree = if path
@project, @ref, @path = project, ref, path
@tree = if path.present?
raw_tree / path.dup.force_encoding('ascii-8bit')
else
raw_tree
Loading
Loading
@@ -26,6 +26,10 @@ class Tree
tree.is_a?(Grit::Blob)
end
 
def invalid?
tree.nil?
end
def empty?
data.blank?
end
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment