Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-09-11 17:32:11 +0300
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-09-11 17:32:11 +0300
commite3c30bf2e84462810bd8eff941681682a7ce6dc7 (patch)
treeb7755ec091db0a66292a19dc2a909bcfad4f67e9
parentcd606e17907071af5ddf1d844deec0365c254604 (diff)
parent4f461fd45f65dbd6900088149b48649b27a7c2ce (diff)
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>
-rw-r--r--CHANGELOG19
-rw-r--r--Gemfile.lock4
-rw-r--r--app/assets/javascripts/dropzone_input.js.coffee1
-rw-r--r--app/assets/javascripts/notes.js.coffee5
-rw-r--r--app/assets/javascripts/syntax_highlight.coffee10
-rw-r--r--app/assets/stylesheets/base/gl_bootstrap.scss20
-rw-r--r--app/assets/stylesheets/base/gl_variables.scss11
-rw-r--r--app/assets/stylesheets/base/mixins.scss4
-rw-r--r--app/assets/stylesheets/base/variables.scss2
-rw-r--r--app/assets/stylesheets/generic/blocks.scss4
-rw-r--r--app/assets/stylesheets/generic/buttons.scss2
-rw-r--r--app/assets/stylesheets/generic/files.scss37
-rw-r--r--app/assets/stylesheets/generic/sidebar.scss8
-rw-r--r--app/assets/stylesheets/highlight/white.scss8
-rw-r--r--app/assets/stylesheets/pages/diff.scss6
-rw-r--r--app/assets/stylesheets/pages/projects.scss27
-rw-r--r--app/assets/stylesheets/pages/tree.scss37
-rw-r--r--app/helpers/page_layout_helper.rb22
-rw-r--r--app/views/groups/edit.html.haml1
-rw-r--r--app/views/layouts/_page.html.haml2
-rw-r--r--app/views/layouts/nav/_dashboard.html.haml11
-rw-r--r--app/views/layouts/nav/_profile.html.haml2
-rw-r--r--app/views/layouts/profile.html.haml3
-rw-r--r--app/views/profiles/accounts/show.html.haml10
-rw-r--r--app/views/profiles/applications.html.haml9
-rw-r--r--app/views/profiles/audit_log.html.haml9
-rw-r--r--app/views/profiles/emails/index.html.haml10
-rw-r--r--app/views/profiles/keys/index.html.haml13
-rw-r--r--app/views/profiles/notifications/show.html.haml8
-rw-r--r--app/views/profiles/passwords/edit.html.haml10
-rw-r--r--app/views/profiles/passwords/new.html.haml2
-rw-r--r--app/views/profiles/preferences/show.html.haml8
-rw-r--r--app/views/profiles/show.html.haml9
-rw-r--r--app/views/projects/_home_panel.html.haml13
-rw-r--r--app/views/projects/blob/_blob.html.haml2
-rw-r--r--app/views/projects/edit.html.haml7
-rw-r--r--app/views/projects/forks/new.html.haml21
-rw-r--r--app/views/shared/issuable/_form.html.haml2
-rw-r--r--config/initializers/session_store.rb7
-rw-r--r--doc/api/services.md160
-rw-r--r--doc/update/6.x-or-7.x-to-7.14.md2
-rw-r--r--docker/Dockerfile3
-rw-r--r--features/steps/admin/users.rb6
-rw-r--r--lib/api/services.rb10
-rw-r--r--lib/gitlab/markdown.rb2
-rw-r--r--lib/gitlab/markdown/sanitization_filter.rb12
-rw-r--r--lib/gitlab/markdown/syntax_highlight_filter.rb8
-rw-r--r--lib/tasks/services.rake9
-rw-r--r--spec/javascripts/syntax_highlight_spec.js.coffee42
-rw-r--r--spec/lib/gitlab/markdown/syntax_highlight_filter_spec.rb19
-rw-r--r--spec/requests/api/services_spec.rb10
-rw-r--r--spec/spec_helper.rb1
-rw-r--r--spec/support/matchers/markdown_matchers.rb3
-rw-r--r--spec/support/relative_url.rb8
54 files changed, 514 insertions, 167 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 3a1cbe4bc56..2ae83d5b3ce 100644
--- a/CHANGELOG
+++ b/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.
diff --git a/Gemfile.lock b/Gemfile.lock
index f252d33c9ad..c8a833ea4d0 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -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)
diff --git a/app/assets/javascripts/dropzone_input.js.coffee b/app/assets/javascripts/dropzone_input.js.coffee
index a0dcaa8c27a..6f789e668af 100644
--- a/app/assets/javascripts/dropzone_input.js.coffee
+++ b/app/assets/javascripts/dropzone_input.js.coffee
@@ -167,6 +167,7 @@ class @DropzoneInput
dataType: "json"
).success (data) ->
preview.html data.body
+ preview.syntaxHighlight()
renderReferencedUsers data.references.users
diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee
index b7f2c63c5a7..ce638c2641b 100644
--- a/app/assets/javascripts/notes.js.coffee
+++ b/app/assets/javascripts/notes.js.coffee
@@ -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()
###
diff --git a/app/assets/javascripts/syntax_highlight.coffee b/app/assets/javascripts/syntax_highlight.coffee
index 71295cd4b08..980f0232d10 100644
--- a/app/assets/javascripts/syntax_highlight.coffee
+++ b/app/assets/javascripts/syntax_highlight.coffee
@@ -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()
diff --git a/app/assets/stylesheets/base/gl_bootstrap.scss b/app/assets/stylesheets/base/gl_bootstrap.scss
index ae72c5b8d97..eb8d23d6453 100644
--- a/app/assets/stylesheets/base/gl_bootstrap.scss
+++ b/app/assets/stylesheets/base/gl_bootstrap.scss
@@ -156,10 +156,16 @@
* Add some extra stuff to panels
*
*/
+
+.container-blank .panel .panel-heading {
+ font-size: 17px;
+ line-height: 38px;
+}
+
.panel {
- .panel-heading {
- font-weight: bold;
+ 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,
diff --git a/app/assets/stylesheets/base/gl_variables.scss b/app/assets/stylesheets/base/gl_variables.scss
index d18b48eaca9..bfef5f78f83 100644
--- a/app/assets/stylesheets/base/gl_variables.scss
+++ b/app/assets/stylesheets/base/gl_variables.scss
@@ -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
//
diff --git a/app/assets/stylesheets/base/mixins.scss b/app/assets/stylesheets/base/mixins.scss
index 0f661d6b1b6..a2f6c3e21f4 100644
--- a/app/assets/stylesheets/base/mixins.scss
+++ b/app/assets/stylesheets/base/mixins.scss
@@ -55,10 +55,10 @@
}
@mixin md-typography {
- color: #444;
+ color: $md-text-color;
a {
- color: #3084bb;
+ color: $md-link-color;
}
img {
diff --git a/app/assets/stylesheets/base/variables.scss b/app/assets/stylesheets/base/variables.scss
index 21462b31127..2fc7bf1720a 100644
--- a/app/assets/stylesheets/base/variables.scss
+++ b/app/assets/stylesheets/base/variables.scss
@@ -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;
diff --git a/app/assets/stylesheets/generic/blocks.scss b/app/assets/stylesheets/generic/blocks.scss
index 27a4c4db8c8..48d9f890f62 100644
--- a/app/assets/stylesheets/generic/blocks.scss
+++ b/app/assets/stylesheets/generic/blocks.scss
@@ -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;
diff --git a/app/assets/stylesheets/generic/buttons.scss b/app/assets/stylesheets/generic/buttons.scss
index e8237509092..46ef595ddf0 100644
--- a/app/assets/stylesheets/generic/buttons.scss
+++ b/app/assets/stylesheets/generic/buttons.scss
@@ -10,7 +10,7 @@
}
&.btn-save {
- @extend .btn-primary;
+ @extend .btn-success;
}
&.btn-remove {
diff --git a/app/assets/stylesheets/generic/files.scss b/app/assets/stylesheets/generic/files.scss
index f845342c67b..9dd77747884 100644
--- a/app/assets/stylesheets/generic/files.scss
+++ b/app/assets/stylesheets/generic/files.scss
@@ -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 {
diff --git a/app/assets/stylesheets/generic/sidebar.scss b/app/assets/stylesheets/generic/sidebar.scss
index 22720c2e1d5..41ffd358576 100644
--- a/app/assets/stylesheets/generic/sidebar.scss
+++ b/app/assets/stylesheets/generic/sidebar.scss
@@ -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;
diff --git a/app/assets/stylesheets/highlight/white.scss b/app/assets/stylesheets/highlight/white.scss
index e0edfb80b42..5de589109bd 100644
--- a/app/assets/stylesheets/highlight/white.scss
+++ b/app/assets/stylesheets/highlight/white.scss
@@ -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
diff --git a/app/assets/stylesheets/pages/diff.scss b/app/assets/stylesheets/pages/diff.scss
index 487b600e31d..5e7e59a6af8 100644
--- a/app/assets/stylesheets/pages/diff.scss
+++ b/app/assets/stylesheets/pages/diff.scss
@@ -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;
diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss
index 361fd63bc79..53004fca350 100644
--- a/app/assets/stylesheets/pages/projects.scss
+++ b/app/assets/stylesheets/pages/projects.scss
@@ -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;
- }
- }
-
- &.fork-thumbnail {
- border-color: #AAA;
-
- &:hover {
- background-color: $hover;
- }
+ .caption {
+ padding: $gl-padding 0;
+ min-height: 30px;
}
- a {
- text-decoration: none;
+ img {
+ @include border-radius(50%);
+ max-width: 100px;
}
}
}
diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss
index 587d09a04a5..71ca37c0cd7 100644
--- a/app/assets/stylesheets/pages/tree.scss
+++ b/app/assets/stylesheets/pages/tree.scss
@@ -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;
}
}
}
diff --git a/app/helpers/page_layout_helper.rb b/app/helpers/page_layout_helper.rb
index 8473d6d75d0..df37be51ce9 100644
--- a/app/helpers/page_layout_helper.rb
+++ b/app/helpers/page_layout_helper.rb
@@ -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
diff --git a/app/views/groups/edit.html.haml b/app/views/groups/edit.html.haml
index 2ff4b7e23ea..ac7d9ba0f4f 100644
--- a/app/views/groups/edit.html.haml
+++ b/app/views/groups/edit.html.haml
@@ -1,3 +1,4 @@
+- @blank_container = true
.panel.panel-default
.panel-heading
%strong= @group.name
diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml
index c1746676ae2..707905ee92a 100644
--- a/app/views/layouts/_page.html.haml
+++ b/app/views/layouts/_page.html.haml
@@ -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
diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml
index 0cf1c3d5d27..7d3764a76a3 100644
--- a/app/views/layouts/nav/_dashboard.html.haml
+++ b/app/views/layouts/nav/_dashboard.html.haml
@@ -37,14 +37,15 @@
= 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
- 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
- = nav_link(controller: :help) do
- = link_to help_path, title: 'Help', data: {placement: 'right'} do
- = icon('question-circle fw')
- %span
- Help
diff --git a/app/views/layouts/nav/_profile.html.haml b/app/views/layouts/nav/_profile.html.haml
index 33fd5fcef6c..abdb7544651 100644
--- a/app/views/layouts/nav/_profile.html.haml
+++ b/app/views/layouts/nav/_profile.html.haml
@@ -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')
diff --git a/app/views/layouts/profile.html.haml b/app/views/layouts/profile.html.haml
index 77d2ccbf762..b80ce0dfc75 100644
--- a/app/views/layouts/profile.html.haml
+++ b/app/views/layouts/profile.html.haml
@@ -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"
diff --git a/app/views/profiles/accounts/show.html.haml b/app/views/profiles/accounts/show.html.haml
index 767fe2e0e9a..cd7b1b0fe03 100644
--- a/app/views/profiles/accounts/show.html.haml
+++ b/app/views/profiles/accounts/show.html.haml
@@ -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')
diff --git a/app/views/profiles/applications.html.haml b/app/views/profiles/applications.html.haml
index 3a3e6e1b1c4..2342936a5d5 100644
--- a/app/views/profiles/applications.html.haml
+++ b/app/views/profiles/applications.html.haml
@@ -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
diff --git a/app/views/profiles/audit_log.html.haml b/app/views/profiles/audit_log.html.haml
index 698d6037428..8fdba45b193 100644
--- a/app/views/profiles/audit_log.html.haml
+++ b/app/views/profiles/audit_log.html.haml
@@ -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 \ No newline at end of file
+.gray-content-block.top-block
+ History of authentications
+
+.prepend-top-default
+= render 'event_table', events: @events
diff --git a/app/views/profiles/emails/index.html.haml b/app/views/profiles/emails/index.html.haml
index 66812872c41..1d140347a5f 100644
--- a/app/views/profiles/emails/index.html.haml
+++ b/app/views/profiles/emails/index.html.haml
@@ -1,12 +1,10 @@
- page_title "Emails"
-%h3.page-title
- = page_title
-%p.light
- Control emails linked to your account
-%hr
+- header_title page_title, profile_emails_path
+.gray-content-block.top-block
+ Control emails linked to your account
-%ul
+%ul.prepend-top-default
%li
Your
%b Primary Email
diff --git a/app/views/profiles/keys/index.html.haml b/app/views/profiles/keys/index.html.haml
index 06655f7ba3a..14adba1c797 100644
--- a/app/views/profiles/keys/index.html.haml
+++ b/app/views/profiles/keys/index.html.haml
@@ -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'
diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml
index db7fa2eabe3..ea4e5f3e182 100644
--- a/app/views/profiles/notifications/show.html.haml
+++ b/app/views/profiles/notifications/show.html.haml
@@ -1,10 +1,10 @@
- page_title "Notifications"
-%h3.page-title
- = page_title
-%p.light
+- header_title page_title, profile_notifications_path
+
+.gray-content-block.top-block
These are your global notification settings.
-%hr
+.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
diff --git a/app/views/profiles/passwords/edit.html.haml b/app/views/profiles/passwords/edit.html.haml
index 399ae98adf9..fab7c45c9b2 100644
--- a/app/views/profiles/passwords/edit.html.haml
+++ b/app/views/profiles/passwords/edit.html.haml
@@ -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
diff --git a/app/views/profiles/passwords/new.html.haml b/app/views/profiles/passwords/new.html.haml
index 9c6204963e0..d165f758c81 100644
--- a/app/views/profiles/passwords/new.html.haml
+++ b/app/views/profiles/passwords/new.html.haml
@@ -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'
diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml
index aa0361a0a1b..60289bfe7cd 100644
--- a/app/views/profiles/preferences/show.html.haml
+++ b/app/views/profiles/preferences/show.html.haml
@@ -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
diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml
index c519e52e596..47412e2ef0c 100644
--- a/app/views/profiles/show.html.haml
+++ b/app/views/profiles/show.html.haml
@@ -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
diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml
index b93036e78e6..dbecd1e7192 100644
--- a/app/views/projects/_home_panel.html.haml
+++ b/app/views/projects/_home_panel.html.haml
@@ -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')
diff --git a/app/views/projects/blob/_blob.html.haml b/app/views/projects/blob/_blob.html.haml
index 65c3ab10e02..b4c7d8b9b71 100644
--- a/app/views/projects/blob/_blob.html.haml
+++ b/app/views/projects/blob/_blob.html.haml
@@ -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
diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml
index e8e65d87f47..90dce739992 100644
--- a/app/views/projects/edit.html.haml
+++ b/app/views/projects/edit.html.haml
@@ -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|
diff --git a/app/views/projects/forks/new.html.haml b/app/views/projects/forks/new.html.haml
index b7a2ed68e25..cd5f3a5d39e 100644
--- a/app/views/projects/forks/new.html.haml
+++ b/app/views/projects/forks/new.html.haml
@@ -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.
diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml
index 09327d645f3..1aa1e3c6c97 100644
--- a/app/views/shared/issuable/_form.html.haml
+++ b/app/views/shared/issuable/_form.html.haml
@@ -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)
diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb
index c3bee1c7cec..04ed9e90df5 100644
--- a/config/initializers/session_store.rb
+++ b/config/initializers/session_store.rb
@@ -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.
diff --git a/doc/api/services.md b/doc/api/services.md
index bc5049dd302..7d45b2cf463 100644
--- a/doc/api/services.md
+++ b/doc/api/services.md
@@ -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
+```
+
diff --git a/doc/update/6.x-or-7.x-to-7.14.md b/doc/update/6.x-or-7.x-to-7.14.md
index 5bc1f84270a..b34fb12da6f 100644
--- a/doc/update/6.x-or-7.x-to-7.14.md
+++ b/doc/update/6.x-or-7.x-to-7.14.md
@@ -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.
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 05521af6963..304bb97409e 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -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 "" && \
diff --git a/features/steps/admin/users.rb b/features/steps/admin/users.rb
index 2e17d5c4c2e..4bc290b6bdf 100644
--- a/features/steps/admin/users.rb
+++ b/features/steps/admin/users.rb
@@ -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
diff --git a/lib/api/services.rb b/lib/api/services.rb
index 6d2322bb464..6727e80ac1e 100644
--- a/lib/api/services.rb
+++ b/lib/api/services.rb
@@ -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
diff --git a/lib/gitlab/markdown.rb b/lib/gitlab/markdown.rb
index 097caf67a65..ae5f2544691 100644
--- a/lib/gitlab/markdown.rb
+++ b/lib/gitlab/markdown.rb
@@ -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
diff --git a/lib/gitlab/markdown/sanitization_filter.rb b/lib/gitlab/markdown/sanitization_filter.rb
index 68ed57f6257..e368de7d848 100644
--- a/lib/gitlab/markdown/sanitization_filter.rb
+++ b/lib/gitlab/markdown/sanitization_filter.rb
@@ -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
diff --git a/lib/gitlab/markdown/syntax_highlight_filter.rb b/lib/gitlab/markdown/syntax_highlight_filter.rb
index 86f4385753a..8597e02f0de 100644
--- a/lib/gitlab/markdown/syntax_highlight_filter.rb
+++ b/lib/gitlab/markdown/syntax_highlight_filter.rb
@@ -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)
diff --git a/lib/tasks/services.rake b/lib/tasks/services.rake
index 3f276a5e12e..39541c0b9c6 100644
--- a/lib/tasks/services.rake
+++ b/lib/tasks/services.rake
@@ -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
diff --git a/spec/javascripts/syntax_highlight_spec.js.coffee b/spec/javascripts/syntax_highlight_spec.js.coffee
new file mode 100644
index 00000000000..6a73b6bf32c
--- /dev/null
+++ b/spec/javascripts/syntax_highlight_spec.js.coffee
@@ -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()
diff --git a/spec/lib/gitlab/markdown/syntax_highlight_filter_spec.rb b/spec/lib/gitlab/markdown/syntax_highlight_filter_spec.rb
new file mode 100644
index 00000000000..6a490673728
--- /dev/null
+++ b/spec/lib/gitlab/markdown/syntax_highlight_filter_spec.rb
@@ -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
diff --git a/spec/requests/api/services_spec.rb b/spec/requests/api/services_spec.rb
index c297904614a..fb3b235446f 100644
--- a/spec/requests/api/services_spec.rb
+++ b/spec/requests/api/services_spec.rb
@@ -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
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 8442d3f4445..dfe855926c6 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -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
diff --git a/spec/support/matchers/markdown_matchers.rb b/spec/support/matchers/markdown_matchers.rb
index 9df226c3af8..7500d0fdf80 100644
--- a/spec/support/matchers/markdown_matchers.rb
+++ b/spec/support/matchers/markdown_matchers.rb
@@ -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
diff --git a/spec/support/relative_url.rb b/spec/support/relative_url.rb
new file mode 100644
index 00000000000..72e3ccce75b
--- /dev/null
+++ b/spec/support/relative_url.rb
@@ -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