# encoding: utf-8 #-- # Copyright (C) 2010 Tero Hänninen # Copyright (C) 2010 Juho Nieminen # Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies) # Copyright (C) 2008 Johan Sørensen # Copyright (C) 2008 David A. Cuadrado # Copyright (C) 2008 Tor Arne Vestbø # Copyright (C) 2009 Fabio Akita # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . #++ class SiteController < ApplicationController skip_before_filter :public_and_logged_in, :only => [:index, :about, :faq] before_filter :login_required, :only => [:dashboard, :new_repo_and_project, :create_repo_and_project] before_filter :require_user_has_ssh_keys, :only => [:new_repo_and_project, :create_repo_and_project] renders_in_site_specific_context :except => [:about, :faq, :contact] renders_in_global_context :only => [:about, :faq, :contact] def index if !current_site.subdomain.blank? render_site_index and return else render_global_index end end def public_timeline render_public_timeline end def dashboard redirect_to current_user end def about end def faq end def contact end def repositories @repositories = Repository.mainlines.public_to_world_or_site.paginate(:all, :order => "repositories.updated_at desc", :page => params[:page]) @active_recently = Repository.most_active_recently(current_user, logged_in?) @user = current_user @user_repositories = @user.commit_repositories.find(:all, :order => "repositories.updated_at desc")[0..9] if logged_in? end def new_repo_and_project @project = Project.new @project.owner = current_user @project.user = current_user @repository = @project.repositories.new @repository.kind = Repository::KIND_PROJECT_REPO @repository.owner = current_user @repository.mirror_url = "http://" @projects = current_user.administrated_projects.find(:all, :order => "created_at desc") if @projects.empty? @suggested_project_title = suggest_a_project_title end end def create_repo_and_project @projects = current_user.administrated_projects.find(:all, :order => "created_at desc") if @projects.empty? then suggestion = suggest_a_project_title @project = Project.new(:title => suggestion, :slug => suggestion, :description => "", :license => "None") @project.owner = current_user @project.user = current_user @project.save redirect_to :action => "new_repo_and_project" return end @root = Breadcrumb::NewRepository.new(@project) @project = current_user.projects.find_by_title(params[:repo_in_project]) @repository = @project.repositories.new(params[:repository]) @repository.owner = current_user @repository.user = current_user if params[:mirroring] == "svn_mirror" @repository.kind = Repository::KIND_SVN_MIRROR elsif params[:mirroring] == "zip_mirror" @repository.kind = Repository::KIND_ZIP_MIRROR else @repository.kind = Repository::KIND_PROJECT_REPO @repository.mirror_url = "" end unless params[:local_package_file].blank? package_file = params[:local_package_file] zip_dir = Repository.dir_for_temp_zip(@repository.real_gitdir) `mkdir #{zip_dir}` path = File.join(zip_dir, "init.zip") File.open(path, "wb") { |f| f.write(package_file.read) } end if @repository.save flash[:success] = I18n.t("repositories_controller.create_success") redirect_to [@repository.project_or_owner, @repository] else render :action => "new_repo_and_project" end end protected # Render a Site-specific index template def render_site_index @projects = current_site.projects.public_to_world.find(:all, :order => "created_at asc") @teams = Group.all_participating_in_projects(@projects) @top_repository_clones = Repository.most_active_clones_in_projects(@projects) @latest_events = Event.latest_in_projects(25, @projects.map{|p| p.id }) render "site/#{current_site.subdomain}/index" end def render_public_timeline @projects = Project.find(:all, :limit => 10, :order => "id desc", :conditions => ["publicity in (?)", Project::PUBLICITY_PUBLICS]) @top_repository_clones = Repository.most_active_clones @active_projects = Project.most_active_recently(15) @active_users = User.most_active @active_groups = Group.most_active @latest_events = Event.latest(25) render :template => "site/index" end def render_dashboard @user = current_user @projects = @user.projects.find(:all, :include => [:tags, { :repositories => :project }]) @events = @user.paginated_events_in_watchlist(:page => params[:page]) @messages = @user.messages_in_inbox(3) if @user == current_user @favorites = @user.watched_objects @root = Breadcrumb::Dashboard.new(current_user) @atom_auto_discovery_url = watchlist_user_path(current_user, :format => :atom) render :template => "site/dashboard" end def render_gitorious_dot_org_in_public @projects = Project.most_active_recently(10, 7) @teams = Group.most_active @users = User.most_active @latest_events = Event.latest(4) render :layout => "second_generation/application", :inline => "" end # Render the global index template def render_global_index if logged_in? render_dashboard elsif GitoriousConfig["is_gitorious_dot_org"] render_gitorious_dot_org_in_public else render_public_timeline end end private #TODO try to suggest a name that definitely doesn't exist def suggest_a_project_title names = [current_user.login, current_user.login+"_project", current_user.login+"_personal_project"] result = "" names.each do |name| if Project.find_by_title(name).nil? result = name break end end result end end