diff options
-rw-r--r-- | GITLAB_PAGES_VERSION | 2 | ||||
-rw-r--r-- | app/assets/javascripts/behaviors/gl_emoji.js | 19 | ||||
-rw-r--r-- | app/services/projects/update_pages_configuration_service.rb | 34 | ||||
-rw-r--r-- | changelogs/unreleased/57227-absolute-uri-missing-hierarchical-segment.yml | 5 | ||||
-rw-r--r-- | changelogs/unreleased/update-pages-config-only-when-changed.yml | 5 | ||||
-rw-r--r-- | changelogs/unreleased/update-pages-extensionless-urls.yml | 5 | ||||
-rw-r--r-- | doc/user/project/pages/introduction.md | 51 | ||||
-rw-r--r-- | lib/banzai/filter/autolink_filter.rb | 6 | ||||
-rw-r--r-- | package.json | 4 | ||||
-rw-r--r-- | spec/lib/banzai/filter/autolink_filter_spec.rb | 7 | ||||
-rw-r--r-- | spec/services/projects/update_pages_configuration_service_spec.rb | 32 | ||||
-rw-r--r-- | yarn.lock | 18 |
12 files changed, 153 insertions, 35 deletions
diff --git a/GITLAB_PAGES_VERSION b/GITLAB_PAGES_VERSION index 88c5fb891dc..bc80560fad6 100644 --- a/GITLAB_PAGES_VERSION +++ b/GITLAB_PAGES_VERSION @@ -1 +1 @@ -1.4.0 +1.5.0 diff --git a/app/assets/javascripts/behaviors/gl_emoji.js b/app/assets/javascripts/behaviors/gl_emoji.js index 56293d5f96f..d1d75658181 100644 --- a/app/assets/javascripts/behaviors/gl_emoji.js +++ b/app/assets/javascripts/behaviors/gl_emoji.js @@ -1,11 +1,10 @@ -import installCustomElements from 'document-register-element'; +import 'document-register-element'; import isEmojiUnicodeSupported from '../emoji/support'; -installCustomElements(window); +class GlEmoji extends HTMLElement { + constructor() { + super(); -export default function installGlEmojiElement() { - const GlEmojiElementProto = Object.create(HTMLElement.prototype); - GlEmojiElementProto.createdCallback = function createdCallback() { const emojiUnicode = this.textContent.trim(); const { name, unicodeVersion, fallbackSrc, fallbackSpriteClass } = this.dataset; @@ -43,9 +42,11 @@ export default function installGlEmojiElement() { }); } } - }; + } +} - document.registerElement('gl-emoji', { - prototype: GlEmojiElementProto, - }); +export default function installGlEmojiElement() { + if (!customElements.get('gl-emoji')) { + customElements.define('gl-emoji', GlEmoji); + } } diff --git a/app/services/projects/update_pages_configuration_service.rb b/app/services/projects/update_pages_configuration_service.rb index abf40b3ad7a..674071ad92a 100644 --- a/app/services/projects/update_pages_configuration_service.rb +++ b/app/services/projects/update_pages_configuration_service.rb @@ -2,6 +2,8 @@ module Projects class UpdatePagesConfigurationService < BaseService + include Gitlab::Utils::StrongMemoize + attr_reader :project def initialize(project) @@ -9,15 +11,25 @@ module Projects end def execute - update_file(pages_config_file, pages_config.to_json) + if file_equals?(pages_config_file, pages_config_json) + return success(reload: false) + end + + update_file(pages_config_file, pages_config_json) reload_daemon - success + success(reload: true) rescue => e error(e.message) end private + def pages_config_json + strong_memoize(:pages_config_json) do + pages_config.to_json + end + end + def pages_config { domains: pages_domains_config, @@ -67,11 +79,6 @@ module Projects end def update_file(file, data) - unless data - FileUtils.remove(file, force: true) - return - end - temp_file = "#{file}.#{SecureRandom.hex(16)}" File.open(temp_file, 'w') do |f| f.write(data) @@ -81,5 +88,18 @@ module Projects # In case if the updating fails FileUtils.remove(temp_file, force: true) end + + def file_equals?(file, data) + existing_data = read_file(file) + data == existing_data.to_s + end + + def read_file(file) + File.open(file, 'r') do |f| + f.read + end + rescue + nil + end end end diff --git a/changelogs/unreleased/57227-absolute-uri-missing-hierarchical-segment.yml b/changelogs/unreleased/57227-absolute-uri-missing-hierarchical-segment.yml new file mode 100644 index 00000000000..3a663ce2132 --- /dev/null +++ b/changelogs/unreleased/57227-absolute-uri-missing-hierarchical-segment.yml @@ -0,0 +1,5 @@ +--- +title: Fix potential Addressable::URI::InvalidURIError +merge_request: 24908 +author: +type: fixed diff --git a/changelogs/unreleased/update-pages-config-only-when-changed.yml b/changelogs/unreleased/update-pages-config-only-when-changed.yml new file mode 100644 index 00000000000..8d9e02df678 --- /dev/null +++ b/changelogs/unreleased/update-pages-config-only-when-changed.yml @@ -0,0 +1,5 @@ +--- +title: Do not reload daemon if configuration file of pages does not change +merge_request: +author: +type: performance diff --git a/changelogs/unreleased/update-pages-extensionless-urls.yml b/changelogs/unreleased/update-pages-extensionless-urls.yml new file mode 100644 index 00000000000..13b3e1df500 --- /dev/null +++ b/changelogs/unreleased/update-pages-extensionless-urls.yml @@ -0,0 +1,5 @@ +--- +title: Add support for extensionless pages URLs +merge_request: 24876 +author: +type: added diff --git a/doc/user/project/pages/introduction.md b/doc/user/project/pages/introduction.md index 2bb6fcd9d74..cebff38ba88 100644 --- a/doc/user/project/pages/introduction.md +++ b/doc/user/project/pages/introduction.md @@ -356,6 +356,57 @@ By pre-compressing the files and including both versions in the artifact, Pages can serve requests for both compressed and uncompressed content without needing to compress files on-demand. +### Resolving ambiguous URLs + +> [Introduced](https://gitlab.com/gitlab-org/gitlab-pages/issues/95) in GitLab 11.8 + +GitLab Pages makes assumptions about which files to serve when receiving a +request for a URL that does not include an extension. + +Consider a Pages site deployed with the following files: + +``` +public/ +├─┬ index.html +│ ├ data.html +│ └ info.html +│ +├── data/ +│ └── index.html +├── info/ +│ └── details.html +└── other/ + └── index.html +``` + +Pages supports reaching each of these files through several different URLs. In +particular, it will always look for an `index.html` file if the URL only +specifies the directory. If the URL references a file that doesn't exist, but +adding `.html` to the URL leads to a file that *does* exist, it will be served +instead. Here are some examples of what will happen given the above Pages site: + +| URL path | HTTP response | File served | +| -------------------- | ------------- | ----------- | +| `/` | `200 OK` | `public/index.html` | +| `/index.html` | `200 OK` | `public/index.html` | +| `/index` | `200 OK` | `public/index.html` | +| `/data` | `200 OK` | `public/data/index.html` | +| `/data/` | `200 OK` | `public/data/index.html` | +| `/data.html` | `200 OK` | `public/data.html` | +| `/info` | `200 OK` | `public/info.html` | +| `/info/` | `200 OK` | `public/info.html` | +| `/info.html` | `200 OK` | `public/info.html` | +| `/info/details` | `200 OK` | `public/info/details.html` | +| `/info/details.html` | `200 OK` | `public/info/details.html` | +| `/other` | `302 Found` | `public/other/index.html` | +| `/other/` | `200 OK` | `public/other/index.html` | +| `/other/index` | `200 OK` | `public/other/index.html` | +| `/other/index.html` | `200 OK` | `public/other/index.html` | + +NOTE: **Note:** +When `public/data/index.html` exists, it takes priority over the `public/data.html` +file for both the `/data` and `/data/` URL paths. + ### Add a custom domain to your Pages website For a complete guide on Pages domains, read through the article diff --git a/lib/banzai/filter/autolink_filter.rb b/lib/banzai/filter/autolink_filter.rb index f3061bad4ff..086adf59d2b 100644 --- a/lib/banzai/filter/autolink_filter.rb +++ b/lib/banzai/filter/autolink_filter.rb @@ -114,7 +114,11 @@ module Banzai # Since this came from a Text node, make sure the new href is encoded. # `commonmarker` percent encodes the domains of links it handles, so # do the same (instead of using `normalized_encode`). - href_safe = Addressable::URI.encode(match).html_safe + begin + href_safe = Addressable::URI.encode(match).html_safe + rescue Addressable::URI::InvalidURIError + return uri.to_s + end html_safe_match = match.html_safe options = link_options.merge(href: href_safe) diff --git a/package.json b/package.json index 3f504dc0b0b..97d8fd3b17f 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "@babel/preset-env": "^7.3.1", "@gitlab/csslab": "^1.8.0", "@gitlab/svgs": "^1.48.0", - "@gitlab/ui": "^2.0.0", + "@gitlab/ui": "^2.0.2", "apollo-boost": "^0.1.20", "apollo-client": "^2.4.5", "autosize": "^4.0.0", @@ -58,7 +58,7 @@ "dateformat": "^3.0.3", "deckar01-task_list": "^2.2.0", "diff": "^3.4.0", - "document-register-element": "1.3.0", + "document-register-element": "1.13.1", "dropzone": "^4.2.0", "echarts": "^4.2.0-rc.2", "emoji-regex": "^7.0.3", diff --git a/spec/lib/banzai/filter/autolink_filter_spec.rb b/spec/lib/banzai/filter/autolink_filter_spec.rb index 6217381c491..4972c4b4bd2 100644 --- a/spec/lib/banzai/filter/autolink_filter_spec.rb +++ b/spec/lib/banzai/filter/autolink_filter_spec.rb @@ -121,6 +121,13 @@ describe Banzai::Filter::AutolinkFilter do expect(doc.to_s).to eq("See #{link}") end + it 'does not autolink bad URLs after we remove trailing punctuation' do + link = 'http://]' + doc = filter("See #{link}") + + expect(doc.to_s).to eq("See #{link}") + end + it 'does not include trailing punctuation' do ['.', ', ok?', '...', '?', '!', ': is that ok?'].each do |trailing_punctuation| doc = filter("See #{link}#{trailing_punctuation}") diff --git a/spec/services/projects/update_pages_configuration_service_spec.rb b/spec/services/projects/update_pages_configuration_service_spec.rb index e4d4e6ff3dd..7f5ef3129d7 100644 --- a/spec/services/projects/update_pages_configuration_service_spec.rb +++ b/spec/services/projects/update_pages_configuration_service_spec.rb @@ -2,23 +2,41 @@ require 'spec_helper' describe Projects::UpdatePagesConfigurationService do let(:project) { create(:project) } - subject { described_class.new(project) } + let(:service) { described_class.new(project) } describe "#update" do let(:file) { Tempfile.new('pages-test') } + subject { service.execute } + after do file.close file.unlink end - it 'updates the .update file' do - # Access this reference to ensure scoping works - Projects::Settings # rubocop:disable Lint/Void - expect(subject).to receive(:pages_config_file).and_return(file.path) - expect(subject).to receive(:reload_daemon).and_call_original + before do + allow(service).to receive(:pages_config_file).and_return(file.path) + end + + context 'when configuration changes' do + it 'updates the .update file' do + expect(service).to receive(:reload_daemon).and_call_original + + expect(subject).to include(status: :success, reload: true) + end + end + + context 'when configuration does not change' do + before do + # we set the configuration + service.execute + end + + it 'does not update the .update file' do + expect(service).not_to receive(:reload_daemon) - expect(subject.execute).to eq({ status: :success }) + expect(subject).to include(status: :success, reload: false) + end end end end diff --git a/yarn.lock b/yarn.lock index a55bd26ffd4..423c7f75d47 100644 --- a/yarn.lock +++ b/yarn.lock @@ -658,10 +658,10 @@ resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-1.48.0.tgz#7b2e20e357d85aa46e905e6ca51b0b4184ae2794" integrity sha512-9lRsfqN0W3JxopiXnTzvDY31O465jMTGNKpiOCXy7uAMfwZA6UsRsc7Pp369uKnOLR0duXUGOxOv4NGsK6AeXw== -"@gitlab/ui@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-2.0.0.tgz#96c6845292a037de8b38bec9958e051b9904e52e" - integrity sha512-TnM+Wf5/0eRxtB02Hblfqx1X6INP+uhRcLoW+nv7Xy0fyy3LIU81EVaCnDEKFddhoK04DzmlUXswRIu59iI5LQ== +"@gitlab/ui@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-2.0.2.tgz#611571c931181fb783f57f712e1c2388059b301b" + integrity sha512-rUWVhWmM9EkwIEruYJEjizrQKe7TzNyKArwWY/nfEL4HptDtwbe+xHfR8IJHbpql3oI87cTO3BheMxYF6b2Ebg== dependencies: babel-standalone "^6.26.0" bootstrap-vue "^2.0.0-rc.11" @@ -3264,10 +3264,12 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" -document-register-element@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/document-register-element/-/document-register-element-1.3.0.tgz#fb3babb523c74662be47be19c6bc33e71990d940" - integrity sha1-+zurtSPHRmK+R74Zxrwz5xmQ2UA= +document-register-element@1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/document-register-element/-/document-register-element-1.13.1.tgz#dad8cb7be38e04ee3f56842e6cf81af46c1249ba" + integrity sha512-92ZyLDKg9j4rOll//NNXj25f+8rAzOkYsGJonhugKwXfeqH7bzs8Ucpvey0WzZ2ZzKdrvW9RnUw3UyOZ/uhBFw== + dependencies: + lightercollective "^0.1.0" dom-serialize@^2.2.0: version "2.2.1" |