BigW Consortium Gitlab
Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gitlab-ce
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Forest Godfrey
gitlab-ce
Commits
dcbe9cd3
Commit
dcbe9cd3
authored
Feb 19, 2015
by
Dmitriy Zaporozhets
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '7-8-rc2' into '7-8-stable'
Code from master to 7-8-stable for RC2 See merge request !1544
parents
a9d9f940
d2110d26
Hide whitespace changes
Inline
Side-by-side
Showing
54 changed files
with
336 additions
and
200 deletions
+336
-200
CHANGELOG
CHANGELOG
+4
-0
GITLAB_SHELL_VERSION
GITLAB_SHELL_VERSION
+1
-1
issue.js.coffee
app/assets/javascripts/issue.js.coffee
+6
-0
merge_request.js.coffee
app/assets/javascripts/merge_request.js.coffee
+6
-0
notes.js.coffee
app/assets/javascripts/notes.js.coffee
+4
-4
issuable.scss
app/assets/stylesheets/sections/issuable.scss
+25
-0
issues.scss
app/assets/stylesheets/sections/issues.scss
+9
-2
merge_requests.scss
app/assets/stylesheets/sections/merge_requests.scss
+9
-2
dashboard_controller.rb
app/controllers/dashboard_controller.rb
+17
-7
projects_controller.rb
app/controllers/explore/projects_controller.rb
+1
-1
groups_controller.rb
app/controllers/groups_controller.rb
+19
-7
projects_controller.rb
app/controllers/projects_controller.rb
+8
-5
users_controller.rb
app/controllers/users_controller.rb
+6
-2
application_helper.rb
app/helpers/application_helper.rb
+7
-1
gitlab_markdown_helper.rb
app/helpers/gitlab_markdown_helper.rb
+5
-4
event.rb
app/models/event.rb
+1
-0
user.rb
app/models/user.rb
+11
-2
_activities.html.haml
app/views/dashboard/_activities.html.haml
+1
-6
_project.html.haml
app/views/dashboard/_project.html.haml
+1
-1
_project.html.haml
app/views/explore/projects/_project.html.haml
+3
-5
_projects.html.haml
app/views/groups/_projects.html.haml
+1
-1
show.html.haml
app/views/groups/show.html.haml
+1
-4
_home_panel.html.haml
app/views/projects/_home_panel.html.haml
+1
-1
_issuable_form.html.haml
app/views/projects/_issuable_form.html.haml
+1
-1
_md_preview.html.haml
app/views/projects/_md_preview.html.haml
+1
-1
_discussion.html.haml
app/views/projects/issues/_discussion.html.haml
+20
-20
show.html.haml
app/views/projects/issues/show.html.haml
+36
-33
_discussion.html.haml
app/views/projects/merge_requests/_discussion.html.haml
+19
-18
_merge_request.html.haml
app/views/projects/merge_requests/_merge_request.html.haml
+1
-1
_new_submit.html.haml
app/views/projects/merge_requests/_new_submit.html.haml
+1
-1
_show.html.haml
app/views/projects/merge_requests/_show.html.haml
+33
-32
_form.html.haml
app/views/projects/milestones/_form.html.haml
+1
-1
new.html.haml
app/views/projects/new.html.haml
+3
-4
_edit_form.html.haml
app/views/projects/notes/_edit_form.html.haml
+1
-1
_form.html.haml
app/views/projects/notes/_form.html.haml
+1
-1
_form.html.haml
app/views/projects/wikis/_form.html.haml
+1
-1
_file_highlight.html.haml
app/views/shared/_file_highlight.html.haml
+2
-1
_projects.html.haml
app/views/users/_projects.html.haml
+21
-6
calendar.html.haml
app/views/users/calendar.html.haml
+1
-1
show.html.haml
app/views/users/show.html.haml
+1
-3
01_admin.rb
db/fixtures/development/01_admin.rb
+1
-0
groups.md
doc/api/groups.md
+0
-2
merge_requests.rb
features/steps/project/merge_requests.rb
+2
-2
note.rb
features/steps/shared/note.rb
+1
-1
entities.rb
lib/api/entities.rb
+1
-1
groups.rb
lib/api/groups.rb
+1
-1
helpers.rb
lib/api/helpers.rb
+2
-2
internal.rb
lib/api/internal.rb
+1
-1
current_settings.rb
lib/gitlab/current_settings.rb
+9
-5
git_access.rb
lib/gitlab/git_access.rb
+2
-0
public.pem
safe/public.pem
+9
-0
notes_on_merge_requests_spec.rb
spec/features/notes_on_merge_requests_spec.rb
+1
-1
gitlab_markdown_helper_spec.rb
spec/helpers/gitlab_markdown_helper_spec.rb
+13
-1
internal_spec.rb
spec/requests/api/internal_spec.rb
+2
-1
No files found.
CHANGELOG
View file @
dcbe9cd3
...
...
@@ -56,6 +56,10 @@ v 7.8.0 (unreleased)
- Show users button to share their newly created public or internal projects on twitter
- Add quick help links to the GitLab pricing and feature comparison pages.
- Fix duplicate authorized applications in user profile and incorrect application client count in admin area.
- Make sure Markdown previews always use the same styling as the eventual destination.
- Remove deprecated Group#owner_id from API
- Show projects user contributed to on user page. Show stars near project on user page.
- Improve database performance for GitLab
v 7.7.2
- Update GitLab Shell to version 2.4.2 that fixes a bug when developers can push to protected branch
...
...
GITLAB_SHELL_VERSION
View file @
dcbe9cd3
2.
4.3
2.
5.1
app/assets/javascripts/issue.js.coffee
View file @
dcbe9cd3
...
...
@@ -15,3 +15,9 @@ class @Issue
"issue"
updateTaskState
)
$
(
'.issuable-affix'
).
affix
offset
:
top
:
->
@
top
=
$
(
'.issue-details'
).
outerHeight
(
true
)
+
25
bottom
:
->
@
bottom
=
$
(
'.footer'
).
outerHeight
(
true
)
app/assets/javascripts/merge_request.js.coffee
View file @
dcbe9cd3
...
...
@@ -20,6 +20,12 @@ class @MergeRequest
if
$
(
"a.btn-close"
).
length
$
(
"li.task-list-item input:checkbox"
).
prop
(
"disabled"
,
false
)
$
(
'.issuable-affix'
).
affix
offset
:
top
:
->
@
top
=
$
(
'.merge-request-details'
).
outerHeight
(
true
)
+
70
bottom
:
->
@
bottom
=
$
(
'.footer'
).
outerHeight
(
true
)
# Local jQuery finder
$
:
(
selector
)
->
this
.
$el
.
find
(
selector
)
...
...
app/assets/javascripts/notes.js.coffee
View file @
dcbe9cd3
...
...
@@ -272,7 +272,7 @@ class @Notes
note_li
=
$
(
".note-row-"
+
note
.
id
)
note_li
.
replaceWith
(
note
.
html
)
note_li
.
find
(
'.note-edit-form'
).
hide
()
note_li
.
find
(
'.note-text'
).
show
()
note_li
.
find
(
'.note-
body > .note-
text'
).
show
()
###
Called in response to clicking the edit note link
...
...
@@ -284,7 +284,7 @@ class @Notes
showEditForm
:
(
e
)
->
e
.
preventDefault
()
note
=
$
(
this
).
closest
(
".note"
)
note
.
find
(
".note-text"
).
hide
()
note
.
find
(
".note-
body > .note-
text"
).
hide
()
note
.
find
(
".note-header"
).
hide
()
base_form
=
note
.
find
(
".note-edit-form"
)
form
=
base_form
.
clone
().
insertAfter
(
base_form
)
...
...
@@ -311,7 +311,7 @@ class @Notes
cancelEdit
:
(
e
)
->
e
.
preventDefault
()
note
=
$
(
this
).
closest
(
".note"
)
note
.
find
(
".note-text"
).
show
()
note
.
find
(
".note-
body > .note-
text"
).
show
()
note
.
find
(
".note-header"
).
show
()
note
.
find
(
".current-note-edit-form"
).
remove
()
...
...
@@ -345,7 +345,7 @@ class @Notes
removeAttachment
:
->
note
=
$
(
this
).
closest
(
".note"
)
note
.
find
(
".note-attachment"
).
remove
()
note
.
find
(
".note-text"
).
show
()
note
.
find
(
".note-
body > .note-
text"
).
show
()
note
.
find
(
".js-note-attachment-delete"
).
hide
()
note
.
find
(
".note-edit-form"
).
hide
()
...
...
app/assets/stylesheets/sections/issuable.scss
0 → 100644
View file @
dcbe9cd3
@media
(
max-width
:
$screen-sm-max
)
{
.issuable-affix
{
margin-top
:
20px
;
}
}
@media
(
max-width
:
$screen-md-max
)
{
.issuable-affix
{
position
:
static
;
}
}
@media
(
min-width
:
$screen-md-max
)
{
.issuable-affix
{
&
.affix-top
{
position
:
static
;
}
&
.affix
{
position
:
fixed
;
top
:
70px
;
width
:
220px
;
}
}
}
app/assets/stylesheets/sections/issues.scss
View file @
dcbe9cd3
...
...
@@ -94,8 +94,15 @@
}
}
.issue-show-labels
.color-label
{
padding
:
6px
10px
;
.issue-show-labels
{
a
{
margin-right
:
5px
;
margin-bottom
:
5px
;
display
:
inline-block
;
.color-label
{
padding
:
6px
10px
;
}
}
}
form
.edit-issue
{
...
...
app/assets/stylesheets/sections/merge_requests.scss
View file @
dcbe9cd3
...
...
@@ -185,6 +185,13 @@
}
}
.merge-request-show-labels
.label
{
padding
:
6px
10px
;
.merge-request-show-labels
{
a
{
margin-right
:
5px
;
margin-bottom
:
5px
;
display
:
inline-block
;
.color-label
{
padding
:
6px
10px
;
}
}
}
app/controllers/dashboard_controller.rb
View file @
dcbe9cd3
...
...
@@ -12,11 +12,7 @@ class DashboardController < ApplicationController
@groups
=
current_user
.
authorized_groups
.
order_name_asc
@has_authorized_projects
=
@projects
.
count
>
0
@projects_count
=
@projects
.
count
@projects
=
@projects
.
limit
(
@projects_limit
)
@events
=
Event
.
in_projects
(
current_user
.
authorized_projects
.
pluck
(
:id
))
@events
=
@event_filter
.
apply_filter
(
@events
)
@events
=
@events
.
limit
(
20
).
offset
(
params
[
:offset
]
||
0
)
@projects
=
@projects
.
includes
(
:namespace
).
limit
(
@projects_limit
)
@last_push
=
current_user
.
recent_push
...
...
@@ -24,8 +20,16 @@ class DashboardController < ApplicationController
respond_to
do
|
format
|
format
.
html
format
.
json
{
pager_json
(
"events/_events"
,
@events
.
count
)
}
format
.
atom
{
render
layout:
false
}
format
.
json
do
load_events
pager_json
(
"events/_events"
,
@events
.
count
)
end
format
.
atom
do
load_events
render
layout:
false
end
end
end
...
...
@@ -74,4 +78,10 @@ class DashboardController < ApplicationController
def
load_projects
@projects
=
current_user
.
authorized_projects
.
sorted_by_activity
.
non_archived
end
def
load_events
@events
=
Event
.
in_projects
(
current_user
.
authorized_projects
.
pluck
(
:id
))
@events
=
@event_filter
.
apply_filter
(
@events
).
with_associations
@events
=
@events
.
limit
(
20
).
offset
(
params
[
:offset
]
||
0
)
end
end
app/controllers/explore/projects_controller.rb
View file @
dcbe9cd3
...
...
@@ -18,7 +18,7 @@ class Explore::ProjectsController < ApplicationController
def
starred
@starred_projects
=
ProjectsFinder
.
new
.
execute
(
current_user
)
@starred_projects
=
@starred_projects
.
order
(
'star_count DESC'
)
@starred_projects
=
@starred_projects
.
re
order
(
'star_count DESC'
)
@starred_projects
=
@starred_projects
.
page
(
params
[
:page
]).
per
(
10
)
end
end
app/controllers/groups_controller.rb
View file @
dcbe9cd3
...
...
@@ -10,11 +10,11 @@ class GroupsController < ApplicationController
# Load group projects
before_filter
:load_projects
,
except:
[
:new
,
:create
,
:projects
,
:edit
,
:update
]
before_filter
:event_filter
,
only: :show
before_filter
:set_title
,
only:
[
:new
,
:create
]
layout
:determine_layout
before_filter
:set_title
,
only:
[
:new
,
:create
]
def
new
@group
=
Group
.
new
end
...
...
@@ -32,15 +32,21 @@ class GroupsController < ApplicationController
end
def
show
@events
=
Event
.
in_projects
(
project_ids
)
@events
=
event_filter
.
apply_filter
(
@events
)
@events
=
@events
.
limit
(
20
).
offset
(
params
[
:offset
]
||
0
)
@last_push
=
current_user
.
recent_push
if
current_user
@projects
=
@projects
.
includes
(
:namespace
)
respond_to
do
|
format
|
format
.
html
format
.
json
{
pager_json
(
"events/_events"
,
@events
.
count
)
}
format
.
atom
{
render
layout:
false
}
format
.
json
do
load_events
pager_json
(
"events/_events"
,
@events
.
count
)
end
format
.
atom
do
load_events
render
layout:
false
end
end
end
...
...
@@ -149,4 +155,10 @@ class GroupsController < ApplicationController
def
group_params
params
.
require
(
:group
).
permit
(
:name
,
:description
,
:path
,
:avatar
)
end
def
load_events
@events
=
Event
.
in_projects
(
project_ids
)
@events
=
event_filter
.
apply_filter
(
@events
).
with_associations
@events
=
@events
.
limit
(
20
).
offset
(
params
[
:offset
]
||
0
)
end
end
app/controllers/projects_controller.rb
View file @
dcbe9cd3
...
...
@@ -5,9 +5,10 @@ class ProjectsController < ApplicationController
# Authorize
before_filter
:authorize_admin_project!
,
only:
[
:edit
,
:update
,
:destroy
,
:transfer
,
:archive
,
:unarchive
]
before_filter
:set_title
,
only:
[
:new
,
:create
]
before_filter
:event_filter
,
only: :show
layout
'navless'
,
only:
[
:new
,
:create
,
:fork
]
before_filter
:set_title
,
only:
[
:new
,
:create
]
def
new
@project
=
Project
.
new
...
...
@@ -56,9 +57,6 @@ class ProjectsController < ApplicationController
end
limit
=
(
params
[
:limit
]
||
20
).
to_i
@events
=
@project
.
events
.
recent
@events
=
event_filter
.
apply_filter
(
@events
)
@events
=
@events
.
limit
(
limit
).
offset
(
params
[
:offset
]
||
0
)
@show_star
=
!
(
current_user
&&
current_user
.
starred?
(
@project
))
...
...
@@ -76,7 +74,12 @@ class ProjectsController < ApplicationController
end
end
format
.
json
{
pager_json
(
'events/_events'
,
@events
.
count
)
}
format
.
json
do
@events
=
@project
.
events
.
recent
@events
=
event_filter
.
apply_filter
(
@events
).
with_associations
@events
=
@events
.
limit
(
limit
).
offset
(
params
[
:offset
]
||
0
)
pager_json
(
'events/_events'
,
@events
.
count
)
end
end
end
...
...
app/controllers/users_controller.rb
View file @
dcbe9cd3
...
...
@@ -8,15 +8,19 @@ class UsersController < ApplicationController
visible_projects
=
ProjectsFinder
.
new
.
execute
(
current_user
)
authorized_projects_ids
=
visible_projects
.
pluck
(
:id
)
@contributed_projects
=
Project
.
where
(
id:
authorized_projects_ids
).
in_group_namespace
.
includes
(
:namespace
)
@projects
=
@user
.
personal_projects
.
where
(
id:
authorized_projects_ids
)
where
(
id:
authorized_projects_ids
)
.
includes
(
:namespace
)
# Collect only groups common for both users
@groups
=
@user
.
groups
&
GroupsFinder
.
new
.
execute
(
current_user
)
# Get user activity feed for projects common for both users
@events
=
@user
.
recent_events
.
where
(
project_id:
authorized_projects_ids
).
limit
(
30
)
where
(
project_id:
authorized_projects_ids
).
with_associations
.
limit
(
30
)
@title
=
@user
.
name
@title_url
=
user_path
(
@user
)
...
...
app/helpers/application_helper.rb
View file @
dcbe9cd3
...
...
@@ -51,7 +51,13 @@ module ApplicationHelper
end
def
project_icon
(
project_id
,
options
=
{})
project
=
Project
.
find_with_namespace
(
project_id
)
project
=
if
project_id
.
is_a?
(
Project
)
project
=
project_id
else
Project
.
find_with_namespace
(
project_id
)
end
if
project
.
avatar
.
present?
image_tag
project
.
avatar
.
url
,
options
elsif
project
.
avatar_in_git
...
...
app/helpers/gitlab_markdown_helper.rb
View file @
dcbe9cd3
...
...
@@ -110,7 +110,7 @@ module GitlabMarkdownHelper
end
def
link_to_ignore?
(
link
)
if
link
=~
/\#\w+/
if
link
=~
/\
A\
#\w+/
# ignore anchors like <a href="#my-header">
true
else
...
...
@@ -122,10 +122,11 @@ module GitlabMarkdownHelper
[
"http://"
,
"https://"
,
"ftp://"
,
"mailto:"
]
end
def
rebuild_path
(
path
)
path
.
gsub!
(
/(#.*)/
,
""
)
def
rebuild_path
(
file_path
)
file_path
=
file_path
.
dup
file_path
.
gsub!
(
/(#.*)/
,
""
)
id
=
$1
||
""
file_path
=
relative_file_path
(
path
)
file_path
=
relative_file_path
(
file_
path
)
file_path
=
sanitize_slashes
(
file_path
)
[
...
...
app/models/event.rb
View file @
dcbe9cd3
...
...
@@ -47,6 +47,7 @@ class Event < ActiveRecord::Base
scope
:recent
,
->
{
order
(
"created_at DESC"
)
}
scope
:code_push
,
->
{
where
(
action:
PUSHED
)
}
scope
:in_projects
,
->
(
project_ids
)
{
where
(
project_id:
project_ids
).
recent
}
scope
:with_associations
,
->
{
includes
(
project: :namespace
)
}
class
<<
self
def
reset_event_cache_for
(
target
)
...
...
app/models/user.rb
View file @
dcbe9cd3
...
...
@@ -255,7 +255,7 @@ class User < ActiveRecord::Base
counter
=
0
base
=
username
while
User
.
by_login
(
username
).
present?
||
Namespace
.
by_path
(
username
).
present?
counter
+=
1
counter
+=
1
username
=
"
#{
base
}#{
counter
}
"
end
...
...
@@ -459,7 +459,7 @@ class User < ActiveRecord::Base
def
set_notification_email
if
self
.
notification_email
.
blank?
||
!
self
.
all_emails
.
include?
(
self
.
notification_email
)
self
.
notification_email
=
self
.
email
self
.
notification_email
=
self
.
email
end
end
...
...
@@ -607,4 +607,13 @@ class User < ActiveRecord::Base
def
oauth_authorized_tokens
Doorkeeper
::
AccessToken
.
where
(
resource_owner_id:
self
.
id
,
revoked_at:
nil
)
end
def
contributed_projects_ids
Event
.
where
(
author_id:
self
).
where
(
"created_at > ?"
,
Time
.
now
-
1
.
year
).
code_push
.
reorder
(
project_id: :desc
).
select
(
'DISTINCT(project_id)'
).
map
(
&
:project_id
)
end
end
app/views/dashboard/_activities.html.haml
View file @
dcbe9cd3
=
render
"events/event_last_push"
,
event:
@last_push
=
render
'shared/event_filter'
-
if
@events
.
any?
.content_list
-
else
.nothing-here-block
Projects activity will be displayed here
.content_list
=
spinner
app/views/dashboard/_project.html.haml
View file @
dcbe9cd3
=
link_to
project_path
(
project
),
class:
dom_class
(
project
)
do
.dash-project-avatar
=
project_icon
(
project
.
to_param
,
alt:
''
,
class:
'avatar project-avatar s40'
)
=
project_icon
(
project
,
alt:
''
,
class:
'avatar project-avatar s40'
)
.dash-project-access-icon
=
visibility_level_icon
(
project
.
visibility_level
)
%span
.str-truncated
...
...
app/views/explore/projects/_project.html.haml
View file @
dcbe9cd3
...
...
@@ -3,11 +3,9 @@
.project-access-icon
=
visibility_level_icon
(
project
.
visibility_level
)
=
link_to
project
.
name_with_namespace
,
project
-
if
current_page?
(
starred_explore_projects_path
)
%strong
.pull-right
%i
.fa.fa-star
=
pluralize
project
.
star_count
,
'star'
%span
.pull-right
%i
.fa.fa-star
=
project
.
star_count
.project-info
-
if
project
.
description
.
present?
...
...
app/views/groups/_projects.html.haml
View file @
dcbe9cd3
...
...
@@ -13,7 +13,7 @@
%li
.project-row
=
link_to
project_path
(
project
),
class:
dom_class
(
project
)
do
.dash-project-avatar
=
project_icon
(
project
.
to_param
,
alt:
''
,
class:
'avatar s40'
)
=
project_icon
(
project
,
alt:
''
,
class:
'avatar s40'
)
.dash-project-access-icon
=
visibility_level_icon
(
project
.
visibility_level
)
%span
.str-truncated
...
...
app/views/groups/show.html.haml
View file @
dcbe9cd3
...
...
@@ -13,10 +13,7 @@
-
if
current_user
=
render
"events/event_last_push"
,
event:
@last_push
=
render
'shared/event_filter'
-
if
@events
.
any?
.content_list
-
else
.nothing-here-block
Project activity will be displayed here
.content_list
=
spinner
%aside
.side.col-md-4
=
render
"projects"
,
projects:
@projects
app/views/projects/_home_panel.html.haml
View file @
dcbe9cd3
-
empty_repo
=
@project
.
empty_repo?
.project-home-panel
{
:class
=>
(
"empty-project"
if
empty_repo
)}
.project-identicon-holder
=
project_icon
(
@project
.
to_param
,
alt:
''
,
class:
'avatar project-avatar'
)
=
project_icon
(
@project
,
alt:
''
,
class:
'avatar project-avatar'
)
.project-home-row
.project-home-desc
-
if
@project
.
description
.
present?
...
...
app/views/projects/_issuable_form.html.haml
View file @
dcbe9cd3
...
...
@@ -15,7 +15,7 @@
=
f
.
label
:description
,
'Description'
,
class:
'control-label'
.col-sm-10
=
render
layout:
'projects/md_preview'
do
=
render
layout:
'projects/md_preview'
,
locals:
{
preview_class:
"wiki"
}
do
=
render
'projects/zen'
,
f:
f
,
attr: :description
,
classes:
'description form-control'
.col-sm-12.hint
...
...
app/views/projects/_md_preview.html.haml
View file @
dcbe9cd3
...
...
@@ -10,4 +10,4 @@
.md-write-holder
=
yield
.md-preview-holder.hide
.js-md-preview
.js-md-preview
{
class:
(
preview_class
if
defined?
(
preview_class
))}
app/views/projects/issues/_discussion.html.haml
View file @
dcbe9cd3
...
...
@@ -14,24 +14,24 @@
.voting_notes
#notes
=
render
"projects/notes/notes_with_form"
.col-md-3
%div
.clearfix
%span
.slead.has_tooltip
{
:"data-original-title"
=>
'Cross-project reference'
}
=
cross_project_reference
(
@project
,
@issue
)
%hr
.context
%cite
.cgray
=
render
partial:
'issue_context'
,
locals:
{
issue:
@issue
}
%hr
.clearfix
.votes-holder
%h6
Votes
#votes
=
render
'votes/votes_block'
,
votable:
@issue
-
if
@issue
.
labels
.
any?
.issuable-affix
.clearfix
%span
.slead.has_tooltip
{
:"data-original-title"
=>
'Cross-project reference'
}
=
cross_project_reference
(
@project
,
@issue
)
%hr
%h6
Labels
.issue-show-labels
-
@issue
.
labels
.
each
do
|
label
|
=
link_to
project_issues_path
(
@project
,
label_name:
label
.
name
)
do
%p
=
render_colored_label
(
label
)
.context
%cite
.cgray
=
render
partial:
'issue_context'
,
locals:
{
issue:
@issue
}
%hr
.clearfix
.votes-holder
%h6
Votes
#votes
=
render
'votes/votes_block'
,
votable:
@issue
-
if
@issue
.
labels
.
any?
%hr
%h6
Labels
.issue-show-labels
-
@issue
.
labels
.
each
do
|
label
|
=
link_to
project_issues_path
(
@project
,
label_name:
label
.
name
)
do
=
render_colored_label
(
label
)
app/views/projects/issues/show.html.haml
View file @
dcbe9cd3
%h4
.page-title
.issue-box
{
class:
issue_box_class
(
@issue
)
}
-
if
@issue
.
closed?
Closed
-
else
Open
Issue ##{@issue.iid}
%small
.creator
·
created by
#{
link_to_member
(
@project
,
@issue
.
author
)
}
#{
issue_timestamp
(
@issue
)
}
.issue
.issue-details
%h4
.page-title
.issue-box
{
class:
issue_box_class
(
@issue
)
}
-
if
@issue
.
closed?
Closed
-
else
Open
Issue ##{@issue.iid}
%small
.creator
·
created by
#{
link_to_member
(
@project
,
@issue
.
author
)
}
#{
issue_timestamp
(
@issue
)
}
.pull-right
-
if
can?
(
current_user
,
:write_issue
,
@project
)
=
link_to
new_project_issue_path
(
@project
),
class:
"btn btn-grouped new-issue-link"
,
title:
"New Issue"
,
id:
"new_issue_link"
do
%i
.fa.fa-plus
New Issue
-
if
can?
(
current_user
,
:modify_issue
,
@issue
)
-
if
@issue
.
closed?
=
link_to
'Reopen'
,
project_issue_path
(
@project
,
@issue
,
issue:
{
state_event: :reopen
},
status_only:
true
),
method: :put
,
class:
"btn btn-grouped btn-reopen"
-
else
=
link_to
'Close'
,
project_issue_path
(
@project
,
@issue
,
issue:
{
state_event: :close
},
status_only:
true
),
method: :put
,
class:
"btn btn-grouped btn-close"
,
title:
"Close Issue"
.pull-right
-
if
can?
(
current_user
,
:write_issue
,
@project
)
=
link_to
new_project_issue_path
(
@project
),
class:
"btn btn-grouped new-issue-link"
,
title:
"New Issue"
,
id:
"new_issue_link"
do
%i
.fa.fa-plus
New Issue
-
if
can?
(
current_user
,
:modify_issue
,
@issue
)
-
if
@issue
.
closed?
=
link_to
'Reopen'
,
project_issue_path
(
@project
,
@issue
,
issue:
{
state_event: :reopen
},
status_only:
true
),
method: :put
,
class:
"btn btn-grouped btn-reopen"
-
else
=
link_to
'Close'
,
project_issue_path
(
@project
,
@issue
,
issue:
{
state_event: :close
},
status_only:
true
),
method: :put
,
class:
"btn btn-grouped btn-close"
,
title:
"Close Issue"
=
link_to
edit_project_issue_path
(
@project
,
@issue
),
class:
"btn btn-grouped issuable-edit"
do
%i
.fa.fa-pencil-square-o
Edit
=
link_to
edit_project_issue_path
(
@project
,
@issue
),
class:
"btn btn-grouped issuable-edit"
do
%i
.fa.fa-pencil-square-o
Edit
%hr
%h3
.issue-title
=
gfm
escape_once
(
@issue
.
title
)
%div
-
if
@issue
.
description
.
present?
.description
.wiki
=
preserve
do
=
markdown
(
@issue
.
description
,
parse_tasks:
true
)
%hr
%h3
.issue-title
=
gfm
escape_once
(
@issue
.
title
)
%div
-
if
@issue
.
description
.
present?
.description
.wiki
=
preserve
do
=
markdown
(
@issue
.
description
,
parse_tasks:
true
)
%hr
=
render
"projects/issues/discussion"
%hr
.issue-discussion
=
render
"projects/issues/discussion"
app/views/projects/merge_requests/_discussion.html.haml
View file @
dcbe9cd3
...
...
@@ -10,22 +10,23 @@
=
render
"projects/merge_requests/show/participants"
=
render
"projects/notes/notes_with_form"
.col-md-3
.clearfix
%span
.slead.has_tooltip
{
:"data-original-title"
=>
'Cross-project reference'
}
=
cross_project_reference
(
@project
,
@merge_request
)
%hr
.context
%cite
.cgray
=
render
partial:
'projects/merge_requests/show/context'
,
locals:
{
merge_request:
@merge_request
}
%hr
.votes-holder
%h6
Votes
#votes
=
render
'votes/votes_block'
,
votable:
@merge_request
-
if
@merge_request
.
labels
.
any?
.issuable-affix
.clearfix
%span
.slead.has_tooltip
{
:"data-original-title"
=>
'Cross-project reference'
}
=
cross_project_reference
(
@project
,
@merge_request
)
%hr
.context
%cite
.cgray
=
render
partial:
'projects/merge_requests/show/context'
,
locals:
{
merge_request:
@merge_request
}
%hr
%h6
Labels
.merge-request-show-labels
-
@merge_request
.
labels
.
each
do
|
label
|
=
link_to
project_merge_requests_path
(
@project
,
label_name:
label
.
name
)
do
%p
=
render_colored_label
(
label
)
.votes-holder
%h6
Votes
#votes
=
render
'votes/votes_block'
,
votable:
@merge_request
-
if
@merge_request
.
labels
.
any?
%hr
%h6
Labels
.merge-request-show-labels
-
@merge_request
.
labels
.
each
do
|
label
|
=
link_to
project_merge_requests_path
(
@project
,
label_name:
label
.
name
)
do
=
render_colored_label
(
label
)
app/views/projects/merge_requests/_merge_request.html.haml
View file @
dcbe9cd3
...
...
@@ -18,7 +18,7 @@
-
if
merge_request
.
assignee
assigned to
#{
link_to_member
(
merge_request
.
source_project
,
merge_request
.
assignee
)
}
-
else
Work In Progress
Unassigned
-
if
merge_request
.
votes_count
>
0
=
render
'votes/votes_inline'
,
votable:
merge_request
-
if
merge_request
.
notes
.
any?
...
...
app/views/projects/merge_requests/_new_submit.html.haml
View file @
dcbe9cd3
...
...
@@ -19,7 +19,7 @@
.form-group.issuable-description
=
f
.
label
:description
,
'Description'
,
class:
'control-label'
.col-sm-10
=
render
layout:
'projects/md_preview'
do
=
render
layout:
'projects/md_preview'
,
locals:
{
preview_class:
"wiki"
}
do
=
render
'projects/zen'
,
f:
f
,
attr: :description
,
classes:
'description form-control'
.col-sm-12-hint
...
...
app/views/projects/merge_requests/_show.html.haml
View file @
dcbe9cd3
.merge-request
{
'data-url'
=>
project_merge_request_path
(
@project
,
@merge_request
)}
=
render
"projects/merge_requests/show/mr_title"
%hr
=
render
"projects/merge_requests/show/mr_box"
%hr
.append-bottom-20
.slead
%span
From
-
if
@merge_request
.
for_fork?
%strong
.label-branch
<
-
if
@merge_request
.
source_project
=
link_to
@merge_request
.
source_project_namespace
,
project_path
(
@merge_request
.
source_project
)
-
else
\
#{
@merge_request
.
source_project_namespace
}
\
:
#{
@merge_request
.
source_branch
}
%span
into
%strong
.label-branch
#{
@merge_request
.
target_project_namespace
}
:
#{
@merge_request
.
target_branch
}
-
else
%strong
.label-branch
#{
@merge_request
.
source_branch
}
%span
into
%strong
.label-branch
#{
@merge_request
.
target_branch
}
-
if
@merge_request
.
open?
%span
.pull-right
.btn-group
%a
.btn.dropdown-toggle
{
data:
{
toggle: :dropdown
}
}
%i
.fa.fa-download
Download
as
%span
.caret
%ul
.dropdown-menu
%li
=
link_to
"Email Patches"
,
project_merge_request_path
(
@project
,
@merge_request
,
format: :patch
)
%li
=
link_to
"Plain Diff"
,
project_merge_request_path
(
@project
,
@merge_request
,
format: :diff
)
.merge-request-details
=
render
"projects/merge_requests/show/mr_title"
%hr
=
render
"projects/merge_requests/show/mr_box"
%hr
.append-bottom-20
.slead
%span
From
-
if
@merge_request
.
for_fork?
%strong
.label-branch
<
-
if
@merge_request
.
source_project
=
link_to
@merge_request
.
source_project_namespace
,
project_path
(
@merge_request
.
source_project
)
-
else
\
#{
@merge_request
.
source_project_namespace
}
\
:
#{
@merge_request
.
source_branch
}
%span
into
%strong
.label-branch
#{
@merge_request
.
target_project_namespace
}
:
#{
@merge_request
.
target_branch
}
-
else
%strong
.label-branch
#{
@merge_request
.
source_branch
}
%span
into
%strong
.label-branch
#{
@merge_request
.
target_branch
}
-
if
@merge_request
.
open?
%span
.pull-right
.btn-group
%a
.btn.dropdown-toggle
{
data:
{
toggle: :dropdown
}
}
%i
.fa.fa-download
Download
as
%span
.caret
%ul
.dropdown-menu
%li
=
link_to
"Email Patches"
,
project_merge_request_path
(
@project
,
@merge_request
,
format: :patch
)
%li
=
link_to
"Plain Diff"
,
project_merge_request_path
(
@project
,
@merge_request
,
format: :diff
)
=
render
"projects/merge_requests/show/how_to_merge"
=
render
"projects/merge_requests/show/state_widget"
=
render
"projects/merge_requests/show/how_to_merge"
=
render
"projects/merge_requests/show/state_widget"
-
if
@commits
.
present?
%ul
.nav.nav-tabs.merge-request-tabs
...
...
app/views/projects/milestones/_form.html.haml
View file @
dcbe9cd3
...
...
@@ -21,7 +21,7 @@
.form-group.milestone-description
=
f
.
label
:description
,
"Description"
,
class:
"control-label"
.col-sm-10
=
render
layout:
'projects/md_preview'
do
=
render
layout:
'projects/md_preview'
,
locals:
{
preview_class:
"wiki"
}
do
=
render
'projects/zen'
,
f:
f
,
attr: :description
,
classes:
'description form-control'
.hint
.pull-left
Milestones are parsed with
#{
link_to
"GitLab Flavored Markdown"
,
help_page_path
(
"markdown"
,
"markdown"
),
target:
'_blank'
}
.
...
...
app/views/projects/new.html.haml
View file @
dcbe9cd3
...
...
@@ -52,7 +52,7 @@
%i
.fa.fa-github
Import projects from GitHub
=
render
'github_import_modal'
.project-import.form-group
.col-sm-2
.col-sm-10
...
...
@@ -60,7 +60,7 @@
=
link_to
status_import_gitlab_path
do
%i
.fa.fa-heart
Import projects from GitLab.com
-
els
e
-
els
if
request
.
host
!=
'gitlab.com'
=
link_to
'#'
,
class:
'how_to_import_link light'
do
%i
.fa.fa-heart
Import projects from GitLab.com
...
...
@@ -99,4 +99,4 @@
e.preventDefault()
import_modal = $(this).parent().find(".modal").show()
$('.modal-header .close').bind 'click', ->
$(".modal").hide()
\ No newline at end of file
$(".modal").hide()
app/views/projects/notes/_edit_form.html.haml
View file @
dcbe9cd3
.note-edit-form
=
form_for
note
,
url:
project_note_path
(
@project
,
note
),
method: :put
,
remote:
true
,
authenticity_token:
true
do
|
f
|
=
render
layout:
'projects/md_preview'
do
=
render
layout:
'projects/md_preview'
,
locals:
{
preview_class:
"note-text"
}
do
=
render
'projects/zen'
,
f:
f
,
attr: :note
,
classes:
'note_text js-note-text'
...
...
app/views/projects/notes/_form.html.haml
View file @
dcbe9cd3
...
...
@@ -5,7 +5,7 @@
=
f
.
hidden_field
:noteable_id
=
f
.
hidden_field
:noteable_type
=
render
layout:
'projects/md_preview'
do
=
render
layout:
'projects/md_preview'
,
locals:
{
preview_class:
"note-text"
}
do
=
render
'projects/zen'
,
f:
f
,
attr: :note
,
classes:
'note_text js-note-text'
...
...
app/views/projects/wikis/_form.html.haml
View file @
dcbe9cd3
...
...
@@ -22,7 +22,7 @@
.form-group.wiki-content
=
f
.
label
:content
,
class:
'control-label'
.col-sm-10
=
render
layout:
'projects/md_preview'
do
=
render
layout:
'projects/md_preview'
,
locals:
{
preview_class:
"wiki"
}
do
=
render
'projects/zen'
,
f:
f
,
attr: :content
,
classes:
'description form-control'
.col-sm-12.hint
.pull-left
Wiki content is parsed with
#{
link_to
"GitLab Flavored Markdown"
,
help_page_path
(
"markdown"
,
"markdown"
),
target:
'_blank'
}
...
...
app/views/shared/_file_highlight.html.haml
View file @
dcbe9cd3
...
...
@@ -7,4 +7,5 @@
=
link_to
"#L
#{
i
}
"
,
id:
"L
#{
i
}
"
,
rel:
"#L
#{
i
}
"
do
%i
.fa.fa-link
=
i
=
highlight
(
blob
.
name
,
blob
.
data
)
:preserve
#{
highlight
(
blob
.
name
,
blob
.
data
)
}
app/views/users/_projects.html.haml
View file @
dcbe9cd3
.panel.panel-default
.panel-heading
Personal projects
%ul
.well-list
-
projects
.
each
do
|
project
|
%li
=
link_to_project
project
-
if
@contributed_projects
.
present?
.panel.panel-default
.panel-heading
Projects contributed to
%ul
.well-list
-
@contributed_projects
.
sort_by
(
&
:star_count
).
reverse
.
each
do
|
project
|
%li
=
link_to_project
project
%span
.pull-right.light
%i
.fa.fa-star
=
project
.
star_count
-
if
@projects
.
present?
.panel.panel-default
.panel-heading
Personal projects
%ul
.well-list
-
@projects
.
sort_by
(
&
:star_count
).
reverse
.
each
do
|
project
|
%li
=
link_to_project
project
%span
.pull-right.light
%i
.fa.fa-star
=
project
.
star_count
app/views/users/calendar.html.haml
View file @
dcbe9cd3
%h4
Calendar
%h4
C
ommits c
alendar
#cal-heatmap
.calendar
:javascript
new
calendar
(
...
...
app/views/users/show.html.haml
View file @
dcbe9cd3
...
...
@@ -35,9 +35,7 @@
=
render
@events
.col-md-4
=
render
'profile'
,
user:
@user
-
if
@projects
.
present?
=
render
'projects'
,
projects:
@projects
=
render
'projects'
:coffeescript
$ ->
...
...
db/fixtures/development/01_admin.rb
View file @
dcbe9cd3
...
...
@@ -3,6 +3,7 @@ Gitlab::Seeder.quiet do
s
.
id
=
1
s
.
name
=
'Administrator'
s
.
email
=
'admin@example.com'
s
.
notification_email
=
'admin@example.com'
s
.
username
=
'root'
s
.
password
=
'5iveL!fe'
s
.
admin
=
true
...
...
doc/api/groups.md
View file @
dcbe9cd3
...
...
@@ -14,7 +14,6 @@ GET /groups
"id"
:
1
,
"name"
:
"Foobar Group"
,
"path"
:
"foo-bar"
,
"owner_id"
:
18
,
"description"
:
"An interesting group"
}
]
...
...
@@ -87,7 +86,6 @@ GET /groups?search=foobar
"id"
:
1
,
"name"
:
"Foobar Group"
,
"path"
:
"foo-bar"
,
"owner_id"
:
18
,
"description"
:
"An interesting group"
}
]
...
...
features/steps/project/merge_requests.rb
View file @
dcbe9cd3
...
...
@@ -253,7 +253,7 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
end
step
'I should still see a comment like "Line is correct" in the first file'
do
within
'.files [id^=diff]:nth-child(1) .note-text'
do
within
'.files [id^=diff]:nth-child(1) .note-
body > .note-
text'
do
page
.
should
have_visible_content
"Line is correct"
end
end
...
...
@@ -271,7 +271,7 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
end
step
'I should see comments on the side-by-side diff page'
do
within
'.files [id^=diff]:nth-child(1) .parallel .note-text'
do
within
'.files [id^=diff]:nth-child(1) .parallel .note-
body > .note-
text'
do
page
.
should
have_visible_content
"Line is correct"
end
end
...
...
features/steps/shared/note.rb
View file @
dcbe9cd3
...
...
@@ -116,7 +116,7 @@ module SharedNote
end
step
'The comment with the header should not have an ID'
do
within
(
".note-text"
)
do
within
(
".note-
body > .note-
text"
)
do
page
.
should
have_content
(
"Comment with a header"
)
page
.
should_not
have_css
(
"#comment-with-a-header"
)
end
...
...
lib/api/entities.rb
View file @
dcbe9cd3
...
...
@@ -65,7 +65,7 @@ module API
end
class
Group
<
Grape
::
Entity
expose
:id
,
:name
,
:path
,
:
owner_id
,
:
description
expose
:id
,
:name
,
:path
,
:description
end
class
GroupDetail
<
Group
...
...
lib/api/groups.rb
View file @
dcbe9cd3
...
...
@@ -33,9 +33,9 @@ module API
attrs
=
attributes_for_keys
[
:name
,
:path
,
:description
]
@group
=
Group
.
new
(
attrs
)
@group
.
owner
=
current_user
if
@group
.
save
@group
.
add_owner
(
current_user
)
present
@group
,
with:
Entities
::
Group
else
render_api_error!
(
"Failed to save group
#{
@group
.
errors
.
messages
}
"
,
400
)
...
...
lib/api/helpers.rb
View file @
dcbe9cd3
...
...
@@ -83,7 +83,7 @@ module API
end
def
authenticate_by_gitlab_shell_token!
unauthorized!
unless
secret_token
==
params
[
'secret_token'
]
unauthorized!
unless
secret_token
==
params
[
'secret_token'
]
.
try
(
:chomp
)
end
def
authenticated_as_admin!
...
...
@@ -236,7 +236,7 @@ module API
end
def
secret_token
File
.
read
(
Rails
.
root
.
join
(
'.gitlab_shell_secret'
))
File
.
read
(
Rails
.
root
.
join
(
'.gitlab_shell_secret'
))
.
chomp
end
def
handle_member_errors
(
errors
)
...
...
lib/api/internal.rb
View file @
dcbe9cd3
...
...
@@ -74,7 +74,7 @@ module API
if
message
=
BroadcastMessage
.
current
present
message
,
with:
Entities
::
BroadcastMessage
else
not_found!
{}
end
end
end
...
...
lib/gitlab/current_settings.rb
View file @
dcbe9cd3
module
Gitlab
module
CurrentSettings
def
current_application_settings
if
ActiveRecord
::
Base
.
connected?
&&
ActiveRecord
::
Base
.
connection
.
table_exists?
(
'application_settings'
)
ApplicationSetting
.
current
||
ApplicationSetting
.
create_from_defaults
else
fake_application_settings
key
=
:current_application_settings
RequestStore
.
store
[
key
]
||=
begin
if
ActiveRecord
::
Base
.
connected?
&&
ActiveRecord
::
Base
.
connection
.
table_exists?
(
'application_settings'
)
RequestStore
.
store
[
:current_application_settings
]
=
(
ApplicationSetting
.
current
||
ApplicationSetting
.
create_from_defaults
)
else
fake_application_settings
end
end
end
...
...
lib/gitlab/git_access.rb
View file @
dcbe9cd3
...
...
@@ -6,6 +6,8 @@ module Gitlab
attr_reader
:params
,
:project
,
:git_cmd
,
:user
def
self
.
can_push_to_branch?
(
user
,
project
,
ref
)
return
false
unless
user
if
project
.
protected_branch?
(
ref
)
&&
!
(
project
.
developers_can_push_to_protected_branch?
(
ref
)
&&
project
.
team
.
developer?
(
user
))
user
.
can?
(
:push_code_to_protected_branches
,
project
)
...
...
safe/public.pem
0 → 100644
View file @
dcbe9cd3
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnp2mUaLBoHFX127ysonX
OihiGpI4098eFfH1iAxpKHIof0vs0jFF05IUScNXJZ1U3w8G1U/unY/wGGa3NzAb
ZfDd22eOF6X2Gfiey6U4w9dFf0/UT5x1bphlpX357yh4O9oWWuNaWD062DTbOOsJ
U6UW2U/sZAu/QScys0Nw+gJ58t93hb4jFq+nO5IAQc6g4S8ek5YvIXOshFEpF2in
ZLbSYowx92+9GzfjvdQ7fk0Q2ssg0zfScVa6FY8n019osz0SC3wcSd/qicdfecpu
7oycpd9YDqk4lufE1qVMOsgE8OO4KXMrByz2f+T0p/bH9zdBa5HYylf1T7i60hIL
kQIDAQAB
-----END PUBLIC KEY-----
spec/features/notes_on_merge_requests_spec.rb
View file @
dcbe9cd3
...
...
@@ -81,7 +81,7 @@ describe 'Comments' do
within
(
"#note_
#{
note
.
id
}
"
)
do
expect
(
find
(
'.current-note-edit-form'
,
visible:
true
)).
to
be_visible
expect
(
find
(
'.note-edit-form'
,
visible:
true
)).
to
be_visible
expect
(
find
(
:css
,
'.note-text'
,
visible:
false
)).
not_to
be_visible
expect
(
find
(
:css
,
'.note-
body > .note-
text'
,
visible:
false
)).
not_to
be_visible
end
end
...
...
spec/helpers/gitlab_markdown_helper_spec.rb
View file @
dcbe9cd3
...
...
@@ -584,7 +584,7 @@ describe GitlabMarkdownHelper do
it
"should leave code blocks untouched"
do
allow
(
helper
).
to
receive
(
:user_color_scheme_class
).
and_return
(
:white
)
target_html
=
"<pre class=
\"
code highlight white plaintext
\"
><code>some code from $
40
\n
here too
\n
</code></pre>
\n
"
target_html
=
"<pre class=
\"
code highlight white plaintext
\"
><code>some code from $
#{
snippet
.
id
}
\n
here too
\n
</code></pre>
\n
"
expect
(
helper
.
markdown
(
"
\n
some code from $
#{
snippet
.
id
}
\n
here too
\n
"
)).
to
eq
(
target_html
)
...
...
@@ -638,6 +638,18 @@ describe GitlabMarkdownHelper do
expect
(
markdown
(
actual
)).
to
match
(
expected
)
end
it
"should handle relative urls for a file in master with an anchor"
do
actual
=
"[GitLab API doc](doc/api/README.md#section)
\n
"
expected
=
"<p><a href=
\"
/
#{
project
.
path_with_namespace
}
/blob/
#{
@ref
}
/doc/api/README.md#section
\"
>GitLab API doc</a></p>
\n
"
expect
(
markdown
(
actual
)).
to
match
(
expected
)
end
it
"should not handle relative urls for the current file with an anchor"
do
actual
=
"[GitLab API doc](#section)
\n
"
expected
=
"<p><a href=
\"
#section
\"
>GitLab API doc</a></p>
\n
"
expect
(
markdown
(
actual
)).
to
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/
#{
@ref
}
/doc/api
\"
>GitLab API doc</a></p>
\n
"
...
...
spec/requests/api/internal_spec.rb
View file @
dcbe9cd3
...
...
@@ -32,7 +32,8 @@ describe API::API, api: true do
it
do
get
api
(
"/internal/broadcast_message"
),
secret_token:
secret_token
expect
(
response
.
status
).
to
eq
(
404
)
expect
(
response
.
status
).
to
eq
(
200
)
expect
(
json_response
).
to
be_empty
end
end
end
...
...
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