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
512bb5ba
Commit
512bb5ba
authored
Jul 08, 2015
by
Dmitriy Zaporozhets
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of gitlab.com:gitlab-org/gitlab-ce
parents
411d5287
c8e9246e
Changes
32
Show whitespace changes
Inline
Side-by-side
Showing
32 changed files
with
287 additions
and
346 deletions
+287
-346
app/assets/javascripts/dispatcher.js.coffee
app/assets/javascripts/dispatcher.js.coffee
+3
-1
app/assets/javascripts/project_show.js.coffee
app/assets/javascripts/project_show.js.coffee
+1
-13
app/assets/javascripts/shortcuts_navigation.coffee
app/assets/javascripts/shortcuts_navigation.coffee
+1
-0
app/assets/stylesheets/generic/mobile.scss
app/assets/stylesheets/generic/mobile.scss
+11
-13
app/assets/stylesheets/pages/projects.scss
app/assets/stylesheets/pages/projects.scss
+34
-39
app/controllers/projects_controller.rb
app/controllers/projects_controller.rb
+16
-10
app/helpers/gitlab_routing_helper.rb
app/helpers/gitlab_routing_helper.rb
+4
-0
app/helpers/projects_helper.rb
app/helpers/projects_helper.rb
+7
-47
app/views/help/_shortcuts.html.haml
app/views/help/_shortcuts.html.haml
+6
-0
app/views/layouts/nav/_project.html.haml
app/views/layouts/nav/_project.html.haml
+6
-1
app/views/projects/_aside.html.haml
app/views/projects/_aside.html.haml
+0
-106
app/views/projects/_home_panel.html.haml
app/views/projects/_home_panel.html.haml
+23
-34
app/views/projects/_section.html.haml
app/views/projects/_section.html.haml
+0
-36
app/views/projects/activity.html.haml
app/views/projects/activity.html.haml
+13
-0
app/views/projects/buttons/_fork.html.haml
app/views/projects/buttons/_fork.html.haml
+13
-0
app/views/projects/buttons/_star.html.haml
app/views/projects/buttons/_star.html.haml
+21
-0
app/views/projects/empty.html.haml
app/views/projects/empty.html.haml
+17
-17
app/views/projects/show.html.haml
app/views/projects/show.html.haml
+67
-6
app/views/shared/_clone_panel.html.haml
app/views/shared/_clone_panel.html.haml
+1
-1
config/routes.rb
config/routes.rb
+1
-0
db/schema.rb
db/schema.rb
+2
-2
doc/install/requirements.md
doc/install/requirements.md
+5
-1
features/project/issues/issues.feature
features/project/issues/issues.feature
+1
-0
features/project/project.feature
features/project/project.feature
+5
-13
features/project/shortcuts.feature
features/project/shortcuts.feature
+8
-3
features/steps/project/issues/issues.rb
features/steps/project/issues/issues.rb
+5
-0
features/steps/project/project_shortcuts.rb
features/steps/project/project_shortcuts.rb
+5
-0
features/steps/project/source/browse_files.rb
features/steps/project/source/browse_files.rb
+1
-1
features/steps/project/star.rb
features/steps/project/star.rb
+1
-1
features/steps/shared/paths.rb
features/steps/shared/paths.rb
+4
-0
features/steps/shared/project_tab.rb
features/steps/shared/project_tab.rb
+4
-0
lib/tasks/gitlab/test.rake
lib/tasks/gitlab/test.rake
+1
-1
No files found.
app/assets/javascripts/dispatcher.js.coffee
View file @
512bb5ba
...
@@ -62,9 +62,11 @@ class Dispatcher
...
@@ -62,9 +62,11 @@ class Dispatcher
shortcut_handler
=
new
ShortcutsNavigation
()
shortcut_handler
=
new
ShortcutsNavigation
()
when
'projects:commits:show'
when
'projects:commits:show'
shortcut_handler
=
new
ShortcutsNavigation
()
shortcut_handler
=
new
ShortcutsNavigation
()
when
'projects:
show
'
when
'projects:
activity
'
new
Activities
()
new
Activities
()
shortcut_handler
=
new
ShortcutsNavigation
()
shortcut_handler
=
new
ShortcutsNavigation
()
when
'projects:show'
shortcut_handler
=
new
ShortcutsNavigation
()
when
'groups:show'
when
'groups:show'
new
Activities
()
new
Activities
()
shortcut_handler
=
new
ShortcutsNavigation
()
shortcut_handler
=
new
ShortcutsNavigation
()
...
...
app/assets/javascripts/project_show.js.coffee
View file @
512bb5ba
class
@
ProjectShow
class
@
ProjectShow
constructor
:
->
constructor
:
->
$
(
'.project-home-panel .star'
).
on
'ajax:success'
,
(
e
,
data
,
status
,
xhr
)
->
# I kept class for future
$
(
@
).
toggleClass
(
'on'
).
find
(
'.count'
).
html
(
data
.
star_count
)
.
on
'ajax:error'
,
(
e
,
xhr
,
status
,
error
)
->
new
Flash
(
'Star toggle failed. Try again later.'
,
'alert'
)
$
(
"a[data-toggle='tab']"
).
on
"shown.bs.tab"
,
(
e
)
->
$
.
cookie
"default_view"
,
$
(
e
.
target
).
attr
(
"href"
),
{
expires
:
30
,
path
:
'/'
}
defaultView
=
$
.
cookie
(
"default_view"
)
if
defaultView
$
(
"a[href="
+
defaultView
+
"]"
).
tab
"show"
else
$
(
"a[data-toggle='tab']:first"
).
tab
"show"
app/assets/javascripts/shortcuts_navigation.coffee
View file @
512bb5ba
...
@@ -4,6 +4,7 @@ class @ShortcutsNavigation extends Shortcuts
...
@@ -4,6 +4,7 @@ class @ShortcutsNavigation extends Shortcuts
constructor
:
->
constructor
:
->
super
()
super
()
Mousetrap
.
bind
(
'g p'
,
->
ShortcutsNavigation
.
findAndFollowLink
(
'.shortcuts-project'
))
Mousetrap
.
bind
(
'g p'
,
->
ShortcutsNavigation
.
findAndFollowLink
(
'.shortcuts-project'
))
Mousetrap
.
bind
(
'g e'
,
->
ShortcutsNavigation
.
findAndFollowLink
(
'.shortcuts-project-activity'
))
Mousetrap
.
bind
(
'g f'
,
->
ShortcutsNavigation
.
findAndFollowLink
(
'.shortcuts-tree'
))
Mousetrap
.
bind
(
'g f'
,
->
ShortcutsNavigation
.
findAndFollowLink
(
'.shortcuts-tree'
))
Mousetrap
.
bind
(
'g c'
,
->
ShortcutsNavigation
.
findAndFollowLink
(
'.shortcuts-commits'
))
Mousetrap
.
bind
(
'g c'
,
->
ShortcutsNavigation
.
findAndFollowLink
(
'.shortcuts-commits'
))
Mousetrap
.
bind
(
'g n'
,
->
ShortcutsNavigation
.
findAndFollowLink
(
'.shortcuts-network'
))
Mousetrap
.
bind
(
'g n'
,
->
ShortcutsNavigation
.
findAndFollowLink
(
'.shortcuts-network'
))
...
...
app/assets/stylesheets/generic/mobile.scss
View file @
512bb5ba
...
@@ -44,20 +44,18 @@
...
@@ -44,20 +44,18 @@
.project-home-panel
{
.project-home-panel
{
padding-left
:
0
!
important
;
padding-left
:
0
!
important
;
.project-home-row
{
.project-avatar
{
.project-home-desc
{
display
:
block
;
margin-right
:
0
!
important
;
float
:
none
!
important
;
}
}
.project-repo-buttons
{
.project-repo-buttons
,
position
:
static
;
.git-clone-holder
{
margin-top
:
15px
;
display
:
none
;
width
:
100%
;
float
:
none
;
text-align
:
left
;
}
}
}
}
.project-stats
{
display
:
none
;
}
}
.container
.title
{
.container
.title
{
...
...
app/assets/stylesheets/pages/projects.scss
View file @
512bb5ba
...
@@ -15,48 +15,31 @@
...
@@ -15,48 +15,31 @@
}
}
.project-home-panel
{
.project-home-panel
{
margin-top
:
10px
;
text-align
:
center
;
margin-bottom
:
15px
;
margin-bottom
:
20px
;
position
:
relative
;
padding-left
:
65px
;
min-height
:
50px
;
.project-identicon-holder
{
.project-identicon-holder
{
position
:
absolute
;
margin-bottom
:
15px
;
left
:
0
;
top
:
-14px
;
.avatar
{
.avatar
,
.identicon
{
width
:
50px
;
margin
:
0
auto
;
height
:
50px
;
float
:
none
;
}
}
.identicon
{
.identicon
{
font-size
:
26px
;
@include
border-radius
(
50%
);
line-height
:
50px
;
}
}
}
}
.project-home-row
{
.lead
{
@extend
.clearfix
;
margin-bottom
:
15px
;
&
.project-home-row-top
{
margin-bottom
:
15px
;
}
.project-home-desc
{
color
:
$gray
;
float
:
left
;
font-size
:
16px
;
line-height
:
1
.3
;
margin-right
:
250px
;
// Render Markdown-generated HTML inline for this block
p
{
p
{
display
:
inline
;
display
:
inline
;
}
}
}
}
.git-clone-holder
{
max-width
:
600px
;
margin
:
0
auto
;
}
}
.visibility-level-label
{
.visibility-level-label
{
...
@@ -67,22 +50,22 @@
...
@@ -67,22 +50,22 @@
}
}
.project-repo-buttons
{
.project-repo-buttons
{
margin-top
:
-3px
;
margin-top
:
25px
;
position
:
absolute
;
margin-bottom
:
25px
;
right
:
0
;
width
:
265px
;
text-align
:
right
;
.btn
{
.btn
{
@extend
.btn-info
;
margin-left
:
10px
;
font-weight
:
bold
;
font-weight
:
bold
;
font-size
:
14px
;
font-size
:
14px
;
line-height
:
16px
;
line-height
:
16px
;
padding
:
8px
12px
;
.count
{
.count
{
padding-left
:
10px
;
padding-left
:
7px
;
border-left
:
1px
solid
#ccc
;
display
:
inline-block
;
display
:
inline-block
;
margin-left
:
10
px
;
margin-left
:
7
px
;
}
}
}
}
}
}
...
@@ -307,3 +290,15 @@ table.table.protected-branches-list tr.no-border {
...
@@ -307,3 +290,15 @@ table.table.protected-branches-list tr.no-border {
float
:
left
;
float
:
left
;
margin-right
:
10px
;
margin-right
:
10px
;
}
}
.project-stats
{
text-align
:
center
;
ul
.nav-pills
{
display
:inline-block
;
}
li
{
display
:inline
;
}
a
{
float
:left
;
}
}
pre
.light-well
{
border-color
:
#f1f1f1
;
}
app/controllers/projects_controller.rb
View file @
512bb5ba
...
@@ -6,7 +6,7 @@ class ProjectsController < ApplicationController
...
@@ -6,7 +6,7 @@ class ProjectsController < ApplicationController
# Authorize
# Authorize
before_action
:authorize_admin_project!
,
only:
[
:edit
,
:update
,
:destroy
,
:transfer
,
:archive
,
:unarchive
]
before_action
:authorize_admin_project!
,
only:
[
:edit
,
:update
,
:destroy
,
:transfer
,
:archive
,
:unarchive
]
before_action
:event_filter
,
only:
:show
before_action
:event_filter
,
only:
[
:show
,
:activity
]
layout
:determine_layout
layout
:determine_layout
...
@@ -59,14 +59,22 @@ class ProjectsController < ApplicationController
...
@@ -59,14 +59,22 @@ class ProjectsController < ApplicationController
end
end
end
end
def
activity
respond_to
do
|
format
|
format
.
html
format
.
json
do
load_events
pager_json
(
'events/_events'
,
@events
.
count
)
end
end
end
def
show
def
show
if
@project
.
import_in_progress?
if
@project
.
import_in_progress?
redirect_to
namespace_project_import_path
(
@project
.
namespace
,
@project
)
redirect_to
namespace_project_import_path
(
@project
.
namespace
,
@project
)
return
return
end
end
@show_star
=
!
(
current_user
&&
current_user
.
starred?
(
@project
))
respond_to
do
|
format
|
respond_to
do
|
format
|
format
.
html
do
format
.
html
do
if
@project
.
repository_exists?
if
@project
.
repository_exists?
...
@@ -81,11 +89,6 @@ class ProjectsController < ApplicationController
...
@@ -81,11 +89,6 @@ class ProjectsController < ApplicationController
end
end
end
end
format
.
json
do
load_events
pager_json
(
'events/_events'
,
@events
.
count
)
end
format
.
atom
do
format
.
atom
do
load_events
load_events
render
layout:
false
render
layout:
false
...
@@ -147,7 +150,10 @@ class ProjectsController < ApplicationController
...
@@ -147,7 +150,10 @@ class ProjectsController < ApplicationController
def
toggle_star
def
toggle_star
current_user
.
toggle_star
(
@project
)
current_user
.
toggle_star
(
@project
)
@project
.
reload
@project
.
reload
render
json:
{
star_count:
@project
.
star_count
}
render
json:
{
html:
view_to_html_string
(
"projects/buttons/_star"
)
}
end
end
def
markdown_preview
def
markdown_preview
...
...
app/helpers/gitlab_routing_helper.rb
View file @
512bb5ba
...
@@ -17,6 +17,10 @@ module GitlabRoutingHelper
...
@@ -17,6 +17,10 @@ module GitlabRoutingHelper
namespace_project_path
(
project
.
namespace
,
project
,
*
args
)
namespace_project_path
(
project
.
namespace
,
project
,
*
args
)
end
end
def
activity_project_path
(
project
,
*
args
)
activity_namespace_project_path
(
project
.
namespace
,
project
,
*
args
)
end
def
edit_project_path
(
project
,
*
args
)
def
edit_project_path
(
project
,
*
args
)
edit_namespace_project_path
(
project
.
namespace
,
project
,
*
args
)
edit_namespace_project_path
(
project
.
namespace
,
project
,
*
args
)
end
end
...
...
app/helpers/projects_helper.rb
View file @
512bb5ba
...
@@ -84,53 +84,6 @@ module ProjectsHelper
...
@@ -84,53 +84,6 @@ module ProjectsHelper
@project
.
milestones
.
active
.
order
(
"due_date, title ASC"
)
@project
.
milestones
.
active
.
order
(
"due_date, title ASC"
)
end
end
def
link_to_toggle_star
(
title
,
starred
)
cls
=
'star-btn btn btn-sm btn-default'
toggle_text
=
if
starred
' Unstar'
else
' Star'
end
toggle_html
=
content_tag
(
'span'
,
class:
'toggle'
)
do
icon
(
'star'
)
+
toggle_text
end
count_html
=
content_tag
(
'span'
,
class:
'count'
)
do
@project
.
star_count
.
to_s
end
link_opts
=
{
title:
title
,
class:
cls
,
method: :post
,
remote:
true
,
data:
{
type:
'json'
}
}
path
=
toggle_star_namespace_project_path
(
@project
.
namespace
,
@project
)
content_tag
'span'
,
class:
starred
?
'turn-on'
:
'turn-off'
do
link_to
(
path
,
link_opts
)
do
toggle_html
+
' '
+
count_html
end
end
end
def
link_to_toggle_fork
html
=
content_tag
(
'span'
)
do
icon
(
'code-fork'
)
+
' Fork'
end
count_html
=
content_tag
(
:span
,
class:
'count'
)
do
@project
.
forks_count
.
to_s
end
html
+
count_html
end
def
project_for_deploy_key
(
deploy_key
)
def
project_for_deploy_key
(
deploy_key
)
if
deploy_key
.
projects
.
include?
(
@project
)
if
deploy_key
.
projects
.
include?
(
@project
)
@project
@project
...
@@ -306,4 +259,11 @@ module ProjectsHelper
...
@@ -306,4 +259,11 @@ module ProjectsHelper
def
leave_project_message
(
project
)
def
leave_project_message
(
project
)
"Are you sure you want to leave
\"
#{
project
.
name
}
\"
project?"
"Are you sure you want to leave
\"
#{
project
.
name
}
\"
project?"
end
end
def
new_readme_path
ref
=
@repository
.
root_ref
if
@repository
ref
||=
'master'
namespace_project_new_blob_path
(
@project
.
namespace
,
@project
,
tree_join
(
ref
),
file_name:
'README.md'
)
end
end
end
app/views/help/_shortcuts.html.haml
View file @
512bb5ba
...
@@ -79,6 +79,12 @@
...
@@ -79,6 +79,12 @@
%td
.shortcut
%td
.shortcut
.key
g
.key
g
.key
p
.key
p
%td
Go to the project's home page
%tr
%td
.shortcut
.key
g
.key
e
%td
%td
Go to the project's activity feed
Go to the project's activity feed
%tr
%tr
...
...
app/views/layouts/nav/_project.html.haml
View file @
512bb5ba
%ul
.nav.nav-sidebar
%ul
.nav.nav-sidebar
=
nav_link
(
path:
'projects#show'
,
html_options:
{
class:
'home'
})
do
=
nav_link
(
path:
'projects#show'
,
html_options:
{
class:
'home'
})
do
=
link_to
project_path
(
@project
),
title:
'Project'
,
class:
'shortcuts-project'
,
data:
{
placement:
'right'
}
do
=
link_to
project_path
(
@project
),
title:
'Project'
,
class:
'shortcuts-project'
,
data:
{
placement:
'right'
}
do
=
icon
(
'
dashboard
fw'
)
=
icon
(
'
home
fw'
)
%span
%span
Project
Project
=
nav_link
(
path:
'projects#activity'
)
do
=
link_to
activity_project_path
(
@project
),
title:
'Project Activity'
,
class:
'shortcuts-project-activity'
,
data:
{
placement:
'right'
}
do
=
icon
(
'dashboard fw'
)
%span
Activity
-
if
project_nav_tab?
:files
-
if
project_nav_tab?
:files
=
nav_link
(
controller:
%w(tree blob blame edit_tree new_tree)
)
do
=
nav_link
(
controller:
%w(tree blob blame edit_tree new_tree)
)
do
=
link_to
namespace_project_tree_path
(
@project
.
namespace
,
@project
,
@ref
||
@repository
.
root_ref
),
title:
'Files'
,
class:
'shortcuts-tree'
,
data:
{
placement:
'right'
}
do
=
link_to
namespace_project_tree_path
(
@project
.
namespace
,
@project
,
@ref
||
@repository
.
root_ref
),
title:
'Files'
,
class:
'shortcuts-tree'
,
data:
{
placement:
'right'
}
do
...
...
app/views/projects/_aside.html.haml
deleted
100644 → 0
View file @
411d5287
.clearfix
-
unless
@project
.
empty_repo?
.panel.panel-default
.panel-heading
=
visibility_level_icon
(
@project
.
visibility_level
)
=
"
#{
visibility_level_label
(
@project
.
visibility_level
).
capitalize
}
project"
.panel-body
-
if
@repository
.
changelog
||
@repository
.
license
||
@repository
.
contribution_guide
%ul
.nav.nav-pills
-
if
@repository
.
changelog
%li
.hidden-xs
=
link_to
changelog_url
(
@project
)
do
Changelog
-
if
@repository
.
license
%li
=
link_to
license_url
(
@project
)
do
License
-
if
@repository
.
contribution_guide
%li
=
link_to
contribution_guide_url
(
@project
)
do
Contribution guide
.actions
-
if
can?
current_user
,
:create_issue
,
@project
=
link_to
url_for_new_issue
(
@project
,
only_path:
true
),
title:
"New Issue"
,
class:
'btn btn-sm append-right-10'
do
New Issue
-
if
can?
current_user
,
:create_merge_request
,
@project
=
link_to
new_namespace_project_merge_request_path
(
@project
.
namespace
,
@project
),
class:
"btn btn-sm"
,
title:
"New Merge Request"
do
New Merge Request
-
if
forked_from_project
=
@project
.
forked_from_project
.panel-footer
=
icon
(
"code-fork fw"
)
Forked from
.pull-right
=
link_to
forked_from_project
.
namespace
.
try
(
:name
),
project_path
(
forked_from_project
)
-
@project
.
ci_services
.
each
do
|
ci_service
|
-
if
ci_service
.
active?
&&
ci_service
.
respond_to?
(
:builds_path
)
.panel-footer
=
icon
(
"check fw"
)
=
ci_service
.
title
.pull-right
-
if
ci_service
.
respond_to?
(
:status_img_path
)
=
link_to
ci_service
.
builds_path
,
:'data-no-turbolink'
=>
'data-no-turbolink'
do
=
image_tag
ci_service
.
status_img_path
,
alt:
"build status"
,
class:
'ci-status-image'
-
else
=
link_to
'view builds'
,
ci_service
.
builds_path
,
:'data-no-turbolink'
=>
'data-no-turbolink'
-
unless
@project
.
empty_repo?
.panel.panel-default
.panel-heading
=
icon
(
"folder-o fw"
)
Repository
.panel-body
%ul
.nav.nav-pills
%li
=
link_to
namespace_project_commits_path
(
@project
.
namespace
,
@project
,
@ref
||
@repository
.
root_ref
)
do
=
pluralize
(
number_with_delimiter
(
@repository
.
commit_count
),
'commit'
)
%li
=
link_to
namespace_project_branches_path
(
@project
.
namespace
,
@project
)
do
=
pluralize
(
number_with_delimiter
(
@repository
.
branch_names
.
count
),
'branch'
)
%li
=
link_to
namespace_project_tags_path
(
@project
.
namespace
,
@project
)
do
=
pluralize
(
number_with_delimiter
(
@repository
.
tag_names
.
count
),
'tag'
)
.actions
=
link_to
namespace_project_compare_index_path
(
@project
.
namespace
,
@project
,
from:
@repository
.
root_ref
,
to:
@ref
||
@repository
.
root_ref
),
class:
'btn btn-sm append-right-10'
do
%i
.fa.fa-exchange
Compare code
-
if
can?
(
current_user
,
:download_code
,
@project
)
=
render
'projects/repositories/download_archive'
,
split_button:
true
,
btn_class:
'btn-group-sm'
-
if
version
=
@repository
.
version
.panel-footer
=
icon
(
"clock-o fw"
)
Version
.pull-right
=
link_to
version_url
(
@project
)
do
=
@repository
.
blob_by_oid
(
version
.
id
).
data
=
render
"shared/clone_panel"
-
if
@project
.
archived?
%br
.alert.alert-warning
%h4
=
icon
(
"exclamation-triangle fw"
)
Archived project!
%p
Repository is read-only
-
if
current_user
-
access
=
user_max_access_in_project
(
current_user
,
@project
)
-
if
access
.light-well.light.prepend-top-20
%small
You have
#{
access
}
access to this project.
-
if
@project
.
project_member_by_id
(
current_user
)
%br
=
link_to
leave_namespace_project_project_members_path
(
@project
.
namespace
,
@project
),
data:
{
confirm:
leave_project_message
(
@project
)
},
method: :delete
,
title:
'Leave project'
do
Leave this project
app/views/projects/_home_panel.html.haml
View file @
512bb5ba
-
empty_repo
=
@project
.
empty_repo?
-
empty_repo
=
@project
.
empty_repo?
.project-home-panel.clearfix
{
:class
=>
(
"empty-project"
if
empty_repo
)}
.project-home-panel.clearfix
{
:class
=>
(
"empty-project"
if
empty_repo
)}
.project-identicon-holder
.project-identicon-holder
=
project_icon
(
@project
,
alt:
''
,
class:
'avatar project-avatar'
)
=
project_icon
(
@project
,
alt:
''
,
class:
'project-avatar avatar s90'
)
.project-home-row.project-home-row-top
.project-home-desc.lead
.project-home-desc
-
if
@project
.
description
.
present?
-
if
@project
.
description
.
present?
=
markdown
(
@project
.
description
,
pipeline: :description
)
=
markdown
(
@project
.
description
,
pipeline: :description
)
-
if
can?
(
current_user
,
:admin_project
,
@project
)
–
=
link_to
'Edit'
,
edit_namespace_project_path
-
elsif
!
empty_repo
&&
@repository
.
readme
-
readme
=
@repository
.
readme
–
=
link_to
namespace_project_blob_path
(
@project
.
namespace
,
@project
,
tree_join
(
@repository
.
root_ref
,
readme
.
name
))
do
=
readme
.
name
.project-repo-buttons
.project-repo-buttons
.inline.star.js-toggler-container
{
class:
@show_star
?
'on'
:
''
}
=
render
'projects/buttons/star'
-
if
current_user
=
link_to_toggle_star
(
'Star this project.'
,
false
)
=
link_to_toggle_star
(
'Unstar this project.'
,
true
)
-
else
=
link_to
new_user_session_path
,
class:
'btn star-btn has_tooltip'
,
title:
'You must sign in to star a project'
do
%span
=
icon
(
'star'
)
Star
%span
.count
=
@project
.
star_count
-
unless
empty_repo
-
unless
empty_repo
-
if
current_user
&&
can?
(
current_user
,
:fork_project
,
@project
)
&&
@project
.
namespace
!=
current_user
.
namespace
=
render
'projects/buttons/fork'
.inline.fork-buttons.prepend-left-10
-
if
current_user
.
already_forked?
(
@project
)
&&
current_user
.
manageable_namespaces
.
size
<
2
-
if
forked_from_project
=
@project
.
forked_from_project
=
link_to
namespace_project_path
(
current_user
,
current_user
.
fork_of
(
@project
)),
title:
'Go to your fork'
,
class:
'btn btn-sm btn-default'
do
=
link_to
project_path
(
forked_from_project
),
class:
'btn'
do
=
link_to_toggle_fork
=
icon
(
"code-fork fw"
)
-
else
Forked from
=
link_to
new_namespace_project_fork_path
(
@project
.
namespace
,
@project
),
title:
"Fork project"
,
class:
'btn btn-sm btn-default'
do
=
forked_from_project
.
namespace
.
try
(
:name
)
=
link_to_toggle_fork
-
if
can?
current_user
,
:download_code
,
@project
=
link_to
archive_namespace_project_repository_path
(
@project
.
namespace
,
@project
,
ref:
@ref
,
format:
'zip'
),
class:
'btn'
,
rel:
'nofollow'
do
%i
.fa.fa-download
=
render
"shared/clone_panel"
app/views/projects/_section.html.haml
deleted
100644 → 0
View file @
411d5287
%ul
.nav.nav-tabs
%li
.active
=
link_to
'#tab-activity'
,
'data-toggle'
=>
'tab'
do
=
icon
(
"tachometer"
)
Activity
-
if
@repository
.
readme
%li
=
link_to
'#tab-readme'
,
'data-toggle'
=>
'tab'
do
=
icon
(
"file-text-o"
)
Readme
.tab-content
.tab-pane.active
#tab-activity
.hidden-xs
=
render
"events/event_last_push"
,
event:
@last_push
-
if
current_user
%ul
.nav.nav-pills.event_filter.pull-right
%li
=
link_to
namespace_project_path
(
@project
.
namespace
,
@project
,
format: :atom
,
private_token:
current_user
.
private_token
),
title:
"Feed"
,
class:
'rss-btn'
do
%i
.fa.fa-rss
=
render
'shared/event_filter'
%hr
.content_list
=
spinner
-
if
readme
=
@repository
.
readme
.tab-pane
#tab-readme
%article
.readme-holder
#README
.clearfix
%small
.pull-right
=
link_to
namespace_project_blob_path
(
@project
.
namespace
,
@project
,
tree_join
(
@repository
.
root_ref
,
readme
.
name
)),
class:
'light'
do
%i
.fa.fa-file
=
readme
.
name
.wiki
=
render_readme
(
readme
)
app/views/projects/activity.html.haml
0 → 100644
View file @
512bb5ba
.hidden-xs
=
render
"events/event_last_push"
,
event:
@last_push
-
if
current_user
%ul
.nav.nav-pills.event_filter.pull-right
%li
=
link_to
namespace_project_path
(
@project
.
namespace
,
@project
,
format: :atom
,
private_token:
current_user
.
private_token
),
title:
"Feed"
,
class:
'rss-btn'
do
%i
.fa.fa-rss
=
render
'shared/event_filter'
%hr
.content_list
=
spinner
app/views/projects/buttons/_fork.html.haml
0 → 100644
View file @
512bb5ba
-
if
current_user
&&
can?
(
current_user
,
:fork_project
,
@project
)
-
if
current_user
.
already_forked?
(
@project
)
&&
current_user
.
manageable_namespaces
.
size
<
2
=
link_to
namespace_project_path
(
current_user
,
current_user
.
fork_of
(
@project
)),
title:
'Go to your fork'
,
class:
'btn'
do
=
icon
(
'code-fork'
)
Fork
%span
.count
=
@project
.
forks_count
-
else
=
link_to
new_namespace_project_fork_path
(
@project
.
namespace
,
@project
),
title:
"Fork project"
,
class:
'btn'
do
=
icon
(
'code-fork'
)
Fork
%span
.count
=
@project
.
forks_count
app/views/projects/buttons/_star.html.haml
0 → 100644
View file @
512bb5ba
-
if
current_user
=
link_to
toggle_star_namespace_project_path
(
@project
.
namespace
,
@project
),
class:
'btn star-btn toggle-star'
,
method: :post
,
remote:
true
do
-
if
current_user
.
starred?
(
@project
)
Unstar
-
else
Star
%span
.count
=
@project
.
star_count
:coffeescript
$('.project-home-panel .toggle-star').on 'ajax:success', (e, data, status, xhr) ->
$(@).replaceWith(data.html)
.on 'ajax:error', (e, xhr, status, error) ->
new Flash('Star toggle failed. Try again later.', 'alert')
-
else
=
link_to
new_user_session_path
,
class:
'btn has_tooltip star-btn'
,
title:
'You must sign in to star a project'
do
=
icon
(
'star'
)
Star
%span
.count
=
@project
.
star_count
app/views/projects/empty.html.haml
View file @
512bb5ba
...
@@ -4,30 +4,30 @@
...
@@ -4,30 +4,30 @@
=
render
"home_panel"
=
render
"home_panel"
.center.well
.center.
light-
well
%h3
%h3
.page-title
The repository for this project is empty
The repository for this project is empty
%h4
%p
You can
If you already have files you can push them using command line instructions below.
=
link_to
namespace_project_new_blob_path
(
@project
.
namespace
,
@project
,
'master'
),
class:
'btn btn-new btn-lg'
do
%br
add a file
Otherwise you can start with
or do a push via the command line.
=
link_to
"adding README"
,
new_readme_path
,
class:
'underlined-link'
file to this project.
.well
.prepend-top-20
=
render
"shared/clone_panel"
%h3
.page-title
%h4
Command line instructions
%strong
Command line instructions
%div
.git-empty
%div
.git-empty
%fieldset
%fieldset
%
legend
Git global setup
%
h5
Git global setup
%pre
.
dark
%pre
.
light-well
:preserve
:preserve
git config --global user.name "
#{
git_user_name
}
"
git config --global user.name "
#{
git_user_name
}
"
git config --global user.email "
#{
git_user_email
}
"
git config --global user.email "
#{
git_user_email
}
"
%fieldset
%fieldset
%
legend
Create a new repository
%
h5
Create a new repository
%pre
.
dark
%pre
.
light-well
:preserve
:preserve
git clone
#{
content_tag
(
:span
,
default_url_to_repo
,
class:
'clone'
)
}
git clone
#{
content_tag
(
:span
,
default_url_to_repo
,
class:
'clone'
)
}
cd
#{
@project
.
path
}
cd
#{
@project
.
path
}
...
@@ -37,8 +37,8 @@
...
@@ -37,8 +37,8 @@
git push -u origin master
git push -u origin master
%fieldset
%fieldset
%
legend
Existing folder or Git repository
%
h5
Existing folder or Git repository
%pre
.
dark
%pre
.
light-well
:preserve
:preserve
cd existing_folder
cd existing_folder
git init
git init
...
...
app/views/projects/show.html.haml
View file @
512bb5ba
...
@@ -7,10 +7,71 @@
...
@@ -7,10 +7,71 @@
=
render
'shared/no_password'
=
render
'shared/no_password'
=
render
"home_panel"
=
render
"home_panel"
=
render
'shared/show_aside'
.row
.project-stats
%section
.col-md-8
%ul
.nav.nav-pills
=
render
'section'
%li
%aside
.col-md-4.project-side
=
link_to
namespace_project_commits_path
(
@project
.
namespace
,
@project
,
@ref
||
@repository
.
root_ref
)
do
=
render
'aside'
=
pluralize
(
number_with_delimiter
(
@repository
.
commit_count
),
'commit'
)
%li
=
link_to
namespace_project_branches_path
(
@project
.
namespace
,
@project
)
do
=
pluralize
(
number_with_delimiter
(
@repository
.
branch_names
.
count
),
'branch'
)
%li
=
link_to
namespace_project_tags_path
(
@project
.
namespace
,
@project
)
do
=
pluralize
(
number_with_delimiter
(
@repository
.
tag_names
.
count
),
'tag'
)
-
if
@repository
.
changelog
%li
=
link_to
changelog_url
(
@project
)
do
Changelog
-
if
@repository
.
license
%li
=
link_to
license_url
(
@project
)
do
License
-
if
@repository
.
contribution_guide
%li
=
link_to
contribution_guide_url
(
@project
)
do
Contribution guide
-
if
@project
.
archived?
.text-warning.center.prepend-top-20
%p
=
icon
(
"exclamation-triangle fw"
)
Archived project! Repository is read-only
%hr
%section
-
if
readme
=
@repository
.
readme
%article
.readme-holder
#README
.clearfix
%small
.pull-right
=
link_to
namespace_project_blob_path
(
@project
.
namespace
,
@project
,
tree_join
(
@repository
.
root_ref
,
readme
.
name
)),
class:
'light'
do
%i
.fa.fa-file
=
readme
.
name
.wiki
=
render_readme
(
readme
)
-
else
%h3
.page-title
This project does not have README yet
-
if
can?
(
current_user
,
:push_code
,
@project
)
%p
.slead
A
%code
README
file contains information about other files in a repository and is commonly
distributed with computer software, forming part of its documentation.
%br
We recommend you to
=
link_to
"add README"
,
new_readme_path
,
class:
'underlined-link'
file to the repository and GitLab will render it here instead of this message.
-
if
current_user
-
access
=
user_max_access_in_project
(
current_user
,
@project
)
-
if
access
%hr
%p
.light
You have
#{
access
}
access to this project.
-
if
@project
.
project_member_by_id
(
current_user
)
=
link_to
leave_namespace_project_project_members_path
(
@project
.
namespace
,
@project
),
data:
{
confirm:
leave_project_message
(
@project
)
},
method: :delete
,
title:
'Leave project'
,
class:
'cred'
do
Leave this project
app/views/shared/_clone_panel.html.haml
View file @
512bb5ba
...
@@ -20,7 +20,7 @@
...
@@ -20,7 +20,7 @@
:"data-container"
=>
"body"
}
:"data-container"
=>
"body"
}
=
gitlab_config
.
protocol
.
upcase
=
gitlab_config
.
protocol
.
upcase
=
text_field_tag
:project_clone
,
default_url_to_repo
(
project
),
class:
"js-select-on-focus form-control input-sm"
,
readonly:
true
=
text_field_tag
:project_clone
,
default_url_to_repo
(
project
),
class:
"js-select-on-focus form-control input-sm"
,
readonly:
true
-
if
project
.
kind_of?
(
Project
)
&&
project
.
empty_repo?
-
if
project
.
kind_of?
(
Project
)
.input-group-addon
.input-group-addon
.visibility-level-label.has_tooltip
{
'data-title'
=>
"#{visibility_level_label(project.visibility_level)} project"
}
.visibility-level-label.has_tooltip
{
'data-title'
=>
"#{visibility_level_label(project.visibility_level)} project"
}
=
visibility_level_icon
(
project
.
visibility_level
)
=
visibility_level_icon
(
project
.
visibility_level
)
...
...
config/routes.rb
View file @
512bb5ba
...
@@ -314,6 +314,7 @@ Gitlab::Application.routes.draw do
...
@@ -314,6 +314,7 @@ Gitlab::Application.routes.draw do
post
:toggle_star
post
:toggle_star
post
:markdown_preview
post
:markdown_preview
get
:autocomplete_sources
get
:autocomplete_sources
get
:activity
end
end
scope
module: :projects
do
scope
module: :projects
do
...
...
db/schema.rb
View file @
512bb5ba
...
@@ -28,11 +28,11 @@ ActiveRecord::Schema.define(version: 20150620233230) do
...
@@ -28,11 +28,11 @@ ActiveRecord::Schema.define(version: 20150620233230) do
t
.
integer
"default_branch_protection"
,
default:
2
t
.
integer
"default_branch_protection"
,
default:
2
t
.
boolean
"twitter_sharing_enabled"
,
default:
true
t
.
boolean
"twitter_sharing_enabled"
,
default:
true
t
.
text
"restricted_visibility_levels"
t
.
text
"restricted_visibility_levels"
t
.
boolean
"version_check_enabled"
,
default:
true
t
.
integer
"max_attachment_size"
,
default:
10
,
null:
false
t
.
integer
"max_attachment_size"
,
default:
10
,
null:
false
t
.
integer
"default_project_visibility"
t
.
integer
"default_project_visibility"
t
.
integer
"default_snippet_visibility"
t
.
integer
"default_snippet_visibility"
t
.
text
"restricted_signup_domains"
t
.
text
"restricted_signup_domains"
t
.
boolean
"version_check_enabled"
,
default:
true
t
.
boolean
"user_oauth_applications"
,
default:
true
t
.
boolean
"user_oauth_applications"
,
default:
true
t
.
string
"after_sign_out_path"
t
.
string
"after_sign_out_path"
t
.
integer
"session_expire_delay"
,
default:
10080
,
null:
false
t
.
integer
"session_expire_delay"
,
default:
10080
,
null:
false
...
@@ -510,12 +510,12 @@ ActiveRecord::Schema.define(version: 20150620233230) do
...
@@ -510,12 +510,12 @@ ActiveRecord::Schema.define(version: 20150620233230) do
t
.
string
"bitbucket_access_token"
t
.
string
"bitbucket_access_token"
t
.
string
"bitbucket_access_token_secret"
t
.
string
"bitbucket_access_token_secret"
t
.
string
"location"
t
.
string
"location"
t
.
string
"public_email"
,
default:
""
,
null:
false
t
.
string
"encrypted_otp_secret"
t
.
string
"encrypted_otp_secret"
t
.
string
"encrypted_otp_secret_iv"
t
.
string
"encrypted_otp_secret_iv"
t
.
string
"encrypted_otp_secret_salt"
t
.
string
"encrypted_otp_secret_salt"
t
.
boolean
"otp_required_for_login"
,
default:
false
,
null:
false
t
.
boolean
"otp_required_for_login"
,
default:
false
,
null:
false
t
.
text
"otp_backup_codes"
t
.
text
"otp_backup_codes"
t
.
string
"public_email"
,
default:
""
,
null:
false
t
.
integer
"dashboard"
,
default:
0
t
.
integer
"dashboard"
,
default:
0
end
end
...
...
doc/install/requirements.md
View file @
512bb5ba
...
@@ -110,3 +110,7 @@ On a very active server (10,000 active users) the Sidekiq process can use 1GB+ o
...
@@ -110,3 +110,7 @@ On a very active server (10,000 active users) the Sidekiq process can use 1GB+ o
-
Safari 7+ (known problem: required fields in html5 do not work)
-
Safari 7+ (known problem: required fields in html5 do not work)
-
Opera (Latest released version)
-
Opera (Latest released version)
-
IE 10+
-
IE 10+
### Common UI problems with IE
If you experience UI issues with Internet Explorer, please make sure that you have the
`Compatibility View`
mode disabled.
\ No newline at end of file
features/project/issues/issues.feature
View file @
512bb5ba
...
@@ -189,6 +189,7 @@ Feature: Project Issues
...
@@ -189,6 +189,7 @@ Feature: Project Issues
Given
I logout
Given
I logout
Given
public project
"Community"
Given
public project
"Community"
When
I visit project
"Community"
page
When
I visit project
"Community"
page
And
I visit project
"Community"
issues page
And
I click link
"New Issue"
And
I click link
"New Issue"
And
I should not see assignee field
And
I should not see assignee field
And
I should not see milestone field
And
I should not see milestone field
...
...
features/project/project.feature
View file @
512bb5ba
...
@@ -18,9 +18,13 @@ Feature: Project
...
@@ -18,9 +18,13 @@ Feature: Project
Then
I should see the default project avatar
Then
I should see the default project avatar
And
I should not see the
"Remove avatar"
button
And
I should not see the
"Remove avatar"
button
Scenario
:
I
should have readme on page
And
I visit project
"Shop"
page
Then
I should see project
"Shop"
README
@javascript
@javascript
Scenario
:
I
should see project activity
Scenario
:
I
should see project activity
When
I visit project
"Shop"
page
When
I visit project
"Shop"
activity
page
Then
I should see project
"Shop"
activity feed
Then
I should see project
"Shop"
activity feed
Scenario
:
I
visit edit project
Scenario
:
I
visit edit project
...
@@ -38,24 +42,12 @@ Feature: Project
...
@@ -38,24 +42,12 @@ Feature: Project
And
change project path settings
And
change project path settings
Then
I should see project with new path settings
Then
I should see project with new path settings
Scenario
:
I
should see project readme and version
When
I visit project
"Shop"
page
And
I should see project
"Shop"
version
Scenario
:
I
should change project default branch
Scenario
:
I
should change project default branch
When
I visit edit project
"Shop"
page
When
I visit edit project
"Shop"
page
And
change project default branch
And
change project default branch
And
I save project
And
I save project
Then
I should see project default branch changed
Then
I should see project default branch changed
@javascript
Scenario
:
I
should have default tab per my preference
And
I own project
"Forum"
When
I select project
"Forum"
README tab
Then
I should see project
"Forum"
README
And
I visit project
"Shop"
page
Then
I should see project
"Shop"
README
Scenario
:
I
tag a project
Scenario
:
I
tag a project
When
I visit edit project
"Shop"
page
When
I visit edit project
"Shop"
page
Then
I should see project settings
Then
I should see project settings
...
...
features/project/shortcuts.feature
View file @
512bb5ba
...
@@ -3,7 +3,7 @@ Feature: Project Shortcuts
...
@@ -3,7 +3,7 @@ Feature: Project Shortcuts
Background
:
Background
:
Given
I sign in as a user
Given
I sign in as a user
And
I own a project
And
I own a project
And
I visit my project's
home
page
And
I visit my project's
commits
page
@javascript
@javascript
Scenario
:
Navigate to files tab
Scenario
:
Navigate to files tab
...
@@ -12,6 +12,7 @@ Feature: Project Shortcuts
...
@@ -12,6 +12,7 @@ Feature: Project Shortcuts
@javascript
@javascript
Scenario
:
Navigate to commits tab
Scenario
:
Navigate to commits tab
Given
I visit my project's files page
Given
I press
"g"
and
"c"
Given
I press
"g"
and
"c"
Then
the active main tab should be Commits
Then
the active main tab should be Commits
...
@@ -46,7 +47,11 @@ Feature: Project Shortcuts
...
@@ -46,7 +47,11 @@ Feature: Project Shortcuts
Then
the active main tab should be Wiki
Then
the active main tab should be Wiki
@javascript
@javascript
Scenario
:
Navigate to project feed
Scenario
:
Navigate to project home
Given
I visit my project's files page
Given
I press
"g"
and
"p"
Given
I press
"g"
and
"p"
Then
the active main tab should be Home
Then
the active main tab should be Home
@javascript
Scenario
:
Navigate to project feed
Given
I press
"g"
and
"e"
Then
the active main tab should be Activity
features/steps/project/issues/issues.rb
View file @
512bb5ba
...
@@ -194,6 +194,11 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
...
@@ -194,6 +194,11 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
end
end
end
end
When
"I visit project
\"
Community
\"
issues page"
do
project
=
Project
.
find_by
(
name:
'Community'
)
visit
namespace_project_issues_path
(
project
.
namespace
,
project
)
end
When
"I visit empty project's issues page"
do
When
"I visit empty project's issues page"
do
project
=
Project
.
find_by
(
name:
'Empty Project'
)
project
=
Project
.
find_by
(
name:
'Empty Project'
)
visit
namespace_project_issues_path
(
project
.
namespace
,
project
)
visit
namespace_project_issues_path
(
project
.
namespace
,
project
)
...
...
features/steps/project/project_shortcuts.rb
View file @
512bb5ba
...
@@ -33,4 +33,9 @@ class Spinach::Features::ProjectShortcuts < Spinach::FeatureSteps
...
@@ -33,4 +33,9 @@ class Spinach::Features::ProjectShortcuts < Spinach::FeatureSteps
find
(
'body'
).
native
.
send_key
(
'g'
)
find
(
'body'
).
native
.
send_key
(
'g'
)
find
(
'body'
).
native
.
send_key
(
'w'
)
find
(
'body'
).
native
.
send_key
(
'w'
)
end
end
step
'I press "g" and "e"'
do
find
(
'body'
).
native
.
send_key
(
'g'
)
find
(
'body'
).
native
.
send_key
(
'e'
)
end
end
end
features/steps/project/source/browse_files.rb
View file @
512bb5ba
...
@@ -187,7 +187,7 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps
...
@@ -187,7 +187,7 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps
end
end
step
'I click on "add a file" link'
do
step
'I click on "add a file" link'
do
click_link
'add
a file
'
click_link
'add
ing README
'
# Remove pre-receive hook so we can push without auth
# Remove pre-receive hook so we can push without auth
FileUtils
.
rm_f
(
File
.
join
(
@project
.
repository
.
path
,
'hooks'
,
'pre-receive'
))
FileUtils
.
rm_f
(
File
.
join
(
@project
.
repository
.
path
,
'hooks'
,
'pre-receive'
))
...
...
features/steps/project/star.rb
View file @
512bb5ba
...
@@ -5,7 +5,7 @@ class Spinach::Features::ProjectStar < Spinach::FeatureSteps
...
@@ -5,7 +5,7 @@ class Spinach::Features::ProjectStar < Spinach::FeatureSteps
include
SharedUser
include
SharedUser
step
"The project has no stars"
do
step
"The project has no stars"
do
expect
(
page
).
not_to
have_content
'.
star-buttons
'
expect
(
page
).
not_to
have_content
'.
toggle-star
'
end
end
step
"The project has 0 stars"
do
step
"The project has 0 stars"
do
...
...
features/steps/shared/paths.rb
View file @
512bb5ba
...
@@ -251,6 +251,10 @@ module SharedPaths
...
@@ -251,6 +251,10 @@ module SharedPaths
visit
namespace_project_path
(
project
.
namespace
,
project
)
visit
namespace_project_path
(
project
.
namespace
,
project
)
end
end
step
'I visit project "Shop" activity page'
do
visit
activity_namespace_project_path
(
project
.
namespace
,
project
)
end
step
'I visit project "Forked Shop" merge requests page'
do
step
'I visit project "Forked Shop" merge requests page'
do
visit
namespace_project_merge_requests_path
(
@forked_project
.
namespace
,
@forked_project
)
visit
namespace_project_merge_requests_path
(
@forked_project
.
namespace
,
@forked_project
)
end
end
...
...
features/steps/shared/project_tab.rb
View file @
512bb5ba
...
@@ -49,4 +49,8 @@ module SharedProjectTab
...
@@ -49,4 +49,8 @@ module SharedProjectTab
expect
(
page
).
to
have_content
(
'Back to project'
)
expect
(
page
).
to
have_content
(
'Back to project'
)
end
end
end
end
step
'the active main tab should be Activity'
do
ensure_active_main_tab
(
'Activity'
)
end
end
end
lib/tasks/gitlab/test.rake
View file @
512bb5ba
...
@@ -6,7 +6,7 @@ namespace :gitlab do
...
@@ -6,7 +6,7 @@ namespace :gitlab do
%W(rake rubocop)
,
%W(rake rubocop)
,
%W(rake spinach)
,
%W(rake spinach)
,
%W(rake spec)
,
%W(rake spec)
,
%W(rake
jasmine:ci
)
%W(rake
teaspoon
)
]
]
cmds
.
each
do
|
cmd
|
cmds
.
each
do
|
cmd
|
...
...
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