diff --git a/doc/user/markdown.md b/doc/user/markdown.md index 393bcfe18b9d5351fabbaad92638a38946f95bc5..fb7116e8e466ef96f0683581b16ffc33ede6633a 100644 --- a/doc/user/markdown.md +++ b/doc/user/markdown.md @@ -2034,6 +2034,7 @@ The syntax is `%{PLACEHOLDER}`. | `%{project_title}` | `GitLab` | Title of a project | | `%{group_name}` | `gitlab-org` | Group of a project | | `%{default_branch}` | `main` | Default branch name configured for a project's repository | +| `%{current_ref}` | `feature-branch` | Current ref (branch, tag, or commit SHA) being viewed | | `%{commit_sha}` | `ad10e011ce65492322037633ebc054efde37b143` | ID of the most recent commit to the default branch of a project's repository | | `%{latest_tag}` | `v17.10.7-ee` | Latest tag added to the project's repository | diff --git a/lib/banzai/filter/placeholders_post_filter.rb b/lib/banzai/filter/placeholders_post_filter.rb index 824907cd3f5e1b3a62390871578fd057723c77a5..6430bcf75be22ce290b0198687d1b5b2b1f8a22c 100644 --- a/lib/banzai/filter/placeholders_post_filter.rb +++ b/lib/banzai/filter/placeholders_post_filter.rb @@ -58,6 +58,12 @@ class PlaceholdersPostFilter < HTML::Pipeline::Filter context[:project]&.default_branch end end, + 'current_ref' => ->(context) do + if context[:project]&.repository_exists? && + Ability.allowed?(context[:current_user], :read_code, context[:project]) + context[:ref] + end + end, 'commit_sha' => ->(context) do if context[:project]&.repository_exists? && Ability.allowed?(context[:current_user], :read_code, context[:project]) diff --git a/spec/lib/banzai/filter/placeholders_post_filter_spec.rb b/spec/lib/banzai/filter/placeholders_post_filter_spec.rb index 47bb1899eae99269d1fc00290504c0c94b3d9e26..956e426e23e4e9359e961cdcca69885fa196e827 100644 --- a/spec/lib/banzai/filter/placeholders_post_filter_spec.rb +++ b/spec/lib/banzai/filter/placeholders_post_filter_spec.rb @@ -20,7 +20,7 @@ def run_filter(text, context = { project: project }) end def expect_replaces_placeholder(markdown, expected) - result = run_pipeline(markdown, project: project, current_user: user) + result = run_pipeline(markdown, project: project, current_user: user, ref: current_ref_name, group: group) if expected expect(result).to eq "

#{expected}

" @@ -34,20 +34,22 @@ def expect_replaces_placeholder(markdown, expected) "#{Gitlab.config.pages.host}" end - let!(:project_path) { "#{project.full_path}" } - let!(:project_name) { "#{project.path}" } - let!(:project_id) { "#{project.id}" } - let!(:project_namespace) do + let(:project_path) { "#{project.full_path}" } + let(:project_name) { "#{project.path}" } + let(:project_id) { "#{project.id}" } + let(:project_namespace) do "#{project.project_namespace.to_param}" end - let!(:project_title) { "#{project.title}" } - let!(:group_name) { "#{project.group&.name}" } - let!(:default_branch) { "#{project.default_branch}" } - let!(:commit_sha) { "#{project.commit&.sha}" } - let!(:latest_tag) { "#{project_tag}" } + let(:project_title) { "#{project.title}" } + let(:group_name) { "#{project.group.name}" } + let(:default_branch) { "#{project.default_branch}" } + let!(:current_ref) { "#{current_ref_name}" } + let(:commit_sha) { "#{project.commit.sha}" } + let(:latest_tag) { "#{project_tag}" } let!(:empty_span) { "" } - let!(:project_tag) do + let!(:current_ref_name) { 'feature-branch' } + let(:project_tag) do if project.repository_exists? TagsFinder.new(project.repository, per_page: 1, sort: 'updated_desc')&.execute&.first&.name end @@ -64,6 +66,7 @@ def expect_replaces_placeholder(markdown, expected) '%{project_namespace}' | nil '%{group_name}' | ref(:group_name) '%{default_branch}' | nil + '%{current_ref}' | nil '%{commit_sha}' | nil '%{latest_tag}' | nil end @@ -86,6 +89,7 @@ def expect_replaces_placeholder(markdown, expected) '%{project_namespace}' | nil '%{group_name}' | nil '%{default_branch}' | nil + '%{current_ref}' | nil '%{commit_sha}' | nil '%{latest_tag}' | nil end @@ -108,6 +112,7 @@ def expect_replaces_placeholder(markdown, expected) '%{project_namespace}' | ref(:project_namespace) '%{group_name}' | ref(:group_name) '%{default_branch}' | ref(:default_branch) + '%{current_ref}' | ref(:current_ref) '%{commit_sha}' | ref(:commit_sha) '%{latest_tag}' | ref(:latest_tag) end @@ -130,6 +135,7 @@ def expect_replaces_placeholder(markdown, expected) '%{project_namespace}' | ref(:project_namespace) '%{group_name}' | ref(:group_name) '%{default_branch}' | nil + '%{current_ref}' | nil '%{commit_sha}' | nil '%{latest_tag}' | nil end @@ -258,6 +264,15 @@ def expect_replaces_placeholder(markdown, expected) it_behaves_like 'placeholders with access, no code access' end + context 'when project is nil' do + let_it_be(:user) { create(:user) } + let_it_be(:group) { create(:group) } + let_it_be(:project) { nil } + let_it_be(:group_name) { "#{group.name}" } + + it_behaves_like 'placeholders with no access' + end + context 'when placeholders in text' do let_it_be(:user) { create(:user) } let_it_be(:group) { create(:group) }