...@@ -14,7 +14,6 @@ export default { ...@@ -14,7 +14,6 @@ export default {
}, },
data() { data() {
return { return {
loading: false,
pages: [], pages: [],
}; };
}, },
...@@ -37,17 +36,18 @@ export default { ...@@ -37,17 +36,18 @@ export default {
return pdfjsLib return pdfjsLib
.getDocument(this.document) .getDocument(this.document)
.then(this.renderPages) .then(this.renderPages)
.then(() => this.$emit('pdflabload')) .then(pages => {
.catch(error => this.$emit('pdflaberror', error)) this.pages = pages;
.then(() => { this.$emit('pdflabload');
this.loading = false; })
.catch(error => {
this.$emit('pdflaberror', error);
}); });
}, },
renderPages(pdf) { renderPages(pdf) {
const pagePromises = []; const pagePromises = [];
this.loading = true;
for (let num = 1; num <= pdf.numPages; num += 1) { for (let num = 1; num <= pdf.numPages; num += 1) {
pagePromises.push(pdf.getPage(num).then(p => this.pages.push(p))); pagePromises.push(pdf.getPage(num));
} }
return Promise.all(pagePromises); return Promise.all(pagePromises);
}, },
...@@ -59,8 +59,8 @@ export default { ...@@ -59,8 +59,8 @@ export default {
<div v-if="hasPDF" class="pdf-viewer"> <div v-if="hasPDF" class="pdf-viewer">
<page <page
v-for="(page, index) in pages" v-for="(page, index) in pages"
v-if="page"
:key="index" :key="index"
:v-if="!loading"
:page="page" :page="page"
:number="index + 1" :number="index + 1"
/> />
... ...
......
...@@ -39,7 +39,9 @@ export default { ...@@ -39,7 +39,9 @@ export default {
.then(() => { .then(() => {
this.rendering = false; this.rendering = false;
}) })
.catch(error => this.$emit('pdflaberror', error)); .catch(error => {
this.$emit('pdflaberror', error);
});
}, },
}; };
</script> </script>
... ...
......
...@@ -13,6 +13,8 @@ module SubmoduleHelper ...@@ -13,6 +13,8 @@ module SubmoduleHelper
end end
def submodule_links_for_url(submodule_item_id, url, repository) def submodule_links_for_url(submodule_item_id, url, repository)
return [nil, nil] unless url
if url == '.' || url == './' if url == '.' || url == './'
url = File.join(Gitlab.config.gitlab.url, repository.project.full_path) url = File.join(Gitlab.config.gitlab.url, repository.project.full_path)
end end
...@@ -34,8 +36,8 @@ module SubmoduleHelper ...@@ -34,8 +36,8 @@ module SubmoduleHelper
project.sub!(/\.git\z/, '') project.sub!(/\.git\z/, '')
if self_url?(url, namespace, project) if self_url?(url, namespace, project)
[namespace_project_path(namespace, project), [url_helpers.namespace_project_path(namespace, project),
namespace_project_tree_path(namespace, project, submodule_item_id)] url_helpers.namespace_project_tree_path(namespace, project, submodule_item_id)]
elsif relative_self_url?(url) elsif relative_self_url?(url)
relative_self_links(url, submodule_item_id, repository.project) relative_self_links(url, submodule_item_id, repository.project)
elsif github_dot_com_url?(url) elsif github_dot_com_url?(url)
...@@ -99,8 +101,8 @@ module SubmoduleHelper ...@@ -99,8 +101,8 @@ module SubmoduleHelper
begin begin
[ [
namespace_project_path(target_namespace_path, submodule_base), url_helpers.namespace_project_path(target_namespace_path, submodule_base),
namespace_project_tree_path(target_namespace_path, submodule_base, commit) url_helpers.namespace_project_tree_path(target_namespace_path, submodule_base, commit)
] ]
rescue ActionController::UrlGenerationError rescue ActionController::UrlGenerationError
[nil, nil] [nil, nil]
...@@ -118,4 +120,8 @@ module SubmoduleHelper ...@@ -118,4 +120,8 @@ module SubmoduleHelper
rescue URI::InvalidURIError rescue URI::InvalidURIError
nil nil
end end
def url_helpers
Gitlab::Routing.url_helpers
end
end end
...@@ -9,12 +9,10 @@ module ProjectAPICompatibility ...@@ -9,12 +9,10 @@ module ProjectAPICompatibility
end end
def auto_devops_enabled=(value) def auto_devops_enabled=(value)
self.build_auto_devops if self.auto_devops&.enabled.nil? (auto_devops || build_auto_devops).enabled = value
self.auto_devops.update! enabled: value
end end
def auto_devops_deploy_strategy=(value) def auto_devops_deploy_strategy=(value)
self.build_auto_devops if self.auto_devops&.enabled.nil? (auto_devops || build_auto_devops).deploy_strategy = value
self.auto_devops.update! deploy_strategy: value
end end
end end
...@@ -22,7 +22,7 @@ class PagesDomain < ApplicationRecord ...@@ -22,7 +22,7 @@ class PagesDomain < ApplicationRecord
validate :validate_pages_domain validate :validate_pages_domain
validate :validate_matching_key, if: ->(domain) { domain.certificate.present? || domain.key.present? } validate :validate_matching_key, if: ->(domain) { domain.certificate.present? || domain.key.present? }
validate :validate_intermediates, if: ->(domain) { domain.certificate.present? } validate :validate_intermediates, if: ->(domain) { domain.certificate.present? && domain.certificate_changed? }
attr_encrypted :key, attr_encrypted :key,
mode: :per_attribute_iv_and_salt, mode: :per_attribute_iv_and_salt,
... ...
......
...@@ -277,7 +277,7 @@ class Project < ApplicationRecord ...@@ -277,7 +277,7 @@ class Project < ApplicationRecord
has_many :project_deploy_tokens has_many :project_deploy_tokens
has_many :deploy_tokens, through: :project_deploy_tokens has_many :deploy_tokens, through: :project_deploy_tokens
has_one :auto_devops, class_name: 'ProjectAutoDevops' has_one :auto_devops, class_name: 'ProjectAutoDevops', inverse_of: :project, autosave: true
has_many :custom_attributes, class_name: 'ProjectCustomAttribute' has_many :custom_attributes, class_name: 'ProjectCustomAttribute'
has_many :project_badges, class_name: 'ProjectBadge' has_many :project_badges, class_name: 'ProjectBadge'
...@@ -1869,16 +1869,24 @@ class Project < ApplicationRecord ...@@ -1869,16 +1869,24 @@ class Project < ApplicationRecord
end end
def append_or_update_attribute(name, value) def append_or_update_attribute(name, value)
old_values = public_send(name.to_s) # rubocop:disable GitlabSecurity/PublicSend if Project.reflect_on_association(name).try(:macro) == :has_many
# if this is 1-to-N relation, update the parent object
value.each do |item|
item.update!(
Project.reflect_on_association(name).foreign_key => id)
end
# force to drop relation cache
public_send(name).reset # rubocop:disable GitlabSecurity/PublicSend
if Project.reflect_on_association(name).try(:macro) == :has_many && old_values.any? # succeeded
update_attribute(name, old_values + value) true
else else
# if this is another relation or attribute, update just object
update_attribute(name, value) update_attribute(name, value)
end end
rescue ActiveRecord::RecordInvalid => e
rescue ActiveRecord::RecordNotSaved => e raise e, "Failed to set #{name}: #{e.message}"
handle_update_attribute_error(e, value)
end end
# Tries to set repository as read_only, checking for existing Git transfers in progress beforehand # Tries to set repository as read_only, checking for existing Git transfers in progress beforehand
...@@ -2267,18 +2275,6 @@ class Project < ApplicationRecord ...@@ -2267,18 +2275,6 @@ class Project < ApplicationRecord
ContainerRepository.build_root_repository(self).has_tags? ContainerRepository.build_root_repository(self).has_tags?
end end
def handle_update_attribute_error(ex, value)
if ex.message.start_with?('Failed to replace')
if value.respond_to?(:each)
invalid = value.detect(&:invalid?)
raise ex, ([ex.message] + invalid.errors.full_messages).join(' ') if invalid
end
end
raise ex
end
def fetch_branch_allows_collaboration(user, branch_name = nil) def fetch_branch_allows_collaboration(user, branch_name = nil)
return false unless user return false unless user
... ...
......
...@@ -5,7 +5,7 @@ class ProjectAutoDevops < ApplicationRecord ...@@ -5,7 +5,7 @@ class ProjectAutoDevops < ApplicationRecord
ignore_column :domain ignore_column :domain
belongs_to :project belongs_to :project, inverse_of: :auto_devops
enum deploy_strategy: { enum deploy_strategy: {
continuous: 0, continuous: 0,
... ...
......
...@@ -274,19 +274,6 @@ ...@@ -274,19 +274,6 @@
= render_if_exists 'layouts/nav/sidebar/project_feature_flags_link' = render_if_exists 'layouts/nav/sidebar/project_feature_flags_link'
- if project_nav_tab? :container_registry
= nav_link(controller: %w[projects/registry/repositories]) do
= link_to project_container_registry_index_path(@project), class: 'shortcuts-container-registry' do
.nav-icon-container
= sprite_icon('disk')
%span.nav-item-name
= _('Registry')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: %w[projects/registry/repositories], html_options: { class: "fly-out-top-item" } ) do
= link_to project_container_registry_index_path(@project) do
%strong.fly-out-top-item-name
= _('Registry')
= render_if_exists 'layouts/nav/sidebar/project_packages_link' = render_if_exists 'layouts/nav/sidebar/project_packages_link'
- if project_nav_tab? :wiki - if project_nav_tab? :wiki
... ...
......
- if project_nav_tab? :container_registry
= nav_link controller: :repositories do
= link_to project_container_registry_index_path(@project) do
.nav-icon-container
= sprite_icon('package')
%span.nav-item-name
= _('Packages')
%ul.sidebar-sub-level-items
= nav_link(controller: :repositories, html_options: { class: "fly-out-top-item" } ) do
= link_to project_container_registry_index_path(@project) do
%strong.fly-out-top-item-name
= _('Packages')
%li.divider.fly-out-top-item
= nav_link controller: :repositories do
= link_to project_container_registry_index_path(@project), class: 'shortcuts-container-registry', title: _('Container Registry') do
%span= _('Container Registry')
---
title: Fix xterm css not loading for environment terminal
merge_request: 31023
author:
type: fixed
---
title: Fix the project auto devops API
merge_request: 30946
author:
type: fixed
---
title: Fix "Certificate misses intermediates" UI error when enabling Let's Encrypt
integration for pages domain
merge_request: 30995
author:
type: fixed
---
title: Set DOCKER_TLS_CERTDIR in Auto Dev-Ops CI template to fix jobs using Docker-in-Docker
merge_request: 31078
author:
type: fixed
---
title: Set DOCKER_TLS_CERTDIR in CI job templates to fix Docker-in-Docker service
merge_request: 31080
author:
type: fixed
---
title: Fix bug that caused diffs not to show on MRs with changes to submodules
merge_request:
author:
type: fixed
---
title: Fix error rendering submodules in MR diffs when there is no .gitmodules
merge_request: 31162
author:
type: fixed
---
title: Optimise import performance
merge_request: 31045
author:
type: performance
---
title: Prevent multiple confirmation modals from opening when deleting a repository
merge_request: 30532
author:
type: fixed
---
title: Fix exception handling in Gitaly autodetection
merge_request: 31285
author:
type: fixed
---
title: Fix pdf.js rendering pages in the wrong order
merge_request: 31222
author:
type: fixed