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
1
Merge Requests
1
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
nexedi
gitlab-ce
Commits
efe4ac6f
Commit
efe4ac6f
authored
Jan 29, 2017
by
Douwe Maan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add tests
parent
07be72a3
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
381 additions
and
6 deletions
+381
-6
app/models/ci/pipeline.rb
app/models/ci/pipeline.rb
+1
-1
app/models/project.rb
app/models/project.rb
+3
-3
app/models/repository.rb
app/models/repository.rb
+2
-2
lib/gitlab/route_map.rb
lib/gitlab/route_map.rb
+2
-0
spec/features/projects/blobs/view_on_env_spec.rb
spec/features/projects/blobs/view_on_env_spec.rb
+7
-0
spec/features/projects/commit/cherry_pick_spec.rb
spec/features/projects/commit/cherry_pick_spec.rb
+0
-0
spec/features/projects/commit/view_on_env_spec.rb
spec/features/projects/commit/view_on_env_spec.rb
+9
-0
spec/features/projects/compare/view_on_env_spec.rb
spec/features/projects/compare/view_on_env_spec.rb
+9
-0
spec/features/projects/compare_spec.rb
spec/features/projects/compare_spec.rb
+0
-0
spec/features/projects/merge_requests/view_on_env_spec.rb
spec/features/projects/merge_requests/view_on_env_spec.rb
+9
-0
spec/helpers/commits_helper_spec.rb
spec/helpers/commits_helper_spec.rb
+19
-0
spec/lib/gitlab/route_map_spec.rb
spec/lib/gitlab/route_map_spec.rb
+89
-0
spec/models/environment_spec.rb
spec/models/environment_spec.rb
+48
-0
spec/models/merge_request_spec.rb
spec/models/merge_request_spec.rb
+24
-0
spec/models/project_spec.rb
spec/models/project_spec.rb
+123
-0
spec/models/repository_spec.rb
spec/models/repository_spec.rb
+36
-0
No files found.
app/models/ci/pipeline.rb
View file @
efe4ac6f
...
...
@@ -283,7 +283,7 @@ module Ci
def
ci_yaml_file
return
@ci_yaml_file
if
defined?
(
@ci_yaml_file
)
@ci_yaml_file
||=
project
.
repository
.
ci_yaml_file
(
sha
)
@ci_yaml_file
||=
project
.
repository
.
gitlab_ci_yml_for
(
sha
)
end
def
has_yaml_errors?
...
...
app/models/project.rb
View file @
efe4ac6f
...
...
@@ -1579,10 +1579,10 @@ class Project < ActiveRecord::Base
end
end
def
route_map_for
_commit
(
commit_sha
)
def
route_map_for
(
commit_sha
)
@route_maps_by_commit
||=
Hash
.
new
do
|
h
,
sha
|
h
[
sha
]
=
begin
data
=
repository
.
route_map_f
ile
(
sha
)
data
=
repository
.
route_map_f
or
(
sha
)
next
unless
data
Gitlab
::
RouteMap
.
new
(
data
)
...
...
@@ -1595,7 +1595,7 @@ class Project < ActiveRecord::Base
end
def
public_path_for_source_path
(
path
,
commit_sha
)
map
=
route_map_for
_commit
(
commit_sha
)
map
=
route_map_for
(
commit_sha
)
return
unless
map
map
.
public_path_for_source_path
(
path
)
...
...
app/models/repository.rb
View file @
efe4ac6f
...
...
@@ -1340,14 +1340,14 @@ class Repository
end
end
def
route_map_f
ile
(
sha
)
def
route_map_f
or
(
sha
)
blob
=
blob_at
(
sha
,
ROUTE_MAP_PATH
)
return
unless
blob
blob
.
load_all_data!
(
self
)
blob
.
data
end
def
ci_yaml_file
(
sha
)
def
gitlab_ci_yml_for
(
sha
)
blob
=
blob_at
(
sha
,
GITLAB_CI_YML_PATH
)
return
unless
blob
blob
.
load_all_data!
(
self
)
...
...
lib/gitlab/route_map.rb
View file @
efe4ac6f
...
...
@@ -2,6 +2,8 @@ module Gitlab
class
RouteMap
class
FormatError
<
StandardError
;
end
attr_reader
:map
def
initialize
(
data
)
begin
entries
=
YAML
.
safe_load
(
data
)
...
...
spec/features/projects/blobs/view_on_env_spec.rb
0 → 100644
View file @
efe4ac6f
require
'spec_helper'
feature
'Blob'
do
describe
'View on environment'
do
# TODO: Test
end
end
spec/features/projects/commit
s
/cherry_pick_spec.rb
→
spec/features/projects/commit/cherry_pick_spec.rb
View file @
efe4ac6f
File moved
spec/features/projects/commit/view_on_env_spec.rb
0 → 100644
View file @
efe4ac6f
require
'spec_helper'
feature
'Commit'
do
describe
'Diff'
do
describe
'View on environment'
do
# TODO: Test
end
end
end
spec/features/projects/compare/view_on_env_spec.rb
0 → 100644
View file @
efe4ac6f
require
'spec_helper'
feature
'Compare'
do
describe
'Diff'
do
describe
'View on environment'
do
# TODO: Test
end
end
end
spec/features/compare_spec.rb
→
spec/features/
projects/
compare_spec.rb
View file @
efe4ac6f
File moved
spec/features/projects/merge_requests/view_on_env_spec.rb
0 → 100644
View file @
efe4ac6f
require
'spec_helper'
feature
'Merge Request'
do
describe
'Diff'
do
describe
'View on environment'
do
# TODO: Test
end
end
end
spec/helpers/commits_helper_spec.rb
View file @
efe4ac6f
...
...
@@ -26,4 +26,23 @@ describe CommitsHelper do
not_to
include
(
'onmouseover="alert(1)"'
)
end
end
describe
'#view_on_environment_btn'
do
let
(
:project
)
{
create
(
:empty_project
)
}
let
(
:environment
)
{
create
(
:environment
,
external_url:
'http://example.com'
)
}
let
(
:path
)
{
'source/file.html'
}
let
(
:sha
)
{
RepoHelpers
.
sample_commit
.
id
}
before
do
allow
(
environment
).
to
receive
(
:external_url_for
).
with
(
path
,
sha
).
and_return
(
'http://example.com/file.html'
)
end
it
'returns a link tag linking to the file in the environment'
do
html
=
helper
.
view_on_environment_btn
(
sha
,
path
,
environment
)
node
=
Nokogiri
::
HTML
.
parse
(
html
).
at_css
(
'a'
)
expect
(
node
[
:title
]).
to
eq
(
'View on example.com'
)
expect
(
node
[
:href
]).
to
eq
(
'http://example.com/file.html'
)
end
end
end
spec/lib/gitlab/route_map_spec.rb
0 → 100644
View file @
efe4ac6f
require
'spec_helper'
describe
Gitlab
::
RouteMap
,
lib:
true
do
describe
'#initialize'
do
context
'when the data is not YAML'
do
it
'raises an error'
do
expect
{
described_class
.
new
(
'"'
)
}.
to
raise_error
(
Gitlab
::
RouteMap
::
FormatError
,
/valid YAML/
)
end
end
context
'when the data is not a YAML array'
do
it
'raises an error'
do
expect
{
described_class
.
new
(
YAML
.
dump
(
'foo'
))
}.
to
raise_error
(
Gitlab
::
RouteMap
::
FormatError
,
/an array/
)
end
end
context
'when an entry is not a hash'
do
it
'raises an error'
do
expect
{
described_class
.
new
(
YAML
.
dump
([
'foo'
]))
}.
to
raise_error
(
Gitlab
::
RouteMap
::
FormatError
,
/a hash/
)
end
end
context
'when an entry does not have a source key'
do
it
'raises an error'
do
expect
{
described_class
.
new
(
YAML
.
dump
([{
'public'
=>
'index.html'
}]))
}.
to
raise_error
(
Gitlab
::
RouteMap
::
FormatError
,
/source key/
)
end
end
context
'when an entry does not have a public key'
do
it
'raises an error'
do
expect
{
described_class
.
new
(
YAML
.
dump
([{
'source'
=>
'/index\.html/'
}]))
}.
to
raise_error
(
Gitlab
::
RouteMap
::
FormatError
,
/public key/
)
end
end
context
'when an entry source does not start and end with a slash'
do
it
'raises an error'
do
expect
{
described_class
.
new
(
YAML
.
dump
([{
'source'
=>
'index.html'
,
'public'
=>
'index.html'
}]))
}.
to
raise_error
(
Gitlab
::
RouteMap
::
FormatError
,
/a slash/
)
end
end
context
'when an entry source is not a valid regex'
do
it
'raises an error'
do
expect
{
described_class
.
new
(
YAML
.
dump
([{
'source'
=>
'/[/'
,
'public'
=>
'index.html'
}]))
}.
to
raise_error
(
Gitlab
::
RouteMap
::
FormatError
,
/regular expression/
)
end
end
context
'when all is good'
do
it
'returns a route map'
do
route_map
=
described_class
.
new
(
YAML
.
dump
([{
'source'
=>
'/index\.html/'
,
'public'
=>
'index.html'
}]))
expect
(
route_map
.
map
).
to
eq
([{
source:
/^index\.html$/
,
public:
'index.html'
}])
end
end
end
describe
'#public_path_for_source_path'
do
subject
do
described_class
.
new
(
<<-
'MAP'
.
strip_heredoc
)
# Blogposts
- source: /source/posts/([0-9]{4})-([0-9]{2})-([0-9]{2})-(.+?)
\.
.*/ # source/posts/2017-01-30-around-the-world-in-6-releases.html.md.erb
public: '
\1
/
\2
/
\3
/
\4
/' # 2017/01/30/around-the-world-in-6-releases/
# HTML files
- source: /source/(.+?
\.
html).*/ # source/index.html.haml
public: '
\1
' # index.html
# Other files
- source: /source/(.*)/ # source/images/blogimages/around-the-world-in-6-releases-cover.png
public: '
\1
' # images/blogimages/around-the-world-in-6-releases-cover.png
MAP
end
it
'returns the public path for a provided source path'
do
expect
(
subject
.
public_path_for_source_path
(
'source/posts/2017-01-30-around-the-world-in-6-releases.html.md.erb'
)).
to
eq
(
'2017/01/30/around-the-world-in-6-releases/'
)
expect
(
subject
.
public_path_for_source_path
(
'source/index.html.haml'
)).
to
eq
(
'index.html'
)
expect
(
subject
.
public_path_for_source_path
(
'source/images/blogimages/around-the-world-in-6-releases-cover.png'
)).
to
eq
(
'images/blogimages/around-the-world-in-6-releases-cover.png'
)
expect
(
subject
.
public_path_for_source_path
(
'.gitlab/route-map.yml'
)).
to
be_nil
end
end
end
spec/models/environment_spec.rb
View file @
efe4ac6f
...
...
@@ -22,6 +22,25 @@ describe Environment, models: true do
it
{
is_expected
.
to
validate_length_of
(
:external_url
).
is_at_most
(
255
)
}
it
{
is_expected
.
to
validate_uniqueness_of
(
:external_url
).
scoped_to
(
:project_id
)
}
describe
'.latest_for_commit'
do
let!
(
:environment1
)
{
create
(
:environment
,
project:
project
)
}
let!
(
:environment2
)
{
create
(
:environment
,
project:
project
)
}
let!
(
:environment3
)
{
create
(
:environment
,
project:
project
)
}
let!
(
:deployment1
)
{
create
(
:deployment
,
environment:
environment1
)
}
let!
(
:deployment2
)
{
create
(
:deployment
,
environment:
environment2
)
}
let
(
:commit
)
{
RepoHelpers
.
sample_commit
}
before
do
allow
(
environment1
).
to
receive
(
:first_deployment_for
).
with
(
commit
).
and_return
(
deployment1
)
allow
(
environment2
).
to
receive
(
:first_deployment_for
).
with
(
commit
).
and_return
(
deployment2
)
allow
(
environment3
).
to
receive
(
:first_deployment_for
).
with
(
commit
).
and_return
(
nil
)
end
it
'returns the environment that the commit was last deployed to'
do
expect
(
Environment
.
latest_for_commit
([
environment1
,
environment2
,
environment3
],
commit
)).
to
be
(
environment2
)
end
end
describe
'#nullify_external_url'
do
it
'replaces a blank url with nil'
do
env
=
build
(
:environment
,
external_url:
""
)
...
...
@@ -301,4 +320,33 @@ describe Environment, models: true do
end
end
end
describe
'#external_url_for'
do
let
(
:source_path
)
{
'source/file.html'
}
let
(
:sha
)
{
RepoHelpers
.
sample_commit
.
id
}
before
do
environment
.
external_url
=
'http://example.com'
end
context
'when the public path is not known'
do
before
do
allow
(
project
).
to
receive
(
:public_path_for_source_path
).
with
(
source_path
,
sha
).
and_return
(
nil
)
end
it
'returns nil'
do
expect
(
environment
.
external_url_for
(
source_path
,
sha
)).
to
be_nil
end
end
context
'when the public path is known'
do
before
do
allow
(
project
).
to
receive
(
:public_path_for_source_path
).
with
(
source_path
,
sha
).
and_return
(
'file.html'
)
end
it
'returns the full external URL'
do
expect
(
environment
.
external_url_for
(
source_path
,
sha
)).
to
eq
(
'http://example.com/file.html'
)
end
end
end
end
spec/models/merge_request_spec.rb
View file @
efe4ac6f
...
...
@@ -1326,6 +1326,30 @@ describe MergeRequest, models: true do
end
end
describe
'#latest_environment'
do
let
(
:project
)
{
subject
.
project
}
let!
(
:environment1
)
{
create
(
:environment
,
project:
project
)
}
let!
(
:environment2
)
{
create
(
:environment
,
project:
project
)
}
let!
(
:environment3
)
{
create
(
:environment
,
project:
project
)
}
let!
(
:deployment1
)
{
create
(
:deployment
,
environment:
environment1
,
ref:
'master'
,
sha:
commit
.
id
)
}
let!
(
:deployment2
)
{
create
(
:deployment
,
environment:
environment2
,
ref:
'feature'
,
sha:
commit
.
id
)
}
let
(
:commit
)
{
subject
.
diff_head_commit
}
before
do
allow
(
environment1
).
to
receive
(
:first_deployment_for
).
with
(
commit
).
and_return
(
deployment1
)
allow
(
environment2
).
to
receive
(
:first_deployment_for
).
with
(
commit
).
and_return
(
deployment2
)
allow
(
environment3
).
to
receive
(
:first_deployment_for
).
with
(
commit
).
and_return
(
nil
)
end
before
do
allow
(
subject
).
to
receive
(
:environments
).
and_return
([
environment1
,
environment2
,
environment3
])
end
it
'returns the environment that the commit was last deployed to'
do
expect
(
subject
.
latest_environment
).
to
eq
(
environment2
)
end
end
describe
"#reload_diff"
do
let
(
:note
)
{
create
(
:diff_note_on_merge_request
,
project:
subject
.
project
,
noteable:
subject
)
}
...
...
spec/models/project_spec.rb
View file @
efe4ac6f
...
...
@@ -2117,6 +2117,53 @@ describe Project, models: true do
.
to
contain_exactly
(
environment
)
end
end
context
'commit deployment'
do
before
do
create
(
:deployment
,
environment:
environment
,
ref:
'master'
,
sha:
project
.
commit
.
id
)
end
it
'returns environment'
do
expect
(
project
.
environments_for
(
nil
,
commit:
project
.
commit
))
.
to
contain_exactly
(
environment
)
end
end
end
describe
'#latest_environment_for'
do
let
(
:project
)
{
create
(
:project
)
}
let!
(
:environment1
)
{
create
(
:environment
,
project:
project
)
}
let!
(
:environment2
)
{
create
(
:environment
,
project:
project
)
}
let!
(
:environment3
)
{
create
(
:environment
,
project:
project
)
}
let!
(
:deployment1
)
{
create
(
:deployment
,
environment:
environment1
,
ref:
'master'
,
sha:
commit
.
id
)
}
let!
(
:deployment2
)
{
create
(
:deployment
,
environment:
environment2
,
ref:
'feature'
,
sha:
commit
.
id
)
}
let
(
:commit
)
{
project
.
commit
}
before
do
allow
(
environment1
).
to
receive
(
:first_deployment_for
).
with
(
commit
).
and_return
(
deployment1
)
allow
(
environment2
).
to
receive
(
:first_deployment_for
).
with
(
commit
).
and_return
(
deployment2
)
allow
(
environment3
).
to
receive
(
:first_deployment_for
).
with
(
commit
).
and_return
(
nil
)
end
context
'when specifying a ref'
do
before
do
allow
(
project
).
to
receive
(
:environments_for
).
with
(
'master'
,
commit:
commit
).
and_return
([
environment1
])
end
it
'returns the environment that the commit was last deployed to from that ref'
do
expect
(
project
.
latest_environment_for
(
commit
,
ref:
'master'
)).
to
eq
(
environment1
)
end
end
context
'when not specifying a ref'
do
before
do
allow
(
project
).
to
receive
(
:environments_for
).
with
(
nil
,
commit:
commit
).
and_return
([
environment1
,
environment2
])
end
it
'returns the environment that the commit was last deployed to'
do
expect
(
project
.
latest_environment_for
(
commit
)).
to
eq
(
environment2
)
end
end
end
describe
'#environments_recently_updated_on_branch'
do
...
...
@@ -2209,6 +2256,82 @@ describe Project, models: true do
it
{
expect
(
Project
.
inside_path
(
path
)).
to
eq
([
project1
])
}
end
describe
'#route_map_for'
do
let
(
:project
)
{
create
(
:project
)
}
let
(
:route_map
)
do
<<-
MAP
.
strip_heredoc
- source: /source/(.*)/
public: '
\\
1'
MAP
end
before
do
project
.
repository
.
commit_file
(
User
.
last
,
'.gitlab/route-map.yml'
,
route_map
,
'Add .gitlab/route-map.yml'
,
'master'
,
false
)
end
context
'when there is a .gitlab/route-map.yml at the commit'
do
context
'when the route map is valid'
do
it
'returns a route map'
do
map
=
project
.
route_map_for
(
project
.
commit
.
sha
)
expect
(
map
).
to
be_a_kind_of
(
Gitlab
::
RouteMap
)
end
end
context
'when the route map is invalid'
do
let
(
:route_map
)
{
'INVALID'
}
it
'returns nil'
do
expect
(
project
.
route_map_for
(
project
.
commit
.
sha
)).
to
be_nil
end
end
end
context
'when there is no .gitlab/route-map.yml at the commit'
do
it
'returns nil'
do
expect
(
project
.
route_map_for
(
project
.
commit
.
parent
.
sha
)).
to
be_nil
end
end
end
describe
'#public_path_for_source_path'
do
let
(
:project
)
{
create
(
:project
)
}
let
(
:route_map
)
do
Gitlab
::
RouteMap
.
new
(
<<-
MAP
.
strip_heredoc
)
- source: /source/(.*)/
public: '
\\
1'
MAP
end
let
(
:sha
)
{
project
.
commit
.
id
}
context
'when there is a route map'
do
before
do
allow
(
project
).
to
receive
(
:route_map_for
).
with
(
sha
).
and_return
(
route_map
)
end
context
'when the source path is mapped'
do
it
'returns the public path'
do
expect
(
project
.
public_path_for_source_path
(
'source/file.html'
,
sha
)).
to
eq
(
'file.html'
)
end
end
context
'when the source path is not mapped'
do
it
'returns nil'
do
expect
(
project
.
public_path_for_source_path
(
'file.html'
,
sha
)).
to
be_nil
end
end
end
context
'when there is no route map'
do
before
do
allow
(
project
).
to
receive
(
:route_map_for
).
with
(
sha
).
and_return
(
nil
)
end
it
'returns nil'
do
expect
(
project
.
public_path_for_source_path
(
'source/file.html'
,
sha
)).
to
be_nil
end
end
end
def
enable_lfs
allow
(
Gitlab
.
config
.
lfs
).
to
receive
(
:enabled
).
and_return
(
true
)
end
...
...
spec/models/repository_spec.rb
View file @
efe4ac6f
...
...
@@ -1926,6 +1926,42 @@ describe Repository, models: true do
end
end
describe
'#gitlab_ci_yml_for'
do
before
do
repository
.
commit_file
(
User
.
last
,
'.gitlab-ci.yml'
,
'CONTENT'
,
'Add .gitlab-ci.yml'
,
'master'
,
false
)
end
context
'when there is a .gitlab-ci.yml at the commit'
do
it
'returns the content'
do
expect
(
repository
.
gitlab_ci_yml_for
(
repository
.
commit
.
sha
)).
to
eq
(
'CONTENT'
)
end
end
context
'when there is no .gitlab-ci.yml at the commit'
do
it
'returns nil'
do
expect
(
repository
.
gitlab_ci_yml_for
(
repository
.
commit
.
parent
.
sha
)).
to
be_nil
end
end
end
describe
'#route_map_for'
do
before
do
repository
.
commit_file
(
User
.
last
,
'.gitlab/route-map.yml'
,
'CONTENT'
,
'Add .gitlab/route-map.yml'
,
'master'
,
false
)
end
context
'when there is a .gitlab/route-map.yml at the commit'
do
it
'returns the content'
do
expect
(
repository
.
route_map_for
(
repository
.
commit
.
sha
)).
to
eq
(
'CONTENT'
)
end
end
context
'when there is no .gitlab/route-map.yml at the commit'
do
it
'returns nil'
do
expect
(
repository
.
route_map_for
(
repository
.
commit
.
parent
.
sha
)).
to
be_nil
end
end
end
def
create_remote_branch
(
remote_name
,
branch_name
,
target
)
rugged
=
repository
.
rugged
rugged
.
references
.
create
(
"refs/remotes/
#{
remote_name
}
/
#{
branch_name
}
"
,
target
.
id
)
...
...
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