Merge branch 'master' into notification-levels
This commit is contained in:
commit
1ef2ce95d5
21
CHANGELOG
21
CHANGELOG
|
@ -1,14 +1,16 @@
|
|||
Please view this file on the master branch, on stable branches it's out of date.
|
||||
|
||||
v 8.0.0 (unreleased)
|
||||
- Bump rouge to 1.10.1 to remove warning noise and fix other syntax highlighting bugs (Stan Hu)
|
||||
- Gracefully handle errors in syntax highlighting by leaving the block unformatted (Stan Hu)
|
||||
- Fix URL construction for merge requests, issues, notes, and commits for relative URL config (Stan Hu)
|
||||
- Fix emoji URLs in Markdown when relative_url_root is used (Stan Hu)
|
||||
- Omit filename in Content-Disposition header in raw file download to avoid RFC 6266 encoding issues (Stan HU)
|
||||
- Fix broken Wiki Page History (Stan Hu)
|
||||
- Import forked repositories asynchronously to prevent large repositories from timing out (Stan Hu)
|
||||
- Prevent anchors from being hidden by header (Stan Hu)
|
||||
- Fix bug where only the first 15 Bitbucket issues would be imported (Stan Hu)
|
||||
- Sort issues by creation date in Bitbucket importer (Stan Hu)
|
||||
- Upgrade gitlab_git to 7.2.15 to fix `git blame` errors with ISO-encoded files (Stan Hu)
|
||||
- Prevent too many redirects upon login when home page URL is set to external_url (Stan Hu)
|
||||
- Improve dropdown positioning on the project home page (Hannes Rosenögger)
|
||||
- Upgrade browser gem to 1.0.0 to avoid warning in IE11 compatibilty mode (Stan Hu)
|
||||
|
@ -30,31 +32,36 @@ v 8.0.0 (unreleased)
|
|||
- Fix 500 error when submit project snippet without body
|
||||
- Improve search page usability
|
||||
- Bring more UI consistency in way how projects, snippets and groups lists are rendered
|
||||
- Make all profiles public
|
||||
- Make all profiles and group public
|
||||
- Fixed login failure when extern_uid changes (Joel Koglin)
|
||||
- Don't notify users without access to the project when they are (accidentally) mentioned in a note.
|
||||
- Retrieving oauth token with LDAP credentials
|
||||
- Load Application settings from running database unless env var USE_DB=false
|
||||
- Added Drone CI integration (Kirill Zaitsev)
|
||||
- Refactored service API and added automatically service docs generator (Kirill Zaitsev)
|
||||
- Refactored service API and added automatically service docs generator (Kirill Zaitsev)
|
||||
- Added web_url key project hook_attrs (Kirill Zaitsev)
|
||||
- Add ability to get user information by ID of an SSH key via the API
|
||||
- Fix bug which IE cannot show image at markdown when the image is raw file of gitlab
|
||||
- Fix bug which IE cannot show image at markdown when the image is raw file of gitlab
|
||||
- Add support for Crowd
|
||||
- Global Labels that are available to all projects
|
||||
- Fix highlighting of deleted lines in diffs.
|
||||
- Project notification level can be set on the project page itself
|
||||
- Added service API endpoint to retrieve service parameters (Petheő Bence)
|
||||
- Add FogBugz project import (Jared Szechy)
|
||||
|
||||
v 7.14.3
|
||||
- No changes
|
||||
|
||||
v 7.14.2
|
||||
- Upgrade gitlab_git to 7.2.15 to fix `git blame` errors with ISO-encoded files (Stan Hu)
|
||||
|
||||
v 7.14.1
|
||||
- Improve abuse reports management from admin area
|
||||
- Fix "Reload with full diff" URL button in compare branch view (Stan Hu)
|
||||
- Disabled DNS lookups for SSH in docker image (Rowan Wookey)
|
||||
|
||||
v 7.14.1 (unreleased)
|
||||
- Only include base URL in OmniAuth full_host parameter (Stan Hu)
|
||||
- Fix Error 500 in API when accessing a group that has an avatar (Stan Hu)
|
||||
- Ability to enable SSL verification for Webhooks
|
||||
- Add FogBugz project import (Jared Szechy)
|
||||
|
||||
v 7.14.0
|
||||
- Fix bug where non-project members of the target project could set labels on new merge requests.
|
||||
|
|
|
@ -291,7 +291,7 @@ GEM
|
|||
github-markup (~> 1.3.1)
|
||||
gollum-grit_adapter (~> 0.1, >= 0.1.1)
|
||||
nokogiri (~> 1.6.4)
|
||||
rouge (~> 1.9)
|
||||
rouge (~> 1.10.1)
|
||||
sanitize (~> 2.1.0)
|
||||
stringex (~> 2.5.1)
|
||||
gon (5.0.1)
|
||||
|
@ -544,7 +544,7 @@ GEM
|
|||
netrc (~> 0.7)
|
||||
rinku (1.7.3)
|
||||
rotp (1.6.1)
|
||||
rouge (1.9.1)
|
||||
rouge (1.10.1)
|
||||
rqrcode (0.4.2)
|
||||
rqrcode-rails3 (0.1.7)
|
||||
rqrcode (>= 0.4.2)
|
||||
|
|
|
@ -167,6 +167,7 @@ class @DropzoneInput
|
|||
dataType: "json"
|
||||
).success (data) ->
|
||||
preview.html data.body
|
||||
preview.syntaxHighlight()
|
||||
|
||||
renderReferencedUsers data.references.users
|
||||
|
||||
|
|
|
@ -122,8 +122,9 @@ class @Notes
|
|||
# or skip if rendered
|
||||
if @isNewNote(note)
|
||||
@note_ids.push(note.id)
|
||||
$('ul.main-notes-list').append(note.html)
|
||||
$('.js-syntax-highlight').syntaxHighlight()
|
||||
$('ul.main-notes-list').
|
||||
append(note.html).
|
||||
syntaxHighlight()
|
||||
@initTaskList()
|
||||
|
||||
###
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
# Syntax Highlighter
|
||||
#
|
||||
# Applies a syntax highlighting color scheme CSS class to any element with the
|
||||
# `js-syntax-highlight` class
|
||||
#
|
||||
|
@ -6,7 +8,13 @@
|
|||
# <div class="js-syntax-highlight"></div>
|
||||
#
|
||||
$.fn.syntaxHighlight = ->
|
||||
$(this).addClass(gon.user_color_scheme)
|
||||
if $(this).hasClass('js-syntax-highlight')
|
||||
# Given the element itself, apply highlighting
|
||||
$(this).addClass(gon.user_color_scheme)
|
||||
else
|
||||
# Given a parent element, recurse to any of its applicable children
|
||||
$children = $(this).find('.js-syntax-highlight')
|
||||
$children.syntaxHighlight() if $children.length
|
||||
|
||||
$(document).on 'ready page:load', ->
|
||||
$('.js-syntax-highlight').syntaxHighlight()
|
||||
|
|
|
@ -156,10 +156,16 @@
|
|||
* Add some extra stuff to panels
|
||||
*
|
||||
*/
|
||||
.panel {
|
||||
.panel-heading {
|
||||
font-weight: bold;
|
||||
|
||||
.container-blank .panel .panel-heading {
|
||||
font-size: 17px;
|
||||
line-height: 38px;
|
||||
}
|
||||
|
||||
.panel {
|
||||
box-shadow: none;
|
||||
|
||||
.panel-heading {
|
||||
.panel-head-actions {
|
||||
position: relative;
|
||||
top: -5px;
|
||||
|
@ -182,6 +188,10 @@
|
|||
.pagination {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.btn {
|
||||
min-width: 124px;
|
||||
}
|
||||
}
|
||||
|
||||
&.panel-small {
|
||||
|
@ -209,6 +219,12 @@
|
|||
}
|
||||
}
|
||||
|
||||
.alert-help {
|
||||
background-color: $background-color;
|
||||
border: 1px solid $border-color;
|
||||
color: $gl-gray;
|
||||
}
|
||||
|
||||
// Typography =================================================================
|
||||
|
||||
.text-primary,
|
||||
|
|
|
@ -114,11 +114,12 @@ $alert-border-radius: 0;
|
|||
//
|
||||
//##
|
||||
|
||||
$panel-border-radius: 0;
|
||||
$panel-default-text: $text-color;
|
||||
$panel-default-border: #E7E9ED;
|
||||
$panel-default-heading-bg: #F8FAFC;
|
||||
|
||||
$panel-border-radius: 2px;
|
||||
$panel-default-text: $text-color;
|
||||
$panel-default-border: $border-color;
|
||||
$panel-default-heading-bg: $background-color;
|
||||
$panel-footer-bg: $background-color;
|
||||
$panel-inner-border: $border-color;
|
||||
|
||||
//== Wells
|
||||
//
|
||||
|
|
|
@ -55,10 +55,10 @@
|
|||
}
|
||||
|
||||
@mixin md-typography {
|
||||
color: #444;
|
||||
color: $md-text-color;
|
||||
|
||||
a {
|
||||
color: #3084bb;
|
||||
color: $md-link-color;
|
||||
}
|
||||
|
||||
img {
|
||||
|
|
|
@ -2,6 +2,8 @@ $hover: #FFFAF1;
|
|||
$gl-text-color: #54565b;
|
||||
$gl-header-color: #4c4e54;
|
||||
$gl-link-color: #333c48;
|
||||
$md-text-color: #444;
|
||||
$md-link-color: #3084bb;
|
||||
$nprogress-color: #c0392b;
|
||||
$gl-font-size: 15px;
|
||||
$list-font-size: 15px;
|
||||
|
|
|
@ -27,6 +27,10 @@
|
|||
border-bottom: 1px solid #e7e9ed;
|
||||
color: $gl-gray;
|
||||
|
||||
&.top-block {
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
&.middle-block {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
|
@ -47,6 +51,6 @@
|
|||
}
|
||||
|
||||
.oneline {
|
||||
line-height: 44px;
|
||||
line-height: 42px;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
}
|
||||
|
||||
&.btn-save {
|
||||
@extend .btn-primary;
|
||||
@extend .btn-success;
|
||||
}
|
||||
|
||||
&.btn-remove {
|
||||
|
|
|
@ -3,7 +3,11 @@
|
|||
*
|
||||
*/
|
||||
.file-holder {
|
||||
border: 1px solid $border-color;
|
||||
margin-left: -$gl-padding;
|
||||
margin-right: -$gl-padding;
|
||||
border: none;
|
||||
border-top: 1px solid #E7E9EE;
|
||||
border-bottom: 1px solid #E7E9EE;
|
||||
margin-bottom: 1em;
|
||||
|
||||
table {
|
||||
|
@ -49,7 +53,7 @@
|
|||
}
|
||||
|
||||
&.wiki {
|
||||
padding: 25px;
|
||||
padding: $gl-padding;
|
||||
|
||||
.highlight {
|
||||
margin-bottom: 9px;
|
||||
|
@ -90,7 +94,7 @@
|
|||
border-right: none;
|
||||
}
|
||||
background: #fff;
|
||||
padding: 8px;
|
||||
padding: 10px $gl-padding;
|
||||
}
|
||||
.lines {
|
||||
pre {
|
||||
|
@ -100,6 +104,33 @@
|
|||
border: none;
|
||||
}
|
||||
}
|
||||
img.avatar {
|
||||
border: 0 none;
|
||||
float: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
td.blame-commit {
|
||||
background: #f9f9f9;
|
||||
min-width: 350px;
|
||||
|
||||
.commit-author-link {
|
||||
color: #888;
|
||||
}
|
||||
}
|
||||
td.blame-numbers {
|
||||
pre {
|
||||
color: #AAA;
|
||||
white-space: pre;
|
||||
}
|
||||
background: #f1f1f1;
|
||||
border-left: 1px solid #DDD;
|
||||
}
|
||||
td.lines {
|
||||
code {
|
||||
font-family: $monospace_font;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.logs {
|
||||
|
|
|
@ -28,12 +28,18 @@
|
|||
padding: $gl-padding;
|
||||
border: 1px solid #e7e9ed;
|
||||
min-height: 90vh;
|
||||
|
||||
&.container-blank {
|
||||
background: none;
|
||||
padding: 0;
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.nav-sidebar {
|
||||
margin-top: 14 + $header-height;
|
||||
margin-bottom: 50px;
|
||||
margin-bottom: 100px;
|
||||
transition-duration: .3s;
|
||||
list-style: none;
|
||||
overflow: hidden;
|
||||
|
@ -146,7 +152,6 @@
|
|||
}
|
||||
|
||||
.collapse-nav a {
|
||||
left: 0px;
|
||||
width: $sidebar_collapsed_width;
|
||||
}
|
||||
|
||||
|
@ -165,6 +170,7 @@
|
|||
width: $sidebar_width;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
font-size: 13px;
|
||||
background: transparent;
|
||||
height: 40px;
|
||||
|
|
|
@ -5,15 +5,19 @@ pre.code.highlight.white,
|
|||
background-color: #fff;
|
||||
color: #333;
|
||||
|
||||
pre.highlight,
|
||||
.line-numbers,
|
||||
.line-numbers a {
|
||||
background-color: $background-color !important;
|
||||
color: $gl-gray !important;
|
||||
}
|
||||
|
||||
pre.highlight {
|
||||
background-color: #fff !important;
|
||||
color: #333 !important;
|
||||
}
|
||||
|
||||
pre.code {
|
||||
border-left: 1px solid #bbb;
|
||||
border-left: 1px solid $border-color;
|
||||
}
|
||||
|
||||
// highlight line via anchor
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
.diff-file {
|
||||
margin-left: -16px;
|
||||
margin-right: -16px;
|
||||
margin-left: -$gl-padding;
|
||||
margin-right: -$gl-padding;
|
||||
border: none;
|
||||
border-bottom: 1px solid #E7E9EE;
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
|||
position: relative;
|
||||
background: $background-color;
|
||||
border-bottom: 1px solid $border-color;
|
||||
padding: 10px 15px;
|
||||
padding: 10px 16px;
|
||||
color: #555;
|
||||
z-index: 10;
|
||||
|
||||
|
|
|
@ -235,8 +235,6 @@ ul.notes {
|
|||
filter: alpha(opacity=0);
|
||||
|
||||
&:hover {
|
||||
width: 38px;
|
||||
font-size: 20px;
|
||||
background: $gl-info;
|
||||
color: #FFF;
|
||||
@include show-add-diff-note;
|
||||
|
|
|
@ -48,7 +48,6 @@
|
|||
|
||||
p {
|
||||
color: #7f8fa4;
|
||||
display: inline;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -204,26 +203,18 @@ ul.nav.nav-projects-tabs {
|
|||
}
|
||||
|
||||
.fork-namespaces {
|
||||
.thumbnail {
|
||||
.fork-thumbnail {
|
||||
text-align: center;
|
||||
margin-bottom: $gl-padding;
|
||||
|
||||
&.fork-exists-thumbnail {
|
||||
border-color: #EEE;
|
||||
|
||||
.caption {
|
||||
color: #999;
|
||||
}
|
||||
.caption {
|
||||
padding: $gl-padding 0;
|
||||
min-height: 30px;
|
||||
}
|
||||
|
||||
&.fork-thumbnail {
|
||||
border-color: #AAA;
|
||||
|
||||
&:hover {
|
||||
background-color: $hover;
|
||||
}
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
img {
|
||||
@include border-radius(50%);
|
||||
max-width: 100px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -78,36 +78,6 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.blame {
|
||||
img.avatar {
|
||||
border: 0 none;
|
||||
float: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
td.blame-commit {
|
||||
background: #f9f9f9;
|
||||
min-width: 350px;
|
||||
|
||||
.commit-author-link {
|
||||
color: #888;
|
||||
}
|
||||
}
|
||||
td.blame-numbers {
|
||||
pre {
|
||||
color: #AAA;
|
||||
white-space: pre;
|
||||
}
|
||||
background: #f1f1f1;
|
||||
border-left: 1px solid #DDD;
|
||||
}
|
||||
td.lines {
|
||||
code {
|
||||
font-family: $monospace_font;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.tree-ref-holder {
|
||||
|
@ -132,17 +102,14 @@
|
|||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
margin-bottom: 10px;
|
||||
margin-bottom: 5px;
|
||||
|
||||
.commit {
|
||||
padding: 10px 15px;
|
||||
padding: $gl-padding 0;
|
||||
|
||||
.commit-row-title {
|
||||
font-size: 13px;
|
||||
|
||||
.commit-row-message {
|
||||
font-weight: normal;
|
||||
color: #555;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,21 @@
|
|||
class Dashboard::ProjectsController < Dashboard::ApplicationController
|
||||
before_action :event_filter
|
||||
|
||||
def index
|
||||
@projects = current_user.authorized_projects.sorted_by_activity.non_archived
|
||||
@projects = @projects.includes(:namespace)
|
||||
@last_push = current_user.recent_push
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.atom do
|
||||
event_filter
|
||||
load_events
|
||||
render layout: false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def starred
|
||||
@projects = current_user.starred_projects
|
||||
@projects = @projects.includes(:namespace, :forked_from_project, :tags)
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
class Dashboard::SnippetsController < Dashboard::ApplicationController
|
||||
def index
|
||||
@snippets = SnippetsFinder.new.execute(current_user,
|
||||
filter: :by_user,
|
||||
user: current_user,
|
||||
scope: params[:scope]
|
||||
)
|
||||
@snippets = @snippets.page(params[:page]).per(PER_PAGE)
|
||||
end
|
||||
end
|
|
@ -1,23 +1,8 @@
|
|||
class DashboardController < Dashboard::ApplicationController
|
||||
before_action :load_projects, except: :activity
|
||||
before_action :event_filter, only: :activity
|
||||
|
||||
respond_to :html
|
||||
|
||||
def show
|
||||
@projects = @projects.includes(:namespace)
|
||||
@last_push = current_user.recent_push
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.atom do
|
||||
event_filter
|
||||
load_events
|
||||
render layout: false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def merge_requests
|
||||
@merge_requests = get_merge_requests_collection
|
||||
@merge_requests = @merge_requests.page(params[:page]).per(PER_PAGE)
|
||||
|
@ -50,10 +35,6 @@ class DashboardController < Dashboard::ApplicationController
|
|||
|
||||
protected
|
||||
|
||||
def load_projects
|
||||
@projects = current_user.authorized_projects.sorted_by_activity.non_archived
|
||||
end
|
||||
|
||||
def load_events
|
||||
project_ids =
|
||||
if params[:filter] == "starred"
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
class Explore::ApplicationController < ApplicationController
|
||||
skip_before_action :authenticate_user!, :reject_blocked
|
||||
|
||||
layout 'explore'
|
||||
end
|
||||
|
|
|
@ -1,7 +1,4 @@
|
|||
class Explore::GroupsController < Explore::ApplicationController
|
||||
skip_before_action :authenticate_user!,
|
||||
:reject_blocked, :set_current_user_for_observers
|
||||
|
||||
def index
|
||||
@groups = GroupsFinder.new.execute(current_user)
|
||||
@groups = @groups.search(params[:search]) if params[:search].present?
|
||||
|
|
|
@ -1,7 +1,4 @@
|
|||
class Explore::ProjectsController < Explore::ApplicationController
|
||||
skip_before_action :authenticate_user!,
|
||||
:reject_blocked
|
||||
|
||||
def index
|
||||
@projects = ProjectsFinder.new.execute(current_user)
|
||||
@tags = @projects.tags_on(:tags)
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
class Explore::SnippetsController < Explore::ApplicationController
|
||||
def index
|
||||
@snippets = SnippetsFinder.new.execute(current_user, filter: :all)
|
||||
@snippets = @snippets.page(params[:page]).per(PER_PAGE)
|
||||
end
|
||||
end
|
|
@ -4,7 +4,7 @@ class GroupsController < Groups::ApplicationController
|
|||
before_action :group, except: [:new, :create]
|
||||
|
||||
# Authorize
|
||||
before_action :authorize_read_group!, except: [:new, :create]
|
||||
before_action :authorize_read_group!, except: [:show, :new, :create]
|
||||
before_action :authorize_admin_group!, only: [:edit, :update, :destroy, :projects]
|
||||
before_action :authorize_create_group!, only: [:new, :create]
|
||||
|
||||
|
@ -14,6 +14,10 @@ class GroupsController < Groups::ApplicationController
|
|||
|
||||
layout :determine_layout
|
||||
|
||||
def index
|
||||
redirect_to(current_user ? dashboard_groups_path : explore_groups_path)
|
||||
end
|
||||
|
||||
def new
|
||||
@group = Group.new
|
||||
end
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
class HelpController < ApplicationController
|
||||
skip_before_action :authenticate_user!, :reject_blocked
|
||||
|
||||
layout 'help'
|
||||
|
||||
def index
|
||||
|
|
|
@ -24,7 +24,7 @@ class InvitesController < ApplicationController
|
|||
|
||||
path =
|
||||
if current_user
|
||||
dashboard_path
|
||||
dashboard_projects_path
|
||||
else
|
||||
new_user_session_path
|
||||
end
|
||||
|
@ -73,7 +73,7 @@ class InvitesController < ApplicationController
|
|||
path = group_path(group)
|
||||
else
|
||||
label = "who knows what"
|
||||
path = dashboard_path
|
||||
path = dashboard_projects_path
|
||||
end
|
||||
|
||||
[label, path]
|
||||
|
|
|
@ -14,7 +14,7 @@ class NamespacesController < ApplicationController
|
|||
|
||||
if user
|
||||
redirect_to user_path(user)
|
||||
elsif group && can?(current_user, :read_group, group)
|
||||
elsif group
|
||||
redirect_to group_path(group)
|
||||
elsif current_user.nil?
|
||||
authenticate_user!
|
||||
|
|
|
@ -13,10 +13,14 @@ class Projects::ForksController < Projects::ApplicationController
|
|||
@forked_project = ::Projects::ForkService.new(project, current_user, namespace: namespace).execute
|
||||
|
||||
if @forked_project.saved? && @forked_project.forked?
|
||||
redirect_to(
|
||||
namespace_project_path(@forked_project.namespace, @forked_project),
|
||||
notice: 'Project was successfully forked.'
|
||||
)
|
||||
if @forked_project.import_in_progress?
|
||||
redirect_to namespace_project_import_path(@forked_project.namespace, @forked_project)
|
||||
else
|
||||
redirect_to(
|
||||
namespace_project_path(@forked_project.namespace, @forked_project),
|
||||
notice: 'Project was successfully forked.'
|
||||
)
|
||||
end
|
||||
else
|
||||
render :error
|
||||
end
|
||||
|
|
|
@ -78,7 +78,7 @@ class Projects::ProjectMembersController < Projects::ApplicationController
|
|||
@project.project_members.find_by(user_id: current_user).destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html { redirect_to dashboard_path }
|
||||
format.html { redirect_to dashboard_projects_path }
|
||||
format.js { render nothing: true }
|
||||
end
|
||||
end
|
||||
|
|
|
@ -10,6 +10,10 @@ class ProjectsController < ApplicationController
|
|||
|
||||
layout :determine_layout
|
||||
|
||||
def index
|
||||
redirect_to(current_user ? root_path : explore_root_path)
|
||||
end
|
||||
|
||||
def new
|
||||
@project = Project.new
|
||||
end
|
||||
|
@ -108,7 +112,7 @@ class ProjectsController < ApplicationController
|
|||
if request.referer.include?('/admin')
|
||||
redirect_to admin_namespaces_projects_path
|
||||
else
|
||||
redirect_to dashboard_path
|
||||
redirect_to dashboard_projects_path
|
||||
end
|
||||
rescue Projects::DestroyService::DestroyError => ex
|
||||
redirect_to edit_project_path(@project), alert: ex.message
|
||||
|
|
|
@ -6,10 +6,10 @@
|
|||
#
|
||||
# For users who haven't customized the setting, we simply delegate to
|
||||
# `DashboardController#show`, which is the default.
|
||||
class RootController < DashboardController
|
||||
before_action :redirect_to_custom_dashboard, only: [:show]
|
||||
class RootController < Dashboard::ProjectsController
|
||||
before_action :redirect_to_custom_dashboard, only: [:index]
|
||||
|
||||
def show
|
||||
def index
|
||||
super
|
||||
end
|
||||
|
||||
|
@ -20,6 +20,7 @@ class RootController < DashboardController
|
|||
|
||||
case current_user.dashboard
|
||||
when 'stars'
|
||||
flash.keep
|
||||
redirect_to starred_dashboard_projects_path
|
||||
else
|
||||
return
|
||||
|
|
|
@ -24,13 +24,9 @@ class SnippetsController < ApplicationController
|
|||
scope: params[:scope] }).
|
||||
page(params[:page]).per(PER_PAGE)
|
||||
|
||||
if @user == current_user
|
||||
render 'current_user_index'
|
||||
else
|
||||
render 'user_index'
|
||||
end
|
||||
render 'index'
|
||||
else
|
||||
@snippets = SnippetsFinder.new.execute(current_user, filter: :all).page(params[:page]).per(PER_PAGE)
|
||||
redirect_to(current_user ? dashboard_snippets_path : explore_snippets_path)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -201,7 +201,7 @@ module ApplicationHelper
|
|||
class: "#{html_class} js-timeago",
|
||||
datetime: time.getutc.iso8601,
|
||||
title: time.in_time_zone.stamp('Aug 21, 2011 9:23pm'),
|
||||
data: { toggle: 'tooltip', placement: placement }
|
||||
data: { toggle: 'tooltip', placement: placement, container: 'body' }
|
||||
|
||||
element += javascript_tag "$('.js-timeago').timeago()" unless skip_js
|
||||
|
||||
|
|
|
@ -17,6 +17,14 @@ module GitlabRoutingHelper
|
|||
namespace_project_path(project.namespace, project, *args)
|
||||
end
|
||||
|
||||
def project_files_path(project, *args)
|
||||
namespace_project_tree_path(project.namespace, project, @ref || project.repository.root_ref)
|
||||
end
|
||||
|
||||
def project_commits_path(project, *args)
|
||||
namespace_project_commits_path(project.namespace, project, @ref || project.repository.root_ref)
|
||||
end
|
||||
|
||||
def activity_project_path(project, *args)
|
||||
activity_namespace_project_path(project.namespace, project, *args)
|
||||
end
|
||||
|
|
|
@ -31,4 +31,26 @@ module PageLayoutHelper
|
|||
@fluid_layout
|
||||
end
|
||||
end
|
||||
|
||||
def blank_container(enabled = false)
|
||||
if @blank_container.nil?
|
||||
@blank_container = enabled
|
||||
else
|
||||
@blank_container
|
||||
end
|
||||
end
|
||||
|
||||
def container_class
|
||||
css_class = "container-fluid"
|
||||
|
||||
unless fluid_layout
|
||||
css_class += " container-limited"
|
||||
end
|
||||
|
||||
if blank_container
|
||||
css_class += " container-blank"
|
||||
end
|
||||
|
||||
css_class
|
||||
end
|
||||
end
|
||||
|
|
|
@ -43,24 +43,22 @@ module ProjectsHelper
|
|||
end
|
||||
end
|
||||
|
||||
def project_title(project)
|
||||
if project.group
|
||||
content_tag :span do
|
||||
link_to(
|
||||
simple_sanitize(project.group.name), group_path(project.group)
|
||||
) + ' / ' +
|
||||
link_to(simple_sanitize(project.name),
|
||||
project_path(project))
|
||||
end
|
||||
else
|
||||
owner = project.namespace.owner
|
||||
content_tag :span do
|
||||
link_to(
|
||||
simple_sanitize(owner.name), user_path(owner)
|
||||
) + ' / ' +
|
||||
link_to(simple_sanitize(project.name),
|
||||
project_path(project))
|
||||
def project_title(project, name = nil, url = nil)
|
||||
namespace_link =
|
||||
if project.group
|
||||
link_to(simple_sanitize(project.group.name), group_path(project.group))
|
||||
else
|
||||
owner = project.namespace.owner
|
||||
link_to(simple_sanitize(owner.name), user_path(owner))
|
||||
end
|
||||
|
||||
project_link = link_to(simple_sanitize(project.name), project_path(project))
|
||||
|
||||
full_title = namespace_link + ' / ' + project_link
|
||||
full_title += ' · '.html_safe + link_to(simple_sanitize(name), url) if name
|
||||
|
||||
content_tag :span do
|
||||
full_title
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -315,6 +313,45 @@ module ProjectsHelper
|
|||
end
|
||||
end
|
||||
|
||||
def current_ref
|
||||
@ref || @repository.try(:root_ref)
|
||||
end
|
||||
|
||||
def detect_project_title(project)
|
||||
name, url =
|
||||
if current_controller? 'wikis'
|
||||
['Wiki', get_project_wiki_path(project)]
|
||||
elsif current_controller? 'project_members'
|
||||
['Members', namespace_project_project_members_path(project.namespace, project)]
|
||||
elsif current_controller? 'labels'
|
||||
['Labels', namespace_project_labels_path(project.namespace, project)]
|
||||
elsif current_controller? 'members'
|
||||
['Members', project_files_path(project)]
|
||||
elsif current_controller? 'commits'
|
||||
['Commits', project_commits_path(project)]
|
||||
elsif current_controller? 'graphs'
|
||||
['Graphs', namespace_project_graph_path(project.namespace, project, current_ref)]
|
||||
elsif current_controller? 'network'
|
||||
['Network', namespace_project_network_path(project.namespace, project, current_ref)]
|
||||
elsif current_controller? 'milestones'
|
||||
['Milestones', namespace_project_milestones_path(project.namespace, project)]
|
||||
elsif current_controller? 'snippets'
|
||||
['Snippets', namespace_project_snippets_path(project.namespace, project)]
|
||||
elsif current_controller? 'issues'
|
||||
['Issues', namespace_project_issues_path(project.namespace, project)]
|
||||
elsif current_controller? 'merge_requests'
|
||||
['Merge Requests', namespace_project_merge_requests_path(project.namespace, project)]
|
||||
elsif current_controller? 'tree', 'blob'
|
||||
['Files', project_files_path(project)]
|
||||
elsif current_path? 'projects#activity'
|
||||
['Activity', activity_project_path(project)]
|
||||
else
|
||||
[nil, nil]
|
||||
end
|
||||
|
||||
project_title(project, name, url)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def filename_path(project, filename)
|
||||
|
|
|
@ -144,7 +144,7 @@ class Project < ActiveRecord::Base
|
|||
validates_uniqueness_of :path, scope: :namespace_id
|
||||
validates :import_url,
|
||||
format: { with: /\A#{URI.regexp(%w(ssh git http https))}\z/, message: 'should be a valid url' },
|
||||
if: :import?
|
||||
if: :external_import?
|
||||
validates :star_count, numericality: { greater_than_or_equal_to: 0 }
|
||||
validate :check_limit, on: :create
|
||||
validate :avatar_type,
|
||||
|
@ -275,7 +275,13 @@ class Project < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def add_import_job
|
||||
RepositoryImportWorker.perform_in(2.seconds, id)
|
||||
if forked?
|
||||
unless RepositoryForkWorker.perform_async(id, forked_from_project.path_with_namespace, self.namespace.path)
|
||||
import_fail
|
||||
end
|
||||
else
|
||||
RepositoryImportWorker.perform_in(2.seconds, id)
|
||||
end
|
||||
end
|
||||
|
||||
def clear_import_data
|
||||
|
@ -283,6 +289,10 @@ class Project < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def import?
|
||||
external_import? || forked?
|
||||
end
|
||||
|
||||
def external_import?
|
||||
import_url.present?
|
||||
end
|
||||
|
||||
|
@ -702,14 +712,8 @@ class Project < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def create_repository
|
||||
if forked?
|
||||
if gitlab_shell.fork_repository(forked_from_project.path_with_namespace, self.namespace.path)
|
||||
true
|
||||
else
|
||||
errors.add(:base, 'Failed to fork repository via gitlab-shell')
|
||||
false
|
||||
end
|
||||
else
|
||||
# Forked import is handled asynchronously
|
||||
unless forked?
|
||||
if gitlab_shell.add_repository(path_with_namespace)
|
||||
true
|
||||
else
|
||||
|
|
|
@ -22,7 +22,7 @@ module Files
|
|||
blob = repository.blob_at_branch(@current_branch, @file_path)
|
||||
|
||||
if blob
|
||||
raise_error("Your changes could not be committed, because file with such name exists")
|
||||
raise_error("Your changes could not be committed because a file with the same name already exists")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -55,9 +55,7 @@ module Projects
|
|||
@project.save
|
||||
|
||||
if @project.persisted? && !@project.import?
|
||||
unless @project.create_repository
|
||||
raise 'Failed to create repository'
|
||||
end
|
||||
raise 'Failed to create repository' unless @project.create_repository
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
- if current_user
|
||||
%ul.nav.nav-pills.event_filter.pull-right
|
||||
%li.pull-right
|
||||
= link_to dashboard_path(:atom, { private_token: current_user.private_token }), class: 'rss-btn' do
|
||||
= link_to dashboard_projects_path(:atom, { private_token: current_user.private_token }), class: 'rss-btn' do
|
||||
%i.fa.fa-rss
|
||||
= render 'shared/event_filter'
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
%ul.center-top-menu
|
||||
= nav_link(page: [dashboard_groups_path]) do
|
||||
= nav_link(page: dashboard_groups_path) do
|
||||
= link_to dashboard_groups_path, title: 'Your groups', data: {placement: 'right'} do
|
||||
Your Groups
|
||||
= nav_link(page: [explore_groups_path]) do
|
||||
= nav_link(page: explore_groups_path) do
|
||||
= link_to explore_groups_path, title: 'Explore groups', data: {placement: 'bottom'} do
|
||||
Explore Groups
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%ul.center-top-menu
|
||||
= nav_link(path: ['dashboard#show', 'root#show']) do
|
||||
= link_to dashboard_path, title: 'Home', class: 'shortcuts-activity', data: {placement: 'right'} do
|
||||
= nav_link(path: ['projects#index', 'root#index']) do
|
||||
= link_to dashboard_projects_path, title: 'Home', class: 'shortcuts-activity', data: {placement: 'right'} do
|
||||
Your Projects
|
||||
= nav_link(page: starred_dashboard_projects_path) do
|
||||
= link_to starred_dashboard_projects_path, title: 'Starred Projects', data: {placement: 'right'} do
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
%ul.center-top-menu
|
||||
= nav_link(page: dashboard_snippets_path, html_options: {class: 'home'}) do
|
||||
= link_to dashboard_snippets_path, title: 'Your snippets', data: {placement: 'right'} do
|
||||
Your Snippets
|
||||
= nav_link(page: explore_snippets_path) do
|
||||
= link_to explore_snippets_path, title: 'Explore snippets', data: {placement: 'right'} do
|
||||
Explore Snippets
|
|
@ -1,8 +1,10 @@
|
|||
= content_for :meta_tags do
|
||||
- if current_user
|
||||
= auto_discovery_link_tag(:atom, dashboard_url(format: :atom, private_token: current_user.private_token), title: "All activity")
|
||||
= auto_discovery_link_tag(:atom, dashboard_projects_url(format: :atom, private_token: current_user.private_token), title: "All activity")
|
||||
|
||||
- page_title "Activity"
|
||||
- header_title "Activity", activity_dashboard_path
|
||||
|
||||
= render 'dashboard/activity_head'
|
||||
|
||||
%section.activities
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
xml.instruct!
|
||||
xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do
|
||||
xml.title "Activity"
|
||||
xml.link href: dashboard_url(format: :atom, private_token: current_user.try(:private_token)), rel: "self", type: "application/atom+xml"
|
||||
xml.link href: dashboard_url, rel: "alternate", type: "text/html"
|
||||
xml.id dashboard_url
|
||||
xml.link href: dashboard_projects_url(format: :atom, private_token: current_user.try(:private_token)), rel: "self", type: "application/atom+xml"
|
||||
xml.link href: dashboard_projects_url, rel: "alternate", type: "text/html"
|
||||
xml.id dashboard_projects_url
|
||||
xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any?
|
||||
|
||||
@events.each do |event|
|
|
@ -1,8 +1,10 @@
|
|||
= content_for :meta_tags do
|
||||
- if current_user
|
||||
= auto_discovery_link_tag(:atom, dashboard_url(format: :atom, private_token: current_user.private_token), title: "All activity")
|
||||
= auto_discovery_link_tag(:atom, dashboard_projects_url(format: :atom, private_token: current_user.private_token), title: "All activity")
|
||||
|
||||
- page_title "Projects"
|
||||
- header_title "Projects", root_path
|
||||
|
||||
- header_title "Projects", (current_user ? root_path : explore_root_path)
|
||||
= render 'dashboard/projects_head'
|
||||
|
||||
- if @last_push
|
|
@ -1,9 +1,10 @@
|
|||
- page_title "Starred Projects"
|
||||
- header_title "Projects", (current_user ? root_path : explore_root_path)
|
||||
- header_title "Projects", projects_path
|
||||
|
||||
= render 'dashboard/projects_head'
|
||||
|
||||
- if @projects.any?
|
||||
= render 'dashboard/projects'
|
||||
= render 'projects'
|
||||
- else
|
||||
%h3 You don't have starred projects yet
|
||||
%p.slead Visit project page and press on star icon and it will appear on this page.
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
- page_title "Snippets"
|
||||
- header_title "Snippets", dashboard_snippets_path
|
||||
|
||||
= render 'dashboard/snippets_head'
|
||||
|
||||
.gray-content-block
|
||||
.pull-right
|
||||
= link_to new_snippet_path, class: "btn btn-new", title: "New Snippet" do
|
||||
Add new snippet
|
||||
|
||||
.oneline
|
||||
Share code pastes with others out of git repository
|
||||
|
||||
%ul.nav.nav-tabs.prepend-top-20
|
||||
= nav_tab :scope, nil do
|
||||
= link_to dashboard_snippets_path do
|
||||
All
|
||||
%span.badge
|
||||
= current_user.snippets.count
|
||||
= nav_tab :scope, 'are_private' do
|
||||
= link_to dashboard_snippets_path(scope: 'are_private') do
|
||||
Private
|
||||
%span.badge
|
||||
= current_user.snippets.are_private.count
|
||||
= nav_tab :scope, 'are_internal' do
|
||||
= link_to dashboard_snippets_path(scope: 'are_internal') do
|
||||
Internal
|
||||
%span.badge
|
||||
= current_user.snippets.are_internal.count
|
||||
= nav_tab :scope, 'are_public' do
|
||||
= link_to dashboard_snippets_path(scope: 'are_public') do
|
||||
Public
|
||||
%span.badge
|
||||
= current_user.snippets.are_public.count
|
||||
|
||||
.my-snippets
|
||||
= render 'snippets/snippets'
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
.explore-title
|
||||
%h3
|
||||
Explore GitLab
|
||||
%p.lead
|
||||
Discover projects, groups and snippets. Share your projects with others
|
||||
%br
|
|
@ -1,7 +1,11 @@
|
|||
- page_title "Groups"
|
||||
- header_title "Groups", (current_user ? dashboard_groups_path : explore_groups_path)
|
||||
- page_title "Groups"
|
||||
- header_title "Groups", dashboard_groups_path
|
||||
|
||||
- if current_user
|
||||
= render 'dashboard/groups_head'
|
||||
- else
|
||||
= render 'explore/head'
|
||||
|
||||
.gray-content-block.clearfix
|
||||
.pull-left
|
||||
= form_tag explore_groups_path, method: :get, class: 'form-inline form-tiny' do |f|
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
- page_title "Projects"
|
||||
- page_title "Projects"
|
||||
- header_title "Projects", root_path
|
||||
|
||||
- if current_user
|
||||
= render 'dashboard/projects_head'
|
||||
- else
|
||||
= render 'explore/head'
|
||||
|
||||
.gray-content-block.clearfix
|
||||
= render 'filter'
|
||||
= render 'projects', projects: @projects
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
- page_title "Starred Projects"
|
||||
- page_title "Projects"
|
||||
- header_title "Projects", root_path
|
||||
|
||||
- if current_user
|
||||
= render 'dashboard/projects_head'
|
||||
- else
|
||||
= render 'explore/head'
|
||||
|
||||
.explore-trending-block
|
||||
.gray-content-block
|
||||
|
|
|
@ -1,13 +1,11 @@
|
|||
- page_title "Trending Projects"
|
||||
- page_title "Projects"
|
||||
- header_title "Projects", root_path
|
||||
|
||||
- if current_user
|
||||
= render 'dashboard/projects_head'
|
||||
- else
|
||||
.explore-title
|
||||
%h3
|
||||
Explore GitLab
|
||||
%p.lead
|
||||
Discover projects and groups. Share your projects with others
|
||||
%br
|
||||
= render 'explore/head'
|
||||
|
||||
.explore-trending-block
|
||||
.gray-content-block
|
||||
.pull-right
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
- page_title "Snippets"
|
||||
- header_title "Snippets", snippets_path
|
||||
|
||||
- if current_user
|
||||
= render 'dashboard/snippets_head'
|
||||
- else
|
||||
= render 'explore/head'
|
||||
|
||||
.gray-content-block
|
||||
- if current_user
|
||||
.pull-right
|
||||
= link_to new_snippet_path, class: "btn btn-new", title: "New Snippet" do
|
||||
Add new snippet
|
||||
|
||||
.oneline
|
||||
Public snippets created by you and other users are listed here
|
||||
|
||||
= render 'snippets/snippets'
|
|
@ -1,3 +1,6 @@
|
|||
- header_title group_title(@group, "Settings", edit_group_path(@group))
|
||||
- @blank_container = true
|
||||
|
||||
.panel.panel-default
|
||||
.panel-heading
|
||||
%strong= @group.name
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
- page_title "Projects"
|
||||
- header_title group_title(@group, "Projects", projects_group_path(@group))
|
||||
|
||||
.panel.panel-default
|
||||
.panel-heading
|
||||
%strong= @group.name
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
- unless can?(current_user, :read_group, @group)
|
||||
- @disable_search_panel = true
|
||||
|
||||
= content_for :meta_tags do
|
||||
- if current_user
|
||||
= auto_discovery_link_tag(:atom, group_url(@group, format: :atom, private_token: current_user.private_token), title: "#{@group.name} activity")
|
||||
|
@ -16,22 +19,25 @@
|
|||
|
||||
= render 'shared/show_aside'
|
||||
|
||||
.row
|
||||
%section.activities.col-md-7
|
||||
.hidden-xs
|
||||
- if current_user
|
||||
= render "events/event_last_push", event: @last_push
|
||||
|
||||
- if can?(current_user, :read_group, @group)
|
||||
.row
|
||||
%section.activities.col-md-7
|
||||
.hidden-xs
|
||||
- if current_user
|
||||
= render "events/event_last_push", event: @last_push
|
||||
|
||||
%ul.nav.nav-pills.event_filter.pull-right
|
||||
%li
|
||||
= link_to group_path(@group, { format: :atom, private_token: current_user.private_token }), title: "Feed", class: 'rss-btn' do
|
||||
%i.fa.fa-rss
|
||||
|
||||
= render 'shared/event_filter'
|
||||
%hr
|
||||
= render 'shared/event_filter'
|
||||
%hr
|
||||
|
||||
.content_list
|
||||
= spinner
|
||||
%aside.side.col-md-5
|
||||
= render "projects", projects: @projects
|
||||
.content_list
|
||||
= spinner
|
||||
%aside.side.col-md-5
|
||||
= render "projects", projects: @projects
|
||||
- else
|
||||
%p
|
||||
This group does not have public projects
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
- page_title @file.humanize, *@category.split("/").reverse.map(&:humanize)
|
||||
.documentation.wiki
|
||||
= markdown @markdown.gsub('$your_email', current_user.email)
|
||||
= markdown @markdown.gsub('$your_email', current_user.try(:email) || "email@example.com")
|
||||
|
|
|
@ -6,10 +6,14 @@
|
|||
= brand_header_logo
|
||||
.gitlab-text-container
|
||||
%h3 GitLab
|
||||
|
||||
- if defined?(sidebar) && sidebar
|
||||
= render "layouts/nav/#{sidebar}"
|
||||
- elsif current_user
|
||||
= render 'layouts/nav/dashboard'
|
||||
- else
|
||||
= render 'layouts/nav/explore'
|
||||
|
||||
.collapse-nav
|
||||
= render partial: 'layouts/collapse_button'
|
||||
- if current_user
|
||||
|
@ -19,7 +23,7 @@
|
|||
= current_user.username
|
||||
.content-wrapper
|
||||
= render "layouts/flash"
|
||||
%div{ class: fluid_layout ? "container-fluid" : "container-fluid container-limited" }
|
||||
%div{ class: container_class }
|
||||
.content
|
||||
.clearfix
|
||||
= yield
|
||||
|
|
|
@ -31,5 +31,5 @@
|
|||
.container
|
||||
.footer-links
|
||||
= link_to "Explore", explore_root_path
|
||||
= link_to "Documentation", "http://doc.gitlab.com/"
|
||||
= link_to "Help", help_path
|
||||
= link_to "About GitLab", "https://about.gitlab.com/"
|
||||
|
|
|
@ -1,9 +1,5 @@
|
|||
- page_title "Explore"
|
||||
- if current_user
|
||||
- unless @header_title
|
||||
- header_title "Projects", (current_user ? root_path : explore_root_path)
|
||||
- else
|
||||
- unless current_user
|
||||
- header_title "Explore GitLab", explore_root_path
|
||||
- sidebar "dashboard"
|
||||
|
||||
= render template: "layouts/application"
|
||||
|
|
|
@ -7,8 +7,9 @@
|
|||
|
||||
.navbar-collapse.collapse
|
||||
%ul.nav.navbar-nav.pull-right
|
||||
%li.hidden-sm.hidden-xs
|
||||
= render 'layouts/search'
|
||||
- unless @disable_search_panel
|
||||
%li.hidden-sm.hidden-xs
|
||||
= render 'layouts/search'
|
||||
%li.visible-sm.visible-xs
|
||||
= link_to search_path, title: 'Search', data: {toggle: 'tooltip', placement: 'bottom'} do
|
||||
= icon('search')
|
||||
|
|
|
@ -1,31 +1,30 @@
|
|||
%ul.nav.nav-sidebar
|
||||
= nav_link(path: ['dashboard#show', 'root#show', 'projects#trending', 'projects#starred', 'projects#index'], html_options: {class: 'home'}) do
|
||||
= link_to (current_user ? root_path : explore_root_path), title: 'Home', class: 'shortcuts-activity', data: {placement: 'right'} do
|
||||
= nav_link(path: ['root#index', 'projects#trending', 'projects#starred', 'projects#index'], html_options: {class: 'home'}) do
|
||||
= link_to root_path, title: 'Projects', data: {placement: 'right'} do
|
||||
= icon('home fw')
|
||||
%span
|
||||
Projects
|
||||
= nav_link(path: 'dashboard#activity') do
|
||||
= link_to activity_dashboard_path, title: 'Activity', data: {placement: 'right'} do
|
||||
= link_to activity_dashboard_path, class: 'shortcuts-activity', title: 'Activity', data: {placement: 'right'} do
|
||||
= icon('dashboard fw')
|
||||
%span
|
||||
Activity
|
||||
= nav_link(controller: :groups) do
|
||||
= link_to (current_user ? dashboard_groups_path : explore_groups_path), title: 'Groups', data: {placement: 'right'} do
|
||||
= link_to dashboard_groups_path, title: 'Groups', data: {placement: 'right'} do
|
||||
= icon('group fw')
|
||||
%span
|
||||
Groups
|
||||
- if current_user
|
||||
= nav_link(controller: :milestones) do
|
||||
= link_to dashboard_milestones_path, title: 'Milestones', data: {placement: 'right'} do
|
||||
= icon('clock-o fw')
|
||||
%span
|
||||
Milestones
|
||||
= nav_link(path: 'dashboard#issues') do
|
||||
= link_to assigned_issues_dashboard_path, title: 'Issues', class: 'shortcuts-issues', data: {placement: 'right'} do
|
||||
= icon('exclamation-circle fw')
|
||||
%span
|
||||
Issues
|
||||
%span.count= current_user.assigned_issues.opened.count
|
||||
= nav_link(controller: :milestones) do
|
||||
= link_to dashboard_milestones_path, title: 'Milestones', data: {placement: 'right'} do
|
||||
= icon('clock-o fw')
|
||||
%span
|
||||
Milestones
|
||||
= nav_link(path: 'dashboard#issues') do
|
||||
= link_to assigned_issues_dashboard_path, title: 'Issues', class: 'shortcuts-issues', data: {placement: 'right'} do
|
||||
= icon('exclamation-circle fw')
|
||||
%span
|
||||
Issues
|
||||
%span.count= current_user.assigned_issues.opened.count
|
||||
= nav_link(path: 'dashboard#merge_requests') do
|
||||
= link_to assigned_mrs_dashboard_path, title: 'Merge Requests', class: 'shortcuts-merge_requests', data: {placement: 'right'} do
|
||||
= icon('tasks fw')
|
||||
|
@ -33,18 +32,17 @@
|
|||
Merge Requests
|
||||
%span.count= current_user.assigned_merge_requests.opened.count
|
||||
= nav_link(controller: :snippets) do
|
||||
= link_to (current_user ? user_snippets_path(current_user) : snippets_path), title: 'Your snippets', data: {placement: 'right'} do
|
||||
= link_to dashboard_snippets_path, title: 'Your snippets', data: {placement: 'right'} do
|
||||
= icon('clipboard fw')
|
||||
%span
|
||||
Snippets
|
||||
- if current_user
|
||||
= nav_link(controller: :profile) do
|
||||
= link_to profile_path, title: 'Profile settings', data: {toggle: 'tooltip', placement: 'bottom'} do
|
||||
= icon('user fw')
|
||||
%span
|
||||
Profile Settings
|
||||
= nav_link(controller: :help) do
|
||||
= link_to help_path, title: 'Help', data: {placement: 'right'} do
|
||||
= icon('question-circle fw')
|
||||
%span
|
||||
Help
|
||||
= nav_link(controller: :profile) do
|
||||
= link_to profile_path, title: 'Profile settings', data: {placement: 'bottom'} do
|
||||
= icon('user fw')
|
||||
%span
|
||||
Profile Settings
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
%ul.nav.nav-sidebar
|
||||
= nav_link(path: ['dashboard#show', 'root#show', 'projects#trending', 'projects#starred', 'projects#index'], html_options: {class: 'home'}) do
|
||||
= link_to explore_root_path, title: 'Projects', data: {placement: 'right'} do
|
||||
= icon('home fw')
|
||||
%span
|
||||
Projects
|
||||
= nav_link(controller: :groups) do
|
||||
= link_to explore_groups_path, title: 'Groups', data: {placement: 'right'} do
|
||||
= icon('group fw')
|
||||
%span
|
||||
Groups
|
||||
= nav_link(controller: :snippets) do
|
||||
= link_to explore_snippets_path, title: 'Snippets', data: {placement: 'right'} do
|
||||
= icon('clipboard fw')
|
||||
%span
|
||||
Snippets
|
||||
= nav_link(controller: :help) do
|
||||
= link_to help_path, title: 'Help', data: {placement: 'right'} do
|
||||
= icon('question-circle fw')
|
||||
%span
|
||||
Help
|
|
@ -3,7 +3,7 @@
|
|||
= link_to root_path, title: 'Back to dashboard', data: {placement: 'right'}, class: 'back-link' do
|
||||
= icon('caret-square-o-left fw')
|
||||
%span
|
||||
Back to Dashboard
|
||||
Back to dashboard
|
||||
|
||||
%li.separate-item
|
||||
|
||||
|
@ -12,34 +12,35 @@
|
|||
= icon('dashboard fw')
|
||||
%span
|
||||
Group
|
||||
- if current_user
|
||||
= nav_link(controller: [:group, :milestones]) do
|
||||
= link_to group_milestones_path(@group), title: 'Milestones', data: {placement: 'right'} do
|
||||
= icon('clock-o fw')
|
||||
- if can?(current_user, :read_group, @group)
|
||||
- if current_user
|
||||
= nav_link(controller: [:group, :milestones]) do
|
||||
= link_to group_milestones_path(@group), title: 'Milestones', data: {placement: 'right'} do
|
||||
= icon('clock-o fw')
|
||||
%span
|
||||
Milestones
|
||||
= nav_link(path: 'groups#issues') do
|
||||
= link_to issues_group_path(@group), title: 'Issues', data: {placement: 'right'} do
|
||||
= icon('exclamation-circle fw')
|
||||
%span
|
||||
Milestones
|
||||
= nav_link(path: 'groups#issues') do
|
||||
= link_to issues_group_path(@group), title: 'Issues', data: {placement: 'right'} do
|
||||
= icon('exclamation-circle fw')
|
||||
%span
|
||||
Issues
|
||||
- if current_user
|
||||
%span.count= Issue.opened.of_group(@group).count
|
||||
= nav_link(path: 'groups#merge_requests') do
|
||||
= link_to merge_requests_group_path(@group), title: 'Merge Requests', data: {placement: 'right'} do
|
||||
= icon('tasks fw')
|
||||
%span
|
||||
Merge Requests
|
||||
- if current_user
|
||||
%span.count= MergeRequest.opened.of_group(@group).count
|
||||
= nav_link(controller: [:group_members]) do
|
||||
= link_to group_group_members_path(@group), title: 'Members', data: {placement: 'right'} do
|
||||
= icon('users fw')
|
||||
%span
|
||||
Members
|
||||
- if can?(current_user, :admin_group, @group)
|
||||
= nav_link(html_options: { class: "separate-item" }) do
|
||||
= link_to edit_group_path(@group), title: 'Settings', data: {placement: 'right'} do
|
||||
= icon ('cogs fw')
|
||||
Issues
|
||||
- if current_user
|
||||
%span.count= Issue.opened.of_group(@group).count
|
||||
= nav_link(path: 'groups#merge_requests') do
|
||||
= link_to merge_requests_group_path(@group), title: 'Merge Requests', data: {placement: 'right'} do
|
||||
= icon('tasks fw')
|
||||
%span
|
||||
Settings
|
||||
Merge Requests
|
||||
- if current_user
|
||||
%span.count= MergeRequest.opened.of_group(@group).count
|
||||
= nav_link(controller: [:group_members]) do
|
||||
= link_to group_group_members_path(@group), title: 'Members', data: {placement: 'right'} do
|
||||
= icon('users fw')
|
||||
%span
|
||||
Members
|
||||
- if can?(current_user, :admin_group, @group)
|
||||
= nav_link(html_options: { class: "separate-item" }) do
|
||||
= link_to edit_group_path(@group), title: 'Settings', data: {placement: 'right'} do
|
||||
= icon ('cogs fw')
|
||||
%span
|
||||
Settings
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
= link_to root_path, title: 'Back to dashboard', data: {placement: 'right'}, class: 'back-link' do
|
||||
= icon('caret-square-o-left fw')
|
||||
%span
|
||||
Back to Dashboard
|
||||
Back to dashboard
|
||||
|
||||
%li.separate-item
|
||||
|
||||
|
@ -11,7 +11,7 @@
|
|||
= link_to profile_path, title: 'Profile', data: {placement: 'right'} do
|
||||
= icon('user fw')
|
||||
%span
|
||||
Profile
|
||||
Profile Settings
|
||||
= nav_link(controller: [:accounts, :two_factor_auths]) do
|
||||
= link_to profile_account_path, title: 'Account', data: {placement: 'right'} do
|
||||
= icon('gear fw')
|
||||
|
|
|
@ -4,13 +4,13 @@
|
|||
= link_to group_path(@project.group), title: 'Back to group', data: {placement: 'right'}, class: 'back-link' do
|
||||
= icon('caret-square-o-left fw')
|
||||
%span
|
||||
Back to Group
|
||||
Back to group
|
||||
- else
|
||||
= nav_link do
|
||||
= link_to root_path, title: 'Back to dashboard', data: {placement: 'right'}, class: 'back-link' do
|
||||
= icon('caret-square-o-left fw')
|
||||
%span
|
||||
Back to Dashboard
|
||||
Back to dashboard
|
||||
|
||||
%li.separate-item
|
||||
|
||||
|
@ -26,28 +26,28 @@
|
|||
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
|
||||
= link_to project_files_path(@project), title: 'Files', class: 'shortcuts-tree', data: {placement: 'right'} do
|
||||
= icon('files-o fw')
|
||||
%span
|
||||
Files
|
||||
|
||||
- if project_nav_tab? :commits
|
||||
= nav_link(controller: %w(commit commits compare repositories tags branches)) do
|
||||
= link_to namespace_project_commits_path(@project.namespace, @project, @ref || @repository.root_ref), title: 'Commits', class: 'shortcuts-commits', data: {placement: 'right'} do
|
||||
= link_to project_commits_path(@project), title: 'Commits', class: 'shortcuts-commits', data: {placement: 'right'} do
|
||||
= icon('history fw')
|
||||
%span
|
||||
Commits
|
||||
|
||||
- if project_nav_tab? :network
|
||||
= nav_link(controller: %w(network)) do
|
||||
= link_to namespace_project_network_path(@project.namespace, @project, @ref || @repository.root_ref), title: 'Network', class: 'shortcuts-network', data: {placement: 'right'} do
|
||||
= link_to namespace_project_network_path(@project.namespace, @project, current_ref), title: 'Network', class: 'shortcuts-network', data: {placement: 'right'} do
|
||||
= icon('code-fork fw')
|
||||
%span
|
||||
Network
|
||||
|
||||
- if project_nav_tab? :graphs
|
||||
= nav_link(controller: %w(graphs)) do
|
||||
= link_to namespace_project_graph_path(@project.namespace, @project, @ref || @repository.root_ref), title: 'Graphs', class: 'shortcuts-graphs', data: {placement: 'right'} do
|
||||
= link_to namespace_project_graph_path(@project.namespace, @project, current_ref), title: 'Graphs', class: 'shortcuts-graphs', data: {placement: 'right'} do
|
||||
= icon('area-chart fw')
|
||||
%span
|
||||
Graphs
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
- page_title "Profile Settings"
|
||||
- header_title "Profile Settings", profile_path
|
||||
- unless @header_title
|
||||
- header_title "Profile Settings", profile_path
|
||||
- sidebar "profile"
|
||||
|
||||
= render template: "layouts/application"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
- page_title @project.name_with_namespace
|
||||
- header_title project_title(@project)
|
||||
- header_title detect_project_title(@project)
|
||||
- sidebar "project" unless sidebar
|
||||
|
||||
- content_for :scripts_body_top do
|
||||
|
|
|
@ -1,8 +1,3 @@
|
|||
- page_title 'Snippets'
|
||||
- if current_user
|
||||
- header_title "Snippets", user_snippets_path(current_user)
|
||||
- else
|
||||
- header_title 'Snippets', snippets_path
|
||||
- sidebar "dashboard"
|
||||
- header_title "Snippets", snippets_path
|
||||
|
||||
= render template: "layouts/application"
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
- page_title "Account"
|
||||
%h3.page-title
|
||||
= page_title
|
||||
%p.light
|
||||
Change your username and basic account settings.
|
||||
%hr
|
||||
- header_title page_title, profile_account_path
|
||||
- @blank_container = true
|
||||
|
||||
- if current_user.ldap_user?
|
||||
.alert.alert-info
|
||||
Some options are unavailable for LDAP accounts
|
||||
|
@ -69,7 +67,7 @@
|
|||
- button_based_providers.each do |provider|
|
||||
.btn-group
|
||||
= link_to provider_image_tag(provider), user_omniauth_authorize_path(provider), method: :post, class: "btn btn-lg #{'active' if auth_active?(provider)}", "data-no-turbolink" => "true"
|
||||
|
||||
|
||||
- if auth_active?(provider)
|
||||
= link_to unlink_profile_account_path(provider: provider), method: :delete, class: 'btn btn-lg' do
|
||||
= icon('close')
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
- page_title "Applications"
|
||||
%h3.page-title
|
||||
= page_title
|
||||
%p.light
|
||||
- header_title page_title, applications_profile_path
|
||||
|
||||
.gray-content-block.top-block
|
||||
- if user_oauth_applications?
|
||||
Manage applications that can use GitLab as an OAuth provider,
|
||||
Manage applications that can use GitLab as an OAuth provider,
|
||||
and applications that you've authorized to use your account.
|
||||
- else
|
||||
Manage applications that you've authorized to use your account.
|
||||
%hr
|
||||
|
||||
- if user_oauth_applications?
|
||||
.oauth-applications
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
- page_title "Audit Log"
|
||||
%h3.page-title Audit Log
|
||||
%p.light History of authentications
|
||||
- header_title page_title, audit_log_profile_path
|
||||
|
||||
= render 'event_table', events: @events
|
||||
.gray-content-block.top-block
|
||||
History of authentications
|
||||
|
||||
.prepend-top-default
|
||||
= render 'event_table', events: @events
|
||||
|
|
|
@ -1,12 +1,10 @@
|
|||
- page_title "Emails"
|
||||
%h3.page-title
|
||||
= page_title
|
||||
%p.light
|
||||
- header_title page_title, profile_emails_path
|
||||
|
||||
.gray-content-block.top-block
|
||||
Control emails linked to your account
|
||||
%hr
|
||||
|
||||
|
||||
%ul
|
||||
%ul.prepend-top-default
|
||||
%li
|
||||
Your
|
||||
%b Primary Email
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
- page_title "SSH Keys"
|
||||
%h3.page-title
|
||||
= page_title
|
||||
- header_title page_title, profile_keys_path
|
||||
|
||||
.gray-content-block.top-block
|
||||
.pull-right
|
||||
= link_to "Add SSH Key", new_profile_key_path, class: "btn btn-new"
|
||||
%p.light
|
||||
Before you can add an SSH key you need to
|
||||
= link_to "generate it.", help_page_path("ssh", "README")
|
||||
%hr
|
||||
.oneline
|
||||
Before you can add an SSH key you need to
|
||||
= link_to "generate it.", help_page_path("ssh", "README")
|
||||
|
||||
.prepend-top-default
|
||||
= render 'key_table'
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
- page_title "Notifications"
|
||||
%h3.page-title
|
||||
= page_title
|
||||
%p.light
|
||||
These are your global notification settings.
|
||||
%hr
|
||||
- header_title page_title, profile_notifications_path
|
||||
|
||||
.gray-content-block.top-block
|
||||
These are your global notification settings.
|
||||
|
||||
.prepend-top-default
|
||||
= form_for @user, url: profile_notifications_path, method: :put, html: { class: 'update-notifications form-horizontal global-notifications-form' } do |f|
|
||||
-if @user.errors.any?
|
||||
%div.alert.alert-danger
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
- page_title "Password"
|
||||
%h3.page-title
|
||||
= page_title
|
||||
%p.light
|
||||
- header_title page_title, edit_profile_password_path
|
||||
|
||||
.gray-content-block.top-block
|
||||
- if @user.password_automatically_set?
|
||||
Set your password.
|
||||
- else
|
||||
Change your password or recover your current one.
|
||||
%hr
|
||||
.update-password
|
||||
|
||||
.update-password.prepend-top-default
|
||||
= form_for @user, url: profile_password_path, method: :put, html: { class: 'form-horizontal' } do |f|
|
||||
%div
|
||||
%p.slead
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
%ul
|
||||
- @user.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
|
||||
|
||||
- unless @user.password_automatically_set?
|
||||
.form-group
|
||||
= f.label :current_password, class: 'control-label'
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
- page_title 'Preferences'
|
||||
%h3.page-title
|
||||
= page_title
|
||||
%p.light
|
||||
- header_title page_title, profile_preferences_path
|
||||
- @blank_container = true
|
||||
|
||||
.alert.alert-help
|
||||
These settings allow you to customize the appearance and behavior of the site.
|
||||
They are saved with your account and will persist to any device you use to
|
||||
access the site.
|
||||
%hr
|
||||
|
||||
= form_for @user, url: profile_preferences_path, remote: true, method: :put, html: {class: 'js-preferences-form form-horizontal'} do |f|
|
||||
.panel.panel-default.application-theme
|
||||
|
|
|
@ -1,14 +1,9 @@
|
|||
- page_title "Profile"
|
||||
%h3.page-title
|
||||
= page_title
|
||||
%p.light
|
||||
.gray-content-block.top-block
|
||||
This information will appear on your profile.
|
||||
- if current_user.ldap_user?
|
||||
Some options are unavailable for LDAP accounts
|
||||
%hr
|
||||
|
||||
|
||||
|
||||
.prepend-top-default
|
||||
= form_for @user, url: profile_path, method: :put, html: { multipart: true, class: "edit_user form-horizontal" }, authenticity_token: true do |f|
|
||||
-if @user.errors.any?
|
||||
%div.alert.alert-danger
|
||||
|
|
|
@ -7,6 +7,13 @@
|
|||
- if @project.description.present?
|
||||
= markdown(@project.description, pipeline: :description)
|
||||
|
||||
- if forked_from_project = @project.forked_from_project
|
||||
%p
|
||||
Forked from
|
||||
= link_to project_path(forked_from_project) do
|
||||
= forked_from_project.namespace.try(:name)
|
||||
|
||||
|
||||
|
||||
.project-repo-buttons
|
||||
= render 'projects/buttons/star'
|
||||
|
@ -14,12 +21,6 @@
|
|||
- 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
|
||||
= icon('download fw')
|
||||
|
|
|
@ -1 +1,2 @@
|
|||
- page_title "Activity"
|
||||
= render 'projects/activity'
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
- else
|
||||
= link_to title, '#'
|
||||
|
||||
%ul.blob-commit-info.well.hidden-xs
|
||||
%ul.blob-commit-info.hidden-xs
|
||||
- blob_commit = @repository.last_commit_for_path(@commit.id, blob.path)
|
||||
= render blob_commit, project: @project
|
||||
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
%ul.center-top-menu
|
||||
= nav_link(controller: [:commit, :commits]) do
|
||||
= link_to namespace_project_commits_path(@project.namespace, @project, @ref || @repository.root_ref) do
|
||||
= link_to namespace_project_commits_path(@project.namespace, @project, current_ref) do
|
||||
Commits
|
||||
%span.badge= number_with_delimiter(@repository.commit_count)
|
||||
= nav_link(controller: :compare) do
|
||||
= link_to namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: @ref || @repository.root_ref) do
|
||||
= link_to namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: current_ref) do
|
||||
Compare
|
||||
|
||||
= nav_link(html_options: {class: branches_tab_class}) do
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
- @blank_container = true
|
||||
|
||||
.project-edit-container
|
||||
.project-edit-errors
|
||||
.project-edit-content
|
||||
%div
|
||||
%h3.page-title
|
||||
.panel.panel-default
|
||||
.panel-heading
|
||||
Project settings
|
||||
%hr
|
||||
.panel-body
|
||||
= form_for [@project.namespace.becomes(Namespace), @project], remote: true, html: { multipart: true, class: "edit_project form-horizontal fieldset-form" }, authenticity_token: true do |f|
|
||||
|
||||
|
|
|
@ -10,21 +10,22 @@
|
|||
- group.each do |namespace|
|
||||
.col-md-2.col-sm-3
|
||||
- if fork = namespace.find_fork_of(@project)
|
||||
.thumbnail.fork-exists-thumbnail
|
||||
.fork-thumbnail
|
||||
= link_to project_path(fork), title: "Visit project fork", class: 'has_tooltip' do
|
||||
= image_tag namespace_icon(namespace, 200)
|
||||
= image_tag namespace_icon(namespace, 100)
|
||||
.caption
|
||||
%h4=namespace.human_name
|
||||
%p
|
||||
= namespace.path
|
||||
%strong
|
||||
= namespace.human_name
|
||||
%div.text-primary
|
||||
Already forked
|
||||
|
||||
- else
|
||||
.thumbnail.fork-thumbnail
|
||||
.fork-thumbnail
|
||||
= link_to namespace_project_fork_path(@project.namespace, @project, namespace_key: namespace.id), title: "Fork here", method: "POST", class: 'has_tooltip' do
|
||||
= image_tag namespace_icon(namespace, 200)
|
||||
= image_tag namespace_icon(namespace, 100)
|
||||
.caption
|
||||
%h4=namespace.human_name
|
||||
%p
|
||||
= namespace.path
|
||||
%strong
|
||||
= namespace.human_name
|
||||
|
||||
%p.light
|
||||
Fork is a copy of a project repository.
|
||||
|
|
|
@ -1,14 +1,15 @@
|
|||
- page_title "Labels"
|
||||
- if can? current_user, :admin_label, @project
|
||||
= link_to new_namespace_project_label_path(@project.namespace, @project), class: "pull-right btn btn-new" do
|
||||
New label
|
||||
%h3.page-title
|
||||
Labels
|
||||
%hr
|
||||
|
||||
.gray-content-block.top-block
|
||||
- if can? current_user, :admin_label, @project
|
||||
= link_to new_namespace_project_label_path(@project.namespace, @project), class: "pull-right btn btn-new" do
|
||||
New label
|
||||
.oneline
|
||||
Labels can be applied to issues and merge requests.
|
||||
|
||||
.labels
|
||||
- if @labels.present?
|
||||
%ul.bordered-list.manage-labels-list
|
||||
%ul.content-list.manage-labels-list
|
||||
= render @labels
|
||||
= paginate @labels, theme: 'gitlab'
|
||||
- else
|
||||
|
|
|
@ -1,30 +1,28 @@
|
|||
- page_title "Members"
|
||||
%h3.page-title
|
||||
Users with access to this project
|
||||
|
||||
%p.light
|
||||
.gray-content-block.top-block
|
||||
.clearfix.js-toggle-container
|
||||
= form_tag namespace_project_project_members_path(@project.namespace, @project), method: :get, class: 'form-inline member-search-form' do
|
||||
.form-group
|
||||
= search_field_tag :search, params[:search], { placeholder: 'Find existing member by name', class: 'form-control search-text-input' }
|
||||
= button_tag 'Search', class: 'btn'
|
||||
|
||||
- if can?(current_user, :admin_project_member, @project)
|
||||
%span.pull-right
|
||||
= button_tag class: 'btn btn-new btn-grouped js-toggle-button', type: 'button' do
|
||||
Add members
|
||||
%i.fa.fa-chevron-down
|
||||
= link_to import_namespace_project_project_members_path(@project.namespace, @project), class: "btn btn-grouped", title: "Import members from another project" do
|
||||
Import members
|
||||
|
||||
.js-toggle-content.hide.new-group-member-holder
|
||||
= render "new_project_member"
|
||||
|
||||
%p.prepend-top-default.light
|
||||
Users with access to this project are listed below.
|
||||
Read more about project permissions
|
||||
%strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink"
|
||||
|
||||
%hr
|
||||
|
||||
.clearfix.js-toggle-container
|
||||
= form_tag namespace_project_project_members_path(@project.namespace, @project), method: :get, class: 'form-inline member-search-form' do
|
||||
.form-group
|
||||
= search_field_tag :search, params[:search], { placeholder: 'Find existing member by name', class: 'form-control search-text-input' }
|
||||
= button_tag 'Search', class: 'btn'
|
||||
|
||||
- if can?(current_user, :admin_project_member, @project)
|
||||
%span.pull-right
|
||||
= button_tag class: 'btn btn-new btn-grouped js-toggle-button', type: 'button' do
|
||||
Add members
|
||||
%i.fa.fa-chevron-down
|
||||
= link_to import_namespace_project_project_members_path(@project.namespace, @project), class: "btn btn-grouped", title: "Import members from another project" do
|
||||
Import members
|
||||
|
||||
.js-toggle-content.hide.new-group-member-holder
|
||||
= render "new_project_member"
|
||||
|
||||
= render "team", members: @project_members
|
||||
|
||||
- if @group
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
.project-stats.gray-content-block
|
||||
%ul.nav.nav-pills
|
||||
%li
|
||||
= link_to namespace_project_commits_path(@project.namespace, @project, @ref || @repository.root_ref) do
|
||||
= link_to namespace_project_commits_path(@project.namespace, @project, current_ref) do
|
||||
= pluralize(number_with_delimiter(@project.commit_count), 'commit')
|
||||
%li
|
||||
= link_to namespace_project_branches_path(@project.namespace, @project) do
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
= f.label :title, class: 'control-label' do
|
||||
%strong= 'Title *'
|
||||
.col-sm-10
|
||||
= f.text_field :title, maxlength: 255, autofocus: true,
|
||||
= f.text_field :title, maxlength: 255, autofocus: true, autocomplete: 'off',
|
||||
class: 'form-control pad js-gfm-input', required: true
|
||||
|
||||
- if issuable.is_a?(MergeRequest)
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
%ul.center-top-menu
|
||||
= nav_link(page: user_snippets_path(current_user), html_options: {class: 'home'}) do
|
||||
= link_to user_snippets_path(current_user), title: 'Your snippets', data: {placement: 'right'} do
|
||||
Your Snippets
|
||||
= nav_link(page: snippets_path) do
|
||||
= link_to snippets_path, title: 'Explore snippets', data: {placement: 'right'} do
|
||||
Explore Snippets
|
|
@ -1,36 +0,0 @@
|
|||
- page_title "Your Snippets"
|
||||
= render 'head'
|
||||
|
||||
.gray-content-block
|
||||
.pull-right
|
||||
= link_to new_snippet_path, class: "btn btn-new", title: "New Snippet" do
|
||||
Add new snippet
|
||||
|
||||
.oneline
|
||||
Share code pastes with others out of git repository
|
||||
|
||||
%ul.nav.nav-tabs.prepend-top-20
|
||||
= nav_tab :scope, nil do
|
||||
= link_to user_snippets_path(@user) do
|
||||
All
|
||||
%span.badge
|
||||
= @user.snippets.count
|
||||
= nav_tab :scope, 'are_private' do
|
||||
= link_to user_snippets_path(@user, scope: 'are_private') do
|
||||
Private
|
||||
%span.badge
|
||||
= @user.snippets.are_private.count
|
||||
= nav_tab :scope, 'are_internal' do
|
||||
= link_to user_snippets_path(@user, scope: 'are_internal') do
|
||||
Internal
|
||||
%span.badge
|
||||
= @user.snippets.are_internal.count
|
||||
= nav_tab :scope, 'are_public' do
|
||||
= link_to user_snippets_path(@user, scope: 'are_public') do
|
||||
Public
|
||||
%span.badge
|
||||
= @user.snippets.are_public.count
|
||||
|
||||
.my-snippets
|
||||
= render 'snippets'
|
||||
|
|
@ -1,15 +1,13 @@
|
|||
- page_title "Public Snippets"
|
||||
- if current_user
|
||||
= render 'head'
|
||||
- page_title "By #{@user.name}", "Snippets"
|
||||
|
||||
.gray-content-block
|
||||
- if current_user
|
||||
.pull-right
|
||||
= link_to new_snippet_path, class: "btn btn-new", title: "New Snippet" do
|
||||
Add new snippet
|
||||
|
||||
.oneline
|
||||
Public snippets created by you and other users are listed here
|
||||
%ol.breadcrumb
|
||||
%li
|
||||
= link_to snippets_path do
|
||||
Snippets
|
||||
%li
|
||||
= @user.name
|
||||
.pull-right.hidden-xs
|
||||
= link_to user_path(@user) do
|
||||
#{@user.name} profile page
|
||||
|
||||
= render 'snippets'
|
||||
|
||||
|
|
|
@ -20,10 +20,10 @@
|
|||
|
||||
.back-link
|
||||
- if @snippet.author == current_user
|
||||
= link_to user_snippets_path(current_user) do
|
||||
= link_to dashboard_snippets_path do
|
||||
← your snippets
|
||||
- else
|
||||
= link_to snippets_path do
|
||||
= link_to explore_snippets_path do
|
||||
← explore snippets
|
||||
|
||||
.file-holder
|
||||
|
|
|
@ -1,13 +0,0 @@
|
|||
- page_title "Snippets", @user.name
|
||||
|
||||
%ol.breadcrumb
|
||||
%li
|
||||
= link_to snippets_path do
|
||||
Snippets
|
||||
%li
|
||||
= @user.name
|
||||
.pull-right.hidden-xs
|
||||
= link_to user_path(@user) do
|
||||
#{@user.name} profile page
|
||||
|
||||
= render 'snippets'
|
|
@ -0,0 +1,34 @@
|
|||
class RepositoryForkWorker
|
||||
include Sidekiq::Worker
|
||||
include Gitlab::ShellAdapter
|
||||
|
||||
sidekiq_options queue: :gitlab_shell
|
||||
|
||||
def perform(project_id, source_path, target_path)
|
||||
project = Project.find_by_id(project_id)
|
||||
|
||||
unless project.present?
|
||||
logger.error("Project #{project_id} no longer exists!")
|
||||
return
|
||||
end
|
||||
|
||||
result = gitlab_shell.fork_repository(source_path, target_path)
|
||||
|
||||
unless result
|
||||
logger.error("Unable to fork project #{project_id} for repository #{source_path} -> #{target_path}")
|
||||
project.import_fail
|
||||
project.save
|
||||
return
|
||||
end
|
||||
|
||||
if project.valid_repo?
|
||||
ProjectCacheWorker.perform_async(project.id)
|
||||
project.import_finish
|
||||
else
|
||||
project.import_fail
|
||||
logger.error("Project #{id} had an invalid repository after fork")
|
||||
end
|
||||
|
||||
project.save
|
||||
end
|
||||
end
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue