Commit f4205abb7725c96c1a967f5b3779e09c6e94a21d

Authored by Dmitriy Zaporozhets
2 parents f82db569 be17a32d

Merge branch 'master' of dev.gitlab.org:gitlab/gitlabhq

app/assets/stylesheets/sections/projects.scss
@@ -81,9 +81,11 @@ ul.nav.nav-projects-tabs { @@ -81,9 +81,11 @@ ul.nav.nav-projects-tabs {
81 81
82 .public-projects { 82 .public-projects {
83 li { 83 li {
84 - margin-top: 8px;  
85 - margin-bottom: 5px;  
86 - border-bottom: 1px solid #eee; 84 + .project-title {
  85 + font-size: 14px;
  86 + line-height: 2;
  87 + font-weight: normal;
  88 + }
87 89
88 .description { 90 .description {
89 margin-left: 15px; 91 margin-left: 15px;
@@ -92,6 +94,14 @@ ul.nav.nav-projects-tabs { @@ -92,6 +94,14 @@ ul.nav.nav-projects-tabs {
92 } 94 }
93 } 95 }
94 96
  97 +.public-clone {
  98 + background: #333;
  99 + color: #f5f5f5;
  100 + padding: 5px 10px;
  101 + margin: 1px;
  102 + font-weight: normal;
  103 +}
  104 +
95 .new-tag-btn { 105 .new-tag-btn {
96 position: relative; 106 position: relative;
97 top: -5px; 107 top: -5px;
app/controllers/public/projects_controller.rb
@@ -10,4 +10,15 @@ class Public::ProjectsController < ApplicationController @@ -10,4 +10,15 @@ class Public::ProjectsController < ApplicationController
10 @projects = @projects.search(params[:search]) if params[:search].present? 10 @projects = @projects.search(params[:search]) if params[:search].present?
11 @projects = @projects.includes(:namespace).order("namespaces.path, projects.name ASC").page(params[:page]).per(20) 11 @projects = @projects.includes(:namespace).order("namespaces.path, projects.name ASC").page(params[:page]).per(20)
12 end 12 end
  13 +
  14 + def show
  15 + @project = Project.public_only.find_with_namespace(params[:id])
  16 + render_404 and return unless @project
  17 +
  18 + @repository = @project.repository
  19 + @recent_tags = @repository.tags.first(10)
  20 +
  21 + @commit = @repository.commit(params[:ref])
  22 + @tree = Tree.new(@repository, @commit.id)
  23 + end
13 end 24 end
app/views/layouts/errors.html.haml
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 %html{ lang: "en"} 2 %html{ lang: "en"}
3 = render "layouts/head", title: "Error" 3 = render "layouts/head", title: "Error"
4 %body{class: "#{app_theme} application"} 4 %body{class: "#{app_theme} application"}
5 - = render "layouts/head_panel", title: "" 5 + = render "layouts/head_panel", title: "" if current_user
6 = render "layouts/flash" 6 = render "layouts/flash"
7 .container 7 .container
8 .content 8 .content
app/views/layouts/public.html.haml
@@ -10,10 +10,16 @@ @@ -10,10 +10,16 @@
10 .container 10 .container
11 %div.app_logo 11 %div.app_logo
12 %span.separator 12 %span.separator
13 - = link_to root_path, class: "home" do 13 + = link_to public_root_path, class: "home" do
14 %h1 GITLAB 14 %h1 GITLAB
15 %span.separator 15 %span.separator
16 %h1.project_name Public Projects 16 %h1.project_name Public Projects
  17 + %ul.nav
  18 + %li
  19 + %a
  20 + %div.hide.turbolink-spinner
  21 + %i.icon-refresh.icon-spin
  22 + Loading...
17 23
18 .container.navless-container 24 .container.navless-container
19 .content 25 .content
app/views/public/projects/_tree.html.haml 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +- if tree.readme
  2 + = render "projects/tree/readme", readme: tree.readme
  3 +- else
  4 + .alert
  5 + %h3.nothing_here_message This project does not have README file
app/views/public/projects/index.html.haml
@@ -11,22 +11,20 @@ @@ -11,22 +11,20 @@
11 = search_field_tag :search, params[:search], placeholder: "gitlab-ci", class: "span3 search-text-input", id: "projects_search" 11 = search_field_tag :search, params[:search], placeholder: "gitlab-ci", class: "span3 search-text-input", id: "projects_search"
12 = submit_tag 'Search', class: "btn btn-primary wide" 12 = submit_tag 'Search', class: "btn btn-primary wide"
13 13
14 -%hr  
15 -  
16 .public-projects 14 .public-projects
17 - %ul.unstyled 15 + %ul.bordered-list
18 - @projects.each do |project| 16 - @projects.each do |project|
19 - %li.clearfix  
20 - %div  
21 - %i.icon-share  
22 - - if current_user  
23 - = link_to_project project  
24 - - else 17 + %li
  18 + .project-title
  19 + %i.icon-share.cgray
  20 + = link_to public_project_path(project) do
25 = project.name_with_namespace 21 = project.name_with_namespace
26 .pull-right 22 .pull-right
27 - %pre.dark.tiny git clone #{project.http_url_to_repo}  
28 - %div.description  
29 - = project.description 23 + %pre.public-clone git clone #{project.http_url_to_repo}
  24 +
  25 + - if project.description.present?
  26 + %div.description
  27 + = project.description
30 - unless @projects.present? 28 - unless @projects.present?
31 %h3.nothing_here_message No public projects 29 %h3.nothing_here_message No public projects
32 30
app/views/public/projects/show.html.haml 0 → 100644
@@ -0,0 +1,46 @@ @@ -0,0 +1,46 @@
  1 +%h3.page-title
  2 + = @project.name_with_namespace
  3 + .pull-right
  4 + %pre.public-clone git clone #{@project.http_url_to_repo}
  5 + .pull-right
  6 + - if current_user
  7 + = link_to 'Browse project', @project, class: 'btn btn-create append-right-10'
  8 +
  9 +
  10 +%div
  11 + = link_to public_root_path do
  12 + ← To projects list
  13 + .pull-right
  14 + %span.light= @project.description
  15 +
  16 +%br
  17 +.row
  18 + .span9
  19 + = render 'tree', tree: @tree
  20 + .span3
  21 + %h5 Repository:
  22 + %div
  23 + %p
  24 + %span.light Bare size is
  25 + #{@project.repository.size} MB
  26 +
  27 + %p
  28 + = pluralize(@repository.round_commit_count, 'commit')
  29 + %p
  30 + = pluralize(@repository.branch_names.count, 'branch')
  31 + %p
  32 + = pluralize(@repository.tag_names.count, 'tag')
  33 +
  34 + - if @recent_tags.present?
  35 + %hr
  36 + %h5 Most Recent Tags:
  37 + %ul.unstyled
  38 + - @recent_tags.each do |tag|
  39 + %li
  40 + %p
  41 + %i.icon-tag
  42 + %strong= tag.name
  43 + %small.light.pull-right
  44 + %i.icon-calendar
  45 + = time_ago_in_words(tag.commit.committed_date)
  46 + ago
config/routes.rb
@@ -55,6 +55,8 @@ Gitlab::Application.routes.draw do @@ -55,6 +55,8 @@ Gitlab::Application.routes.draw do
55 # 55 #
56 namespace :public do 56 namespace :public do
57 resources :projects, only: [:index] 57 resources :projects, only: [:index]
  58 + resources :projects, constraints: { id: /[a-zA-Z.\/0-9_\-]+/ }, only: [:show]
  59 +
58 root to: "projects#index" 60 root to: "projects#index"
59 end 61 end
60 62
features/public/public_projects.feature 0 → 100644
@@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
  1 +Feature: Public Projects Feature
  2 + Background:
  3 + Given public project "Community"
  4 + And private project "Enterprise"
  5 +
  6 + Scenario: I visit public area
  7 + When I visit the public projects area
  8 + Then I should see project "Community"
  9 + And I should not see project "Enterprise"
  10 +
  11 + Scenario: I visit public project page
  12 + When I visit public page for "Community" project
  13 + Then I should see public project details
  14 + And I should see project readme
features/steps/public/projects_feature.rb 0 → 100644
@@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
  1 +class Spinach::Features::PublicProjectsFeature < Spinach::FeatureSteps
  2 + include SharedPaths
  3 +
  4 + step 'I should see project "Community"' do
  5 + page.should have_content "Community"
  6 + end
  7 +
  8 + step 'I should not see project "Enterprise"' do
  9 + page.should_not have_content "Enterprise"
  10 + end
  11 +
  12 + step 'I should see public project details' do
  13 + page.should have_content '32 branches'
  14 + page.should have_content '16 tags'
  15 + end
  16 +
  17 + step 'I should see project readme' do
  18 + page.should have_content 'README.md'
  19 + end
  20 +
  21 + step 'public project "Community"' do
  22 + create :project_with_code, name: 'Community', public: true
  23 + end
  24 +
  25 + step 'private project "Enterprise"' do
  26 + create :project, name: 'Enterprise'
  27 + end
  28 +
  29 + private
  30 +
  31 + def project
  32 + @project ||= Project.find_by_name("Community")
  33 + end
  34 +end
  35 +
features/steps/shared/paths.rb
@@ -275,6 +275,10 @@ module SharedPaths @@ -275,6 +275,10 @@ module SharedPaths
275 visit public_root_path 275 visit public_root_path
276 end 276 end
277 277
  278 + step 'I visit public page for "Community" project' do
  279 + visit public_project_path(Project.find_by_name("Community"))
  280 + end
  281 +
278 # ---------------------------------------- 282 # ----------------------------------------
279 # Snippets 283 # Snippets
280 # ---------------------------------------- 284 # ----------------------------------------