Commit ced4a37a186601b37121c19523955b96767d9af5
Exists in
spb-stable
and in
3 other branches
Merge branch 'reference_relative_links' into 'master'
Reference style links with relative links in markdown #996 ``` Adds relative links support to reference style links, eg: [GitLab API doc directory][GitLab API directory listing] [Maintenance][Maintenance rake task] \[GitLab API directory listing]: doc/api/ \[Maintenance rake task]: doc/raketasks/maintenance.md ```
Showing
7 changed files
with
82 additions
and
11 deletions
Show diff stats
app/helpers/gitlab_markdown_helper.rb
| ... | ... | @@ -69,10 +69,17 @@ module GitlabMarkdownHelper |
| 69 | 69 | project_path_with_namespace = project.path_with_namespace |
| 70 | 70 | paths = extract_paths(text) |
| 71 | 71 | paths.each do |file_path| |
| 72 | - new_path = rebuild_path(project_path_with_namespace, file_path, requested_path, ref) | |
| 73 | - # Replacing old string with a new one with brackets ]() to prevent replacing occurence of a word | |
| 74 | - # e.g. If we have a markdown like [test](test) this will replace ](test) and not the word test | |
| 75 | - text.gsub!("](#{file_path})", "](/#{new_path})") | |
| 72 | + original_file_path = extract(file_path) | |
| 73 | + new_path = rebuild_path(project_path_with_namespace, original_file_path, requested_path, ref) | |
| 74 | + if reference_path?(file_path) | |
| 75 | + # Replacing old string with a new one that contains updated path | |
| 76 | + # eg. [some document]: document.md will be replaced with [some document] /namespace/project/master/blob/document.md | |
| 77 | + text.gsub!(file_path, file_path.gsub(original_file_path, "/#{new_path}")) | |
| 78 | + else | |
| 79 | + # Replacing old string with a new one with brackets ]() to prevent replacing occurence of a word | |
| 80 | + # e.g. If we have a markdown like [test](test) this will replace ](test) and not the word test | |
| 81 | + text.gsub!("](#{file_path})", "](/#{new_path})") | |
| 82 | + end | |
| 76 | 83 | end |
| 77 | 84 | text |
| 78 | 85 | end |
| ... | ... | @@ -83,9 +90,11 @@ module GitlabMarkdownHelper |
| 83 | 90 | select_relative(paths) |
| 84 | 91 | end |
| 85 | 92 | |
| 86 | - # Split the markdown text to each line and find all paths, this will match anything with - ]("some_text") | |
| 93 | + # Split the markdown text to each line and find all paths, this will match anything with - ]("some_text") and [some text]: file.md | |
| 87 | 94 | def pick_out_paths(markdown_text) |
| 88 | - markdown_text.split("\n").map { |text| text.scan(/\]\(([^(]+)\)/) } | |
| 95 | + inline_paths = markdown_text.split("\n").map { |text| text.scan(/\]\(([^(]+)\)/) } | |
| 96 | + reference_paths = markdown_text.split("\n").map { |text| text.scan(/\[.*\]:.*/) } | |
| 97 | + inline_paths + reference_paths | |
| 89 | 98 | end |
| 90 | 99 | |
| 91 | 100 | # Removes any empty result produced by not matching the regexp |
| ... | ... | @@ -93,12 +102,22 @@ module GitlabMarkdownHelper |
| 93 | 102 | paths.reject{|l| l.empty? }.flatten |
| 94 | 103 | end |
| 95 | 104 | |
| 105 | + # If a path is a reference style link we need to omit ]: | |
| 106 | + def extract(path) | |
| 107 | + path.split("]: ").last | |
| 108 | + end | |
| 109 | + | |
| 96 | 110 | # Reject any path that contains ignored protocol |
| 97 | 111 | # eg. reject "https://gitlab.org} but accept "doc/api/README.md" |
| 98 | 112 | def select_relative(paths) |
| 99 | 113 | paths.reject{|path| ignored_protocols.map{|protocol| path.include?(protocol)}.any?} |
| 100 | 114 | end |
| 101 | 115 | |
| 116 | + # Check whether a path is a reference-style link | |
| 117 | + def reference_path?(path) | |
| 118 | + path.include?("]: ") | |
| 119 | + end | |
| 120 | + | |
| 102 | 121 | def ignored_protocols |
| 103 | 122 | ["http://","https://", "ftp://", "mailto:"] |
| 104 | 123 | end | ... | ... |
features/project/source/markdown_render.feature
| ... | ... | @@ -16,6 +16,18 @@ Feature: Project markdown render |
| 16 | 16 | And I click on Rake tasks in README |
| 17 | 17 | Then I should see correct directory rendered |
| 18 | 18 | |
| 19 | + Scenario: I view README in master branch to see reference links to directory | |
| 20 | + Then I should see files from repository in master | |
| 21 | + And I should see rendered README which contains correct links | |
| 22 | + And I click on GitLab API doc directory in README | |
| 23 | + Then I should see correct doc/api directory rendered | |
| 24 | + | |
| 25 | + Scenario: I view README in master branch to see reference links to file | |
| 26 | + Then I should see files from repository in master | |
| 27 | + And I should see rendered README which contains correct links | |
| 28 | + And I click on Maintenance in README | |
| 29 | + Then I should see correct maintenance file rendered | |
| 30 | + | |
| 19 | 31 | Scenario: I navigate to doc directory to view documentation in master |
| 20 | 32 | And I navigate to the doc/api/README |
| 21 | 33 | And I see correct file rendered | ... | ... |
features/steps/project/project_markdown_render.rb
| ... | ... | @@ -21,6 +21,8 @@ class Spinach::Features::ProjectMarkdownRender < Spinach::FeatureSteps |
| 21 | 21 | page.should have_link "GitLab API website" |
| 22 | 22 | page.should have_link "Rake tasks" |
| 23 | 23 | page.should have_link "backup and restore procedure" |
| 24 | + page.should have_link "GitLab API doc directory" | |
| 25 | + page.should have_link "Maintenance" | |
| 24 | 26 | end |
| 25 | 27 | |
| 26 | 28 | And 'I click on Gitlab API in README' do |
| ... | ... | @@ -42,6 +44,26 @@ class Spinach::Features::ProjectMarkdownRender < Spinach::FeatureSteps |
| 42 | 44 | page.should have_content "maintenance.md" |
| 43 | 45 | end |
| 44 | 46 | |
| 47 | + | |
| 48 | + And 'I click on GitLab API doc directory in README' do | |
| 49 | + click_link "GitLab API doc directory" | |
| 50 | + end | |
| 51 | + | |
| 52 | + Then 'I should see correct doc/api directory rendered' do | |
| 53 | + current_path.should == project_tree_path(@project, "master/doc/api/") | |
| 54 | + page.should have_content "README.md" | |
| 55 | + page.should have_content "users.md" | |
| 56 | + end | |
| 57 | + | |
| 58 | + And 'I click on Maintenance in README' do | |
| 59 | + click_link "Maintenance" | |
| 60 | + end | |
| 61 | + | |
| 62 | + Then 'I should see correct maintenance file rendered' do | |
| 63 | + current_path.should == project_blob_path(@project, "master/doc/raketasks/maintenance.md") | |
| 64 | + page.should have_content "bundle exec rake gitlab:env:info RAILS_ENV=production" | |
| 65 | + end | |
| 66 | + | |
| 45 | 67 | And 'I navigate to the doc/api/README' do |
| 46 | 68 | click_link "doc" |
| 47 | 69 | click_link "api" | ... | ... |
spec/helpers/gitlab_markdown_helper_spec.rb
| ... | ... | @@ -431,6 +431,24 @@ describe GitlabMarkdownHelper do |
| 431 | 431 | expected = "<p><a href=\"/#{project.path_with_namespace}/wikis/test/link\">Link</a></p>\n" |
| 432 | 432 | markdown(actual).should match(expected) |
| 433 | 433 | end |
| 434 | + | |
| 435 | + it "should handle relative urls in reference links for a file in master" do | |
| 436 | + actual = "[GitLab API doc][GitLab readme]\n [GitLab readme]: doc/api/README.md\n" | |
| 437 | + expected = "<p><a href=\"/#{project.path_with_namespace}/blob/master/doc/api/README.md\">GitLab API doc</a></p>\n" | |
| 438 | + markdown(actual).should match(expected) | |
| 439 | + end | |
| 440 | + | |
| 441 | + it "should handle relative urls in reference links for a directory in master" do | |
| 442 | + actual = "[GitLab API doc directory][GitLab readmes]\n [GitLab readmes]: doc/api/\n" | |
| 443 | + expected = "<p><a href=\"/#{project.path_with_namespace}/tree/master/doc/api/\">GitLab API doc directory</a></p>\n" | |
| 444 | + markdown(actual).should match(expected) | |
| 445 | + end | |
| 446 | + | |
| 447 | + it "should not handle malformed relative urls in reference links for a file in master" do | |
| 448 | + actual = "[GitLab readme]: doc/api/README.md\n" | |
| 449 | + expected = "" | |
| 450 | + markdown(actual).should match(expected) | |
| 451 | + end | |
| 434 | 452 | end |
| 435 | 453 | |
| 436 | 454 | describe "#render_wiki_content" do | ... | ... |
spec/lib/gitlab/satellite/merge_action_spec.rb
| ... | ... | @@ -2,7 +2,7 @@ require 'spec_helper' |
| 2 | 2 | |
| 3 | 3 | describe 'Gitlab::Satellite::MergeAction' do |
| 4 | 4 | before(:each) do |
| 5 | - @master = ['master', 'b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828'] | |
| 5 | + @master = ['master', '69b34b7e9ad9f496f0ad10250be37d6265a03bba'] | |
| 6 | 6 | @one_after_stable = ['stable', '6ea87c47f0f8a24ae031c3fff17bc913889ecd00'] #this commit sha is one after stable |
| 7 | 7 | @wiki_branch = ['wiki', '635d3e09b72232b6e92a38de6cc184147e5bcb41'] #this is the commit sha where the wiki branch goes off from master |
| 8 | 8 | @conflicting_metior = ['metior', '313d96e42b313a0af5ab50fa233bf43e27118b3f'] #this branch conflicts with the wiki branch | ... | ... |
spec/models/project_spec.rb
| ... | ... | @@ -137,16 +137,16 @@ describe Project do |
| 137 | 137 | |
| 138 | 138 | it "should close merge request if last commit from source branch was pushed to target branch" do |
| 139 | 139 | @merge_request.reload_code |
| 140 | - @merge_request.last_commit.id.should == "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828" | |
| 141 | - project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828", "refs/heads/stable", @key.user) | |
| 140 | + @merge_request.last_commit.id.should == "69b34b7e9ad9f496f0ad10250be37d6265a03bba" | |
| 141 | + project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "69b34b7e9ad9f496f0ad10250be37d6265a03bba", "refs/heads/stable", @key.user) | |
| 142 | 142 | @merge_request.reload |
| 143 | 143 | @merge_request.merged?.should be_true |
| 144 | 144 | end |
| 145 | 145 | |
| 146 | 146 | it "should update merge request commits with new one if pushed to source branch" do |
| 147 | - project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828", "refs/heads/master", @key.user) | |
| 147 | + project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "69b34b7e9ad9f496f0ad10250be37d6265a03bba", "refs/heads/master", @key.user) | |
| 148 | 148 | @merge_request.reload |
| 149 | - @merge_request.last_commit.id.should == "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828" | |
| 149 | + @merge_request.last_commit.id.should == "69b34b7e9ad9f496f0ad10250be37d6265a03bba" | |
| 150 | 150 | end |
| 151 | 151 | end |
| 152 | 152 | ... | ... |
spec/seed_project.tar.gz
No preview for this file type