Merge branch 'master' into ci-and-ce-sitting-in-a-tree-k-i-s-s-i-n-g
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
This commit is contained in:
commit
e3c30bf2e8
54 changed files with 517 additions and 170 deletions
19
CHANGELOG
19
CHANGELOG
|
@ -1,13 +1,15 @@
|
|||
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)
|
||||
- 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)
|
||||
|
@ -35,20 +37,29 @@ v 8.0.0 (unreleased)
|
|||
- 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.
|
||||
- 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)
|
||||
- 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.
|
||||
|
|
|
@ -294,7 +294,7 @@ GEM
|
|||
github-markup (~> 1.3.3)
|
||||
gollum-grit_adapter (~> 1.0)
|
||||
nokogiri (~> 1.6.4)
|
||||
rouge (~> 1.7.4)
|
||||
rouge (~> 1.10.1)
|
||||
sanitize (~> 2.1.0)
|
||||
stringex (~> 2.5.1)
|
||||
gon (5.0.4)
|
||||
|
@ -565,7 +565,7 @@ GEM
|
|||
netrc (~> 0.7)
|
||||
rinku (1.7.3)
|
||||
rotp (1.6.1)
|
||||
rouge (1.7.7)
|
||||
rouge (1.10.1)
|
||||
rqrcode (0.7.0)
|
||||
chunky_png
|
||||
rqrcode-rails3 (0.1.7)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
- @blank_container = true
|
||||
.panel.panel-default
|
||||
.panel-heading
|
||||
%strong= @group.name
|
||||
|
|
|
@ -19,7 +19,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
|
||||
|
|
|
@ -37,14 +37,15 @@
|
|||
= 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
|
||||
- if current_user
|
||||
%li.separate-item
|
||||
= nav_link(controller: :profile) do
|
||||
= link_to profile_path, title: 'Profile settings', data: {toggle: 'tooltip', placement: 'bottom'} do
|
||||
= icon('user fw')
|
||||
%span
|
||||
Profile Settings
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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,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')
|
||||
|
|
|
@ -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,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.
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -2,7 +2,12 @@
|
|||
|
||||
require 'gitlab/current_settings'
|
||||
include Gitlab::CurrentSettings
|
||||
Settings.gitlab['session_expire_delay'] = current_application_settings.session_expire_delay
|
||||
|
||||
# allow it to fail: it may to do so when create_from_defaults is executed before migrations are actually done
|
||||
begin
|
||||
Settings.gitlab['session_expire_delay'] = current_application_settings.session_expire_delay
|
||||
rescue
|
||||
end
|
||||
|
||||
Gitlab::Application.config.session_store(
|
||||
:redis_store, # Using the cookie_store would enable session replay attacks.
|
||||
|
|
|
@ -27,6 +27,14 @@ Delete Asana service for a project.
|
|||
DELETE /projects/:id/services/asana
|
||||
```
|
||||
|
||||
### Get Asana service settings
|
||||
|
||||
Get Asana service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/asana
|
||||
```
|
||||
|
||||
## Assembla
|
||||
|
||||
Project Management Software (Source Commits Endpoint)
|
||||
|
@ -52,6 +60,14 @@ Delete Assembla service for a project.
|
|||
DELETE /projects/:id/services/assembla
|
||||
```
|
||||
|
||||
### Get Assembla service settings
|
||||
|
||||
Get Assembla service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/assembla
|
||||
```
|
||||
|
||||
## Atlassian Bamboo CI
|
||||
|
||||
A continuous integration and build server
|
||||
|
@ -81,6 +97,14 @@ Delete Atlassian Bamboo CI service for a project.
|
|||
DELETE /projects/:id/services/bamboo
|
||||
```
|
||||
|
||||
### Get Atlassian Bamboo CI service settings
|
||||
|
||||
Get Atlassian Bamboo CI service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/bamboo
|
||||
```
|
||||
|
||||
## Buildkite
|
||||
|
||||
Continuous integration and deployments
|
||||
|
@ -107,6 +131,14 @@ Delete Buildkite service for a project.
|
|||
DELETE /projects/:id/services/buildkite
|
||||
```
|
||||
|
||||
### Get Buildkite service settings
|
||||
|
||||
Get Buildkite service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/buildkite
|
||||
```
|
||||
|
||||
## Campfire
|
||||
|
||||
Simple web-based real-time group chat
|
||||
|
@ -133,6 +165,14 @@ Delete Campfire service for a project.
|
|||
DELETE /projects/:id/services/campfire
|
||||
```
|
||||
|
||||
### Get Campfire service settings
|
||||
|
||||
Get Campfire service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/campfire
|
||||
```
|
||||
|
||||
## Custom Issue Tracker
|
||||
|
||||
Custom issue tracker
|
||||
|
@ -161,6 +201,14 @@ Delete Custom Issue Tracker service for a project.
|
|||
DELETE /projects/:id/services/custom-issue-tracker
|
||||
```
|
||||
|
||||
### Get Custom Issue Tracker service settings
|
||||
|
||||
Get Custom Issue Tracker service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/custom-issue-tracker
|
||||
```
|
||||
|
||||
## Drone CI
|
||||
|
||||
Drone is a Continuous Integration platform built on Docker, written in Go
|
||||
|
@ -187,6 +235,14 @@ Delete Drone CI service for a project.
|
|||
DELETE /projects/:id/services/drone-ci
|
||||
```
|
||||
|
||||
### Get Drone CI service settings
|
||||
|
||||
Get Drone CI service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/drone-ci
|
||||
```
|
||||
|
||||
## Emails on push
|
||||
|
||||
Email the commits and diff of each push to a list of recipients.
|
||||
|
@ -213,6 +269,14 @@ Delete Emails on push service for a project.
|
|||
DELETE /projects/:id/services/emails-on-push
|
||||
```
|
||||
|
||||
### Get Emails on push service settings
|
||||
|
||||
Get Emails on push service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/emails-on-push
|
||||
```
|
||||
|
||||
## External Wiki
|
||||
|
||||
Replaces the link to the internal wiki with a link to an external wiki.
|
||||
|
@ -237,6 +301,14 @@ Delete External Wiki service for a project.
|
|||
DELETE /projects/:id/services/external-wiki
|
||||
```
|
||||
|
||||
### Get External Wiki service settings
|
||||
|
||||
Get External Wiki service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/external-wiki
|
||||
```
|
||||
|
||||
## Flowdock
|
||||
|
||||
Flowdock is a collaboration web app for technical teams.
|
||||
|
@ -261,6 +333,14 @@ Delete Flowdock service for a project.
|
|||
DELETE /projects/:id/services/flowdock
|
||||
```
|
||||
|
||||
### Get Flowdock service settings
|
||||
|
||||
Get Flowdock service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/flowdock
|
||||
```
|
||||
|
||||
## Gemnasium
|
||||
|
||||
Gemnasium monitors your project dependencies and alerts you about updates and security vulnerabilities.
|
||||
|
@ -286,6 +366,14 @@ Delete Gemnasium service for a project.
|
|||
DELETE /projects/:id/services/gemnasium
|
||||
```
|
||||
|
||||
### Get Gemnasium service settings
|
||||
|
||||
Get Gemnasium service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/gemnasium
|
||||
```
|
||||
|
||||
## GitLab CI
|
||||
|
||||
Continuous integration server from GitLab
|
||||
|
@ -312,6 +400,14 @@ Delete GitLab CI service for a project.
|
|||
DELETE /projects/:id/services/gitlab-ci
|
||||
```
|
||||
|
||||
### Get GitLab CI service settings
|
||||
|
||||
Get GitLab CI service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/gitlab-ci
|
||||
```
|
||||
|
||||
## HipChat
|
||||
|
||||
Private group chat and IM
|
||||
|
@ -341,6 +437,14 @@ Delete HipChat service for a project.
|
|||
DELETE /projects/:id/services/hipchat
|
||||
```
|
||||
|
||||
### Get HipChat service settings
|
||||
|
||||
Get HipChat service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/hipchat
|
||||
```
|
||||
|
||||
## Irker (IRC gateway)
|
||||
|
||||
Send IRC messages, on update, to a list of recipients through an Irker gateway.
|
||||
|
@ -371,6 +475,14 @@ Delete Irker (IRC gateway) service for a project.
|
|||
DELETE /projects/:id/services/irker
|
||||
```
|
||||
|
||||
### Get Irker (IRC gateway) service settings
|
||||
|
||||
Get Irker (IRC gateway) service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/irker
|
||||
```
|
||||
|
||||
## JIRA
|
||||
|
||||
Jira issue tracker
|
||||
|
@ -400,6 +512,14 @@ Delete JIRA service for a project.
|
|||
DELETE /projects/:id/services/jira
|
||||
```
|
||||
|
||||
### Get JIRA service settings
|
||||
|
||||
Get JIRA service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/jira
|
||||
```
|
||||
|
||||
## PivotalTracker
|
||||
|
||||
Project Management Software (Source Commits Endpoint)
|
||||
|
@ -424,6 +544,14 @@ Delete PivotalTracker service for a project.
|
|||
DELETE /projects/:id/services/pivotaltracker
|
||||
```
|
||||
|
||||
### Get PivotalTracker service settings
|
||||
|
||||
Get PivotalTracker service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/pivotaltracker
|
||||
```
|
||||
|
||||
## Pushover
|
||||
|
||||
Pushover makes it easy to get real-time notifications on your Android device, iPhone, iPad, and Desktop.
|
||||
|
@ -452,6 +580,14 @@ Delete Pushover service for a project.
|
|||
DELETE /projects/:id/services/pushover
|
||||
```
|
||||
|
||||
### Get Pushover service settings
|
||||
|
||||
Get Pushover service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/pushover
|
||||
```
|
||||
|
||||
## Redmine
|
||||
|
||||
Redmine issue tracker
|
||||
|
@ -479,6 +615,14 @@ Delete Redmine service for a project.
|
|||
DELETE /projects/:id/services/redmine
|
||||
```
|
||||
|
||||
### Get Redmine service settings
|
||||
|
||||
Get Redmine service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/redmine
|
||||
```
|
||||
|
||||
## Slack
|
||||
|
||||
A team communication tool for the 21st century
|
||||
|
@ -505,6 +649,14 @@ Delete Slack service for a project.
|
|||
DELETE /projects/:id/services/slack
|
||||
```
|
||||
|
||||
### Get Slack service settings
|
||||
|
||||
Get Slack service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/slack
|
||||
```
|
||||
|
||||
## JetBrains TeamCity CI
|
||||
|
||||
A continuous integration and build server
|
||||
|
@ -534,3 +686,11 @@ Delete JetBrains TeamCity CI service for a project.
|
|||
DELETE /projects/:id/services/teamcity
|
||||
```
|
||||
|
||||
### Get JetBrains TeamCity CI service settings
|
||||
|
||||
Get JetBrains TeamCity CI service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/teamcity
|
||||
```
|
||||
|
||||
|
|
|
@ -162,7 +162,7 @@ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab
|
|||
TIP: to see what changed in `gitlab.yml.example` in this release use next command:
|
||||
|
||||
```
|
||||
git diff 6-0-stable:config/gitlab.yml.example 7.14-stable:config/gitlab.yml.example
|
||||
git diff 6-0-stable:config/gitlab.yml.example 7-14-stable:config/gitlab.yml.example
|
||||
```
|
||||
|
||||
* Make `/home/git/gitlab/config/gitlab.yml` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/7-14-stable/config/gitlab.yml.example but with your settings.
|
||||
|
|
|
@ -25,6 +25,9 @@ RUN mkdir -p /opt/gitlab/sv/sshd/supervise \
|
|||
&& ln -s /opt/gitlab/sv/sshd /opt/gitlab/service \
|
||||
&& mkdir -p /var/run/sshd
|
||||
|
||||
# Disabling use DNS in ssh since it tends to slow connecting
|
||||
RUN echo "UseDNS no" >> /etc/ssh/sshd_config
|
||||
|
||||
# Prepare default configuration
|
||||
RUN ( \
|
||||
echo "" && \
|
||||
|
|
|
@ -4,11 +4,13 @@ class Spinach::Features::AdminUsers < Spinach::FeatureSteps
|
|||
include SharedAdmin
|
||||
|
||||
before do
|
||||
allow(Devise).to receive(:omniauth_providers).and_return([:twitter, :twitter_updated])
|
||||
allow(Gitlab::OAuth::Provider).to receive(:providers).and_return([:twitter, :twitter_updated])
|
||||
allow_any_instance_of(ApplicationHelper).to receive(:user_omniauth_authorize_path).and_return(root_path)
|
||||
end
|
||||
|
||||
after do
|
||||
allow(Devise).to receive(:omniauth_providers).and_call_original
|
||||
allow(Gitlab::OAuth::Provider).to receive(:providers).and_call_original
|
||||
allow_any_instance_of(ApplicationHelper).to receive(:user_omniauth_authorize_path).and_call_original
|
||||
end
|
||||
|
||||
step 'I should see all users' do
|
||||
|
|
|
@ -49,6 +49,16 @@ module API
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Get <service_slug> service settings for project
|
||||
#
|
||||
# Example Request:
|
||||
#
|
||||
# GET /project/:id/services/gitlab-ci
|
||||
#
|
||||
get ':id/services/:service_slug' do
|
||||
present project_service
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -77,7 +77,7 @@ module Gitlab
|
|||
pipeline: options[:pipeline],
|
||||
|
||||
# EmojiFilter
|
||||
asset_root: Gitlab.config.gitlab.url,
|
||||
asset_root: Gitlab.config.gitlab.base_url,
|
||||
asset_host: Gitlab::Application.config.asset_host,
|
||||
|
||||
# TableOfContentsFilter
|
||||
|
|
|
@ -67,12 +67,16 @@ module Gitlab
|
|||
|
||||
def clean_spans
|
||||
lambda do |env|
|
||||
return unless env[:node_name] == 'span'
|
||||
return unless env[:node].has_attribute?('class')
|
||||
node = env[:node]
|
||||
|
||||
unless has_ancestor?(env[:node], 'pre')
|
||||
env[:node].remove_attribute('class')
|
||||
return unless node.name == 'span'
|
||||
return unless node.has_attribute?('class')
|
||||
|
||||
unless has_ancestor?(node, 'pre')
|
||||
node.remove_attribute('class')
|
||||
end
|
||||
|
||||
{ node_whitelist: [node] }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -21,7 +21,13 @@ module Gitlab
|
|||
language = node.attr('class')
|
||||
code = node.text
|
||||
|
||||
highlighted = block_code(code, language)
|
||||
begin
|
||||
highlighted = block_code(code, language)
|
||||
rescue
|
||||
# Gracefully handle syntax highlighter bugs/errors to ensure
|
||||
# users can still access an issue/comment/etc.
|
||||
highlighted = "<pre>#{code}</pre>"
|
||||
end
|
||||
|
||||
# Replace the parent `pre` element with the entire highlighted block
|
||||
node.parent.replace(highlighted)
|
||||
|
|
|
@ -40,6 +40,15 @@ DELETE /projects/:id/services/<%= service[:dashed_name] %>
|
|||
|
||||
```
|
||||
|
||||
### Get <%= service[:title] %> service settings
|
||||
|
||||
Get <%= service[:title] %> service settings for a project.
|
||||
|
||||
```
|
||||
GET /projects/:id/services/<%= service[:dashed_name] %>
|
||||
|
||||
```
|
||||
|
||||
<% end %>
|
||||
ERB
|
||||
|
||||
|
|
42
spec/javascripts/syntax_highlight_spec.js.coffee
Normal file
42
spec/javascripts/syntax_highlight_spec.js.coffee
Normal file
|
@ -0,0 +1,42 @@
|
|||
#= require syntax_highlight
|
||||
|
||||
describe 'Syntax Highlighter', ->
|
||||
stubUserColorScheme = (value) ->
|
||||
window.gon ?= {}
|
||||
window.gon.user_color_scheme = value
|
||||
|
||||
describe 'on a js-syntax-highlight element', ->
|
||||
beforeEach ->
|
||||
fixture.set('<div class="js-syntax-highlight"></div>')
|
||||
|
||||
it 'applies syntax highlighting', ->
|
||||
stubUserColorScheme('monokai')
|
||||
|
||||
$('.js-syntax-highlight').syntaxHighlight()
|
||||
|
||||
expect($('.js-syntax-highlight')).toHaveClass('monokai')
|
||||
|
||||
describe 'on a parent element', ->
|
||||
beforeEach ->
|
||||
fixture.set """
|
||||
<div class="parent">
|
||||
<div class="js-syntax-highlight"></div>
|
||||
<div class="foo"></div>
|
||||
<div class="js-syntax-highlight"></div>
|
||||
</div>
|
||||
"""
|
||||
|
||||
it 'applies highlighting to all applicable children', ->
|
||||
stubUserColorScheme('monokai')
|
||||
|
||||
$('.parent').syntaxHighlight()
|
||||
|
||||
expect($('.parent, .foo')).not.toHaveClass('monokai')
|
||||
expect($('.monokai').length).toBe(2)
|
||||
|
||||
it 'prevents an infinite loop when no matches exist', ->
|
||||
fixture.set('<div></div>')
|
||||
|
||||
highlight = -> $('div').syntaxHighlight()
|
||||
|
||||
expect(highlight).not.toThrow()
|
19
spec/lib/gitlab/markdown/syntax_highlight_filter_spec.rb
Normal file
19
spec/lib/gitlab/markdown/syntax_highlight_filter_spec.rb
Normal file
|
@ -0,0 +1,19 @@
|
|||
require 'spec_helper'
|
||||
|
||||
module Gitlab::Markdown
|
||||
describe SyntaxHighlightFilter do
|
||||
include FilterSpecHelper
|
||||
|
||||
it 'highlights valid code blocks' do
|
||||
result = filter('<pre><code>def fun end</code>')
|
||||
expect(result.to_html).to eq("<pre class=\"code highlight js-syntax-highlight plaintext\"><code>def fun end</code></pre>\n")
|
||||
end
|
||||
|
||||
it 'passes through invalid code blocks' do
|
||||
allow_any_instance_of(SyntaxHighlightFilter).to receive(:block_code).and_raise(StandardError)
|
||||
|
||||
result = filter('<pre><code>This is a test</code></pre>')
|
||||
expect(result.to_html).to eq('<pre>This is a test</pre>')
|
||||
end
|
||||
end
|
||||
end
|
|
@ -47,5 +47,15 @@ describe API::API, api: true do
|
|||
expect(project.send(service_method).activated?).to be_falsey
|
||||
end
|
||||
end
|
||||
|
||||
describe "GET /projects/:id/services/#{service.dasherize}" do
|
||||
include_context service
|
||||
|
||||
it "should get #{service} settings" do
|
||||
get api("/projects/#{project.id}/services/#{dashed_service}", user)
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -28,6 +28,7 @@ RSpec.configure do |config|
|
|||
config.include LoginHelpers, type: :feature
|
||||
config.include LoginHelpers, type: :request
|
||||
config.include StubConfiguration
|
||||
config.include RelativeUrl, type: feature
|
||||
config.include TestEnv
|
||||
config.include StubGitlabCalls
|
||||
config.include StubGitlabData
|
||||
|
|
|
@ -27,6 +27,9 @@ module MarkdownMatchers
|
|||
|
||||
match do |actual|
|
||||
expect(actual).to have_selector('img.emoji', count: 10)
|
||||
|
||||
image = actual.at_css('img.emoji')
|
||||
expect(image['src'].to_s).to start_with(Gitlab.config.gitlab.url + '/assets')
|
||||
end
|
||||
end
|
||||
|
||||
|
|
8
spec/support/relative_url.rb
Normal file
8
spec/support/relative_url.rb
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Fix route helpers in tests (e.g. root_path, ...)
|
||||
module RelativeUrl
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
default_url_options[:script_name] = Rails.application.config.relative_url_root
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue