Merge branch 'master' into git-2-7-4
This commit is contained in:
commit
5833ae0c5e
|
@ -25,6 +25,7 @@ v 8.6.0 (unreleased)
|
|||
- Rewrite logo to simplify SVG code (Sean Lang)
|
||||
- Allow to use YAML anchors when parsing the `.gitlab-ci.yml` (Pascal Bach)
|
||||
- Ignore jobs that start with `.` (hidden jobs)
|
||||
- Hide builds from project's settings when the feature is disabled
|
||||
- Allow to pass name of created artifacts archive in `.gitlab-ci.yml`
|
||||
- Refactor and greatly improve search performance
|
||||
- Add support for cross-project label references
|
||||
|
@ -62,6 +63,7 @@ v 8.5.5
|
|||
- Fix pagination for filtered dashboard and explore pages
|
||||
- Fix "Show all" link behavior
|
||||
- Add #upcoming filter to Milestone filter (Tiago Botelho)
|
||||
- HTTP error pages work independently from location and config (Artem Sidorenko)
|
||||
|
||||
v 8.5.4
|
||||
- Do not cache requests for badges (including builds badge)
|
||||
|
|
|
@ -343,6 +343,7 @@ class @Notes
|
|||
updateNote: (_xhr, note, _status) =>
|
||||
# Convert returned HTML to a jQuery object so we can modify it further
|
||||
$html = $(note.html)
|
||||
$('.js-timeago', $html).timeago()
|
||||
$html.syntaxHighlight()
|
||||
$html.find('.js-task-list-container').taskList('enable')
|
||||
|
||||
|
|
|
@ -3,3 +3,16 @@ class @ProjectNew
|
|||
$('.project-edit-container').on 'ajax:before', =>
|
||||
$('.project-edit-container').hide()
|
||||
$('.save-project-loader').show()
|
||||
@toggleSettings()
|
||||
@toggleSettingsOnclick()
|
||||
|
||||
|
||||
toggleSettings: ->
|
||||
checked = $("#project_builds_enabled").prop("checked")
|
||||
if checked
|
||||
$('.builds-feature').show()
|
||||
else
|
||||
$('.builds-feature').hide()
|
||||
|
||||
toggleSettingsOnclick: ->
|
||||
$("#project_builds_enabled").on 'click', @toggleSettings
|
||||
|
|
|
@ -28,10 +28,6 @@
|
|||
border-bottom: 1px solid $border-color;
|
||||
color: $gl-gray;
|
||||
|
||||
a {
|
||||
color: $md-link-color;
|
||||
}
|
||||
|
||||
&.oneline-block {
|
||||
line-height: 42px;
|
||||
}
|
||||
|
|
|
@ -262,3 +262,11 @@
|
|||
color: $gray-darkest;
|
||||
}
|
||||
}
|
||||
|
||||
.edited-text {
|
||||
color: $gray-darkest;
|
||||
|
||||
.author_link {
|
||||
color: $gray-darkest;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -182,7 +182,7 @@ module ApplicationHelper
|
|||
# Returns an HTML-safe String
|
||||
def time_ago_with_tooltip(time, placement: 'top', html_class: 'time_ago', skip_js: false)
|
||||
element = content_tag :time, time.to_s,
|
||||
class: "#{html_class} js-timeago js-timeago-pending",
|
||||
class: "#{html_class} js-timeago #{"js-timeago-pending" unless skip_js}",
|
||||
datetime: time.to_time.getutc.iso8601,
|
||||
title: time.in_time_zone.to_s(:medium),
|
||||
data: { toggle: 'tooltip', placement: placement, container: 'body' }
|
||||
|
@ -196,6 +196,22 @@ module ApplicationHelper
|
|||
element
|
||||
end
|
||||
|
||||
def edited_time_ago_with_tooltip(object, placement: 'top', html_class: 'time_ago', include_author: false)
|
||||
return if object.updated_at == object.created_at
|
||||
|
||||
content_tag :small, class: "edited-text" do
|
||||
output = content_tag(:span, "Edited ")
|
||||
output << time_ago_with_tooltip(object.updated_at, placement: placement, html_class: html_class)
|
||||
|
||||
if include_author && object.updated_by && object.updated_by != object.author
|
||||
output << content_tag(:span, " by ")
|
||||
output << link_to_member(object.project, object.updated_by, avatar: false, author_class: nil)
|
||||
end
|
||||
|
||||
output
|
||||
end
|
||||
end
|
||||
|
||||
def render_markup(file_name, file_content)
|
||||
if gitlab_markdown?(file_name)
|
||||
Haml::Helpers.preserve(markdown(file_content))
|
||||
|
|
|
@ -571,10 +571,7 @@ class Project < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def avatar_in_git
|
||||
@avatar_file ||= 'logo.png' if repository.blob_at_branch('master', 'logo.png')
|
||||
@avatar_file ||= 'logo.jpg' if repository.blob_at_branch('master', 'logo.jpg')
|
||||
@avatar_file ||= 'logo.gif' if repository.blob_at_branch('master', 'logo.gif')
|
||||
@avatar_file
|
||||
repository.avatar
|
||||
end
|
||||
|
||||
def avatar_url
|
||||
|
|
|
@ -3,6 +3,10 @@ require 'securerandom'
|
|||
class Repository
|
||||
class CommitError < StandardError; end
|
||||
|
||||
# Files to use as a project avatar in case no avatar was uploaded via the web
|
||||
# UI.
|
||||
AVATAR_FILES = %w{logo.png logo.jpg logo.gif}
|
||||
|
||||
include Gitlab::ShellAdapter
|
||||
|
||||
attr_accessor :path_with_namespace, :project
|
||||
|
@ -241,12 +245,13 @@ class Repository
|
|||
@branches = nil
|
||||
end
|
||||
|
||||
def expire_cache(branch_name = nil)
|
||||
def expire_cache(branch_name = nil, revision = nil)
|
||||
cache_keys.each do |key|
|
||||
cache.expire(key)
|
||||
end
|
||||
|
||||
expire_branch_cache(branch_name)
|
||||
expire_avatar_cache(branch_name, revision)
|
||||
|
||||
# This ensures this particular cache is flushed after the first commit to a
|
||||
# new repository.
|
||||
|
@ -316,6 +321,23 @@ class Repository
|
|||
cache.expire(:branch_names)
|
||||
end
|
||||
|
||||
def expire_avatar_cache(branch_name = nil, revision = nil)
|
||||
# Avatars are pulled from the default branch, thus if somebody pushes to a
|
||||
# different branch there's no need to expire anything.
|
||||
return if branch_name && branch_name != root_ref
|
||||
|
||||
# We don't want to flush the cache if the commit didn't actually make any
|
||||
# changes to any of the possible avatar files.
|
||||
if revision && commit = self.commit(revision)
|
||||
return unless commit.diffs.
|
||||
any? { |diff| AVATAR_FILES.include?(diff.new_path) }
|
||||
end
|
||||
|
||||
cache.expire(:avatar)
|
||||
|
||||
@avatar = nil
|
||||
end
|
||||
|
||||
# Runs code just before a repository is deleted.
|
||||
def before_delete
|
||||
expire_cache if exists?
|
||||
|
@ -350,8 +372,8 @@ class Repository
|
|||
end
|
||||
|
||||
# Runs code after a new commit has been pushed.
|
||||
def after_push_commit(branch_name)
|
||||
expire_cache(branch_name)
|
||||
def after_push_commit(branch_name, revision)
|
||||
expire_cache(branch_name, revision)
|
||||
end
|
||||
|
||||
# Runs code after a new branch has been created.
|
||||
|
@ -857,6 +879,14 @@ class Repository
|
|||
end
|
||||
end
|
||||
|
||||
def avatar
|
||||
@avatar ||= cache.fetch(:avatar) do
|
||||
AVATAR_FILES.find do |file|
|
||||
blob_at_branch('master', file)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def cache
|
||||
|
|
|
@ -17,7 +17,7 @@ class GitPushService < BaseService
|
|||
# 6. Checks if the project's main language has changed
|
||||
#
|
||||
def execute
|
||||
@project.repository.after_push_commit(branch_name)
|
||||
@project.repository.after_push_commit(branch_name, params[:newrev])
|
||||
|
||||
if push_remove_branch?
|
||||
@project.repository.after_remove_branch
|
||||
|
|
|
@ -0,0 +1,60 @@
|
|||
%fieldset.builds-feature
|
||||
%legend
|
||||
Builds:
|
||||
.form-group
|
||||
.col-sm-offset-2.col-sm-10
|
||||
%p Get recent application code using the following command:
|
||||
.radio
|
||||
= f.label :build_allow_git_fetch_false do
|
||||
= f.radio_button :build_allow_git_fetch, 'false'
|
||||
%strong git clone
|
||||
%br
|
||||
%span.descr Slower but makes sure you have a clean dir before every build
|
||||
.radio
|
||||
= f.label :build_allow_git_fetch_true do
|
||||
= f.radio_button :build_allow_git_fetch, 'true'
|
||||
%strong git fetch
|
||||
%br
|
||||
%span.descr Faster
|
||||
|
||||
.form-group
|
||||
= f.label :build_timeout_in_minutes, 'Timeout', class: 'control-label'
|
||||
.col-sm-10
|
||||
= f.number_field :build_timeout_in_minutes, class: 'form-control', min: '0'
|
||||
%p.help-block per build in minutes
|
||||
.form-group
|
||||
= f.label :build_coverage_regex, "Test coverage parsing", class: 'control-label'
|
||||
.col-sm-10
|
||||
.input-group
|
||||
%span.input-group-addon /
|
||||
= f.text_field :build_coverage_regex, class: 'form-control', placeholder: '\(\d+.\d+\%\) covered'
|
||||
%span.input-group-addon /
|
||||
%p.help-block
|
||||
We will use this regular expression to find test coverage output in build trace.
|
||||
Leave blank if you want to disable this feature
|
||||
.bs-callout.bs-callout-info
|
||||
%p Below are examples of regex for existing tools:
|
||||
%ul
|
||||
%li
|
||||
Simplecov (Ruby) -
|
||||
%code \(\d+.\d+\%\) covered
|
||||
%li
|
||||
pytest-cov (Python) -
|
||||
%code \d+\%\s*$
|
||||
%li
|
||||
phpunit --coverage-text --colors=never (PHP) -
|
||||
%code ^\s*Lines:\s*\d+.\d+\%
|
||||
|
||||
.form-group
|
||||
.col-sm-offset-2.col-sm-10
|
||||
.checkbox
|
||||
= f.label :public_builds do
|
||||
= f.check_box :public_builds
|
||||
%strong Public builds
|
||||
.help-block Allow everyone to access builds for Public and Internal projects
|
||||
|
||||
.form-group
|
||||
= f.label :runners_token, "Runners token", class: 'control-label'
|
||||
.col-sm-10
|
||||
= f.text_field :runners_token, class: "form-control", placeholder: 'xEeFCaDAB89'
|
||||
%p.help-block The secure token used to checkout project.
|
|
@ -84,6 +84,8 @@
|
|||
%br
|
||||
%span.descr Share code pastes with others out of git repository
|
||||
|
||||
= render 'builds_settings', f: f
|
||||
|
||||
%fieldset.features
|
||||
%legend
|
||||
Project avatar:
|
||||
|
@ -110,69 +112,6 @@
|
|||
%hr
|
||||
= link_to 'Remove avatar', namespace_project_avatar_path(@project.namespace, @project), data: { confirm: "Project avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-sm remove-avatar"
|
||||
|
||||
%fieldset.features
|
||||
%legend
|
||||
Continuous Integration
|
||||
.form-group
|
||||
.col-sm-offset-2.col-sm-10
|
||||
%p Get recent application code using the following command:
|
||||
.radio
|
||||
= f.label :build_allow_git_fetch_false do
|
||||
= f.radio_button :build_allow_git_fetch, 'false'
|
||||
%strong git clone
|
||||
%br
|
||||
%span.descr Slower but makes sure you have a clean dir before every build
|
||||
.radio
|
||||
= f.label :build_allow_git_fetch_true do
|
||||
= f.radio_button :build_allow_git_fetch, 'true'
|
||||
%strong git fetch
|
||||
%br
|
||||
%span.descr Faster
|
||||
|
||||
.form-group
|
||||
= f.label :build_timeout_in_minutes, 'Timeout', class: 'control-label'
|
||||
.col-sm-10
|
||||
= f.number_field :build_timeout_in_minutes, class: 'form-control', min: '0'
|
||||
%p.help-block per build in minutes
|
||||
.form-group
|
||||
= f.label :build_coverage_regex, "Test coverage parsing", class: 'control-label'
|
||||
.col-sm-10
|
||||
.input-group
|
||||
%span.input-group-addon /
|
||||
= f.text_field :build_coverage_regex, class: 'form-control', placeholder: '\(\d+.\d+\%\) covered'
|
||||
%span.input-group-addon /
|
||||
%p.help-block
|
||||
We will use this regular expression to find test coverage output in build trace.
|
||||
Leave blank if you want to disable this feature
|
||||
.bs-callout.bs-callout-info
|
||||
%p Below are examples of regex for existing tools:
|
||||
%ul
|
||||
%li
|
||||
Simplecov (Ruby) -
|
||||
%code \(\d+.\d+\%\) covered
|
||||
%li
|
||||
pytest-cov (Python) -
|
||||
%code \d+\%\s*$
|
||||
%li
|
||||
phpunit --coverage-text --colors=never (PHP) -
|
||||
%code ^\s*Lines:\s*\d+.\d+\%
|
||||
|
||||
.form-group
|
||||
.col-sm-offset-2.col-sm-10
|
||||
.checkbox
|
||||
= f.label :public_builds do
|
||||
= f.check_box :public_builds
|
||||
%strong Public builds
|
||||
.help-block Allow everyone to access builds for Public and Internal projects
|
||||
|
||||
%fieldset.features
|
||||
%legend
|
||||
Advanced settings
|
||||
.form-group
|
||||
= f.label :runners_token, "CI token", class: 'control-label'
|
||||
.col-sm-10
|
||||
= f.text_field :runners_token, class: "form-control", placeholder: 'xEeFCaDAB89'
|
||||
%p.help-block The secure token used to checkout project.
|
||||
|
||||
.form-actions
|
||||
= f.submit 'Save changes', class: "btn btn-save"
|
||||
|
|
|
@ -63,10 +63,7 @@
|
|||
= markdown(@issue.description, cache_key: [@issue, "description"])
|
||||
%textarea.hidden.js-task-list-field
|
||||
= @issue.description
|
||||
- if @issue.updated_at != @issue.created_at
|
||||
%small
|
||||
Edited
|
||||
= time_ago_with_tooltip(@issue.updated_at, placement: 'bottom', html_class: 'issue_edited_ago')
|
||||
= edited_time_ago_with_tooltip(@issue, placement: 'bottom', html_class: 'issue_edited_ago')
|
||||
|
||||
.merge-requests
|
||||
= render 'merge_requests'
|
||||
|
|
|
@ -11,7 +11,4 @@
|
|||
%textarea.hidden.js-task-list-field
|
||||
= @merge_request.description
|
||||
|
||||
- if @merge_request.updated_at != @merge_request.created_at
|
||||
%small
|
||||
Edited
|
||||
= time_ago_with_tooltip(@merge_request.updated_at, placement: 'bottom')
|
||||
= edited_time_ago_with_tooltip(@merge_request, placement: 'bottom')
|
||||
|
|
|
@ -27,20 +27,13 @@
|
|||
%span.note-last-update
|
||||
%a{name: dom_id(note), href: "##{dom_id(note)}", title: 'Link here'}
|
||||
= time_ago_with_tooltip(note.created_at, placement: 'bottom', html_class: 'note_created_ago')
|
||||
- if note.updated_at != note.created_at
|
||||
%span.note-updated-at
|
||||
·
|
||||
= icon('edit', title: 'edited')
|
||||
= time_ago_with_tooltip(note.updated_at, placement: 'bottom', html_class: 'note_edited_ago')
|
||||
- if note.updated_by && note.updated_by != note.author
|
||||
by #{link_to_member(note.project, note.updated_by, avatar: false, author_class: nil)}
|
||||
|
||||
.note-body{class: note_editable?(note) ? 'js-task-list-container' : ''}
|
||||
.note-text
|
||||
= preserve do
|
||||
= markdown(note.note, pipeline: :note, cache_key: [note, "note"])
|
||||
- if note_editable?(note)
|
||||
= render 'projects/notes/edit_form', note: note
|
||||
= edited_time_ago_with_tooltip(note, placement: 'bottom', html_class: 'note_edited_ago', include_author: true)
|
||||
|
||||
- if note.attachment.url
|
||||
.note-attachment
|
||||
|
@ -54,4 +47,3 @@
|
|||
= link_to delete_attachment_namespace_project_note_path(note.project.namespace, note.project, note),
|
||||
title: 'Delete this attachment', method: :delete, remote: true, data: { confirm: 'Are you sure you want to remove the attachment?' }, class: 'danger js-note-attachment-delete' do
|
||||
= icon('trash-o', class: 'cred')
|
||||
.clear
|
||||
|
|
|
@ -30,7 +30,6 @@ server {
|
|||
listen [::]:80 default_server;
|
||||
server_name YOUR_SERVER_FQDN; ## Replace this with something like gitlab.example.com
|
||||
server_tokens off; ## Don't show the nginx version number, a security best practice
|
||||
root /home/git/gitlab/public;
|
||||
|
||||
## See app/controllers/application_controller.rb for headers set
|
||||
|
||||
|
@ -57,4 +56,14 @@ server {
|
|||
|
||||
proxy_pass http://gitlab-workhorse;
|
||||
}
|
||||
|
||||
error_page 404 /404.html;
|
||||
error_page 422 /422.html;
|
||||
error_page 500 /500.html;
|
||||
error_page 502 /502.html;
|
||||
location ~ ^/(404|422|500|502)\.html$ {
|
||||
root /home/git/gitlab/public;
|
||||
internal;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -45,7 +45,6 @@ server {
|
|||
listen [::]:443 ipv6only=on ssl default_server;
|
||||
server_name YOUR_SERVER_FQDN; ## Replace this with something like gitlab.example.com
|
||||
server_tokens off; ## Don't show the nginx version number, a security best practice
|
||||
root /home/git/gitlab/public;
|
||||
|
||||
## Strong SSL Security
|
||||
## https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html & https://cipherli.st/
|
||||
|
@ -101,4 +100,13 @@ server {
|
|||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_pass http://gitlab-workhorse;
|
||||
}
|
||||
|
||||
error_page 404 /404.html;
|
||||
error_page 422 /422.html;
|
||||
error_page 500 /500.html;
|
||||
error_page 502 /502.html;
|
||||
location ~ ^/(404|422|500|502)\.html$ {
|
||||
root /home/git/gitlab/public;
|
||||
internal;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,11 +2,51 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>The page you're looking for could not be found (404)</title>
|
||||
<link href="/static.css" media="screen" rel="stylesheet" type="text/css" />
|
||||
<style>
|
||||
body {
|
||||
color: #666;
|
||||
text-align: center;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
margin: 0;
|
||||
width: 800px;
|
||||
margin: auto;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 56px;
|
||||
line-height: 100px;
|
||||
font-weight: normal;
|
||||
color: #456;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 24px;
|
||||
color: #666;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: #456;
|
||||
font-size: 20px;
|
||||
font-weight: normal;
|
||||
line-height: 28px;
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 18px 0;
|
||||
border: 0;
|
||||
border-top: 1px solid #EEE;
|
||||
border-bottom: 1px solid white;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>404</h1>
|
||||
<h1>
|
||||
<img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEwIiBoZWlnaHQ9IjIxMCIgdmlld0JveD0iMCAwIDIxMCAyMTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTVsMzguNjQtMTE4LjkyMWgtNzcuMjhsMzguNjQgMTE4LjkyMXoiIGZpbGw9IiNlMjQzMjkiLz4KICA8cGF0aCBkPSJNMTA1LjA2MTQgMjAzLjY1NDhsLTM4LjY0LTExOC45MjFoLTU0LjE1M2w5Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTIuMjY4NSA4NC43MzQxbC0xMS43NDIgMzYuMTM5Yy0xLjA3MSAzLjI5Ni4xMDIgNi45MDcgMi45MDYgOC45NDRsMTAxLjYyOSA3My44MzgtOTIuNzkzLTExOC45MjF6IiBmaWxsPSIjZmNhMzI2Ii8+CiAgPHBhdGggZD0iTTEyLjI2ODUgODQuNzM0Mmg1NC4xNTNsLTIzLjI3My03MS42MjVjLTEuMTk3LTMuNjg2LTYuNDExLTMuNjg1LTcuNjA4IDBsLTIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTQ4bDM4LjY0LTExOC45MjFoNTQuMTUzbC05Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTk3Ljg1NDQgODQuNzM0MWwxMS43NDIgMzYuMTM5YzEuMDcxIDMuMjk2LS4xMDIgNi45MDctMi45MDYgOC45NDRsLTEwMS42MjkgNzMuODM4IDkyLjc5My0xMTguOTIxeiIgZmlsbD0iI2ZjYTMyNiIvPgogIDxwYXRoIGQ9Ik0xOTcuODU0NCA4NC43MzQyaC01NC4xNTNsMjMuMjczLTcxLjYyNWMxLjE5Ny0zLjY4NiA2LjQxMS0zLjY4NSA3LjYwOCAwbDIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+Cjwvc3ZnPgo=" /><br />
|
||||
404
|
||||
</h1>
|
||||
<h3>The page you're looking for could not be found.</h3>
|
||||
<hr/>
|
||||
<p>Make sure the address is correct and that the page hasn't moved.</p>
|
||||
|
|
|
@ -2,12 +2,51 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>The change you requested was rejected (422)</title>
|
||||
<link href="/static.css" media="screen" rel="stylesheet" type="text/css" />
|
||||
<style>
|
||||
body {
|
||||
color: #666;
|
||||
text-align: center;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
margin: 0;
|
||||
width: 800px;
|
||||
margin: auto;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 56px;
|
||||
line-height: 100px;
|
||||
font-weight: normal;
|
||||
color: #456;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 24px;
|
||||
color: #666;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: #456;
|
||||
font-size: 20px;
|
||||
font-weight: normal;
|
||||
line-height: 28px;
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 18px 0;
|
||||
border: 0;
|
||||
border-top: 1px solid #EEE;
|
||||
border-bottom: 1px solid white;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- This file lives in public/422.html -->
|
||||
<h1>422</h1>
|
||||
<h1>
|
||||
<img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEwIiBoZWlnaHQ9IjIxMCIgdmlld0JveD0iMCAwIDIxMCAyMTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTVsMzguNjQtMTE4LjkyMWgtNzcuMjhsMzguNjQgMTE4LjkyMXoiIGZpbGw9IiNlMjQzMjkiLz4KICA8cGF0aCBkPSJNMTA1LjA2MTQgMjAzLjY1NDhsLTM4LjY0LTExOC45MjFoLTU0LjE1M2w5Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTIuMjY4NSA4NC43MzQxbC0xMS43NDIgMzYuMTM5Yy0xLjA3MSAzLjI5Ni4xMDIgNi45MDcgMi45MDYgOC45NDRsMTAxLjYyOSA3My44MzgtOTIuNzkzLTExOC45MjF6IiBmaWxsPSIjZmNhMzI2Ii8+CiAgPHBhdGggZD0iTTEyLjI2ODUgODQuNzM0Mmg1NC4xNTNsLTIzLjI3My03MS42MjVjLTEuMTk3LTMuNjg2LTYuNDExLTMuNjg1LTcuNjA4IDBsLTIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTQ4bDM4LjY0LTExOC45MjFoNTQuMTUzbC05Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTk3Ljg1NDQgODQuNzM0MWwxMS43NDIgMzYuMTM5YzEuMDcxIDMuMjk2LS4xMDIgNi45MDctMi45MDYgOC45NDRsLTEwMS42MjkgNzMuODM4IDkyLjc5My0xMTguOTIxeiIgZmlsbD0iI2ZjYTMyNiIvPgogIDxwYXRoIGQ9Ik0xOTcuODU0NCA4NC43MzQyaC01NC4xNTNsMjMuMjczLTcxLjYyNWMxLjE5Ny0zLjY4NiA2LjQxMS0zLjY4NSA3LjYwOCAwbDIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+Cjwvc3ZnPgo=" /><br />
|
||||
422
|
||||
</h1>
|
||||
<h3>The change you requested was rejected.</h3>
|
||||
<hr />
|
||||
<p>Make sure you have access to the thing you tried to change.</p>
|
||||
|
|
|
@ -2,10 +2,50 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Something went wrong (500)</title>
|
||||
<link href="/static.css" media="screen" rel="stylesheet" type="text/css" />
|
||||
<style>
|
||||
body {
|
||||
color: #666;
|
||||
text-align: center;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
margin: 0;
|
||||
width: 800px;
|
||||
margin: auto;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 56px;
|
||||
line-height: 100px;
|
||||
font-weight: normal;
|
||||
color: #456;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 24px;
|
||||
color: #666;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: #456;
|
||||
font-size: 20px;
|
||||
font-weight: normal;
|
||||
line-height: 28px;
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 18px 0;
|
||||
border: 0;
|
||||
border-top: 1px solid #EEE;
|
||||
border-bottom: 1px solid white;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>500</h1>
|
||||
<h1>
|
||||
<img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEwIiBoZWlnaHQ9IjIxMCIgdmlld0JveD0iMCAwIDIxMCAyMTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTVsMzguNjQtMTE4LjkyMWgtNzcuMjhsMzguNjQgMTE4LjkyMXoiIGZpbGw9IiNlMjQzMjkiLz4KICA8cGF0aCBkPSJNMTA1LjA2MTQgMjAzLjY1NDhsLTM4LjY0LTExOC45MjFoLTU0LjE1M2w5Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTIuMjY4NSA4NC43MzQxbC0xMS43NDIgMzYuMTM5Yy0xLjA3MSAzLjI5Ni4xMDIgNi45MDcgMi45MDYgOC45NDRsMTAxLjYyOSA3My44MzgtOTIuNzkzLTExOC45MjF6IiBmaWxsPSIjZmNhMzI2Ii8+CiAgPHBhdGggZD0iTTEyLjI2ODUgODQuNzM0Mmg1NC4xNTNsLTIzLjI3My03MS42MjVjLTEuMTk3LTMuNjg2LTYuNDExLTMuNjg1LTcuNjA4IDBsLTIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTQ4bDM4LjY0LTExOC45MjFoNTQuMTUzbC05Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTk3Ljg1NDQgODQuNzM0MWwxMS43NDIgMzYuMTM5YzEuMDcxIDMuMjk2LS4xMDIgNi45MDctMi45MDYgOC45NDRsLTEwMS42MjkgNzMuODM4IDkyLjc5My0xMTguOTIxeiIgZmlsbD0iI2ZjYTMyNiIvPgogIDxwYXRoIGQ9Ik0xOTcuODU0NCA4NC43MzQyaC01NC4xNTNsMjMuMjczLTcxLjYyNWMxLjE5Ny0zLjY4NiA2LjQxMS0zLjY4NSA3LjYwOCAwbDIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+Cjwvc3ZnPgo=" /><br />
|
||||
500
|
||||
</h1>
|
||||
<h3>Whoops, something went wrong on our end.</h3>
|
||||
<hr/>
|
||||
<p>Try refreshing the page, or going back and attempting the action again.</p>
|
||||
|
|
|
@ -2,10 +2,50 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>GitLab is not responding (502)</title>
|
||||
<link href="/static.css" media="screen" rel="stylesheet" type="text/css" />
|
||||
<style>
|
||||
body {
|
||||
color: #666;
|
||||
text-align: center;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
margin: 0;
|
||||
width: 800px;
|
||||
margin: auto;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 56px;
|
||||
line-height: 100px;
|
||||
font-weight: normal;
|
||||
color: #456;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 24px;
|
||||
color: #666;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: #456;
|
||||
font-size: 20px;
|
||||
font-weight: normal;
|
||||
line-height: 28px;
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 18px 0;
|
||||
border: 0;
|
||||
border-top: 1px solid #EEE;
|
||||
border-bottom: 1px solid white;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>502</h1>
|
||||
<h1>
|
||||
<img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEwIiBoZWlnaHQ9IjIxMCIgdmlld0JveD0iMCAwIDIxMCAyMTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTVsMzguNjQtMTE4LjkyMWgtNzcuMjhsMzguNjQgMTE4LjkyMXoiIGZpbGw9IiNlMjQzMjkiLz4KICA8cGF0aCBkPSJNMTA1LjA2MTQgMjAzLjY1NDhsLTM4LjY0LTExOC45MjFoLTU0LjE1M2w5Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTIuMjY4NSA4NC43MzQxbC0xMS43NDIgMzYuMTM5Yy0xLjA3MSAzLjI5Ni4xMDIgNi45MDcgMi45MDYgOC45NDRsMTAxLjYyOSA3My44MzgtOTIuNzkzLTExOC45MjF6IiBmaWxsPSIjZmNhMzI2Ii8+CiAgPHBhdGggZD0iTTEyLjI2ODUgODQuNzM0Mmg1NC4xNTNsLTIzLjI3My03MS42MjVjLTEuMTk3LTMuNjg2LTYuNDExLTMuNjg1LTcuNjA4IDBsLTIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTQ4bDM4LjY0LTExOC45MjFoNTQuMTUzbC05Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTk3Ljg1NDQgODQuNzM0MWwxMS43NDIgMzYuMTM5YzEuMDcxIDMuMjk2LS4xMDIgNi45MDctMi45MDYgOC45NDRsLTEwMS42MjkgNzMuODM4IDkyLjc5My0xMTguOTIxeiIgZmlsbD0iI2ZjYTMyNiIvPgogIDxwYXRoIGQ9Ik0xOTcuODU0NCA4NC43MzQyaC01NC4xNTNsMjMuMjczLTcxLjYyNWMxLjE5Ny0zLjY4NiA2LjQxMS0zLjY4NSA3LjYwOCAwbDIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+Cjwvc3ZnPgo=" /><br />
|
||||
502
|
||||
</h1>
|
||||
<h3>Whoops, GitLab is taking too much time to respond.</h3>
|
||||
<hr/>
|
||||
<p>Try refreshing the page, or going back and attempting the action again.</p>
|
||||
|
|
|
@ -2,12 +2,49 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Deploy in progress</title>
|
||||
<link href="/static.css" media="screen" rel="stylesheet" type="text/css" />
|
||||
<style>
|
||||
body {
|
||||
color: #666;
|
||||
text-align: center;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
margin: 0;
|
||||
width: 800px;
|
||||
margin: auto;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 56px;
|
||||
line-height: 100px;
|
||||
font-weight: normal;
|
||||
color: #456;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 24px;
|
||||
color: #666;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: #456;
|
||||
font-size: 20px;
|
||||
font-weight: normal;
|
||||
line-height: 28px;
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 18px 0;
|
||||
border: 0;
|
||||
border-top: 1px solid #EEE;
|
||||
border-bottom: 1px solid white;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>
|
||||
<img src="/logo.svg" /><br />
|
||||
<img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEwIiBoZWlnaHQ9IjIxMCIgdmlld0JveD0iMCAwIDIxMCAyMTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTVsMzguNjQtMTE4LjkyMWgtNzcuMjhsMzguNjQgMTE4LjkyMXoiIGZpbGw9IiNlMjQzMjkiLz4KICA8cGF0aCBkPSJNMTA1LjA2MTQgMjAzLjY1NDhsLTM4LjY0LTExOC45MjFoLTU0LjE1M2w5Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTIuMjY4NSA4NC43MzQxbC0xMS43NDIgMzYuMTM5Yy0xLjA3MSAzLjI5Ni4xMDIgNi45MDcgMi45MDYgOC45NDRsMTAxLjYyOSA3My44MzgtOTIuNzkzLTExOC45MjF6IiBmaWxsPSIjZmNhMzI2Ii8+CiAgPHBhdGggZD0iTTEyLjI2ODUgODQuNzM0Mmg1NC4xNTNsLTIzLjI3My03MS42MjVjLTEuMTk3LTMuNjg2LTYuNDExLTMuNjg1LTcuNjA4IDBsLTIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTQ4bDM4LjY0LTExOC45MjFoNTQuMTUzbC05Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTk3Ljg1NDQgODQuNzM0MWwxMS43NDIgMzYuMTM5YzEuMDcxIDMuMjk2LS4xMDIgNi45MDctMi45MDYgOC45NDRsLTEwMS42MjkgNzMuODM4IDkyLjc5My0xMTguOTIxeiIgZmlsbD0iI2ZjYTMyNiIvPgogIDxwYXRoIGQ9Ik0xOTcuODU0NCA4NC43MzQyaC01NC4xNTNsMjMuMjczLTcxLjYyNWMxLjE5Ny0zLjY4NiA2LjQxMS0zLjY4NSA3LjYwOCAwbDIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+Cjwvc3ZnPgo=" /><br />
|
||||
Deploy in progress
|
||||
</h1>
|
||||
<h3>Please try again in a few minutes.</h3>
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
<svg width="210" height="210" viewBox="0 0 210 210" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M105.0614 203.655l38.64-118.921h-77.28l38.64 118.921z" fill="#e24329"/>
|
||||
<path d="M105.0614 203.6548l-38.64-118.921h-54.153l92.793 118.921z" fill="#fc6d26"/>
|
||||
<path d="M12.2685 84.7341l-11.742 36.139c-1.071 3.296.102 6.907 2.906 8.944l101.629 73.838-92.793-118.921z" fill="#fca326"/>
|
||||
<path d="M12.2685 84.7342h54.153l-23.273-71.625c-1.197-3.686-6.411-3.685-7.608 0l-23.272 71.625z" fill="#e24329"/>
|
||||
<path d="M105.0614 203.6548l38.64-118.921h54.153l-92.793 118.921z" fill="#fc6d26"/>
|
||||
<path d="M197.8544 84.7341l11.742 36.139c1.071 3.296-.102 6.907-2.906 8.944l-101.629 73.838 92.793-118.921z" fill="#fca326"/>
|
||||
<path d="M197.8544 84.7342h-54.153l23.273-71.625c1.197-3.686 6.411-3.685 7.608 0l23.272 71.625z" fill="#e24329"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 839 B |
|
@ -1,36 +0,0 @@
|
|||
body {
|
||||
color: #666;
|
||||
text-align: center;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
margin: 0;
|
||||
width: 800px;
|
||||
margin: auto;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 56px;
|
||||
line-height: 100px;
|
||||
font-weight: normal;
|
||||
color: #456;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 24px;
|
||||
color: #666;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: #456;
|
||||
font-size: 20px;
|
||||
font-weight: normal;
|
||||
line-height: 28px;
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 18px 0;
|
||||
border: 0;
|
||||
border-top: 1px solid #EEE;
|
||||
border-bottom: 1px solid white;
|
||||
}
|
|
@ -597,9 +597,9 @@ describe Repository, models: true do
|
|||
|
||||
describe '#after_push_commit' do
|
||||
it 'flushes the cache' do
|
||||
expect(repository).to receive(:expire_cache).with('master')
|
||||
expect(repository).to receive(:expire_cache).with('master', '123')
|
||||
|
||||
repository.after_push_commit('master')
|
||||
repository.after_push_commit('master', '123')
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -703,4 +703,81 @@ describe Repository, models: true do
|
|||
repository.rm_tag('8.5')
|
||||
end
|
||||
end
|
||||
|
||||
describe '#avatar' do
|
||||
it 'returns the first avatar file found in the repository' do
|
||||
expect(repository).to receive(:blob_at_branch).
|
||||
with('master', 'logo.png').
|
||||
and_return(true)
|
||||
|
||||
expect(repository.avatar).to eq('logo.png')
|
||||
end
|
||||
|
||||
it 'caches the output' do
|
||||
allow(repository).to receive(:blob_at_branch).
|
||||
with('master', 'logo.png').
|
||||
and_return(true)
|
||||
|
||||
expect(repository.avatar).to eq('logo.png')
|
||||
|
||||
expect(repository).to_not receive(:blob_at_branch)
|
||||
expect(repository.avatar).to eq('logo.png')
|
||||
end
|
||||
end
|
||||
|
||||
describe '#expire_avatar_cache' do
|
||||
let(:cache) { repository.send(:cache) }
|
||||
|
||||
before do
|
||||
allow(repository).to receive(:cache).and_return(cache)
|
||||
end
|
||||
|
||||
context 'without a branch or revision' do
|
||||
it 'flushes the cache' do
|
||||
expect(cache).to receive(:expire).with(:avatar)
|
||||
|
||||
repository.expire_avatar_cache
|
||||
end
|
||||
end
|
||||
|
||||
context 'with a branch' do
|
||||
it 'does not flush the cache if the branch is not the default branch' do
|
||||
expect(cache).not_to receive(:expire)
|
||||
|
||||
repository.expire_avatar_cache('cats')
|
||||
end
|
||||
|
||||
it 'flushes the cache if the branch equals the default branch' do
|
||||
expect(cache).to receive(:expire).with(:avatar)
|
||||
|
||||
repository.expire_avatar_cache(repository.root_ref)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with a branch and revision' do
|
||||
let(:commit) { double(:commit) }
|
||||
|
||||
before do
|
||||
allow(repository).to receive(:commit).and_return(commit)
|
||||
end
|
||||
|
||||
it 'does not flush the cache if the commit does not change any logos' do
|
||||
diff = double(:diff, new_path: 'test.txt')
|
||||
|
||||
expect(commit).to receive(:diffs).and_return([diff])
|
||||
expect(cache).not_to receive(:expire)
|
||||
|
||||
repository.expire_avatar_cache(repository.root_ref, '123')
|
||||
end
|
||||
|
||||
it 'flushes the cache if the commit changes any of the logos' do
|
||||
diff = double(:diff, new_path: Repository::AVATAR_FILES[0])
|
||||
|
||||
expect(commit).to receive(:diffs).and_return([diff])
|
||||
expect(cache).to receive(:expire).with(:avatar)
|
||||
|
||||
repository.expire_avatar_cache(repository.root_ref, '123')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -29,7 +29,8 @@ describe GitPushService, services: true do
|
|||
it { is_expected.to be_truthy }
|
||||
|
||||
it 'flushes general cached data' do
|
||||
expect(project.repository).to receive(:expire_cache).with('master')
|
||||
expect(project.repository).to receive(:expire_cache).
|
||||
with('master', newrev)
|
||||
|
||||
subject
|
||||
end
|
||||
|
@ -46,7 +47,8 @@ describe GitPushService, services: true do
|
|||
it { is_expected.to be_truthy }
|
||||
|
||||
it 'flushes general cached data' do
|
||||
expect(project.repository).to receive(:expire_cache).with('master')
|
||||
expect(project.repository).to receive(:expire_cache).
|
||||
with('master', newrev)
|
||||
|
||||
subject
|
||||
end
|
||||
|
@ -65,7 +67,8 @@ describe GitPushService, services: true do
|
|||
end
|
||||
|
||||
it 'flushes general cached data' do
|
||||
expect(project.repository).to receive(:expire_cache).with('master')
|
||||
expect(project.repository).to receive(:expire_cache).
|
||||
with('master', newrev)
|
||||
|
||||
subject
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue