Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Jérome Perrin
gitlab-ce
Commits
b883d94f
Commit
b883d94f
authored
Oct 11, 2013
by
Dmitriy Zaporozhets
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'relative_links_in_documentation' of /home/git/repositories/gitlab/gitlabhq
parents
10fac475
f40e0171
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
357 additions
and
6 deletions
+357
-6
app/helpers/gitlab_markdown_helper.rb
app/helpers/gitlab_markdown_helper.rb
+95
-1
features/project/source/markdown_render.feature
features/project/source/markdown_render.feature
+70
-0
features/steps/project/project_markdown_render.rb
features/steps/project/project_markdown_render.rb
+153
-0
lib/redcarpet/render/gitlab_html.rb
lib/redcarpet/render/gitlab_html.rb
+10
-0
spec/helpers/gitlab_markdown_helper_spec.rb
spec/helpers/gitlab_markdown_helper_spec.rb
+24
-0
spec/lib/gitlab/satellite/merge_action_spec.rb
spec/lib/gitlab/satellite/merge_action_spec.rb
+1
-1
spec/models/project_spec.rb
spec/models/project_spec.rb
+4
-4
spec/seed_project.tar.gz
spec/seed_project.tar.gz
+0
-0
No files found.
app/helpers/gitlab_markdown_helper.rb
View file @
b883d94f
...
@@ -34,7 +34,8 @@ module GitlabMarkdownHelper
...
@@ -34,7 +34,8 @@ module GitlabMarkdownHelper
# see https://github.com/vmg/redcarpet#darling-i-packed-you-a-couple-renderers-for-lunch-
# see https://github.com/vmg/redcarpet#darling-i-packed-you-a-couple-renderers-for-lunch-
filter_html:
true
,
filter_html:
true
,
with_toc_data:
true
,
with_toc_data:
true
,
hard_wrap:
true
)
hard_wrap:
true
,
safe_links_only:
true
)
@markdown
=
Redcarpet
::
Markdown
.
new
(
gitlab_renderer
,
@markdown
=
Redcarpet
::
Markdown
.
new
(
gitlab_renderer
,
# see https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use
# see https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use
no_intra_emphasis:
true
,
no_intra_emphasis:
true
,
...
@@ -57,4 +58,97 @@ module GitlabMarkdownHelper
...
@@ -57,4 +58,97 @@ module GitlabMarkdownHelper
wiki_page
.
formatted_content
.
html_safe
wiki_page
.
formatted_content
.
html_safe
end
end
end
end
# text - whole text from a markdown file
# project_path_with_namespace - namespace/projectname, eg. gitlabhq/gitlabhq
# ref - name of the branch or reference, eg. stable
# requested_path - path of request, eg. doc/api/README.md, used in special case when path is pointing to the .md file were the original request is coming from
# wiki - whether the markdown is from wiki or not
def
create_relative_links
(
text
,
project_path_with_namespace
,
ref
,
requested_path
,
wiki
=
false
)
paths
=
extract_paths
(
text
)
paths
.
each
do
|
file_path
|
new_path
=
rebuild_path
(
project_path_with_namespace
,
file_path
,
requested_path
,
ref
)
# Replacing old string with a new one with brackets ]() to prevent replacing occurence of a word
# e.g. If we have a markdown like [test](test) this will replace ](test) and not the word test
text
.
gsub!
(
"](
#{
file_path
}
)"
,
"](/
#{
new_path
}
)"
)
end
text
end
def
extract_paths
(
markdown_text
)
all_markdown_paths
=
pick_out_paths
(
markdown_text
)
paths
=
remove_empty
(
all_markdown_paths
)
select_relative
(
paths
)
end
# Split the markdown text to each line and find all paths, this will match anything with - ]("some_text")
def
pick_out_paths
(
markdown_text
)
markdown_text
.
split
(
"
\n
"
).
map
{
|
text
|
text
.
scan
(
/\]\(([^(]+)\)/
)
}
end
# Removes any empty result produced by not matching the regexp
def
remove_empty
(
paths
)
paths
.
reject
{
|
l
|
l
.
empty?
}.
flatten
end
# Reject any path that contains ignored protocol
# eg. reject "https://gitlab.org} but accept "doc/api/README.md"
def
select_relative
(
paths
)
paths
.
reject
{
|
path
|
ignored_protocols
.
map
{
|
protocol
|
path
.
include?
(
protocol
)}.
any?
}
end
def
ignored_protocols
[
"http://"
,
"https://"
,
"ftp://"
,
"mailto:"
]
end
def
rebuild_path
(
path_with_namespace
,
path
,
requested_path
,
ref
)
file_path
=
relative_file_path
(
path
,
requested_path
)
[
path_with_namespace
,
path_with_ref
(
file_path
,
ref
),
file_path
].
compact
.
join
(
"/"
)
end
# Checks if the path exists in the repo
# eg. checks if doc/README.md exists, if it doesn't then it is a wiki link
def
path_with_ref
(
path
,
ref
)
if
file_exists?
(
path
)
"
#{
local_path
(
path
)
}
/
#{
correct_ref
(
ref
)
}
"
else
"wikis"
end
end
def
relative_file_path
(
path
,
requested_path
)
nested_path
=
build_nested_path
(
path
,
requested_path
)
return
nested_path
if
file_exists?
(
nested_path
)
path
end
# Covering a special case, when the link is referencing file in the same directory eg:
# If we are at doc/api/README.md and the README.md contains relative links like [Users](users.md)
# this takes the request path(doc/api/README.md), and replaces the README.md with users.md so the path looks like doc/api/users.md
def
build_nested_path
(
path
,
request_path
)
return
path
unless
request_path
base
=
request_path
.
split
(
"/"
)
base
.
pop
(
base
+
[
path
]).
join
(
"/"
)
end
def
file_exists?
(
path
)
return
false
if
path
.
nil?
||
path
.
empty?
File
.
exists?
(
Rails
.
root
.
join
(
path
))
end
# Check if the path is pointing to a directory(tree) or a file(blob)
# eg. doc/api is directory and doc/README.md is file
def
local_path
(
path
)
File
.
directory?
(
Rails
.
root
.
join
(
path
))
?
"tree"
:
"blob"
end
# We will assume that if no ref exists we can point to master
def
correct_ref
(
ref
)
ref
?
ref
:
"master"
end
end
end
features/project/source/markdown_render.feature
0 → 100644
View file @
b883d94f
Feature
:
Project markdown render
Background
:
Given
I sign in as a user
And
I own project
"Delta"
Given
I visit project source page
Scenario
:
I
browse files from master branch
Then
I should see files from repository in master
And
I should see rendered README which contains correct links
And
I click on Gitlab API in README
Then
I should see correct document rendered
Scenario
:
I
view README in master branch
Then
I should see files from repository in master
And
I should see rendered README which contains correct links
And
I click on Rake tasks in README
Then
I should see correct directory rendered
Scenario
:
I
navigate to doc directory to view documentation in master
And
I navigate to the doc/api/README
And
I see correct file rendered
And
I click on users in doc/api/README
Then
I should see the correct document file
Scenario
:
I
navigate to doc directory to view user doc in master
And
I navigate to the doc/api/README
And
I see correct file rendered
And
I click on raketasks in doc/api/README
Then
I should see correct directory rendered
Scenario
:
I
browse files from markdown branch
When
I visit markdown branch
Then
I should see files from repository in markdown branch
And
I should see rendered README which contains correct links
And
I click on Gitlab API in README
Then
I should see correct document rendered for markdown branch
Scenario
:
I
browse directory from markdown branch
When
I visit markdown branch
Then
I should see files from repository in markdown branch
And
I should see rendered README which contains correct links
And
I click on Rake tasks in README
Then
I should see correct directory rendered for markdown branch
Scenario
:
I
navigate to doc directory to view documentation in markdown branch
When
I visit markdown branch
And
I navigate to the doc/api/README
And
I see correct file rendered in markdown branch
And
I click on users in doc/api/README
Then
I should see the users document file in markdown branch
Scenario
:
I
navigate to doc directory to view user doc in markdown branch
When
I visit markdown branch
And
I navigate to the doc/api/README
And
I see correct file rendered in markdown branch
And
I click on raketasks in doc/api/README
Then
I should see correct directory rendered for markdown branch
Scenario
:
I
create a wiki page with different links
Given
I go to wiki page
And
I add various links to the wiki page
Then
Wiki page should have added links
And
I click on test link
Then
I see new wiki page named test
When
I go back to wiki page home
And
I click on GitLab API doc link
Then
I see Gitlab API document
When
I go back to wiki page home
And
I click on Rake tasks link
Then
I see Rake tasks directory
features/steps/project/project_markdown_render.rb
0 → 100644
View file @
b883d94f
class
Spinach::Features::ProjectMarkdownRender
<
Spinach
::
FeatureSteps
include
SharedAuthentication
include
SharedPaths
And
'I own project "Delta"'
do
@project
=
Project
.
find_by_name
"Delta"
@project
||=
create
(
:project_with_code
,
name:
"Delta"
,
namespace:
@user
.
namespace
)
@project
.
team
<<
[
@user
,
:master
]
end
Then
'I should see files from repository in master'
do
current_path
.
should
==
project_tree_path
(
@project
,
"master"
)
page
.
should
have_content
"Gemfile"
page
.
should
have_content
"app"
page
.
should
have_content
"README"
end
And
'I should see rendered README which contains correct links'
do
page
.
should
have_content
"Welcome to GitLab GitLab is a free project and repository management application"
page
.
should
have_link
"GitLab API doc"
page
.
should
have_link
"GitLab API website"
page
.
should
have_link
"Rake tasks"
page
.
should
have_link
"backup and restore procedure"
end
And
'I click on Gitlab API in README'
do
click_link
"GitLab API doc"
end
Then
'I should see correct document rendered'
do
current_path
.
should
==
project_blob_path
(
@project
,
"master/doc/api/README.md"
)
page
.
should
have_content
"All API requests require authentication"
end
And
'I click on Rake tasks in README'
do
click_link
"Rake tasks"
end
Then
'I should see correct directory rendered'
do
current_path
.
should
==
project_tree_path
(
@project
,
"master/doc/raketasks"
)
page
.
should
have_content
"backup_restore.md"
page
.
should
have_content
"maintenance.md"
end
And
'I navigate to the doc/api/README'
do
click_link
"doc"
click_link
"api"
click_link
"README.md"
end
And
'I see correct file rendered'
do
current_path
.
should
==
project_blob_path
(
@project
,
"master/doc/api/README.md"
)
page
.
should
have_content
"Contents"
page
.
should
have_link
"Users"
page
.
should
have_link
"Rake tasks"
end
And
'I click on users in doc/api/README'
do
click_link
"Users"
end
Then
'I should see the correct document file'
do
current_path
.
should
==
project_blob_path
(
@project
,
"master/doc/api/users.md"
)
page
.
should
have_content
"Get a list of users."
end
And
'I click on raketasks in doc/api/README'
do
click_link
"Rake tasks"
end
When
'I visit markdown branch'
do
visit
project_tree_path
(
@project
,
"markdown"
)
end
Then
'I should see files from repository in markdown branch'
do
current_path
.
should
==
project_tree_path
(
@project
,
"markdown"
)
page
.
should
have_content
"Gemfile"
page
.
should
have_content
"app"
page
.
should
have_content
"README"
end
And
'I see correct file rendered in markdown branch'
do
current_path
.
should
==
project_blob_path
(
@project
,
"markdown/doc/api/README.md"
)
page
.
should
have_content
"Contents"
page
.
should
have_link
"Users"
page
.
should
have_link
"Rake tasks"
end
Then
'I should see correct document rendered for markdown branch'
do
current_path
.
should
==
project_blob_path
(
@project
,
"markdown/doc/api/README.md"
)
page
.
should
have_content
"All API requests require authentication"
end
Then
'I should see correct directory rendered for markdown branch'
do
current_path
.
should
==
project_tree_path
(
@project
,
"markdown/doc/raketasks"
)
page
.
should
have_content
"backup_restore.md"
page
.
should
have_content
"maintenance.md"
end
Then
'I should see the users document file in markdown branch'
do
current_path
.
should
==
project_blob_path
(
@project
,
"markdown/doc/api/users.md"
)
page
.
should
have_content
"Get a list of users."
end
Given
'I go to wiki page'
do
click_link
"Wiki"
current_path
.
should
==
project_wiki_path
(
@project
,
"home"
)
end
And
'I add various links to the wiki page'
do
fill_in
"wiki[content]"
,
with:
"[test](test)
\n
[GitLab API doc](doc/api/README.md)
\n
[Rake tasks](doc/raketasks)
\n
"
fill_in
"wiki[message]"
,
with:
"Adding links to wiki"
click_button
"Create page"
end
Then
'Wiki page should have added links'
do
current_path
.
should
==
project_wiki_path
(
@project
,
"home"
)
page
.
should
have_content
"test GitLab API doc Rake tasks"
end
And
'I click on test link'
do
click_link
"test"
end
Then
'I see new wiki page named test'
do
current_path
.
should
==
project_wiki_path
(
@project
,
"test"
)
page
.
should
have_content
"Editing page"
end
When
'I go back to wiki page home'
do
visit
project_wiki_path
(
@project
,
"home"
)
current_path
.
should
==
project_wiki_path
(
@project
,
"home"
)
end
And
'I click on GitLab API doc link'
do
click_link
"GitLab API"
end
Then
'I see Gitlab API document'
do
current_path
.
should
==
project_blob_path
(
@project
,
"master/doc/api/README.md"
)
page
.
should
have_content
"Status codes"
end
And
'I click on Rake tasks link'
do
click_link
"Rake tasks"
end
Then
'I see Rake tasks directory'
do
current_path
.
should
==
project_tree_path
(
@project
,
"master/doc/raketasks"
)
page
.
should
have_content
"backup_restore.md"
page
.
should
have_content
"maintenance.md"
end
end
\ No newline at end of file
lib/redcarpet/render/gitlab_html.rb
View file @
b883d94f
...
@@ -6,6 +6,8 @@ class Redcarpet::Render::GitlabHTML < Redcarpet::Render::HTML
...
@@ -6,6 +6,8 @@ class Redcarpet::Render::GitlabHTML < Redcarpet::Render::HTML
def
initialize
(
template
,
options
=
{})
def
initialize
(
template
,
options
=
{})
@template
=
template
@template
=
template
@project
=
@template
.
instance_variable_get
(
"@project"
)
@project
=
@template
.
instance_variable_get
(
"@project"
)
@ref
=
@template
.
instance_variable_get
(
"@ref"
)
@request_path
=
@template
.
instance_variable_get
(
"@path"
)
super
options
super
options
end
end
...
@@ -32,7 +34,15 @@ class Redcarpet::Render::GitlabHTML < Redcarpet::Render::HTML
...
@@ -32,7 +34,15 @@ class Redcarpet::Render::GitlabHTML < Redcarpet::Render::HTML
h
.
link_to_gfm
(
content
,
link
,
title:
title
)
h
.
link_to_gfm
(
content
,
link
,
title:
title
)
end
end
def
preprocess
(
full_document
)
h
.
create_relative_links
(
full_document
,
@project
.
path_with_namespace
,
@ref
,
@request_path
,
is_wiki?
)
end
def
postprocess
(
full_document
)
def
postprocess
(
full_document
)
h
.
gfm
(
full_document
)
h
.
gfm
(
full_document
)
end
end
def
is_wiki?
@template
.
instance_variable_get
(
"@wiki"
)
end
end
end
spec/helpers/gitlab_markdown_helper_spec.rb
View file @
b883d94f
...
@@ -406,6 +406,30 @@ describe GitlabMarkdownHelper do
...
@@ -406,6 +406,30 @@ describe GitlabMarkdownHelper do
it
"should generate absolute urls for emoji"
do
it
"should generate absolute urls for emoji"
do
markdown
(
":smile:"
).
should
include
(
"src=
\"
#{
url_to_image
(
"emoji/smile"
)
}
"
)
markdown
(
":smile:"
).
should
include
(
"src=
\"
#{
url_to_image
(
"emoji/smile"
)
}
"
)
end
end
it
"should handle relative urls for a file in master"
do
actual
=
"[GitLab API doc](doc/api/README.md)
\n
"
expected
=
"<p><a href=
\"
/
#{
project
.
path_with_namespace
}
/blob/master/doc/api/README.md
\"
>GitLab API doc</a></p>
\n
"
markdown
(
actual
).
should
match
(
expected
)
end
it
"should handle relative urls for a directory in master"
do
actual
=
"[GitLab API doc](doc/api)
\n
"
expected
=
"<p><a href=
\"
/
#{
project
.
path_with_namespace
}
/tree/master/doc/api
\"
>GitLab API doc</a></p>
\n
"
markdown
(
actual
).
should
match
(
expected
)
end
it
"should handle absolute urls"
do
actual
=
"[GitLab](https://www.gitlab.com)
\n
"
expected
=
"<p><a href=
\"
https://www.gitlab.com
\"
>GitLab</a></p>
\n
"
markdown
(
actual
).
should
match
(
expected
)
end
it
"should handle wiki urls"
do
actual
=
"[Link](test/link)
\n
"
expected
=
"<p><a href=
\"
/
#{
project
.
path_with_namespace
}
/wikis/test/link
\"
>Link</a></p>
\n
"
markdown
(
actual
).
should
match
(
expected
)
end
end
end
describe
"#render_wiki_content"
do
describe
"#render_wiki_content"
do
...
...
spec/lib/gitlab/satellite/merge_action_spec.rb
View file @
b883d94f
...
@@ -3,7 +3,7 @@ require 'spec_helper'
...
@@ -3,7 +3,7 @@ require 'spec_helper'
describe
'Gitlab::Satellite::MergeAction'
do
describe
'Gitlab::Satellite::MergeAction'
do
before
(
:each
)
do
before
(
:each
)
do
# TestEnv.init(mailer: false, init_repos: true, repos: true)
# TestEnv.init(mailer: false, init_repos: true, repos: true)
@master
=
[
'master'
,
'b
cf03b5de6c33f3869ef70d68cf06e679d1d7f9a
'
]
@master
=
[
'master'
,
'b
1e6a9dbf1c85e6616497a5e7bad9143a4bd0828
'
]
@one_after_stable
=
[
'stable'
,
'6ea87c47f0f8a24ae031c3fff17bc913889ecd00'
]
#this commit sha is one after stable
@one_after_stable
=
[
'stable'
,
'6ea87c47f0f8a24ae031c3fff17bc913889ecd00'
]
#this commit sha is one after stable
@wiki_branch
=
[
'wiki'
,
'635d3e09b72232b6e92a38de6cc184147e5bcb41'
]
#this is the commit sha where the wiki branch goes off from master
@wiki_branch
=
[
'wiki'
,
'635d3e09b72232b6e92a38de6cc184147e5bcb41'
]
#this is the commit sha where the wiki branch goes off from master
@conflicting_metior
=
[
'metior'
,
'313d96e42b313a0af5ab50fa233bf43e27118b3f'
]
#this branch conflicts with the wiki branch
@conflicting_metior
=
[
'metior'
,
'313d96e42b313a0af5ab50fa233bf43e27118b3f'
]
#this branch conflicts with the wiki branch
...
...
spec/models/project_spec.rb
View file @
b883d94f
...
@@ -132,17 +132,17 @@ describe Project do
...
@@ -132,17 +132,17 @@ describe Project do
it
"should close merge request if last commit from source branch was pushed to target branch"
do
it
"should close merge request if last commit from source branch was pushed to target branch"
do
@merge_request
.
reloaded_commits
@merge_request
.
reloaded_commits
@merge_request
.
last_commit
.
id
.
should
==
"b
cf03b5de6c33f3869ef70d68cf06e679d1d7f9a
"
@merge_request
.
last_commit
.
id
.
should
==
"b
1e6a9dbf1c85e6616497a5e7bad9143a4bd0828
"
project
.
update_merge_requests
(
"8716fc78f3c65bbf7bcf7b574febd583bc5d2812"
,
"b
cf03b5de6c33f3869ef70d68cf06e679d1d7f9a
"
,
"refs/heads/stable"
,
@key
.
user
)
project
.
update_merge_requests
(
"8716fc78f3c65bbf7bcf7b574febd583bc5d2812"
,
"b
1e6a9dbf1c85e6616497a5e7bad9143a4bd0828
"
,
"refs/heads/stable"
,
@key
.
user
)
@merge_request
.
reload
@merge_request
.
reload
@merge_request
.
merged?
.
should
be_true
@merge_request
.
merged?
.
should
be_true
end
end
it
"should update merge request commits with new one if pushed to source branch"
do
it
"should update merge request commits with new one if pushed to source branch"
do
@merge_request
.
last_commit
.
should
==
nil
@merge_request
.
last_commit
.
should
==
nil
project
.
update_merge_requests
(
"8716fc78f3c65bbf7bcf7b574febd583bc5d2812"
,
"b
cf03b5de6c33f3869ef70d68cf06e679d1d7f9a
"
,
"refs/heads/master"
,
@key
.
user
)
project
.
update_merge_requests
(
"8716fc78f3c65bbf7bcf7b574febd583bc5d2812"
,
"b
1e6a9dbf1c85e6616497a5e7bad9143a4bd0828
"
,
"refs/heads/master"
,
@key
.
user
)
@merge_request
.
reload
@merge_request
.
reload
@merge_request
.
last_commit
.
id
.
should
==
"b
cf03b5de6c33f3869ef70d68cf06e679d1d7f9a
"
@merge_request
.
last_commit
.
id
.
should
==
"b
1e6a9dbf1c85e6616497a5e7bad9143a4bd0828
"
end
end
end
end
...
...
spec/seed_project.tar.gz
View file @
b883d94f
No preview for this file type
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment