Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
GitLab
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
projects.thm.de
GitLab
Commits
70c44a0d
Commit
70c44a0d
authored
Jan 19, 2015
by
Hannes Rosenögger
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix tests, merge conflicts, some minor issues and make the project avatar feature mergable
parent
42bac7f9
Changes
15
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
369 additions
and
360 deletions
+369
-360
CHANGELOG
CHANGELOG
+1
-1
app/assets/javascripts/dispatcher.js.coffee
app/assets/javascripts/dispatcher.js.coffee
+1
-0
app/assets/javascripts/project.js.coffee
app/assets/javascripts/project.js.coffee
+0
-10
app/assets/javascripts/project_avatar.js.coffee
app/assets/javascripts/project_avatar.js.coffee
+9
-0
app/controllers/projects_controller.rb
app/controllers/projects_controller.rb
+10
-10
app/helpers/application_helper.rb
app/helpers/application_helper.rb
+18
-18
app/models/project.rb
app/models/project.rb
+40
-37
app/services/projects/fork_service.rb
app/services/projects/fork_service.rb
+4
-4
app/views/groups/_projects.html.haml
app/views/groups/_projects.html.haml
+2
-0
app/views/projects/edit.html.haml
app/views/projects/edit.html.haml
+5
-2
config/routes.rb
config/routes.rb
+22
-22
features/steps/project/project.rb
features/steps/project/project.rb
+5
-5
spec/helpers/application_helper_spec.rb
spec/helpers/application_helper_spec.rb
+53
-53
spec/models/project_spec.rb
spec/models/project_spec.rb
+29
-29
spec/routing/project_routing_spec.rb
spec/routing/project_routing_spec.rb
+170
-169
No files found.
CHANGELOG
View file @
70c44a0d
...
...
@@ -34,7 +34,7 @@ v 7.8.0
-
-
-
-
-
Add Project Avatars (Steven Thonus and Hannes Rosenögger)
-
-
- Password reset token validity increased from 2 hours to 2 days since it is also send on account creation.
...
...
app/assets/javascripts/dispatcher.js.coffee
View file @
70c44a0d
...
...
@@ -96,6 +96,7 @@ class Dispatcher
new
Profile
()
when
'projects'
new
Project
()
new
ProjectAvatar
()
switch
path
[
1
]
when
'edit'
shortcut_handler
=
new
ShortcutsNavigation
()
...
...
app/assets/javascripts/project.js.coffee
View file @
70c44a0d
...
...
@@ -18,13 +18,3 @@ class @Project
$
.
cookie
(
'hide_no_ssh_message'
,
'false'
,
{
path
:
path
})
$
(
@
).
parents
(
'.no-ssh-key-message'
).
hide
()
e
.
preventDefault
()
# avatar
$
(
'.js-choose-project-avatar-button'
).
bind
"click"
,
->
form
=
$
(
this
).
closest
(
"form"
)
form
.
find
(
".js-project-avatar-input"
).
click
()
$
(
'.js-project-avatar-input'
).
bind
"change"
,
->
form
=
$
(
this
).
closest
(
"form"
)
filename
=
$
(
this
).
val
().
replace
(
/^.*[\\\/]/
,
''
)
form
.
find
(
".js-avatar-filename"
).
text
(
filename
)
app/assets/javascripts/project_avatar.js.coffee
0 → 100644
View file @
70c44a0d
class
@
ProjectAvatar
constructor
:
->
$
(
'.js-choose-project-avatar-button'
).
bind
'click'
,
->
form
=
$
(
this
).
closest
(
'form'
)
form
.
find
(
'.js-project-avatar-input'
).
click
()
$
(
'.js-project-avatar-input'
).
bind
'change'
,
->
form
=
$
(
this
).
closest
(
'form'
)
filename
=
$
(
this
).
val
().
replace
(
/^.*[\\\/]/
,
''
)
form
.
find
(
'.js-avatar-filename'
).
text
(
filename
)
app/controllers/projects_controller.rb
View file @
70c44a0d
...
...
@@ -14,7 +14,7 @@ def new
end
def
edit
render
'edit'
,
layout:
"project_settings"
render
'edit'
,
layout:
'project_settings'
end
def
create
...
...
@@ -36,7 +36,7 @@ def update
format
.
html
{
redirect_to
edit_project_path
(
@project
),
notice:
'Project was successfully updated.'
}
format
.
js
else
format
.
html
{
render
"edit"
,
layout:
"project_settings"
}
format
.
html
{
render
'edit'
,
layout:
'project_settings'
}
format
.
js
end
end
...
...
@@ -66,17 +66,17 @@ def show
format
.
html
do
if
@project
.
repository_exists?
if
@project
.
empty_repo?
render
"projects/empty"
,
layout:
user_layout
render
'projects/empty'
,
layout:
user_layout
else
@last_push
=
current_user
.
recent_push
(
@project
.
id
)
if
current_user
render
:show
,
layout:
user_layout
end
else
render
"projects/no_repo"
,
layout:
user_layout
render
'projects/no_repo'
,
layout:
user_layout
end
end
format
.
json
{
pager_json
(
"events/_events"
,
@events
.
count
)
}
format
.
json
{
pager_json
(
'events/_events'
,
@events
.
count
)
}
end
end
...
...
@@ -87,9 +87,9 @@ def destroy
respond_to
do
|
format
|
format
.
html
do
flash
[
:alert
]
=
"Project deleted."
flash
[
:alert
]
=
'Project deleted.'
if
request
.
referer
.
include?
(
"/admin"
)
if
request
.
referer
.
include?
(
'/admin'
)
redirect_to
admin_projects_path
else
redirect_to
projects_dashboard_path
...
...
@@ -141,7 +141,7 @@ def upload_image
if
link_to_image
format
.
json
{
render
json:
{
link:
link_to_image
}
}
else
format
.
json
{
render
json:
"Invalid file."
,
status: :unprocessable_entity
}
format
.
json
{
render
json:
'Invalid file.'
,
status: :unprocessable_entity
}
end
end
end
...
...
@@ -172,14 +172,14 @@ def set_title
end
def
user_layout
current_user
?
"projects"
:
"public_projects"
current_user
?
'projects'
:
'public_projects'
end
def
project_params
params
.
require
(
:project
).
permit
(
:name
,
:path
,
:description
,
:issues_tracker
,
:tag_list
,
:issues_enabled
,
:merge_requests_enabled
,
:snippets_enabled
,
:issues_tracker_id
,
:default_branch
,
:wiki_enabled
,
:visibility_level
,
:import_url
,
:last_activity_at
,
:namespace_id
:wiki_enabled
,
:visibility_level
,
:import_url
,
:last_activity_at
,
:namespace_id
,
:avatar
)
end
...
...
app/helpers/application_helper.rb
View file @
70c44a0d
...
...
@@ -54,10 +54,10 @@ def project_icon(project_id, options = {})
project
=
Project
.
find_with_namespace
(
project_id
)
if
project
.
avatar
.
present?
image_tag
project
.
avatar
.
url
,
options
elsif
options
[
:only_uploaded
]
image_tag
'/assets/no_project_icon.png'
,
options
elsif
project
.
avatar_in_git
image_tag
project_avatar_path
(
project
),
options
elsif
options
[
:only_uploaded
]
image_tag
'/assets/no_project_icon.png'
,
options
else
# generated icon
project_identicon
(
project
,
options
)
end
...
...
@@ -107,24 +107,24 @@ def last_commit(project)
if
project
.
repo_exists?
time_ago_with_tooltip
(
project
.
repository
.
commit
.
committed_date
)
else
"Never"
'Never'
end
rescue
"Never"
'Never'
end
def
grouped_options_refs
repository
=
@project
.
repository
options
=
[
[
"Branches"
,
repository
.
branch_names
],
[
"Tags"
,
VersionSorter
.
rsort
(
repository
.
tag_names
)]
[
'Branches'
,
repository
.
branch_names
],
[
'Tags'
,
VersionSorter
.
rsort
(
repository
.
tag_names
)]
]
# If reference is commit id - we should add it to branch/tag selectbox
if
(
@ref
&&
!
options
.
flatten
.
include?
(
@ref
)
&&
@ref
=~
/^[0-9a-zA-Z]{6,52}$/
)
options
<<
[
"Commit"
,
[
@ref
]]
options
<<
[
'Commit'
,
[
@ref
]]
end
grouped_options_for_select
(
options
,
@ref
||
@project
.
default_branch
)
...
...
@@ -186,7 +186,7 @@ def body_data_page
path
=
controller
.
controller_path
.
split
(
'/'
)
namespace
=
path
.
first
if
path
.
second
[
namespace
,
controller
.
controller_name
,
controller
.
action_name
].
compact
.
join
(
":"
)
[
namespace
,
controller
.
controller_name
,
controller
.
action_name
].
compact
.
join
(
':'
)
end
# shortcut for gitlab config
...
...
@@ -201,13 +201,13 @@ def extra_config
def
search_placeholder
if
@project
&&
@project
.
persisted?
"Search in this project"
'Search in this project'
elsif
@snippet
||
@snippets
||
@show_snippets
'Search snippets'
elsif
@group
&&
@group
.
persisted?
"Search in this group"
'Search in this group'
else
"Search"
'Search'
end
end
...
...
@@ -218,7 +218,7 @@ def broadcast_message
def
time_ago_with_tooltip
(
date
,
placement
=
'top'
,
html_class
=
'time_ago'
)
capture_haml
do
haml_tag
:time
,
date
.
to_s
,
class:
html_class
,
datetime:
date
.
getutc
.
iso8601
,
title:
date
.
stamp
(
"Aug 21, 2011 9:23pm"
),
class:
html_class
,
datetime:
date
.
getutc
.
iso8601
,
title:
date
.
stamp
(
'Aug 21, 2011 9:23pm'
),
data:
{
toggle:
'tooltip'
,
placement:
placement
}
haml_tag
:script
,
"$('."
+
html_class
+
"').timeago().tooltip()"
...
...
@@ -241,8 +241,8 @@ def gitlab_markdown?(filename)
end
def
spinner
(
text
=
nil
,
visible
=
false
)
css_class
=
"loading"
css_class
<<
" hide"
unless
visible
css_class
=
'loading'
css_class
<<
' hide'
unless
visible
content_tag
:div
,
class:
css_class
do
content_tag
(
:i
,
nil
,
class:
'fa fa-spinner fa-spin'
)
+
text
...
...
@@ -259,17 +259,17 @@ def link_to(name = nil, options = nil, html_options = nil, &block)
absolute_uri
=
nil
end
# Add
"nofollow"
only to external links
# Add
'nofollow'
only to external links
if
host
&&
host
!=
Gitlab
.
config
.
gitlab
.
host
&&
absolute_uri
if
html_options
if
html_options
[
:rel
]
html_options
[
:rel
]
<<
" nofollow"
html_options
[
:rel
]
<<
' nofollow'
else
html_options
.
merge!
(
rel:
"nofollow"
)
html_options
.
merge!
(
rel:
'nofollow'
)
end
else
html_options
=
Hash
.
new
html_options
[
:rel
]
=
"nofollow"
html_options
[
:rel
]
=
'nofollow'
end
end
...
...
app/models/project.rb
View file @
70c44a0d
...
...
@@ -14,7 +14,7 @@
# merge_requests_enabled :boolean default(TRUE), not null
# wiki_enabled :boolean default(TRUE), not null
# namespace_id :integer
# issues_tracker :string(255) default(
"gitlab"
), not null
# issues_tracker :string(255) default(
'gitlab'
), not null
# issues_tracker_id :string(255)
# snippets_enabled :boolean default(TRUE), not null
# last_activity_at :datetime
...
...
@@ -29,6 +29,9 @@
# avatar :string(255)
#
require
'carrierwave/orm/activerecord'
require
'file_size_validator'
class
Project
<
ActiveRecord
::
Base
include
Gitlab
::
ShellAdapter
include
Gitlab
::
VisibilityLevel
...
...
@@ -50,8 +53,8 @@ class Project < ActiveRecord::Base
attr_accessor
:new_default_branch
# Relations
belongs_to
:creator
,
foreign_key:
"creator_id"
,
class_name:
"User"
belongs_to
:group
,
->
{
where
(
type:
Group
)
},
foreign_key:
"namespace_id"
belongs_to
:creator
,
foreign_key:
'creator_id'
,
class_name:
'User'
belongs_to
:group
,
->
{
where
(
type:
Group
)
},
foreign_key:
'namespace_id'
belongs_to
:namespace
has_one
:last_event
,
->
{
order
'events.created_at DESC'
},
class_name:
'Event'
,
foreign_key:
'project_id'
...
...
@@ -71,20 +74,20 @@ class Project < ActiveRecord::Base
has_one
:bamboo_service
,
dependent: :destroy
has_one
:teamcity_service
,
dependent: :destroy
has_one
:pushover_service
,
dependent: :destroy
has_one
:forked_project_link
,
dependent: :destroy
,
foreign_key:
"forked_to_project_id"
has_one
:forked_project_link
,
dependent: :destroy
,
foreign_key:
'forked_to_project_id'
has_one
:forked_from_project
,
through: :forked_project_link
# Merge Requests for target project should be removed with it
has_many
:merge_requests
,
dependent: :destroy
,
foreign_key:
"target_project_id"
has_many
:merge_requests
,
dependent: :destroy
,
foreign_key:
'target_project_id'
# Merge requests from source project should be kept when source project was removed
has_many
:fork_merge_requests
,
foreign_key:
"source_project_id"
,
class_name:
MergeRequest
has_many
:fork_merge_requests
,
foreign_key:
'source_project_id'
,
class_name:
MergeRequest
has_many
:issues
,
->
{
order
'issues.state DESC, issues.created_at DESC'
},
dependent: :destroy
has_many
:labels
,
dependent: :destroy
has_many
:services
,
dependent: :destroy
has_many
:events
,
dependent: :destroy
has_many
:milestones
,
dependent: :destroy
has_many
:notes
,
dependent: :destroy
has_many
:snippets
,
dependent: :destroy
,
class_name:
"ProjectSnippet"
has_many
:hooks
,
dependent: :destroy
,
class_name:
"ProjectHook"
has_many
:snippets
,
dependent: :destroy
,
class_name:
'ProjectSnippet'
has_many
:hooks
,
dependent: :destroy
,
class_name:
'ProjectHook'
has_many
:protected_branches
,
dependent: :destroy
has_many
:project_members
,
dependent: :destroy
,
as: :source
,
class_name:
'ProjectMember'
has_many
:users
,
through: :project_members
...
...
@@ -116,27 +119,27 @@ class Project < ActiveRecord::Base
validates_uniqueness_of
:name
,
scope: :namespace_id
validates_uniqueness_of
:path
,
scope: :namespace_id
validates
:import_url
,
format:
{
with:
URI
::
regexp
(
%w(git http https)
),
message:
"should be a valid url"
},
format:
{
with:
URI
::
regexp
(
%w(git http https)
),
message:
'should be a valid url'
},
if: :import?
validates
:star_count
,
numericality:
{
greater_than_or_equal_to:
0
}
validate
:check_limit
,
on: :create
validate
:avatar_type
,
if:
->
(
project
)
{
project
.
avatar
&&
project
.
avatar_changed?
}
validates
:avatar
,
file_size:
{
maximum:
1
00
.
kilobytes
.
to_i
}
validates
:avatar
,
file_size:
{
maximum:
2
00
.
kilobytes
.
to_i
}
mount_uploader
:avatar
,
AttachmentUploader
# Scopes
scope
:without_user
,
->
(
user
)
{
where
(
"projects.id NOT IN (:ids)"
,
ids:
user
.
authorized_projects
.
map
(
&
:id
)
)
}
scope
:without_team
,
->
(
team
)
{
team
.
projects
.
present?
?
where
(
"projects.id NOT IN (:ids)"
,
ids:
team
.
projects
.
map
(
&
:id
))
:
scoped
}
scope
:not_in_group
,
->
(
group
)
{
where
(
"projects.id NOT IN (:ids)"
,
ids:
group
.
project_ids
)
}
scope
:in_team
,
->
(
team
)
{
where
(
"projects.id IN (:ids)"
,
ids:
team
.
projects
.
map
(
&
:id
))
}
scope
:without_user
,
->
(
user
)
{
where
(
'projects.id NOT IN (:ids)'
,
ids:
user
.
authorized_projects
.
map
(
&
:id
)
)
}
scope
:without_team
,
->
(
team
)
{
team
.
projects
.
present?
?
where
(
'projects.id NOT IN (:ids)'
,
ids:
team
.
projects
.
map
(
&
:id
))
:
scoped
}
scope
:not_in_group
,
->
(
group
)
{
where
(
'projects.id NOT IN (:ids)'
,
ids:
group
.
project_ids
)
}
scope
:in_team
,
->
(
team
)
{
where
(
'projects.id IN (:ids)'
,
ids:
team
.
projects
.
map
(
&
:id
))
}
scope
:in_namespace
,
->
(
namespace
)
{
where
(
namespace_id:
namespace
.
id
)
}
scope
:in_group_namespace
,
->
{
joins
(
:group
)
}
scope
:sorted_by_activity
,
->
{
reorder
(
"projects.last_activity_at DESC"
)
}
scope
:sorted_by_stars
,
->
{
reorder
(
"projects.star_count DESC"
)
}
scope
:sorted_by_activity
,
->
{
reorder
(
'projects.last_activity_at DESC'
)
}
scope
:sorted_by_stars
,
->
{
reorder
(
'projects.star_count DESC'
)
}
scope
:personal
,
->
(
user
)
{
where
(
namespace_id:
user
.
namespace_id
)
}
scope
:joined
,
->
(
user
)
{
where
(
"namespace_id != ?"
,
user
.
namespace_id
)
}
scope
:joined
,
->
(
user
)
{
where
(
'namespace_id != ?'
,
user
.
namespace_id
)
}
scope
:public_only
,
->
{
where
(
visibility_level:
Project
::
PUBLIC
)
}
scope
:public_and_internal_only
,
->
{
where
(
visibility_level:
Project
.
public_and_internal_levels
)
}
scope
:non_archived
,
->
{
where
(
archived:
false
)
}
...
...
@@ -187,26 +190,26 @@ def with_push
end
def
active
joins
(
:issues
,
:notes
,
:merge_requests
).
order
(
"issues.created_at, notes.created_at, merge_requests.created_at DESC"
)
joins
(
:issues
,
:notes
,
:merge_requests
).
order
(
'issues.created_at, notes.created_at, merge_requests.created_at DESC'
)
end
def
search
(
query
)
joins
(
:namespace
).
where
(
"projects.archived = ?"
,
false
).
where
(
"
LOWER(projects.name) LIKE :query OR
joins
(
:namespace
).
where
(
'projects.archived = ?'
,
false
).
where
(
'
LOWER(projects.name) LIKE :query OR
LOWER(projects.path) LIKE :query OR
LOWER(namespaces.name) LIKE :query OR
LOWER(projects.description) LIKE :query
"
,
LOWER(projects.description) LIKE :query
'
,
query:
"%
#{
query
.
try
(
:downcase
)
}
%"
)
end
def
search_by_title
(
query
)
where
(
"projects.archived = ?"
,
false
).
where
(
"LOWER(projects.name) LIKE :query"
,
query:
"%
#{
query
.
downcase
}
%"
)
where
(
'projects.archived = ?'
,
false
).
where
(
'LOWER(projects.name) LIKE :query'
,
query:
"%
#{
query
.
downcase
}
%"
)
end
def
find_with_namespace
(
id
)
return
nil
unless
id
.
include?
(
"/"
)
return
nil
unless
id
.
include?
(
'/'
)
id
=
id
.
split
(
"/"
)
id
=
id
.
split
(
'/'
)
namespace
=
Namespace
.
find_by
(
path:
id
.
first
)
return
nil
unless
namespace
...
...
@@ -224,7 +227,7 @@ def sort(method)
when
'recently_updated'
then
reorder
(
'projects.updated_at DESC'
)
when
'last_updated'
then
reorder
(
'projects.updated_at ASC'
)
when
'largest_repository'
then
reorder
(
'projects.repository_size DESC'
)
else
reorder
(
"namespaces.path, projects.name ASC"
)
else
reorder
(
'namespaces.path, projects.name ASC'
)
end
end
end
...
...
@@ -274,19 +277,19 @@ def check_limit
end
def
to_param
namespace
.
path
+
"/"
+
path
namespace
.
path
+
'/'
+
path
end
def
web_url
[
gitlab_config
.
url
,
path_with_namespace
].
join
(
"/"
)
[
gitlab_config
.
url
,
path_with_namespace
].
join
(
'/'
)
end
def
web_url_without_protocol
web_url
.
split
(
"://"
)[
1
]
web_url
.
split
(
'://'
)[
1
]
end
def
build_commit_note
(
commit
)
notes
.
new
(
commit_id:
commit
.
id
,
noteable_type:
"Commit"
)
notes
.
new
(
commit_id:
commit
.
id
,
noteable_type:
'Commit'
)
end
def
last_activity
...
...
@@ -345,8 +348,8 @@ def ci_service
end
def
avatar_type
unless
avatar
.
image?
errors
.
add
:avatar
,
'only images allowed'
unless
self
.
avatar
.
image?
self
.
errors
.
add
:avatar
,
'only images allowed'
end
end
...
...
@@ -384,7 +387,7 @@ def owner
end
def
team_member_by_name_or_email
(
name
=
nil
,
email
=
nil
)
user
=
users
.
where
(
"name like ? or email like ?"
,
name
,
email
).
first
user
=
users
.
where
(
'name like ? or email like ?'
,
name
,
email
).
first
project_members
.
where
(
user:
user
)
if
user
end
...
...
@@ -396,7 +399,7 @@ def team_member_by_id(user_id)
def
name_with_namespace
@name_with_namespace
||=
begin
if
namespace
namespace
.
human_name
+
" / "
+
name
namespace
.
human_name
+
' / '
+
name
else
name
end
...
...
@@ -431,7 +434,7 @@ def update_merge_requests(oldrev, newrev, ref, user)
def
valid_repo?
repository
.
exists?
rescue
errors
.
add
(
:path
,
"Invalid repository path"
)
errors
.
add
(
:path
,
'Invalid repository path'
)
false
end
...
...
@@ -490,7 +493,7 @@ def ssh_url_to_repo
end
def
http_url_to_repo
[
gitlab_config
.
url
,
"/"
,
path_with_namespace
,
".git"
].
join
(
''
)
[
gitlab_config
.
url
,
'/'
,
path_with_namespace
,
'.git'
].
join
(
''
)
end
# Check if current branch name is marked as protected in the system
...
...
@@ -618,7 +621,7 @@ def create_repository
if
gitlab_shell
.
add_repository
(
path_with_namespace
)
true
else
errors
.
add
(
:base
,
"Failed to create repository"
)
errors
.
add
(
:base
,
'Failed to create repository'
)
false
end
end
...
...
@@ -631,7 +634,7 @@ def create_wiki
ProjectWiki
.
new
(
self
,
self
.
owner
).
wiki
true
rescue
ProjectWiki
::
CouldNotCreateWikiError
=>
ex
errors
.
add
(
:base
,
"Failed create wiki"
)
errors
.
add
(
:base
,
'Failed create wiki'
)
false
end
end
app/services/projects/fork_service.rb
View file @
70c44a0d
...
...
@@ -14,7 +14,7 @@ def execute
project
.
name
=
@from_project
.
name
project
.
path
=
@from_project
.
path
project
.
creator
=
@current_user
if
@from_project
.
avatar
&&
@from_project
.
avatar
.
image?
if
@from_project
.
avatar
.
present?
&&
@from_project
.
avatar
.
image?
project
.
avatar
=
@from_project
.
avatar
end
...
...
@@ -42,16 +42,16 @@ def execute
end
#Now fork the repo
unless
gitlab_shell
.
fork_repository
(
@from_project
.
path_with_namespace
,
project
.
namespace
.
path
)
raise
"forking failed in gitlab-shell"
raise
'forking failed in gitlab-shell'
end
project
.
ensure_satellite_exists
end
rescue
=>
ex
project
.
errors
.
add
(
:base
,
"Fork transaction failed."
)
project
.
errors
.
add
(
:base
,
'Fork transaction failed.'
)
project
.
destroy
end
else
project
.
errors
.
add
(
:base
,
"Invalid fork destination"
)
project
.
errors
.
add
(
:base
,
'Invalid fork destination'
)
end
project
...
...
app/views/groups/_projects.html.haml
View file @
70c44a0d
...
...
@@ -12,6 +12,8 @@
-
projects
.
each
do
|
project
|
%li
.project-row
=
link_to
project_path
(
project
),
class:
dom_class
(
project
)
do
.dash-project-avatar
=
project_icon
(
project
.
to_param
,
alt:
''
,
class:
'avatar s24'
)
.dash-project-access-icon
=
visibility_level_icon
(
project
.
visibility_level
)
%span
.str-truncated
...
...
app/views/projects/edit.html.haml
View file @
70c44a0d
...
...
@@ -87,7 +87,10 @@
.form-group
.col-sm-2
.col-sm-10
=
project_icon
(
@project
.
to_param
,
alt:
''
,
class:
'avatar s160'
,
only_uploaded:
true
)
-
if
@project
.
avatar?
=
project_icon
(
@project
.
to_param
,
alt:
''
,
class:
'avatar s160'
)
-
else
=
project_icon
(
@project
.
to_param
,
alt:
''
,
class:
'avatar s160'
,
only_uploaded:
true
)
%p
.light
-
if
@project
.
avatar_in_git
Project avatar in repository:
#{
@project
.
avatar_in_git
}
...
...
@@ -102,7 +105,7 @@
%span
.file_name.js-avatar-filename
File name...
=
f
.
file_field
:avatar
,
class:
"js-project-avatar-input hidden"
.light
The maximum file size allowed is
1
00KB.
.light
The maximum file size allowed is
2
00KB.
-
if
@project
.
avatar?
%hr
=
link_to
'Remove avatar'
,
project_avatar_path
(
@project
),
data:
{
confirm:
"Project avatar will be removed. Are you sure?"
},
method: :delete
,
class:
"btn btn-remove btn-small remove-avatar"
...
...
config/routes.rb
View file @
70c44a0d
...
...
@@ -10,8 +10,8 @@
#
# Search
#
get
'search'
=>
"search#show"
get
'search/autocomplete'
=>
"search#autocomplete"
,
as: :search_autocomplete
get
'search'
=>
'search#show'
get
'search/autocomplete'
=>
'search#autocomplete'
,
as: :search_autocomplete
# API
API
::
API
.
logger
Rails
.
logger
...
...
@@ -20,9 +20,9 @@
# Get all keys of user
get
':username.keys'
=>
'profiles/keys#get_keys'
,
constraints:
{
username:
/.*/
}
constraint
=
lambda
{
|
request
|
request
.
env
[
"warden"
].
authenticate?
and
request
.
env
[
'warden'
].
user
.
admin?
}
constraint
=
lambda
{
|
request
|
request
.
env
[
'warden'
].
authenticate?
and
request
.
env
[
'warden'
].
user
.
admin?
}
constraints
constraint
do
mount
Sidekiq
::
Web
,
at:
"/admin/sidekiq"
,
as: :sidekiq
mount
Sidekiq
::
Web
,
at:
'/admin/sidekiq'
,
as: :sidekiq
end
# Enable Grack support
...
...
@@ -46,10 +46,10 @@
#
resources
:snippets
do
member
do
get
"raw"
get
'raw'
end
end
get
"/s/:username"
=>
"snippets#user_index"
,
as: :user_snippets
,
constraints:
{
username:
/.*/
}
get
'/s/:username'
=>
'snippets#user_index'
,
as: :user_snippets
,
constraints:
{
username:
/.*/
}
#
# Github importer area
...
...
@@ -72,12 +72,12 @@
end
resources
:groups
,
only:
[
:index
]
root
to:
"projects#trending"
root
to:
'projects#trending'
end
# Compatibility with old routing
get
'public'
=>
"explore/projects#index"
get
'public/projects'
=>
"explore/projects#index"
get
'public'
=>
'explore/projects#index'
get
'public/projects'
=>
'explore/projects#index'
#
# Attachments serving
...
...
@@ -122,7 +122,7 @@
resource
:application_settings
,
only:
[
:show
,
:update
]
root
to:
"dashboard#index"
root
to:
'dashboard#index'
end
#
...
...
@@ -163,7 +163,7 @@
#
# Dashboard Area
#
resource
:dashboard
,
controller:
"dashboard"
,
only:
[
:show
]
do
resource
:dashboard
,
controller:
'dashboard'
,
only:
[
:show
]
do
member
do
get
:projects
get
:issues
...
...
@@ -194,12 +194,12 @@
devise_for
:users
,
controllers:
{
omniauth_callbacks: :omniauth_callbacks
,
registrations: :registrations
,
passwords: :passwords
,
sessions: :sessions
,
confirmations: :confirmations
}
devise_scope
:user
do
get
"/users/auth/:provider/omniauth_error"
=>
"omniauth_callbacks#omniauth_error"
,
as: :omniauth_error
get
'/users/auth/:provider/omniauth_error'
=>
'omniauth_callbacks#omniauth_error'
,
as: :omniauth_error
end
#
# Project Area
#
resources
:projects
,
constraints:
{
id:
/[a-zA-Z.0-9_\-]+\/[a-zA-Z.0-9_\-]+/
},
except:
[
:new
,
:create
,
:index
],
path:
"/"
do
resources
:projects
,
constraints:
{
id:
/[a-zA-Z.0-9_\-]+\/[a-zA-Z.0-9_\-]+/
},
except:
[
:new
,
:create
,
:index
],
path:
'/'
do
member
do
put
:transfer
post
:archive
...
...
@@ -220,6 +220,7 @@
# Cannot be GET to differentiate from GET paths that end in preview.
post
:preview
,
on: :member
end
resource
:avatar
,
only:
[
:show
,
:destroy
]
resources
:new_tree
,
only:
[
:show
,
:update
],
constraints:
{
id:
/.+/
},
path:
'new'
resources
:commit
,
only:
[
:show
],
constraints:
{
id:
/[[:alnum:]]{6,40}/
}
resources
:commits
,
only:
[
:show
],
constraints:
{
id:
/(?:[^.]|\.(?!atom$))+/
,
format:
/atom/
}
...
...
@@ -237,7 +238,7 @@
resources
:snippets
,
constraints:
{
id:
/\d+/
}
do
member
do
get
"raw"
get
'raw'
end
end
...
...
@@ -249,7 +250,7 @@
end
member
do
get
"history"
get
'history'
end
end
...
...
@@ -258,7 +259,7 @@
resource
:repository
,
only:
[
:show
,
:create
]
do
member
do
get
"archive"
,
constraints:
{
format:
Gitlab
::
Regex
.
archive_formats_regex
}
get
'archive'
,
constraints:
{
format:
Gitlab
::
Regex
.
archive_formats_regex
}
end
end
...
...
@@ -281,13 +282,13 @@
resources
:refs
,
only:
[]
do
collection
do
get
"switch"
get
'switch'
end
member
do
# tree viewer logs
get
"logs_tree"
,
constraints:
{
id:
Gitlab
::
Regex
.
git_reference_regex
}
get
"logs_tree/:path"
=>
"refs#logs_tree"
,
get
'logs_tree'
,
constraints:
{
id:
Gitlab
::
Regex
.
git_reference_regex
}
get
'logs_tree/:path'
=>
'refs#logs_tree'
,
as: :logs_file
,
constraints:
{
id:
Gitlab
::
Regex
.
git_reference_regex
,
...
...
@@ -354,11 +355,10 @@
end
end