summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/assets/javascripts/dispatcher.js.coffee4
-rw-r--r--app/assets/javascripts/project_show.js.coffee14
-rw-r--r--app/assets/javascripts/shortcuts_navigation.coffee1
-rw-r--r--app/assets/stylesheets/generic/mobile.scss24
-rw-r--r--app/assets/stylesheets/pages/projects.scss73
-rw-r--r--app/controllers/projects_controller.rb26
-rw-r--r--app/helpers/gitlab_routing_helper.rb4
-rw-r--r--app/helpers/projects_helper.rb54
-rw-r--r--app/views/help/_shortcuts.html.haml6
-rw-r--r--app/views/layouts/nav/_project.html.haml7
-rw-r--r--app/views/projects/_aside.html.haml106
-rw-r--r--app/views/projects/_home_panel.html.haml57
-rw-r--r--app/views/projects/_section.html.haml36
-rw-r--r--app/views/projects/activity.html.haml13
-rw-r--r--app/views/projects/buttons/_fork.html.haml13
-rw-r--r--app/views/projects/buttons/_star.html.haml21
-rw-r--r--app/views/projects/empty.html.haml34
-rw-r--r--app/views/projects/show.html.haml73
-rw-r--r--app/views/shared/_clone_panel.html.haml2
-rw-r--r--config/routes.rb1
-rw-r--r--db/schema.rb4
-rw-r--r--doc/install/requirements.md6
-rw-r--r--features/project/issues/issues.feature1
-rw-r--r--features/project/project.feature18
-rw-r--r--features/project/shortcuts.feature11
-rw-r--r--features/steps/project/issues/issues.rb5
-rw-r--r--features/steps/project/project_shortcuts.rb5
-rw-r--r--features/steps/project/source/browse_files.rb2
-rw-r--r--features/steps/project/star.rb2
-rw-r--r--features/steps/shared/paths.rb4
-rw-r--r--features/steps/shared/project_tab.rb4
-rw-r--r--lib/tasks/gitlab/test.rake2
32 files changed, 287 insertions, 346 deletions
diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee
index a8ec0abc264..8ceaef81a07 100644
--- a/app/assets/javascripts/dispatcher.js.coffee
+++ b/app/assets/javascripts/dispatcher.js.coffee
@@ -62,9 +62,11 @@ class Dispatcher
shortcut_handler = new ShortcutsNavigation()
when 'projects:commits:show'
shortcut_handler = new ShortcutsNavigation()
- when 'projects:show'
+ when 'projects:activity'
new Activities()
shortcut_handler = new ShortcutsNavigation()
+ when 'projects:show'
+ shortcut_handler = new ShortcutsNavigation()
when 'groups:show'
new Activities()
shortcut_handler = new ShortcutsNavigation()
diff --git a/app/assets/javascripts/project_show.js.coffee b/app/assets/javascripts/project_show.js.coffee
index 6828ae471e5..1fdf28f2528 100644
--- a/app/assets/javascripts/project_show.js.coffee
+++ b/app/assets/javascripts/project_show.js.coffee
@@ -1,15 +1,3 @@
class @ProjectShow
constructor: ->
- $('.project-home-panel .star').on 'ajax:success', (e, data, status, xhr) ->
- $(@).toggleClass('on').find('.count').html(data.star_count)
- .on 'ajax:error', (e, xhr, status, error) ->
- new Flash('Star toggle failed. Try again later.', 'alert')
-
- $("a[data-toggle='tab']").on "shown.bs.tab", (e) ->
- $.cookie "default_view", $(e.target).attr("href"), { expires: 30, path: '/' }
-
- defaultView = $.cookie("default_view")
- if defaultView
- $("a[href=" + defaultView + "]").tab "show"
- else
- $("a[data-toggle='tab']:first").tab "show"
+ # I kept class for future
diff --git a/app/assets/javascripts/shortcuts_navigation.coffee b/app/assets/javascripts/shortcuts_navigation.coffee
index 31895fbf2bc..5b6f9e7e3f2 100644
--- a/app/assets/javascripts/shortcuts_navigation.coffee
+++ b/app/assets/javascripts/shortcuts_navigation.coffee
@@ -4,6 +4,7 @@ class @ShortcutsNavigation extends Shortcuts
constructor: ->
super()
Mousetrap.bind('g p', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-project'))
+ Mousetrap.bind('g e', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-project-activity'))
Mousetrap.bind('g f', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-tree'))
Mousetrap.bind('g c', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-commits'))
Mousetrap.bind('g n', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-network'))
diff --git a/app/assets/stylesheets/generic/mobile.scss b/app/assets/stylesheets/generic/mobile.scss
index a49775daf8b..24c828e0d97 100644
--- a/app/assets/stylesheets/generic/mobile.scss
+++ b/app/assets/stylesheets/generic/mobile.scss
@@ -44,20 +44,18 @@
.project-home-panel {
padding-left: 0 !important;
- .project-home-row {
- .project-home-desc {
- margin-right: 0 !important;
- float: none !important;
- }
-
- .project-repo-buttons {
- position: static;
- margin-top: 15px;
- width: 100%;
- float: none;
- text-align: left;
- }
+ .project-avatar {
+ display: block;
}
+
+ .project-repo-buttons,
+ .git-clone-holder {
+ display: none;
+ }
+ }
+
+ .project-stats {
+ display: none;
}
.container .title {
diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss
index e19b2eafa43..5f415f2d78f 100644
--- a/app/assets/stylesheets/pages/projects.scss
+++ b/app/assets/stylesheets/pages/projects.scss
@@ -15,48 +15,31 @@
}
.project-home-panel {
- margin-top: 10px;
- margin-bottom: 15px;
- position: relative;
- padding-left: 65px;
- min-height: 50px;
+ text-align: center;
+ margin-bottom: 20px;
.project-identicon-holder {
- position: absolute;
- left: 0;
- top: -14px;
+ margin-bottom: 15px;
- .avatar {
- width: 50px;
- height: 50px;
+ .avatar, .identicon {
+ margin: 0 auto;
+ float: none;
}
.identicon {
- font-size: 26px;
- line-height: 50px;
+ @include border-radius(50%);
}
}
- .project-home-row {
- @extend .clearfix;
- margin-bottom: 15px;
-
- &.project-home-row-top {
- margin-bottom: 15px;
+ .lead {
+ p {
+ display: inline;
}
+ }
- .project-home-desc {
- color: $gray;
- float: left;
- font-size: 16px;
- line-height: 1.3;
- margin-right: 250px;
-
- // Render Markdown-generated HTML inline for this block
- p {
- display: inline;
- }
- }
+ .git-clone-holder {
+ max-width: 600px;
+ margin: 0 auto;
}
.visibility-level-label {
@@ -67,22 +50,22 @@
}
.project-repo-buttons {
- margin-top: -3px;
- position: absolute;
- right: 0;
- width: 265px;
- text-align: right;
+ margin-top: 25px;
+ margin-bottom: 25px;
.btn {
+ @extend .btn-info;
+
+ margin-left: 10px;
font-weight: bold;
font-size: 14px;
line-height: 16px;
+ padding: 8px 12px;
.count {
- padding-left: 10px;
- border-left: 1px solid #ccc;
+ padding-left: 7px;
display: inline-block;
- margin-left: 10px;
+ margin-left: 7px;
}
}
}
@@ -307,3 +290,15 @@ table.table.protected-branches-list tr.no-border {
float: left;
margin-right: 10px;
}
+
+.project-stats {
+ text-align: center;
+
+ ul.nav-pills { display:inline-block; }
+ li { display:inline; }
+ a { float:left; }
+}
+
+pre.light-well {
+ border-color: #f1f1f1;
+}
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index be5968cd7b0..be85521ffa5 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -6,7 +6,7 @@ class ProjectsController < ApplicationController
# Authorize
before_action :authorize_admin_project!, only: [:edit, :update, :destroy, :transfer, :archive, :unarchive]
- before_action :event_filter, only: :show
+ before_action :event_filter, only: [:show, :activity]
layout :determine_layout
@@ -59,14 +59,22 @@ class ProjectsController < ApplicationController
end
end
+ def activity
+ respond_to do |format|
+ format.html
+ format.json do
+ load_events
+ pager_json('events/_events', @events.count)
+ end
+ end
+ end
+
def show
if @project.import_in_progress?
redirect_to namespace_project_import_path(@project.namespace, @project)
return
end
- @show_star = !(current_user && current_user.starred?(@project))
-
respond_to do |format|
format.html do
if @project.repository_exists?
@@ -81,11 +89,6 @@ class ProjectsController < ApplicationController
end
end
- format.json do
- load_events
- pager_json('events/_events', @events.count)
- end
-
format.atom do
load_events
render layout: false
@@ -147,11 +150,14 @@ class ProjectsController < ApplicationController
def toggle_star
current_user.toggle_star(@project)
@project.reload
- render json: { star_count: @project.star_count }
+
+ render json: {
+ html: view_to_html_string("projects/buttons/_star")
+ }
end
def markdown_preview
- text = params[:text]
+ text = params[:text]
ext = Gitlab::ReferenceExtractor.new(@project, current_user)
ext.analyze(text)
diff --git a/app/helpers/gitlab_routing_helper.rb b/app/helpers/gitlab_routing_helper.rb
index 9d072f81092..d0fae255a04 100644
--- a/app/helpers/gitlab_routing_helper.rb
+++ b/app/helpers/gitlab_routing_helper.rb
@@ -17,6 +17,10 @@ module GitlabRoutingHelper
namespace_project_path(project.namespace, project, *args)
end
+ def activity_project_path(project, *args)
+ activity_namespace_project_path(project.namespace, project, *args)
+ end
+
def edit_project_path(project, *args)
edit_namespace_project_path(project.namespace, project, *args)
end
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index ec65e473919..1bcd9a49527 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -84,53 +84,6 @@ module ProjectsHelper
@project.milestones.active.order("due_date, title ASC")
end
- def link_to_toggle_star(title, starred)
- cls = 'star-btn btn btn-sm btn-default'
-
- toggle_text =
- if starred
- ' Unstar'
- else
- ' Star'
- end
-
- toggle_html = content_tag('span', class: 'toggle') do
- icon('star') + toggle_text
- end
-
- count_html = content_tag('span', class: 'count') do
- @project.star_count.to_s
- end
-
- link_opts = {
- title: title,
- class: cls,
- method: :post,
- remote: true,
- data: { type: 'json' }
- }
-
- path = toggle_star_namespace_project_path(@project.namespace, @project)
-
- content_tag 'span', class: starred ? 'turn-on' : 'turn-off' do
- link_to(path, link_opts) do
- toggle_html + ' ' + count_html
- end
- end
- end
-
- def link_to_toggle_fork
- html = content_tag('span') do
- icon('code-fork') + ' Fork'
- end
-
- count_html = content_tag(:span, class: 'count') do
- @project.forks_count.to_s
- end
-
- html + count_html
- end
-
def project_for_deploy_key(deploy_key)
if deploy_key.projects.include?(@project)
@project
@@ -306,4 +259,11 @@ module ProjectsHelper
def leave_project_message(project)
"Are you sure you want to leave \"#{project.name}\" project?"
end
+
+ def new_readme_path
+ ref = @repository.root_ref if @repository
+ ref ||= 'master'
+
+ namespace_project_new_blob_path(@project.namespace, @project, tree_join(ref), file_name: 'README.md')
+ end
end
diff --git a/app/views/help/_shortcuts.html.haml b/app/views/help/_shortcuts.html.haml
index 825acb0ae3e..e809d99ba71 100644
--- a/app/views/help/_shortcuts.html.haml
+++ b/app/views/help/_shortcuts.html.haml
@@ -80,6 +80,12 @@
.key g
.key p
%td
+ Go to the project's home page
+ %tr
+ %td.shortcut
+ .key g
+ .key e
+ %td
Go to the project's activity feed
%tr
%td.shortcut
diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml
index 6de97302dc1..2012478eba9 100644
--- a/app/views/layouts/nav/_project.html.haml
+++ b/app/views/layouts/nav/_project.html.haml
@@ -1,9 +1,14 @@
%ul.nav.nav-sidebar
= nav_link(path: 'projects#show', html_options: {class: 'home'}) do
= link_to project_path(@project), title: 'Project', class: 'shortcuts-project', data: {placement: 'right'} do
- = icon('dashboard fw')
+ = icon('home fw')
%span
Project
+ = nav_link(path: 'projects#activity') do
+ = link_to activity_project_path(@project), title: 'Project Activity', class: 'shortcuts-project-activity', data: {placement: 'right'} do
+ = icon('dashboard fw')
+ %span
+ Activity
- if project_nav_tab? :files
= nav_link(controller: %w(tree blob blame edit_tree new_tree)) do
= link_to namespace_project_tree_path(@project.namespace, @project, @ref || @repository.root_ref), title: 'Files', class: 'shortcuts-tree', data: {placement: 'right'} do
diff --git a/app/views/projects/_aside.html.haml b/app/views/projects/_aside.html.haml
deleted file mode 100644
index 72aea8814f5..00000000000
--- a/app/views/projects/_aside.html.haml
+++ /dev/null
@@ -1,106 +0,0 @@
-.clearfix
- - unless @project.empty_repo?
- .panel.panel-default
- .panel-heading
- = visibility_level_icon(@project.visibility_level)
- = "#{visibility_level_label(@project.visibility_level).capitalize} project"
-
- .panel-body
- - if @repository.changelog || @repository.license || @repository.contribution_guide
- %ul.nav.nav-pills
- - if @repository.changelog
- %li.hidden-xs
- = link_to changelog_url(@project) do
- Changelog
- - if @repository.license
- %li
- = link_to license_url(@project) do
- License
- - if @repository.contribution_guide
- %li
- = link_to contribution_guide_url(@project) do
- Contribution guide
-
- .actions
- - if can? current_user, :create_issue, @project
- = link_to url_for_new_issue(@project, only_path: true), title: "New Issue", class: 'btn btn-sm append-right-10' do
- New Issue
-
- - if can? current_user, :create_merge_request, @project
- = link_to new_namespace_project_merge_request_path(@project.namespace, @project), class: "btn btn-sm", title: "New Merge Request" do
- New Merge Request
-
- - if forked_from_project = @project.forked_from_project
- .panel-footer
- = icon("code-fork fw")
- Forked from
- .pull-right
- = link_to forked_from_project.namespace.try(:name), project_path(forked_from_project)
-
-
- - @project.ci_services.each do |ci_service|
- - if ci_service.active? && ci_service.respond_to?(:builds_path)
- .panel-footer
- = icon("check fw")
- = ci_service.title
- .pull-right
- - if ci_service.respond_to?(:status_img_path)
- = link_to ci_service.builds_path, :'data-no-turbolink' => 'data-no-turbolink' do
- = image_tag ci_service.status_img_path, alt: "build status", class: 'ci-status-image'
- - else
- = link_to 'view builds', ci_service.builds_path, :'data-no-turbolink' => 'data-no-turbolink'
-
-
- - unless @project.empty_repo?
- .panel.panel-default
- .panel-heading
- = icon("folder-o fw")
- Repository
- .panel-body
- %ul.nav.nav-pills
- %li
- = link_to namespace_project_commits_path(@project.namespace, @project, @ref || @repository.root_ref) do
- = pluralize(number_with_delimiter(@repository.commit_count), 'commit')
- %li
- = link_to namespace_project_branches_path(@project.namespace, @project) do
- = pluralize(number_with_delimiter(@repository.branch_names.count), 'branch')
- %li
- = link_to namespace_project_tags_path(@project.namespace, @project) do
- = pluralize(number_with_delimiter(@repository.tag_names.count), 'tag')
-
- .actions
- = link_to namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: @ref || @repository.root_ref), class: 'btn btn-sm append-right-10' do
- %i.fa.fa-exchange
- Compare code
-
- - if can?(current_user, :download_code, @project)
- = render 'projects/repositories/download_archive', split_button: true, btn_class: 'btn-group-sm'
- - if version = @repository.version
- .panel-footer
- = icon("clock-o fw")
- Version
- .pull-right
- = link_to version_url(@project) do
- = @repository.blob_by_oid(version.id).data
-
- = render "shared/clone_panel"
-
- - if @project.archived?
- %br
- .alert.alert-warning
- %h4
- = icon("exclamation-triangle fw")
- Archived project!
- %p Repository is read-only
-
- - if current_user
- - access = user_max_access_in_project(current_user, @project)
- - if access
- .light-well.light.prepend-top-20
- %small
- You have #{access} access to this project.
- - if @project.project_member_by_id(current_user)
- %br
- = link_to leave_namespace_project_project_members_path(@project.namespace, @project),
- data: { confirm: leave_project_message(@project) }, method: :delete, title: 'Leave project' do
- Leave this project
diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml
index 076afb11a9d..95c84c96c41 100644
--- a/app/views/projects/_home_panel.html.haml
+++ b/app/views/projects/_home_panel.html.haml
@@ -1,37 +1,26 @@
- empty_repo = @project.empty_repo?
.project-home-panel.clearfix{:class => ("empty-project" if empty_repo)}
.project-identicon-holder
- = project_icon(@project, alt: '', class: 'avatar project-avatar')
- .project-home-row.project-home-row-top
- .project-home-desc
- - if @project.description.present?
- = markdown(@project.description, pipeline: :description)
- - if can?(current_user, :admin_project, @project)
- &ndash;
- = link_to 'Edit', edit_namespace_project_path
- - elsif !empty_repo && @repository.readme
- - readme = @repository.readme
- &ndash;
- = link_to namespace_project_blob_path(@project.namespace, @project, tree_join(@repository.root_ref, readme.name)) do
- = readme.name
- .project-repo-buttons
- .inline.star.js-toggler-container{class: @show_star ? 'on' : ''}
- - if current_user
- = link_to_toggle_star('Star this project.', false)
- = link_to_toggle_star('Unstar this project.', true)
- - else
- = link_to new_user_session_path, class: 'btn star-btn has_tooltip', title: 'You must sign in to star a project' do
- %span
- = icon('star')
- Star
- %span.count
- = @project.star_count
- - unless empty_repo
- - if current_user && can?(current_user, :fork_project, @project) && @project.namespace != current_user.namespace
- .inline.fork-buttons.prepend-left-10
- - if current_user.already_forked?(@project) && current_user.manageable_namespaces.size < 2
- = link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: 'Go to your fork', class: 'btn btn-sm btn-default' do
- = link_to_toggle_fork
- - else
- = link_to new_namespace_project_fork_path(@project.namespace, @project), title: "Fork project", class: 'btn btn-sm btn-default' do
- = link_to_toggle_fork
+ = project_icon(@project, alt: '', class: 'project-avatar avatar s90')
+ .project-home-desc.lead
+ - if @project.description.present?
+ = markdown(@project.description, pipeline: :description)
+
+
+ .project-repo-buttons
+ = render 'projects/buttons/star'
+
+ - unless empty_repo
+ = render 'projects/buttons/fork'
+
+ - if forked_from_project = @project.forked_from_project
+ = link_to project_path(forked_from_project), class: 'btn' do
+ = icon("code-fork fw")
+ Forked from
+ = forked_from_project.namespace.try(:name)
+
+ - if can? current_user, :download_code, @project
+ = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: @ref, format: 'zip'), class: 'btn', rel: 'nofollow' do
+ %i.fa.fa-download
+
+ = render "shared/clone_panel"
diff --git a/app/views/projects/_section.html.haml b/app/views/projects/_section.html.haml
deleted file mode 100644
index d7b06197f67..00000000000
--- a/app/views/projects/_section.html.haml
+++ /dev/null
@@ -1,36 +0,0 @@
-%ul.nav.nav-tabs
- %li.active
- = link_to '#tab-activity', 'data-toggle' => 'tab' do
- = icon("tachometer")
- Activity
- - if @repository.readme
- %li
- = link_to '#tab-readme', 'data-toggle' => 'tab' do
- = icon("file-text-o")
- Readme
-.tab-content
- .tab-pane.active#tab-activity
- .hidden-xs
- = render "events/event_last_push", event: @last_push
-
- - if current_user
- %ul.nav.nav-pills.event_filter.pull-right
- %li
- = link_to namespace_project_path(@project.namespace, @project, format: :atom, private_token: current_user.private_token), title: "Feed", class: 'rss-btn' do
- %i.fa.fa-rss
-
- = render 'shared/event_filter'
- %hr
- .content_list
- = spinner
-
- - if readme = @repository.readme
- .tab-pane#tab-readme
- %article.readme-holder#README
- .clearfix
- %small.pull-right
- = link_to namespace_project_blob_path(@project.namespace, @project, tree_join(@repository.root_ref, readme.name)), class: 'light' do
- %i.fa.fa-file
- = readme.name
- .wiki
- = render_readme(readme)
diff --git a/app/views/projects/activity.html.haml b/app/views/projects/activity.html.haml
new file mode 100644
index 00000000000..25bd93cae87
--- /dev/null
+++ b/app/views/projects/activity.html.haml
@@ -0,0 +1,13 @@
+.hidden-xs
+ = render "events/event_last_push", event: @last_push
+
+ - if current_user
+ %ul.nav.nav-pills.event_filter.pull-right
+ %li
+ = link_to namespace_project_path(@project.namespace, @project, format: :atom, private_token: current_user.private_token), title: "Feed", class: 'rss-btn' do
+ %i.fa.fa-rss
+
+ = render 'shared/event_filter'
+ %hr
+.content_list
+= spinner
diff --git a/app/views/projects/buttons/_fork.html.haml b/app/views/projects/buttons/_fork.html.haml
new file mode 100644
index 00000000000..f0483c79edc
--- /dev/null
+++ b/app/views/projects/buttons/_fork.html.haml
@@ -0,0 +1,13 @@
+- if current_user && can?(current_user, :fork_project, @project)
+ - if current_user.already_forked?(@project) && current_user.manageable_namespaces.size < 2
+ = link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: 'Go to your fork', class: 'btn' do
+ = icon('code-fork')
+ Fork
+ %span.count
+ = @project.forks_count
+ - else
+ = link_to new_namespace_project_fork_path(@project.namespace, @project), title: "Fork project", class: 'btn' do
+ = icon('code-fork')
+ Fork
+ %span.count
+ = @project.forks_count
diff --git a/app/views/projects/buttons/_star.html.haml b/app/views/projects/buttons/_star.html.haml
new file mode 100644
index 00000000000..664ebd18295
--- /dev/null
+++ b/app/views/projects/buttons/_star.html.haml
@@ -0,0 +1,21 @@
+- if current_user
+ = link_to toggle_star_namespace_project_path(@project.namespace, @project), class: 'btn star-btn toggle-star', method: :post, remote: true do
+ - if current_user.starred?(@project)
+ Unstar
+ - else
+ Star
+ %span.count
+ = @project.star_count
+
+ :coffeescript
+ $('.project-home-panel .toggle-star').on 'ajax:success', (e, data, status, xhr) ->
+ $(@).replaceWith(data.html)
+ .on 'ajax:error', (e, xhr, status, error) ->
+ new Flash('Star toggle failed. Try again later.', 'alert')
+
+- else
+ = link_to new_user_session_path, class: 'btn has_tooltip star-btn', title: 'You must sign in to star a project' do
+ = icon('star')
+ Star
+ %span.count
+ = @project.star_count
diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml
index 8080a904978..dfe45a3802d 100644
--- a/app/views/projects/empty.html.haml
+++ b/app/views/projects/empty.html.haml
@@ -4,30 +4,30 @@
= render "home_panel"
-.center.well
- %h3
+.center.light-well
+ %h3.page-title
The repository for this project is empty
- %h4
- You can
- = link_to namespace_project_new_blob_path(@project.namespace, @project, 'master'), class: 'btn btn-new btn-lg' do
- add a file
- &nbsp;or do a push via the command line.
+ %p
+ If you already have files you can push them using command line instructions below.
+ %br
+ Otherwise you can start with
+ = link_to "adding README", new_readme_path, class: 'underlined-link'
+ file to this project.
-.well
- = render "shared/clone_panel"
-%h4
- %strong Command line instructions
+.prepend-top-20
+%h3.page-title
+ Command line instructions
%div.git-empty
%fieldset
- %legend Git global setup
- %pre.dark
+ %h5 Git global setup
+ %pre.light-well
:preserve
git config --global user.name "#{git_user_name}"
git config --global user.email "#{git_user_email}"
%fieldset
- %legend Create a new repository
- %pre.dark
+ %h5 Create a new repository
+ %pre.light-well
:preserve
git clone #{ content_tag(:span, default_url_to_repo, class: 'clone')}
cd #{@project.path}
@@ -37,8 +37,8 @@
git push -u origin master
%fieldset
- %legend Existing folder or Git repository
- %pre.dark
+ %h5 Existing folder or Git repository
+ %pre.light-well
:preserve
cd existing_folder
git init
diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml
index 2259dea0865..17907a42e3c 100644
--- a/app/views/projects/show.html.haml
+++ b/app/views/projects/show.html.haml
@@ -7,10 +7,71 @@
= render 'shared/no_password'
= render "home_panel"
-= render 'shared/show_aside'
-.row
- %section.col-md-8
- = render 'section'
- %aside.col-md-4.project-side
- = render 'aside'
+.project-stats
+ %ul.nav.nav-pills
+ %li
+ = link_to namespace_project_commits_path(@project.namespace, @project, @ref || @repository.root_ref) do
+ = pluralize(number_with_delimiter(@repository.commit_count), 'commit')
+ %li
+ = link_to namespace_project_branches_path(@project.namespace, @project) do
+ = pluralize(number_with_delimiter(@repository.branch_names.count), 'branch')
+ %li
+ = link_to namespace_project_tags_path(@project.namespace, @project) do
+ = pluralize(number_with_delimiter(@repository.tag_names.count), 'tag')
+ - if @repository.changelog
+ %li
+ = link_to changelog_url(@project) do
+ Changelog
+ - if @repository.license
+ %li
+ = link_to license_url(@project) do
+ License
+ - if @repository.contribution_guide
+ %li
+ = link_to contribution_guide_url(@project) do
+ Contribution guide
+
+- if @project.archived?
+ .text-warning.center.prepend-top-20
+ %p
+ = icon("exclamation-triangle fw")
+ Archived project! Repository is read-only
+
+%hr
+%section
+ - if readme = @repository.readme
+ %article.readme-holder#README
+ .clearfix
+ %small.pull-right
+ = link_to namespace_project_blob_path(@project.namespace, @project, tree_join(@repository.root_ref, readme.name)), class: 'light' do
+ %i.fa.fa-file
+ = readme.name
+ .wiki
+ = render_readme(readme)
+ - else
+ %h3.page-title
+ This project does not have README yet
+ - if can?(current_user, :push_code, @project)
+ %p.slead
+ A
+ %code README
+ file contains information about other files in a repository and is commonly
+ distributed with computer software, forming part of its documentation.
+ %br
+ We recommend you to
+ = link_to "add README", new_readme_path, class: 'underlined-link'
+ file to the repository and GitLab will render it here instead of this message.
+
+
+
+- if current_user
+ - access = user_max_access_in_project(current_user, @project)
+ - if access
+ %hr
+ %p.light
+ You have #{access} access to this project.
+ - if @project.project_member_by_id(current_user)
+ = link_to leave_namespace_project_project_members_path(@project.namespace, @project),
+ data: { confirm: leave_project_message(@project) }, method: :delete, title: 'Leave project', class: 'cred' do
+ Leave this project
diff --git a/app/views/shared/_clone_panel.html.haml b/app/views/shared/_clone_panel.html.haml
index 6de2aed29ed..07672359dba 100644
--- a/app/views/shared/_clone_panel.html.haml
+++ b/app/views/shared/_clone_panel.html.haml
@@ -20,7 +20,7 @@
:"data-container" => "body"}
= gitlab_config.protocol.upcase
= text_field_tag :project_clone, default_url_to_repo(project), class: "js-select-on-focus form-control input-sm", readonly: true
- - if project.kind_of?(Project) && project.empty_repo?
+ - if project.kind_of?(Project)
.input-group-addon
.visibility-level-label.has_tooltip{'data-title' => "#{visibility_level_label(project.visibility_level)} project" }
= visibility_level_icon(project.visibility_level)
diff --git a/config/routes.rb b/config/routes.rb
index 8617839a256..fd04d7b2f54 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -314,6 +314,7 @@ Gitlab::Application.routes.draw do
post :toggle_star
post :markdown_preview
get :autocomplete_sources
+ get :activity
end
scope module: :projects do
diff --git a/db/schema.rb b/db/schema.rb
index 8736d1e0df5..fb0982b10fd 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -28,11 +28,11 @@ ActiveRecord::Schema.define(version: 20150620233230) do
t.integer "default_branch_protection", default: 2
t.boolean "twitter_sharing_enabled", default: true
t.text "restricted_visibility_levels"
+ t.boolean "version_check_enabled", default: true
t.integer "max_attachment_size", default: 10, null: false
t.integer "default_project_visibility"
t.integer "default_snippet_visibility"
t.text "restricted_signup_domains"
- t.boolean "version_check_enabled", default: true
t.boolean "user_oauth_applications", default: true
t.string "after_sign_out_path"
t.integer "session_expire_delay", default: 10080, null: false
@@ -510,12 +510,12 @@ ActiveRecord::Schema.define(version: 20150620233230) do
t.string "bitbucket_access_token"
t.string "bitbucket_access_token_secret"
t.string "location"
- t.string "public_email", default: "", null: false
t.string "encrypted_otp_secret"
t.string "encrypted_otp_secret_iv"
t.string "encrypted_otp_secret_salt"
t.boolean "otp_required_for_login", default: false, null: false
t.text "otp_backup_codes"
+ t.string "public_email", default: "", null: false
t.integer "dashboard", default: 0
end
diff --git a/doc/install/requirements.md b/doc/install/requirements.md
index a33f149efe4..1efc1f7bddf 100644
--- a/doc/install/requirements.md
+++ b/doc/install/requirements.md
@@ -109,4 +109,8 @@ On a very active server (10,000 active users) the Sidekiq process can use 1GB+ o
- Firefox (Latest released version and [latest ESR version](https://www.mozilla.org/en-US/firefox/organizations/))
- Safari 7+ (known problem: required fields in html5 do not work)
- Opera (Latest released version)
-- IE 10+ \ No newline at end of file
+- IE 10+
+
+### Common UI problems with IE
+
+If you experience UI issues with Internet Explorer, please make sure that you have the `Compatibility View` mode disabled. \ No newline at end of file
diff --git a/features/project/issues/issues.feature b/features/project/issues/issues.feature
index a15298fc452..28cc43ef710 100644
--- a/features/project/issues/issues.feature
+++ b/features/project/issues/issues.feature
@@ -189,6 +189,7 @@ Feature: Project Issues
Given I logout
Given public project "Community"
When I visit project "Community" page
+ And I visit project "Community" issues page
And I click link "New Issue"
And I should not see assignee field
And I should not see milestone field
diff --git a/features/project/project.feature b/features/project/project.feature
index 56ae5c78d01..5fb2c67401e 100644
--- a/features/project/project.feature
+++ b/features/project/project.feature
@@ -18,9 +18,13 @@ Feature: Project
Then I should see the default project avatar
And I should not see the "Remove avatar" button
+ Scenario: I should have readme on page
+ And I visit project "Shop" page
+ Then I should see project "Shop" README
+
@javascript
Scenario: I should see project activity
- When I visit project "Shop" page
+ When I visit project "Shop" activity page
Then I should see project "Shop" activity feed
Scenario: I visit edit project
@@ -38,24 +42,12 @@ Feature: Project
And change project path settings
Then I should see project with new path settings
- Scenario: I should see project readme and version
- When I visit project "Shop" page
- And I should see project "Shop" version
-
Scenario: I should change project default branch
When I visit edit project "Shop" page
And change project default branch
And I save project
Then I should see project default branch changed
- @javascript
- Scenario: I should have default tab per my preference
- And I own project "Forum"
- When I select project "Forum" README tab
- Then I should see project "Forum" README
- And I visit project "Shop" page
- Then I should see project "Shop" README
-
Scenario: I tag a project
When I visit edit project "Shop" page
Then I should see project settings
diff --git a/features/project/shortcuts.feature b/features/project/shortcuts.feature
index cfb68bf1f50..0f71c32380b 100644
--- a/features/project/shortcuts.feature
+++ b/features/project/shortcuts.feature
@@ -3,7 +3,7 @@ Feature: Project Shortcuts
Background:
Given I sign in as a user
And I own a project
- And I visit my project's home page
+ And I visit my project's commits page
@javascript
Scenario: Navigate to files tab
@@ -12,6 +12,7 @@ Feature: Project Shortcuts
@javascript
Scenario: Navigate to commits tab
+ Given I visit my project's files page
Given I press "g" and "c"
Then the active main tab should be Commits
@@ -46,7 +47,11 @@ Feature: Project Shortcuts
Then the active main tab should be Wiki
@javascript
- Scenario: Navigate to project feed
- Given I visit my project's files page
+ Scenario: Navigate to project home
Given I press "g" and "p"
Then the active main tab should be Home
+
+ @javascript
+ Scenario: Navigate to project feed
+ Given I press "g" and "e"
+ Then the active main tab should be Activity
diff --git a/features/steps/project/issues/issues.rb b/features/steps/project/issues/issues.rb
index 9ace6436b15..239392eab96 100644
--- a/features/steps/project/issues/issues.rb
+++ b/features/steps/project/issues/issues.rb
@@ -194,6 +194,11 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
end
end
+ When "I visit project \"Community\" issues page" do
+ project = Project.find_by(name: 'Community')
+ visit namespace_project_issues_path(project.namespace, project)
+ end
+
When "I visit empty project's issues page" do
project = Project.find_by(name: 'Empty Project')
visit namespace_project_issues_path(project.namespace, project)
diff --git a/features/steps/project/project_shortcuts.rb b/features/steps/project/project_shortcuts.rb
index a10e7bf78ee..49e9c5520bb 100644
--- a/features/steps/project/project_shortcuts.rb
+++ b/features/steps/project/project_shortcuts.rb
@@ -33,4 +33,9 @@ class Spinach::Features::ProjectShortcuts < Spinach::FeatureSteps
find('body').native.send_key('g')
find('body').native.send_key('w')
end
+
+ step 'I press "g" and "e"' do
+ find('body').native.send_key('g')
+ find('body').native.send_key('e')
+ end
end
diff --git a/features/steps/project/source/browse_files.rb b/features/steps/project/source/browse_files.rb
index 398c9bf5756..95879b9544d 100644
--- a/features/steps/project/source/browse_files.rb
+++ b/features/steps/project/source/browse_files.rb
@@ -187,7 +187,7 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps
end
step 'I click on "add a file" link' do
- click_link 'add a file'
+ click_link 'adding README'
# Remove pre-receive hook so we can push without auth
FileUtils.rm_f(File.join(@project.repository.path, 'hooks', 'pre-receive'))
diff --git a/features/steps/project/star.rb b/features/steps/project/star.rb
index 8b50bfcef04..bd2e0619cdd 100644
--- a/features/steps/project/star.rb
+++ b/features/steps/project/star.rb
@@ -5,7 +5,7 @@ class Spinach::Features::ProjectStar < Spinach::FeatureSteps
include SharedUser
step "The project has no stars" do
- expect(page).not_to have_content '.star-buttons'
+ expect(page).not_to have_content '.toggle-star'
end
step "The project has 0 stars" do
diff --git a/features/steps/shared/paths.rb b/features/steps/shared/paths.rb
index fe651e81dac..88a98a37807 100644
--- a/features/steps/shared/paths.rb
+++ b/features/steps/shared/paths.rb
@@ -251,6 +251,10 @@ module SharedPaths
visit namespace_project_path(project.namespace, project)
end
+ step 'I visit project "Shop" activity page' do
+ visit activity_namespace_project_path(project.namespace, project)
+ end
+
step 'I visit project "Forked Shop" merge requests page' do
visit namespace_project_merge_requests_path(@forked_project.namespace, @forked_project)
end
diff --git a/features/steps/shared/project_tab.rb b/features/steps/shared/project_tab.rb
index 3b94b7d8621..c67e5e4a06a 100644
--- a/features/steps/shared/project_tab.rb
+++ b/features/steps/shared/project_tab.rb
@@ -49,4 +49,8 @@ module SharedProjectTab
expect(page).to have_content('Back to project')
end
end
+
+ step 'the active main tab should be Activity' do
+ ensure_active_main_tab('Activity')
+ end
end
diff --git a/lib/tasks/gitlab/test.rake b/lib/tasks/gitlab/test.rake
index cbb3d61af04..4d4e746503a 100644
--- a/lib/tasks/gitlab/test.rake
+++ b/lib/tasks/gitlab/test.rake
@@ -6,7 +6,7 @@ namespace :gitlab do
%W(rake rubocop),
%W(rake spinach),
%W(rake spec),
- %W(rake jasmine:ci)
+ %W(rake teaspoon)
]
cmds.each do |cmd|