Commit fe641cbd authored by Grzegorz Bizon's avatar Grzegorz Bizon

Merge branch 'sh-fix-issue-move-api' into 'master'

Fix moving issues API failing when text includes commit URLs

Closes #66666

See merge request gitlab-org/gitlab-ce!32317
parents 96f2b646 29ce13e9
...@@ -35,6 +35,7 @@ class Commit ...@@ -35,6 +35,7 @@ class Commit
MIN_SHA_LENGTH = Gitlab::Git::Commit::MIN_SHA_LENGTH MIN_SHA_LENGTH = Gitlab::Git::Commit::MIN_SHA_LENGTH
COMMIT_SHA_PATTERN = /\h{#{MIN_SHA_LENGTH},40}/.freeze COMMIT_SHA_PATTERN = /\h{#{MIN_SHA_LENGTH},40}/.freeze
EXACT_COMMIT_SHA_PATTERN = /\A#{COMMIT_SHA_PATTERN}\z/.freeze
# Used by GFM to match and present link extensions on node texts and hrefs. # Used by GFM to match and present link extensions on node texts and hrefs.
LINK_EXTENSION_PATTERN = /(patch)/.freeze LINK_EXTENSION_PATTERN = /(patch)/.freeze
...@@ -90,7 +91,7 @@ class Commit ...@@ -90,7 +91,7 @@ class Commit
end end
def valid_hash?(key) def valid_hash?(key)
!!(/\A#{COMMIT_SHA_PATTERN}\z/ =~ key) !!(EXACT_COMMIT_SHA_PATTERN =~ key)
end end
def lazy(project, oid) def lazy(project, oid)
...@@ -139,6 +140,10 @@ class Commit ...@@ -139,6 +140,10 @@ class Commit
'@' '@'
end end
def self.reference_valid?(reference)
!!(reference =~ EXACT_COMMIT_SHA_PATTERN)
end
# Pattern used to extract commit references from text # Pattern used to extract commit references from text
# #
# This pattern supports cross-project references. # This pattern supports cross-project references.
......
---
title: Fix moving issues API failing when text includes commit URLs
merge_request: 32317
author:
type: fixed
...@@ -102,6 +102,23 @@ describe Gitlab::Gfm::ReferenceRewriter do ...@@ -102,6 +102,23 @@ describe Gitlab::Gfm::ReferenceRewriter do
end end
end end
context 'with a commit' do
let(:old_project) { create(:project, :repository, name: 'old-project', group: group) }
let(:commit) { old_project.commit }
context 'reference to an absolute URL to a commit' do
let(:text) { Gitlab::UrlBuilder.build(commit) }
it { is_expected.to eq(text) }
end
context 'reference to a commit' do
let(:text) { commit.id }
it { is_expected.to eq("#{old_project_ref}@#{text}") }
end
end
context 'reference contains project milestone' do context 'reference contains project milestone' do
let!(:milestone) do let!(:milestone) do
create(:milestone, title: '9.0', project: old_project) create(:milestone, title: '9.0', project: old_project)
......
...@@ -192,6 +192,24 @@ describe Commit do ...@@ -192,6 +192,24 @@ describe Commit do
end end
end end
describe '.reference_valid?' do
using RSpec::Parameterized::TableSyntax
where(:ref, :result) do
'1234567' | true
'123456' | false
'1' | false
'0' * 40 | true
'c1acaa58bbcbc3eafe538cb8274ba387047b69f8' | true
'H1acaa58bbcbc3eafe538cb8274ba387047b69f8' | false
nil | false
end
with_them do
it { expect(described_class.reference_valid?(ref)).to eq(result) }
end
end
describe '#reference_link_text' do describe '#reference_link_text' do
let(:project) { create(:project, :repository, path: 'sample-project') } let(:project) { create(:project, :repository, path: 'sample-project') }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment