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
Tatuya Kamada
gitlab-ce
Commits
dd68d100
Commit
dd68d100
authored
Feb 17, 2016
by
James Lopez
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of gitlab.com:gitlab-org/gitlab-ce into fix/project-forks-page
parents
b1731adf
a4ffdf92
Changes
51
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
51 changed files
with
743 additions
and
261 deletions
+743
-261
CHANGELOG
CHANGELOG
+6
-0
Gemfile.lock
Gemfile.lock
+1
-1
app/assets/stylesheets/framework/gitlab-theme.scss
app/assets/stylesheets/framework/gitlab-theme.scss
+16
-0
app/assets/stylesheets/pages/detail_page.scss
app/assets/stylesheets/pages/detail_page.scss
+8
-0
app/assets/stylesheets/pages/issuable.scss
app/assets/stylesheets/pages/issuable.scss
+25
-0
app/controllers/application_controller.rb
app/controllers/application_controller.rb
+1
-1
app/controllers/projects/commit_controller.rb
app/controllers/projects/commit_controller.rb
+2
-2
app/controllers/projects/imports_controller.rb
app/controllers/projects/imports_controller.rb
+9
-3
app/helpers/application_helper.rb
app/helpers/application_helper.rb
+0
-70
app/helpers/diff_helper.rb
app/helpers/diff_helper.rb
+1
-1
app/helpers/issuables_helper.rb
app/helpers/issuables_helper.rb
+37
-0
app/helpers/nav_helper.rb
app/helpers/nav_helper.rb
+3
-15
app/models/concerns/issuable.rb
app/models/concerns/issuable.rb
+4
-7
app/models/project.rb
app/models/project.rb
+17
-4
app/models/project_services/pushover_service.rb
app/models/project_services/pushover_service.rb
+1
-1
app/models/project_wiki.rb
app/models/project_wiki.rb
+1
-1
app/models/repository.rb
app/models/repository.rb
+20
-1
app/services/projects/destroy_service.rb
app/services/projects/destroy_service.rb
+13
-1
app/services/system_note_service.rb
app/services/system_note_service.rb
+14
-5
app/views/projects/blob/_blob.html.haml
app/views/projects/blob/_blob.html.haml
+1
-1
app/views/projects/blob/_image.html.haml
app/views/projects/blob/_image.html.haml
+8
-1
app/views/projects/diffs/_image.html.haml
app/views/projects/diffs/_image.html.haml
+9
-7
app/views/projects/issues/show.html.haml
app/views/projects/issues/show.html.haml
+13
-10
app/views/projects/issues/update.js.haml
app/views/projects/issues/update.js.haml
+1
-1
app/views/projects/merge_requests/update.js.haml
app/views/projects/merge_requests/update.js.haml
+3
-3
app/views/shared/issuable/_sidebar.html.haml
app/views/shared/issuable/_sidebar.html.haml
+8
-11
app/workers/repository_fork_worker.rb
app/workers/repository_fork_worker.rb
+1
-0
app/workers/repository_import_worker.rb
app/workers/repository_import_worker.rb
+1
-0
doc/ci/variables/README.md
doc/ci/variables/README.md
+1
-1
doc/development/migration_style_guide.md
doc/development/migration_style_guide.md
+1
-1
doc/install/installation.md
doc/install/installation.md
+10
-15
doc/install/redis.md
doc/install/redis.md
+60
-0
doc/web_hooks/web_hooks.md
doc/web_hooks/web_hooks.md
+196
-44
features/project/issues/issues.feature
features/project/issues/issues.feature
+8
-1
features/project/merge_requests.feature
features/project/merge_requests.feature
+1
-0
features/steps/project/issues/award_emoji.rb
features/steps/project/issues/award_emoji.rb
+2
-0
features/steps/project/issues/issues.rb
features/steps/project/issues/issues.rb
+5
-0
features/steps/shared/issuable.rb
features/steps/shared/issuable.rb
+24
-0
lib/gitlab/note_data_builder.rb
lib/gitlab/note_data_builder.rb
+4
-7
lib/gitlab/push_data_builder.rb
lib/gitlab/push_data_builder.rb
+8
-10
spec/controllers/projects/commit_controller_spec.rb
spec/controllers/projects/commit_controller_spec.rb
+37
-0
spec/controllers/projects/imports_controller_spec.rb
spec/controllers/projects/imports_controller_spec.rb
+12
-0
spec/lib/gitlab/note_data_builder_spec.rb
spec/lib/gitlab/note_data_builder_spec.rb
+24
-6
spec/lib/gitlab/push_data_builder_spec.rb
spec/lib/gitlab/push_data_builder_spec.rb
+15
-12
spec/models/concerns/issuable_spec.rb
spec/models/concerns/issuable_spec.rb
+12
-11
spec/models/merge_request_spec.rb
spec/models/merge_request_spec.rb
+15
-6
spec/models/repository_spec.rb
spec/models/repository_spec.rb
+11
-0
spec/services/system_note_service_spec.rb
spec/services/system_note_service_spec.rb
+15
-0
spec/support/project_hook_data_shared_example.rb
spec/support/project_hook_data_shared_example.rb
+27
-0
spec/workers/repository_fork_worker_spec.rb
spec/workers/repository_fork_worker_spec.rb
+12
-0
spec/workers/repository_import_worker_spec.rb
spec/workers/repository_import_worker_spec.rb
+19
-0
No files found.
CHANGELOG
View file @
dd68d100
...
@@ -34,6 +34,11 @@ v 8.5.0 (unreleased)
...
@@ -34,6 +34,11 @@ v 8.5.0 (unreleased)
- Update the ExternalIssue regex pattern (Blake Hitchcock)
- Update the ExternalIssue regex pattern (Blake Hitchcock)
- Remember user's inline/side-by-side diff view preference in a cookie (Kirill Katsnelson)
- Remember user's inline/side-by-side diff view preference in a cookie (Kirill Katsnelson)
- Optimized performance of finding issues to be closed by a merge request
- Optimized performance of finding issues to be closed by a merge request
- Add `avatar_url`, `description`, `git_ssh_url`, `git_http_url`, `path_with_namespace`
and `default_branch` in `project` in push, issue, merge-request and note webhooks data (Kirill Zaitsev)
- Deprecate the `ssh_url` in favor of `git_ssh_url` and `http_url` in favor of `git_http_url`
in `project` for push, issue, merge-request and note webhooks data (Kirill Zaitsev)
- Deprecate the `repository` key in push, issue, merge-request and note webhooks data, use `project` instead (Kirill Zaitsev)
- API: Expose MergeRequest#merge_status (Andrei Dziahel)
- API: Expose MergeRequest#merge_status (Andrei Dziahel)
- Revert "Add IP check against DNSBLs at account sign-up"
- Revert "Add IP check against DNSBLs at account sign-up"
- Actually use the `skip_merges` option in Repository#commits (Tony Chu)
- Actually use the `skip_merges` option in Repository#commits (Tony Chu)
...
@@ -49,6 +54,7 @@ v 8.5.0 (unreleased)
...
@@ -49,6 +54,7 @@ v 8.5.0 (unreleased)
- Fixed logo animation on Safari (Roman Rott)
- Fixed logo animation on Safari (Roman Rott)
- Hide remove source branch button when the MR is merged but new commits are pushed (Zeger-Jan van de Weg)
- Hide remove source branch button when the MR is merged but new commits are pushed (Zeger-Jan van de Weg)
- In seach autocomplete show only groups and projects you are member of
- In seach autocomplete show only groups and projects you are member of
- Don't process cross-reference notes from forks
- Fix: init.d script not working on OS X
- Fix: init.d script not working on OS X
- Faster snippet search
- Faster snippet search
- Title for milestones should be unique (Zeger-Jan van de Weg)
- Title for milestones should be unique (Zeger-Jan van de Weg)
...
...
Gemfile.lock
View file @
dd68d100
...
@@ -50,7 +50,7 @@ GEM
...
@@ -50,7 +50,7 @@ GEM
after_commit_queue (1.3.0)
after_commit_queue (1.3.0)
activerecord (>= 3.0)
activerecord (>= 3.0)
akismet (2.0.0)
akismet (2.0.0)
allocations (1.0.
3
)
allocations (1.0.
4
)
annotate (2.6.10)
annotate (2.6.10)
activerecord (>= 3.2, <= 4.3)
activerecord (>= 3.2, <= 4.3)
rake (~> 10.4)
rake (~> 10.4)
...
...
app/assets/stylesheets/framework/gitlab-theme.scss
View file @
dd68d100
...
@@ -118,3 +118,19 @@ body {
...
@@ -118,3 +118,19 @@ body {
@include
gitlab-theme
(
#9988CC
,
$theme-violet
,
#443366
,
#332255
);
@include
gitlab-theme
(
#9988CC
,
$theme-violet
,
#443366
,
#332255
);
}
}
}
}
::-webkit-scrollbar
{
width
:
3px
;
}
::-webkit-scrollbar-thumb
{
background-color
:
$theme-charcoal
;
border-radius
:
0
;
}
::-webkit-scrollbar-thumb:hover
{
background-color
:
$theme-charcoal
;
}
::-webkit-scrollbar-track
{
background-color
:
#FFF
;
}
\ No newline at end of file
app/assets/stylesheets/pages/detail_page.scss
View file @
dd68d100
...
@@ -12,6 +12,14 @@
...
@@ -12,6 +12,14 @@
.identifier
{
.identifier
{
color
:
#5c5d5e
;
color
:
#5c5d5e
;
}
}
.issue_created_ago
,
.author_link
{
white-space
:
nowrap
;
}
.issue-meta
{
margin-left
:
65px
}
}
}
.detail-page-description
{
.detail-page-description
{
...
...
app/assets/stylesheets/pages/issuable.scss
View file @
dd68d100
...
@@ -80,6 +80,10 @@
...
@@ -80,6 +80,10 @@
display
:
inline-block
;
display
:
inline-block
;
}
}
.select2-container
span
{
margin-top
:
0
;
}
.issuable-count
{
.issuable-count
{
}
}
...
@@ -88,6 +92,10 @@
...
@@ -88,6 +92,10 @@
margin-left
:
20px
;
margin-left
:
20px
;
border-left
:
1px
solid
$border-gray-light
;
border-left
:
1px
solid
$border-gray-light
;
padding-left
:
10px
;
padding-left
:
10px
;
&
:hover
{
color
:
$gray-darkest
;
}
}
}
}
}
...
@@ -192,6 +200,10 @@
...
@@ -192,6 +200,10 @@
.btn
{
.btn
{
background
:
$gray-normal
;
background
:
$gray-normal
;
border
:
1px
solid
$border-gray-normal
;
border
:
1px
solid
$border-gray-normal
;
&
:hover
{
background
:
$gray-dark
;
border
:
1px
solid
$border-gray-dark
;
}
}
}
&
.right-sidebar-collapsed
{
&
.right-sidebar-collapsed
{
...
@@ -223,6 +235,19 @@
...
@@ -223,6 +235,19 @@
display
:
block
;
display
:
block
;
margin-top
:
0
;
margin-top
:
0
;
}
}
.btn-clipboard
{
border
:
none
;
&
:hover
{
background
:
transparent
;
}
i
{
color
:
#999999
;
}
}
}
}
}
}
...
...
app/controllers/application_controller.rb
View file @
dd68d100
...
@@ -164,7 +164,7 @@ class ApplicationController < ActionController::Base
...
@@ -164,7 +164,7 @@ class ApplicationController < ActionController::Base
end
end
def
git_not_found!
def
git_not_found!
render
html:
"errors/git_not_found
"
,
layout:
"errors"
,
status:
404
render
"errors/git_not_found.html
"
,
layout:
"errors"
,
status:
404
end
end
def
method_missing
(
method_sym
,
*
arguments
,
&
block
)
def
method_missing
(
method_sym
,
*
arguments
,
&
block
)
...
...
app/controllers/projects/commit_controller.rb
View file @
dd68d100
...
@@ -11,8 +11,6 @@ class Projects::CommitController < Projects::ApplicationController
...
@@ -11,8 +11,6 @@ class Projects::CommitController < Projects::ApplicationController
before_action
:define_show_vars
,
only:
[
:show
,
:builds
]
before_action
:define_show_vars
,
only:
[
:show
,
:builds
]
def
show
def
show
return
git_not_found!
unless
@commit
apply_diff_view_cookie!
apply_diff_view_cookie!
@line_notes
=
commit
.
notes
.
inline
@line_notes
=
commit
.
notes
.
inline
...
@@ -68,6 +66,8 @@ class Projects::CommitController < Projects::ApplicationController
...
@@ -68,6 +66,8 @@ class Projects::CommitController < Projects::ApplicationController
end
end
def
define_show_vars
def
define_show_vars
return
git_not_found!
unless
commit
if
params
[
:w
].
to_i
==
1
if
params
[
:w
].
to_i
==
1
@diffs
=
commit
.
diffs
({
ignore_whitespace_change:
true
})
@diffs
=
commit
.
diffs
({
ignore_whitespace_change:
true
})
else
else
...
...
app/controllers/projects/imports_controller.rb
View file @
dd68d100
...
@@ -3,6 +3,7 @@ class Projects::ImportsController < Projects::ApplicationController
...
@@ -3,6 +3,7 @@ class Projects::ImportsController < Projects::ApplicationController
before_action
:authorize_admin_project!
before_action
:authorize_admin_project!
before_action
:require_no_repo
,
only:
[
:new
,
:create
]
before_action
:require_no_repo
,
only:
[
:new
,
:create
]
before_action
:redirect_if_progress
,
only:
[
:new
,
:create
]
before_action
:redirect_if_progress
,
only:
[
:new
,
:create
]
before_action
:redirect_if_no_import
,
only: :show
def
new
def
new
end
end
...
@@ -63,14 +64,19 @@ class Projects::ImportsController < Projects::ApplicationController
...
@@ -63,14 +64,19 @@ class Projects::ImportsController < Projects::ApplicationController
def
require_no_repo
def
require_no_repo
if
@project
.
repository_exists?
if
@project
.
repository_exists?
redirect_to
(
namespace_project_path
(
@project
.
namespace
,
@project
)
)
redirect_to
namespace_project_path
(
@project
.
namespace
,
@project
)
end
end
end
end
def
redirect_if_progress
def
redirect_if_progress
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
end
end
def
redirect_if_no_import
if
@project
.
repository_exists?
&&
@project
.
no_import?
redirect_to
namespace_project_path
(
@project
.
namespace
,
@project
)
end
end
end
end
end
end
app/helpers/application_helper.rb
View file @
dd68d100
...
@@ -280,76 +280,6 @@ module ApplicationHelper
...
@@ -280,76 +280,6 @@ module ApplicationHelper
end
end
end
end
def
issuable_link_next
(
project
,
issuable
)
if
project
.
nil?
nil
elsif
current_controller?
(
:issues
)
namespace_project_issue_path
(
project
.
namespace
,
project
,
next_issuable_for
(
project
,
issuable
.
id
).
try
(
:iid
))
elsif
current_controller?
(
:merge_requests
)
namespace_project_merge_request_path
(
project
.
namespace
,
project
,
next_issuable_for
(
project
,
issuable
.
id
).
try
(
:iid
))
end
end
def
issuable_link_prev
(
project
,
issuable
)
if
project
.
nil?
nil
elsif
current_controller?
(
:issues
)
namespace_project_issue_path
(
project
.
namespace
,
project
,
prev_issuable_for
(
project
,
issuable
.
id
).
try
(
:iid
))
elsif
current_controller?
(
:merge_requests
)
namespace_project_merge_request_path
(
project
.
namespace
,
project
,
prev_issuable_for
(
project
,
issuable
.
id
).
try
(
:iid
))
end
end
def
issuable_count
(
entity
,
project
)
if
project
.
nil?
0
elsif
current_controller?
(
:issues
)
project
.
issues
.
send
(
entity
).
count
elsif
current_controller?
(
:merge_requests
)
project
.
merge_requests
.
send
(
entity
).
count
end
end
def
next_issuable_for
(
project
,
id
)
if
project
.
nil?
nil
elsif
current_controller?
(
:issues
)
project
.
issues
.
where
(
"id > ?"
,
id
).
last
elsif
current_controller?
(
:merge_requests
)
project
.
merge_requests
.
where
(
"id > ?"
,
id
).
last
end
end
def
has_next_issuable?
(
project
,
id
)
if
project
.
nil?
nil
elsif
current_controller?
(
:issues
)
project
.
issues
.
where
(
"id > ?"
,
id
).
last
elsif
current_controller?
(
:merge_requests
)
project
.
merge_requests
.
where
(
"id > ?"
,
id
).
last
end
end
def
prev_issuable_for
(
project
,
id
)
if
project
.
nil?
nil
elsif
current_controller?
(
:issues
)
project
.
issues
.
where
(
"id < ?"
,
id
).
first
elsif
current_controller?
(
:merge_requests
)
project
.
merge_requests
.
where
(
"id < ?"
,
id
).
first
end
end
def
has_prev_issuable?
(
project
,
id
)
if
project
.
nil?
nil
elsif
current_controller?
(
:issues
)
project
.
issues
.
where
(
"id < ?"
,
id
).
first
elsif
current_controller?
(
:merge_requests
)
project
.
merge_requests
.
where
(
"id < ?"
,
id
).
first
end
end
def
state_filters_text_for
(
entity
,
project
)
def
state_filters_text_for
(
entity
,
project
)
titles
=
{
titles
=
{
opened:
"Open"
opened:
"Open"
...
...
app/helpers/diff_helper.rb
View file @
dd68d100
...
@@ -69,7 +69,7 @@ module DiffHelper
...
@@ -69,7 +69,7 @@ module DiffHelper
end
end
def
line_comments
def
line_comments
@line_comments
||=
@line_notes
.
select
(
&
:active?
).
group_by
(
&
:line_code
)
@line_comments
||=
@line_notes
.
select
(
&
:active?
).
sort_by
(
&
:created_at
).
group_by
(
&
:line_code
)
end
end
def
organize_comments
(
type_left
,
type_right
,
line_code_left
,
line_code_right
)
def
organize_comments
(
type_left
,
type_right
,
line_code_left
,
line_code_right
)
...
...
app/helpers/issuables_helper.rb
0 → 100644
View file @
dd68d100
module
IssuablesHelper
def
sidebar_gutter_toggle_icon
sidebar_gutter_collapsed?
?
icon
(
'angle-double-left'
)
:
icon
(
'angle-double-right'
)
end
def
sidebar_gutter_collapsed_class
"right-sidebar-
#{
sidebar_gutter_collapsed?
?
'collapsed'
:
'expanded'
}
"
end
def
issuables_count
(
issuable
)
base_issuable_scope
(
issuable
).
maximum
(
:iid
)
end
def
next_issuable_for
(
issuable
)
base_issuable_scope
(
issuable
).
where
(
'iid > ?'
,
issuable
.
iid
).
last
end
def
prev_issuable_for
(
issuable
)
base_issuable_scope
(
issuable
).
where
(
'iid < ?'
,
issuable
.
iid
).
first
end
private
def
sidebar_gutter_collapsed?
cookies
[
:collapsed_gutter
]
==
'true'
end
def
base_issuable_scope
(
issuable
)
issuable
.
project
.
send
(
issuable
.
class
.
table_name
).
send
(
issuable_state_scope
(
issuable
))
end
def
issuable_state_scope
(
issuable
)
issuable
.
open?
?
:opened
:
:closed
end
end
app/helpers/nav_helper.rb
View file @
dd68d100
...
@@ -3,18 +3,6 @@ module NavHelper
...
@@ -3,18 +3,6 @@ module NavHelper
cookies
[
:collapsed_nav
]
==
'true'
cookies
[
:collapsed_nav
]
==
'true'
end
end
def
sidebar_gutter_collapsed_class
if
cookies
[
:collapsed_gutter
]
==
'true'
"right-sidebar-collapsed"
else
"right-sidebar-expanded"
end
end
def
sidebar_gutter_collapsed?
cookies
[
:collapsed_gutter
]
==
'true'
end
def
nav_sidebar_class
def
nav_sidebar_class
if
nav_menu_collapsed?
if
nav_menu_collapsed?
"sidebar-collapsed"
"sidebar-collapsed"
...
@@ -32,9 +20,9 @@ module NavHelper
...
@@ -32,9 +20,9 @@ module NavHelper
end
end
def
page_gutter_class
def
page_gutter_class
if
current_path?
(
'merge_requests#show'
)
||
if
current_path?
(
'merge_requests#show'
)
||
current_path?
(
'merge_requests#diffs'
)
||
current_path?
(
'merge_requests#diffs'
)
||
current_path?
(
'merge_requests#commits'
)
||
current_path?
(
'merge_requests#commits'
)
||
current_path?
(
'issues#show'
)
current_path?
(
'issues#show'
)
if
cookies
[
:collapsed_gutter
]
==
'true'
if
cookies
[
:collapsed_gutter
]
==
'true'
"page-gutter right-sidebar-collapsed"
"page-gutter right-sidebar-collapsed"
...
...
app/models/concerns/issuable.rb
View file @
dd68d100
...
@@ -129,13 +129,10 @@ module Issuable
...
@@ -129,13 +129,10 @@ module Issuable
hook_data
=
{
hook_data
=
{
object_kind:
self
.
class
.
name
.
underscore
,
object_kind:
self
.
class
.
name
.
underscore
,
user:
user
.
hook_attrs
,
user:
user
.
hook_attrs
,
repository:
{
project:
project
.
hook_attrs
,
name:
project
.
name
,
object_attributes:
hook_attrs
,
url:
project
.
url_to_repo
,
# DEPRECATED
description:
project
.
description
,
repository:
project
.
hook_attrs
.
slice
(
:name
,
:url
,
:description
,
:homepage
)
homepage:
project
.
web_url
},
object_attributes:
hook_attrs
}
}
hook_data
.
merge!
(
assignee:
assignee
.
hook_attrs
)
if
assignee
hook_data
.
merge!
(
assignee:
assignee
.
hook_attrs
)
if
assignee
...
...
app/models/project.rb
View file @
dd68d100
...
@@ -342,7 +342,7 @@ class Project < ActiveRecord::Base
...
@@ -342,7 +342,7 @@ class Project < ActiveRecord::Base
end
end
def
repository
def
repository
@repository
||=
Repository
.
new
(
path_with_namespace
,
nil
,
self
)
@repository
||=
Repository
.
new
(
path_with_namespace
,
self
)
end
end
def
commit
(
id
=
'HEAD'
)
def
commit
(
id
=
'HEAD'
)
...
@@ -382,6 +382,10 @@ class Project < ActiveRecord::Base
...
@@ -382,6 +382,10 @@ class Project < ActiveRecord::Base
external_import?
||
forked?
external_import?
||
forked?
end
end
def
no_import?
import_status
==
'none'
end
def
external_import?
def
external_import?
import_url
.
present?
import_url
.
present?
end
end
...
@@ -738,11 +742,20 @@ class Project < ActiveRecord::Base
...
@@ -738,11 +742,20 @@ class Project < ActiveRecord::Base
def
hook_attrs
def
hook_attrs
{
{
name:
name
,
name:
name
,
ssh_url:
ssh_url_to_repo
,
description:
description
,
http_url:
http_url_to_repo
,
web_url:
web_url
,
web_url:
web_url
,
avatar_url:
avatar_url
,
git_ssh_url:
ssh_url_to_repo
,
git_http_url:
http_url_to_repo
,
namespace:
namespace
.
name
,
namespace:
namespace
.
name
,
visibility_level:
visibility_level
visibility_level:
visibility_level
,
path_with_namespace:
path_with_namespace
,
default_branch:
default_branch
,
# Backward compatibility
homepage:
web_url
,
url:
url_to_repo
,
ssh_url:
ssh_url_to_repo
,
http_url:
http_url_to_repo
}
}
end
end
...
...
app/models/project_services/pushover_service.rb
View file @
dd68d100
...
@@ -112,7 +112,7 @@ class PushoverService < Service
...
@@ -112,7 +112,7 @@ class PushoverService < Service
priority:
priority
,
priority:
priority
,
title:
"
#{
project
.
name_with_namespace
}
"
,
title:
"
#{
project
.
name_with_namespace
}
"
,
message:
message
,
message:
message
,
url:
data
[
:
repository
][
:homepage
],
url:
data
[
:
project
][
:web_url
],
url_title:
"See project
#{
project
.
name_with_namespace
}
"
url_title:
"See project
#{
project
.
name_with_namespace
}
"
}
}
...
...
app/models/project_wiki.rb
View file @
dd68d100
...
@@ -123,7 +123,7 @@ class ProjectWiki
...
@@ -123,7 +123,7 @@ class ProjectWiki
end
end
def
repository
def
repository
Repository
.
new
(
path_with_namespace
,
default_branch
,
@project
)
Repository
.
new
(
path_with_namespace
,
@project
)
end
end
def
default_branch
def
default_branch
...
...
app/models/repository.rb
View file @
dd68d100
...
@@ -15,7 +15,7 @@ class Repository
...
@@ -15,7 +15,7 @@ class Repository
Gitlab
::
Popen
.
popen
(
%W(find
#{
repository_downloads_path
}
-not -path
#{
repository_downloads_path
}
-mmin +120 -delete)
)
Gitlab
::
Popen
.
popen
(
%W(find
#{
repository_downloads_path
}
-not -path
#{
repository_downloads_path
}
-mmin +120 -delete)
)
end
end
def
initialize
(
path_with_namespace
,
default_branch
=
nil
,
project
=
nil
)
def
initialize
(
path_with_namespace
,
project
)
@path_with_namespace
=
path_with_namespace
@path_with_namespace
=
path_with_namespace
@project
=
project
@project
=
project
end
end
...
@@ -238,6 +238,15 @@ class Repository
...
@@ -238,6 +238,15 @@ class Repository
expire_branch_cache
(
branch_name
)
expire_branch_cache
(
branch_name
)
end
end
# Expires _all_ caches, including those that would normally only be expired
# under specific conditions.
def
expire_all_caches!
expire_cache
expire_root_ref_cache
expire_emptiness_caches
expire_has_visible_content_cache
end
def
expire_branch_cache
(
branch_name
=
nil
)
def
expire_branch_cache
(
branch_name
=
nil
)
# When we push to the root branch we have to flush the cache for all other
# When we push to the root branch we have to flush the cache for all other
# branches as their statistics are based on the commits relative to the
# branches as their statistics are based on the commits relative to the
...
@@ -258,6 +267,14 @@ class Repository
...
@@ -258,6 +267,14 @@ class Repository
@root_ref
=
nil
@root_ref
=
nil
end
end
# Expires the cache(s) used to determine if a repository is empty or not.
def
expire_emptiness_caches
cache
.
expire
(
:empty?
)
@empty
=
nil
expire_has_visible_content_cache
end
def
expire_has_visible_content_cache
def
expire_has_visible_content_cache
cache
.
expire
(
:has_visible_content?
)
cache
.
expire
(
:has_visible_content?
)
@has_visible_content
=
nil
@has_visible_content
=
nil
...
@@ -611,6 +628,8 @@ class Repository
...
@@ -611,6 +628,8 @@ class Repository
end
end
def
merge_base
(
first_commit_id
,
second_commit_id
)
def
merge_base
(
first_commit_id
,
second_commit_id
)
first_commit_id
=
commit
(
first_commit_id
).
try
(
:id
)
||
first_commit_id
second_commit_id
=
commit
(
second_commit_id
).
try
(
:id
)
||
second_commit_id
rugged
.
merge_base
(
first_commit_id
,
second_commit_id
)
rugged
.
merge_base
(
first_commit_id
,
second_commit_id
)
rescue
Rugged
::
ReferenceError
rescue
Rugged
::
ReferenceError
nil
nil
...
...
app/services/projects/destroy_service.rb
View file @
dd68d100
...
@@ -16,11 +16,15 @@ module Projects
...
@@ -16,11 +16,15 @@ module Projects
return
false
unless
can?
(
current_user
,
:remove_project
,
project
)
return
false
unless
can?
(
current_user
,
:remove_project
,
project
)
project
.
team
.
truncate
project
.
team
.
truncate
project
.
repository
.
expire_cache
unless
project
.
empty_repo?
repo_path
=
project
.
path_with_namespace
repo_path
=
project
.
path_with_namespace
wiki_path
=
repo_path
+
'.wiki'
wiki_path
=
repo_path
+
'.wiki'
# Flush the cache for both repositories. This has to be done _before_
# removing the physical repositories as some expiration code depends on
# Git data (e.g. a list of branch names).
flush_caches
(
project
,
wiki_path
)
Project
.
transaction
do
Project
.
transaction
do
project
.
destroy!
project
.
destroy!
...
@@ -70,5 +74,13 @@ module Projects
...
@@ -70,5 +74,13 @@ module Projects
def
removal_path
(
path
)
def
removal_path
(
path
)
"
#{
path
}
+
#{
project
.
id
}#{
DELETED_FLAG
}
"
"
#{
path
}
+
#{
project
.
id
}#{
DELETED_FLAG
}
"
end
end
def
flush_caches
(
project
,
wiki_path
)
project
.
repository
.
expire_all_caches!
if
project
.
repository
.
exists?
wiki_repo
=
Repository
.
new
(
wiki_path
,
project
)
wiki_repo
.
expire_all_caches!
if
wiki_repo
.
exists?
end
end
end
end
end
app/services/system_note_service.rb
View file @
dd68d100
...
@@ -274,12 +274,15 @@ class SystemNoteService
...
@@ -274,12 +274,15 @@ class SystemNoteService
# Check if a cross reference to a noteable from a mentioner already exists
# Check if a cross reference to a noteable from a mentioner already exists
#
#
# This method is used to prevent multiple notes being created for a mention
# This method is used to prevent multiple notes being created for a mention
# when a issue is updated, for example.
# when a issue is updated, for example. The method also calls notes_for_mentioner
# to check if the mentioner is a commit, and return matches only on commit hash
# instead of project + commit, to avoid repeated mentions from forks.
#
#
# noteable - Noteable object being referenced
# noteable - Noteable object being referenced
# mentioner - Mentionable object
# mentioner - Mentionable object
#
#
# Returns Boolean
# Returns Boolean
def
self
.
cross_reference_exists?
(
noteable
,
mentioner
)
def
self
.
cross_reference_exists?
(
noteable
,
mentioner
)
# Initial scope should be system notes of this noteable type
# Initial scope should be system notes of this noteable type
notes
=
Note
.
system
.
where
(
noteable_type:
noteable
.
class
)
notes
=
Note
.
system
.
where
(
noteable_type:
noteable
.
class
)
...
@@ -291,14 +294,20 @@ class SystemNoteService
...
@@ -291,14 +294,20 @@ class SystemNoteService
notes
=
notes
.
where
(
noteable_id:
noteable
.
id
)
notes
=
notes
.
where
(
noteable_id:
noteable
.
id
)
end
end
gfm_reference
=
mentioner
.
gfm_reference
(
noteable
.
project
)
notes_for_mentioner
(
mentioner
,
noteable
,
notes
).
count
>
0
notes
=
notes
.
where
(
note:
cross_reference_note_content
(
gfm_reference
))
notes
.
count
>
0
end
end
private
private
def
self
.
notes_for_mentioner
(
mentioner
,
noteable
,
notes
)
if
mentioner
.
is_a?
(
Commit
)
notes
.
where
(
'note LIKE ?'
,
"
#{
cross_reference_note_prefix
}
%
#{
mentioner
.
to_reference
(
nil
)
}
"
)
else
gfm_reference
=
mentioner
.
gfm_reference
(
noteable
.
project
)
notes
.
where
(
note:
cross_reference_note_content
(
gfm_reference
))
end
end
def
self
.
create_note
(
args
=
{})
def
self
.
create_note
(
args
=
{})
Note
.
create
(
args
.
merge
(
system:
true
))
Note
.
create
(
args
.
merge
(
system:
true
))
end
end
...
...
app/views/projects/blob/_blob.html.haml
View file @
dd68d100
...
@@ -36,7 +36,7 @@
...
@@ -36,7 +36,7 @@
=
render
"download"
,
blob:
blob
=
render
"download"
,
blob:
blob
-
elsif
blob
.
text?
-
elsif
blob
.
text?
-
if
blob_svg?
(
blob
)
-
if
blob_svg?
(
blob
)
=
render
"image"
,
blob:
sanitize_svg
(
blob
)
=
render
"image"
,
blob:
blob
-
else
-
else
=
render
"text"
,
blob:
blob
=
render
"text"
,
blob:
blob
-
elsif
blob
.
image?
-
elsif
blob
.
image?
...
...
app/views/projects/blob/_image.html.haml
View file @
dd68d100
.file-content.image_file
.file-content.image_file
%img
{
src:
namespace_project_raw_path
(
@project
.
namespace
,
@project
,
@id
)}
-
if
blob_svg?
(
blob
)
-
# We need to scrub SVG but we cannot do so in the RawController: it would
-
# be wrong/strange if RawController modified the data.
-
blob
.
load_all_data!
(
@repository
)
-
blob
=
sanitize_svg
(
blob
)
%img
{
src:
"data:#{blob.mime_type};base64,#{Base64.encode64(blob.data)}"
}
-
else
%img
{
src:
namespace_project_raw_path
(
@project
.
namespace
,
@project
,
@id
)}
app/views/projects/diffs/_image.html.haml
View file @
dd68d100
-
diff
=
diff_file
.
diff
-
diff
=
diff_file
.
diff
-
file_raw_path
=
namespace_project_raw_path
(
@project
.
namespace
,
@project
,
tree_join
(
@commit
.
id
,
diff
.
new_path
))
-
old_file_raw_path
=
namespace_project_raw_path
(
@project
.
namespace
,
@project
,
tree_join
(
@commit
.
parent_id
,
diff
.
old_path
))
-
if
diff
.
renamed_file
||
diff
.
new_file
||
diff
.
deleted_file
-
if
diff
.
renamed_file
||
diff
.
new_file
||
diff
.
deleted_file
.image
.image
%span
.wrap
%span
.wrap
.frame
{
class:
image_diff_class
(
diff
)}
.frame
{
class:
image_diff_class
(
diff
)}
%img
{
src:
"data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"
}
%img
{
src:
diff
.
deleted_file
?
old_file_raw_path
:
file_raw_path
}
%p
.image-info
=
"
#{
number_to_human_size
file
.
size
}
"
%p
.image-info
=
"
#{
number_to_human_size
file
.
size
}
"
-
else
-
else
.image
.image
...
@@ -11,7 +13,7 @@
...
@@ -11,7 +13,7 @@
%span
.wrap
%span
.wrap
.frame.deleted
.frame.deleted
%a
{
href:
namespace_project_blob_path
(
@project
.
namespace
,
@project
,
tree_join
(
@commit
.
parent_id
,
diff
.
old_path
))}
%a
{
href:
namespace_project_blob_path
(
@project
.
namespace
,
@project
,
tree_join
(
@commit
.
parent_id
,
diff
.
old_path
))}
%img
{
src:
"data:#{old_file.mime_type};base64,#{Base64.encode64(old_file.data)}"
}
%img
{
src:
old_file_raw_path
}
%p
.image-info.hide
%p
.image-info.hide
%span
.meta-filesize
=
"
#{
number_to_human_size
old_file
.
size
}
"
%span
.meta-filesize
=
"
#{
number_to_human_size
old_file
.
size
}
"
|
|
...
@@ -23,7 +25,7 @@
...
@@ -23,7 +25,7 @@
%span
.wrap
%span
.wrap
.frame.added
.frame.added
%a
{
href:
namespace_project_blob_path
(
@project
.
namespace
,
@project
,
tree_join
(
@commit
.
id
,
diff
.
new_path
))}
%a
{
href:
namespace_project_blob_path
(
@project
.
namespace
,
@project
,
tree_join
(
@commit
.
id
,
diff
.
new_path
))}
%img
{
src:
"data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"
}
%img
{
src:
file_raw_path
}
%p
.image-info.hide
%p
.image-info.hide
%span
.meta-filesize
=
"
#{
number_to_human_size
file
.
size
}
"
%span
.meta-filesize
=
"
#{
number_to_human_size
file
.
size
}
"
|
|
...
@@ -36,10 +38,10 @@
...
@@ -36,10 +38,10 @@
%div
.swipe.view.hide
%div
.swipe.view.hide
.swipe-frame
.swipe-frame
.frame.deleted
.frame.deleted
%img
{
src:
"data:#{old_file.mime_type};base64,#{Base64.encode64(old_file.data)}"
}
%img
{
src:
old_file_raw_path
}
.swipe-wrap
.swipe-wrap
.frame.added
.frame.added
%img
{
src:
"data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"
}
%img
{
src:
file_raw_path
}
%span
.swipe-bar
%span
.swipe-bar
%span
.top-handle
%span
.top-handle
%span
.bottom-handle
%span
.bottom-handle
...
@@ -47,9 +49,9 @@
...
@@ -47,9 +49,9 @@
%div
.onion-skin.view.hide
%div
.onion-skin.view.hide
.onion-skin-frame
.onion-skin-frame
.frame.deleted
.frame.deleted
%img
{
src:
"data:#{old_file.mime_type};base64,#{Base64.encode64(old_file.data)}"
}
%img
{
src:
old_file_raw_path
}
.frame.added
.frame.added
%img
{
src:
"data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"
}
%img
{
src:
file_raw_path
}
.controls
.controls
.transparent
.transparent
.drag-track
.drag-track
...
...
app/views/projects/issues/show.html.haml
View file @
dd68d100
...
@@ -6,16 +6,6 @@
...
@@ -6,16 +6,6 @@
.issue
.issue
.detail-page-header
.detail-page-header
.status-box
{
class:
"status-box-closed #{issue_button_visibility(@issue, false)}"
}
Closed
.status-box
{
class:
"status-box-open #{issue_button_visibility(@issue, true)}"
}
Open
%span
.identifier
Issue ##{@issue.iid}
%span
.creator
·
opened by
#{
link_to_member
(
@project
,
@issue
.
author
,
size:
24
)
}
·
=
time_ago_with_tooltip
(
@issue
.
created_at
,
placement:
'bottom'
,
html_class:
'issue_created_ago'
)
.pull-right
.pull-right
-
if
can?
(
current_user
,
:create_issue
,
@project
)
-
if
can?
(
current_user
,
:create_issue
,
@project
)
=
link_to
new_namespace_project_issue_path
(
@project
.
namespace
,
@project
),
class:
'btn btn-nr btn-grouped new-issue-link btn-success'
,
title:
'New Issue'
,
id:
'new_issue_link'
do
=
link_to
new_namespace_project_issue_path
(
@project
.
namespace
,
@project
),
class:
'btn btn-nr btn-grouped new-issue-link btn-success'
,
title:
'New Issue'
,
id:
'new_issue_link'
do
...
@@ -29,6 +19,19 @@
...
@@ -29,6 +19,19 @@
=
icon
(
'pencil-square-o'
)
=
icon
(
'pencil-square-o'
)
Edit
Edit
.pull-left
.status-box
{
class:
"status-box-closed #{issue_button_visibility(@issue, false)}"
}
Closed
.status-box
{
class:
"status-box-open #{issue_button_visibility(@issue, true)}"
}
Open
.issue-meta
%span
.identifier
Issue ##{@issue.iid}
%span
.creator
·
by
#{
link_to_member
(
@project
,
@issue
.
author
,
size:
24
)
}
·
=
time_ago_with_tooltip
(
@issue
.
created_at
,
placement:
'bottom'
,
html_class:
'issue_created_ago'
)
.issue-details.issuable-details
.issue-details.issuable-details
.detail-page-description.content-block
.detail-page-description.content-block
%h2
.title
%h2
.title
...
...
app/views/projects/issues/update.js.haml
View file @
dd68d100
$('aside.right-sidebar')[0].outerHTML = "
#{
escape_javascript
(
render
'shared/issuable/sidebar'
,
issuable:
@issue
)
}
";
$('aside.right-sidebar')[0].outerHTML = "
#{
escape_javascript
(
render
'shared/issuable/sidebar'
,
issuable:
@issue
)
}
";
$('aside.right-sidebar').effect('highlight');
$('aside.right-sidebar').effect('highlight');
new Issue();
new IssuableContext();
\ No newline at end of file
app/views/projects/merge_requests/update.js.haml
View file @
dd68d100
$('aside.right-sidebar')[0].outerHTML= "
#{
escape_javascript
(
render
'shared/issuable/sidebar'
,
issuable:
@merge_request
)
}
";
$('aside.right-sidebar')[0].outerHTML
= "
#{
escape_javascript
(
render
'shared/issuable/sidebar'
,
issuable:
@merge_request
)
}
";
$('aside.right-sidebar').effect('highlight')
$('aside.right-sidebar').effect('highlight')
;
merge_request = new MergeReques
t();
new IssuableContex
t();
app/views/shared/issuable/_sidebar.html.haml
View file @
dd68d100
...
@@ -4,21 +4,18 @@
...
@@ -4,21 +4,18 @@
%span
.issuable-count.pull-left
%span
.issuable-count.pull-left
=
issuable
.
iid
=
issuable
.
iid
of
of
=
issuable
_count
(
:all
,
@project
)
=
issuable
s_count
(
issuable
)
%span
.pull-right
%span
.pull-right
%a
.gutter-toggle
{
href:
'#'
}
%a
.gutter-toggle
{
href:
'#'
}
-
if
sidebar_gutter_collapsed?
=
sidebar_gutter_toggle_icon
=
icon
(
'angle-double-left'
)
-
else
=
icon
(
'angle-double-right'
)
.issuable-nav.pull-right.btn-group
{
role:
'group'
,
"aria-label"
=>
'...'
}
.issuable-nav.pull-right.btn-group
{
role:
'group'
,
"aria-label"
=>
'...'
}
-
if
has_prev_issuable?
(
@project
,
issuable
.
id
)
-
if
prev_issuable
=
prev_issuable_for
(
issuable
)
=
link_to
'Prev'
,
issuable_link_prev
(
@project
,
issuable
)
,
class:
'btn btn-default prev-btn'
=
link_to
'Prev'
,
[
@project
.
namespace
.
becomes
(
Namespace
),
@project
,
prev_issuable
]
,
class:
'btn btn-default prev-btn'
-
else
-
else
%a
.btn.btn-default.disabled
{
href:
'#'
}
%a
.btn.btn-default.disabled
{
href:
'#'
}
Prev
Prev
-
if
has_next_issuable?
(
@project
,
issuable
.
id
)
-
if
next_issuable
=
next_issuable_for
(
issuable
)
=
link_to
'Next'
,
issuable_link_next
(
@project
,
issuable
)
,
class:
'btn btn-default next-btn'
=
link_to
'Next'
,
[
@project
.
namespace
.
becomes
(
Namespace
),
@project
,
next_issuable
]
,
class:
'btn btn-default next-btn'
-
else
-
else
%a
.btn.btn-default.disabled
{
href:
'#'
}
%a
.btn.btn-default.disabled
{
href:
'#'
}
Next
Next
...
@@ -50,7 +47,7 @@
...
@@ -50,7 +47,7 @@
.block.milestone
.block.milestone
.sidebar-collapsed-icon
.sidebar-collapsed-icon
=
icon
(
'
balance-scale
'
)
=
icon
(
'
clock-o
'
)
%span
%span
-
if
issuable
.
milestone
-
if
issuable
.
milestone
=
issuable
.
milestone
.
title
=
issuable
.
milestone
.
title
...
@@ -118,7 +115,7 @@
...
@@ -118,7 +115,7 @@
-
project_ref
=
cross_project_reference
(
@project
,
issuable
)
-
project_ref
=
cross_project_reference
(
@project
,
issuable
)
.block.project-reference
.block.project-reference
.sidebar-collapsed-icon
.sidebar-collapsed-icon
=
icon
(
'clipboard'
)
=
clipboard_button
(
clipboard_text:
project_ref
)
.title
.title
.cross-project-reference
.cross-project-reference
%span
%span
...
...
app/workers/repository_fork_worker.rb
View file @
dd68d100
...
@@ -27,6 +27,7 @@ class RepositoryForkWorker
...
@@ -27,6 +27,7 @@ class RepositoryForkWorker
return
return
end
end
project
.
repository
.
expire_emptiness_caches
project
.
import_finish
project
.
import_finish
end
end
end
end
app/workers/repository_import_worker.rb
View file @
dd68d100
...
@@ -18,6 +18,7 @@ class RepositoryImportWorker
...
@@ -18,6 +18,7 @@ class RepositoryImportWorker
return
return
end
end
project
.
repository
.
expire_emptiness_caches
project
.
import_finish
project
.
import_finish
end
end
end
end
doc/ci/variables/README.md
View file @
dd68d100
...
@@ -16,7 +16,7 @@ The API_TOKEN will take the Secure Variable value: `SECURE`.
...
@@ -16,7 +16,7 @@ The API_TOKEN will take the Secure Variable value: `SECURE`.
### Predefined variables (Environment Variables)
### Predefined variables (Environment Variables)
| Variable | Runner | Description |
| Variable | Runner | Description |
|-------------------------|-------------|
|-------------------------|-----
|
--------|
|
**CI**
| 0.4 | Mark that build is executed in CI environment |
|
**CI**
| 0.4 | Mark that build is executed in CI environment |
|
**GITLAB_CI**
| all | Mark that build is executed in GitLab CI environment |
|
**GITLAB_CI**
| all | Mark that build is executed in GitLab CI environment |
|
**CI_SERVER**
| all | Mark that build is executed in CI environment |
|
**CI_SERVER**
| all | Mark that build is executed in CI environment |
...
...
doc/development/migration_style_guide.md
View file @
dd68d100
...
@@ -15,7 +15,7 @@ or inconsistencies and guard for that. Try to make as little assumptions as poss
...
@@ -15,7 +15,7 @@ or inconsistencies and guard for that. Try to make as little assumptions as poss
about the state of the database.
about the state of the database.
Please don't depend on GitLab specific code since it can change in future versions.
Please don't depend on GitLab specific code since it can change in future versions.
If needed copy-paste GitLab code into the migration to make
make
it forward compatible.
If needed copy-paste GitLab code into the migration to make it forward compatible.
## Comments in the migration
## Comments in the migration
...
...
doc/install/installation.md
View file @
dd68d100
...
@@ -182,25 +182,20 @@ We recommend using a PostgreSQL database. For MySQL check [MySQL setup guide](da
...
@@ -182,25 +182,20 @@ We recommend using a PostgreSQL database. For MySQL check [MySQL setup guide](da
## 6. Redis
## 6. Redis
As of this writing, most Debian/Ubuntu distributions ship with Redis 2.2 or
GitLab requires at least Redis 2.8.
2.
4. GitLab requires at least Redis 2.8.
Ubuntu users
[
can use a PPA
](
https://launchpad.net/~chris-lea/+archive/ubuntu/redis-server
)
If you are using Debian 8 or Ubuntu 14.04 and up, then you can simply install
to install a recent version of Redis.
Redis 2.8 with:
The following instructions cover building and installing Redis from scratch:
```
sh
```
sh
# Build Redis
sudo
apt-get
install
redis-server
wget http://download.redis.io/releases/redis-2.8.23.tar.gz
```
tar
xzf redis-2.8.23.tar.gz
cd
redis-2.8.23
make
# Install Redis
If you are using Debian 7 or Ubuntu 12.04, follow the special documentation
cd
utils
on
[
an alternate Redis installation
](
redis.md
)
. Once done, follow the rest of
sudo
./install_server.sh
the guide here.
```
# Configure redis to use sockets
# Configure redis to use sockets
sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.orig
sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.orig
...
@@ -224,7 +219,7 @@ if [ -d /etc/tmpfiles.d ]; then
...
@@ -224,7 +219,7 @@ if [ -d /etc/tmpfiles.d ]; then
fi
fi
# Activate the changes to redis.conf
# Activate the changes to redis.conf
sudo
service redis
_6379
start
sudo service redis
-server re
start
# Add git to the redis group
# Add git to the redis group
sudo usermod -aG redis git
sudo usermod -aG redis git
...
...
doc/install/redis.md
0 → 100644
View file @
dd68d100
# Install Redis on old distributions
GitLab requires at least Redis 2.8. The following guide is for Debian 7 and
Ubuntu 12.04. If you are using Debian 8 or Ubuntu 14.04 and up, follow the
[
installation guide
](
installation.md
)
.
## Install Redis 2.8 in Debian 7
Redis 2.8 is included in the Debian Wheezy [backports] repository.
1.
Edit
`/etc/apt/sources.list`
and add the following line:
```
deb http://http.debian.net/debian wheezy-backports main
```
1.
Update the repositories:
```
sudo apt-get update
```
1.
Install
`redis-server`
:
```
sudo apt-get -t wheezy-backports install redis-server
```
1.
Follow the rest of the
[
installation guide
](
installation.md
)
.
## Install Redis 2.8 in Ubuntu 12.04
We will
[
use a PPA
](
https://launchpad.net/~chris-lea/+archive/ubuntu/redis-server
)
to install a recent version of Redis.
1.
Install the PPA repository:
```
sudo add-apt-repository ppa:chris-lea/redis-server
```
Your system will now fetch the PPA's key. This enables your Ubuntu system to
verify that the packages in the PPA have not been interfered with since they
were built.
1.
Update the repositories:
```
sudo apt-get update
```
1.
Install
`redis-server`
:
```
sudo apt-get install redis-server
```
1.
Follow the rest of the
[
installation guide
](
installation.md
)
.
[
backports
]:
http://backports.debian.org/Instructions/
"Debian backports website"
doc/web_hooks/web_hooks.md
View file @
dd68d100
This diff is collapsed.
Click to expand it.
features/project/issues/issues.feature
View file @
dd68d100
...
@@ -25,9 +25,16 @@ Feature: Project Issues
...
@@ -25,9 +25,16 @@ Feature: Project Issues
Scenario
:
I
visit issue page
Scenario
:
I
visit issue page
Given
I click link
"Release 0.4"
Given
I click link
"Release 0.4"
Then
I should see issue
"Release 0.4"
Then
I should see issue
"Release 0.4"
And
I should see
"1 of 2"
in the sidebar
Scenario
:
I
navigate between issues
Given
I click link
"Release 0.4"
Then
I click link
"Next"
in the sidebar
Then
I should see issue
"Tweet control"
And
I should see
"2 of 2"
in the sidebar
@javascript
@javascript
Scenario
:
I
visit issue page
Scenario
:
I
filter by author
Given
I add a user to project
"Shop"
Given
I add a user to project
"Shop"
And
I click
"author"
dropdown
And
I click
"author"
dropdown
Then
I see current user as the first user
Then
I see current user as the first user
...
...
features/project/merge_requests.feature
View file @
dd68d100
...
@@ -39,6 +39,7 @@ Feature: Project Merge Requests
...
@@ -39,6 +39,7 @@ Feature: Project Merge Requests
Scenario
:
I
visit merge request page
Scenario
:
I
visit merge request page
Given
I click link
"Bug NS-04"
Given
I click link
"Bug NS-04"
Then
I should see merge request
"Bug NS-04"
Then
I should see merge request
"Bug NS-04"
And
I should see
"1 of 1"
in the sidebar
Scenario
:
I
close merge request page
Scenario
:
I
close merge request page
Given
I click link
"Bug NS-04"
Given
I click link
"Bug NS-04"
...
...
features/steps/project/issues/award_emoji.rb
View file @
dd68d100
...
@@ -46,6 +46,8 @@ class Spinach::Features::AwardEmoji < Spinach::FeatureSteps
...
@@ -46,6 +46,8 @@ class Spinach::Features::AwardEmoji < Spinach::FeatureSteps
end
end
step
'I have award added'
do
step
'I have award added'
do
sleep
0.2
page
.
within
'.awards'
do
page
.
within
'.awards'
do
expect
(
page
).
to
have_selector
'.award'
expect
(
page
).
to
have_selector
'.award'
expect
(
page
.
find
(
'.award.active .counter'
)).
to
have_content
'1'
expect
(
page
.
find
(
'.award.active .counter'
)).
to
have_content
'1'
...
...
features/steps/project/issues/issues.rb
View file @
dd68d100
...
@@ -54,6 +54,10 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
...
@@ -54,6 +54,10 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
expect
(
page
).
to
have_content
"Release 0.4"
expect
(
page
).
to
have_content
"Release 0.4"
end
end
step
'I should see issue "Tweet control"'
do
expect
(
page
).
to
have_content
"Tweet control"
end
step
'I click link "New Issue"'
do
step
'I click link "New Issue"'
do
click_link
"New Issue"
click_link
"New Issue"
end
end
...
@@ -301,4 +305,5 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
...
@@ -301,4 +305,5 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
def
filter_issue
(
text
)
def
filter_issue
(
text
)
fill_in
'issue_search'
,
with:
text
fill_in
'issue_search'
,
with:
text
end
end
end
end
features/steps/shared/issuable.rb
View file @
dd68d100
...
@@ -119,6 +119,24 @@ module SharedIssuable
...
@@ -119,6 +119,24 @@ module SharedIssuable
end
end
end
end
step
'I should see "1 of 1" in the sidebar'
do
expect_sidebar_content
(
'1 of 1'
)
end
step
'I should see "1 of 2" in the sidebar'
do
expect_sidebar_content
(
'1 of 2'
)
end
step
'I should see "2 of 2" in the sidebar'
do
expect_sidebar_content
(
'2 of 2'
)
end
step
'I click link "Next" in the sidebar'
do
page
.
within
'.issuable-sidebar'
do
click_link
'Next'
end
end
def
create_issuable_for_project
(
project_name
:,
title
:,
type: :issue
)
def
create_issuable_for_project
(
project_name
:,
title
:,
type: :issue
)
project
=
Project
.
find_by
(
name:
project_name
)
project
=
Project
.
find_by
(
name:
project_name
)
...
@@ -159,4 +177,10 @@ module SharedIssuable
...
@@ -159,4 +177,10 @@ module SharedIssuable
expect
(
page
).
to
have_content
(
"mentioned in
#{
issuable
.
class
.
to_s
.
titleize
.
downcase
}
#{
issuable
.
to_reference
(
project
)
}
"
)
expect
(
page
).
to
have_content
(
"mentioned in
#{
issuable
.
class
.
to_s
.
titleize
.
downcase
}
#{
issuable
.
to_reference
(
project
)
}
"
)
end
end
def
expect_sidebar_content
(
content
)
page
.
within
'.issuable-sidebar'
do
expect
(
page
).
to
have_content
content
end
end
end
end
lib/gitlab/note_data_builder.rb
View file @
dd68d100
...
@@ -53,13 +53,10 @@ module Gitlab
...
@@ -53,13 +53,10 @@ module Gitlab
object_kind:
"note"
,
object_kind:
"note"
,
user:
user
.
hook_attrs
,
user:
user
.
hook_attrs
,
project_id:
project
.
id
,
project_id:
project
.
id
,
repository:
{
project:
project
.
hook_attrs
,
name:
project
.
name
,
object_attributes:
note
.
hook_attrs
,
url:
project
.
url_to_repo
,
# DEPRECATED
description:
project
.
description
,
repository:
project
.
hook_attrs
.
slice
(
:name
,
:url
,
:description
,
:homepage
)
homepage:
project
.
web_url
,
},
object_attributes:
note
.
hook_attrs
}
}
base_data
[
:object_attributes
][
:url
]
=
base_data
[
:object_attributes
][
:url
]
=
...
...
lib/gitlab/push_data_builder.rb
View file @
dd68d100
...
@@ -22,6 +22,8 @@ module Gitlab
...
@@ -22,6 +22,8 @@ module Gitlab
# }
# }
#
#
def
build
(
project
,
user
,
oldrev
,
newrev
,
ref
,
commits
=
[],
message
=
nil
)
def
build
(
project
,
user
,
oldrev
,
newrev
,
ref
,
commits
=
[],
message
=
nil
)
commits
=
Array
(
commits
)
# Total commits count
# Total commits count
commits_count
=
commits
.
size
commits_count
=
commits
.
size
...
@@ -47,18 +49,14 @@ module Gitlab
...
@@ -47,18 +49,14 @@ module Gitlab
user_id:
user
.
id
,
user_id:
user
.
id
,
user_name:
user
.
name
,
user_name:
user
.
name
,
user_email:
user
.
email
,
user_email:
user
.
email
,
user_avatar:
user
.
avatar_url
,
project_id:
project
.
id
,
project_id:
project
.
id
,
repository:
{
project:
project
.
hook_attrs
,
name:
project
.
name
,
url:
project
.
url_to_repo
,
description:
project
.
description
,
homepage:
project
.
web_url
,
git_http_url:
project
.
http_url_to_repo
,
git_ssh_url:
project
.
ssh_url_to_repo
,
visibility_level:
project
.
visibility_level
},
commits:
commit_attrs
,
commits:
commit_attrs
,
total_commits_count:
commits_count
total_commits_count:
commits_count
,
# DEPRECATED
repository:
project
.
hook_attrs
.
slice
(
:name
,
:url
,
:description
,
:homepage
,
:git_http_url
,
:git_ssh_url
,
:visibility_level
)
}
}
data
data
...
...
spec/controllers/projects/commit_controller_spec.rb
0 → 100644
View file @
dd68d100
require
'rails_helper'
describe
Projects
::
CommitController
do
describe
'GET show'
do
let
(
:project
)
{
create
(
:project
)
}
before
do
user
=
create
(
:user
)
project
.
team
<<
[
user
,
:master
]
sign_in
(
user
)
end
context
'with valid id'
do
it
'responds with 200'
do
go
id:
project
.
commit
.
id
expect
(
response
).
to
be_ok
end
end
context
'with invalid id'
do
it
'responds with 404'
do
go
id:
project
.
commit
.
id
.
reverse
expect
(
response
).
to
be_not_found
end
end
def
go
(
id
:)
get
:show
,
namespace_id:
project
.
namespace
.
to_param
,
project_id:
project
.
to_param
,
id:
id
end
end
end
spec/controllers/projects/imports_controller_spec.rb
View file @
dd68d100
...
@@ -104,6 +104,18 @@ describe Projects::ImportsController do
...
@@ -104,6 +104,18 @@ describe Projects::ImportsController do
end
end
end
end
end
end
context
'when import never happened'
do
before
do
project
.
update_attribute
(
:import_status
,
:none
)
end
it
'redirects to namespace_project_path'
do
get
:show
,
namespace_id:
project
.
namespace
.
to_param
,
project_id:
project
.
to_param
expect
(
response
).
to
redirect_to
namespace_project_path
(
project
.
namespace
,
project
)
end
end
end
end
end
end
end
end
spec/lib/gitlab/note_data_builder_spec.rb
View file @
dd68d100
...
@@ -16,62 +16,80 @@ describe 'Gitlab::NoteDataBuilder', lib: true do
...
@@ -16,62 +16,80 @@ describe 'Gitlab::NoteDataBuilder', lib: true do
end
end
describe
'When asking for a note on commit'
do
describe
'When asking for a note on commit'
do
let
(
:note
)
{
create
(
:note_on_commit
)
}
let
(
:note
)
{
create
(
:note_on_commit
,
project:
project
)
}
it
'returns the note and commit-specific data'
do
it
'returns the note and commit-specific data'
do
expect
(
data
).
to
have_key
(
:commit
)
expect
(
data
).
to
have_key
(
:commit
)
end
end
include_examples
'project hook data'
include_examples
'deprecated repository hook data'
end
end
describe
'When asking for a note on commit diff'
do
describe
'When asking for a note on commit diff'
do
let
(
:note
)
{
create
(
:note_on_commit_diff
)
}
let
(
:note
)
{
create
(
:note_on_commit_diff
,
project:
project
)
}
it
'returns the note and commit-specific data'
do
it
'returns the note and commit-specific data'
do
expect
(
data
).
to
have_key
(
:commit
)
expect
(
data
).
to
have_key
(
:commit
)
end
end
include_examples
'project hook data'
include_examples
'deprecated repository hook data'
end
end
describe
'When asking for a note on issue'
do
describe
'When asking for a note on issue'
do
let
(
:issue
)
{
create
(
:issue
,
created_at:
fixed_time
,
updated_at:
fixed_time
)
}
let
(
:issue
)
{
create
(
:issue
,
created_at:
fixed_time
,
updated_at:
fixed_time
)
}
let
(
:note
)
{
create
(
:note_on_issue
,
noteable_id:
issue
.
id
)
}
let
(
:note
)
{
create
(
:note_on_issue
,
noteable_id:
issue
.
id
,
project:
project
)
}
it
'returns the note and issue-specific data'
do
it
'returns the note and issue-specific data'
do
expect
(
data
).
to
have_key
(
:issue
)
expect
(
data
).
to
have_key
(
:issue
)
expect
(
data
[
:issue
].
except
(
'updated_at'
)).
to
eq
(
issue
.
hook_attrs
.
except
(
'updated_at'
))
expect
(
data
[
:issue
].
except
(
'updated_at'
)).
to
eq
(
issue
.
hook_attrs
.
except
(
'updated_at'
))
expect
(
data
[
:issue
][
'updated_at'
]).
to
be
>
issue
.
hook_attrs
[
'updated_at'
]
expect
(
data
[
:issue
][
'updated_at'
]).
to
be
>
issue
.
hook_attrs
[
'updated_at'
]
end
end
include_examples
'project hook data'
include_examples
'deprecated repository hook data'
end
end
describe
'When asking for a note on merge request'
do
describe
'When asking for a note on merge request'
do
let
(
:merge_request
)
{
create
(
:merge_request
,
created_at:
fixed_time
,
updated_at:
fixed_time
)
}
let
(
:merge_request
)
{
create
(
:merge_request
,
created_at:
fixed_time
,
updated_at:
fixed_time
)
}
let
(
:note
)
{
create
(
:note_on_merge_request
,
noteable_id:
merge_request
.
id
)
}
let
(
:note
)
{
create
(
:note_on_merge_request
,
noteable_id:
merge_request
.
id
,
project:
project
)
}
it
'returns the note and merge request data'
do
it
'returns the note and merge request data'
do
expect
(
data
).
to
have_key
(
:merge_request
)
expect
(
data
).
to
have_key
(
:merge_request
)
expect
(
data
[
:merge_request
].
except
(
'updated_at'
)).
to
eq
(
merge_request
.
hook_attrs
.
except
(
'updated_at'
))
expect
(
data
[
:merge_request
].
except
(
'updated_at'
)).
to
eq
(
merge_request
.
hook_attrs
.
except
(
'updated_at'
))
expect
(
data
[
:merge_request
][
'updated_at'
]).
to
be
>
merge_request
.
hook_attrs
[
'updated_at'
]
expect
(
data
[
:merge_request
][
'updated_at'
]).
to
be
>
merge_request
.
hook_attrs
[
'updated_at'
]
end
end
include_examples
'project hook data'
include_examples
'deprecated repository hook data'
end
end
describe
'When asking for a note on merge request diff'
do
describe
'When asking for a note on merge request diff'
do
let
(
:merge_request
)
{
create
(
:merge_request
,
created_at:
fixed_time
,
updated_at:
fixed_time
)
}
let
(
:merge_request
)
{
create
(
:merge_request
,
created_at:
fixed_time
,
updated_at:
fixed_time
)
}
let
(
:note
)
{
create
(
:note_on_merge_request_diff
,
noteable_id:
merge_request
.
id
)
}
let
(
:note
)
{
create
(
:note_on_merge_request_diff
,
noteable_id:
merge_request
.
id
,
project:
project
)
}
it
'returns the note and merge request diff data'
do
it
'returns the note and merge request diff data'
do
expect
(
data
).
to
have_key
(
:merge_request
)
expect
(
data
).
to
have_key
(
:merge_request
)
expect
(
data
[
:merge_request
].
except
(
'updated_at'
)).
to
eq
(
merge_request
.
hook_attrs
.
except
(
'updated_at'
))
expect
(
data
[
:merge_request
].
except
(
'updated_at'
)).
to
eq
(
merge_request
.
hook_attrs
.
except
(
'updated_at'
))
expect
(
data
[
:merge_request
][
'updated_at'
]).
to
be
>
merge_request
.
hook_attrs
[
'updated_at'
]
expect
(
data
[
:merge_request
][
'updated_at'
]).
to
be
>
merge_request
.
hook_attrs
[
'updated_at'
]
end
end
include_examples
'project hook data'
include_examples
'deprecated repository hook data'
end
end
describe
'When asking for a note on project snippet'
do
describe
'When asking for a note on project snippet'
do
let!
(
:snippet
)
{
create
(
:project_snippet
,
created_at:
fixed_time
,
updated_at:
fixed_time
)
}
let!
(
:snippet
)
{
create
(
:project_snippet
,
created_at:
fixed_time
,
updated_at:
fixed_time
)
}
let!
(
:note
)
{
create
(
:note_on_project_snippet
,
noteable_id:
snippet
.
id
)
}
let!
(
:note
)
{
create
(
:note_on_project_snippet
,
noteable_id:
snippet
.
id
,
project:
project
)
}
it
'returns the note and project snippet data'
do
it
'returns the note and project snippet data'
do
expect
(
data
).
to
have_key
(
:snippet
)
expect
(
data
).
to
have_key
(
:snippet
)
expect
(
data
[
:snippet
].
except
(
'updated_at'
)).
to
eq
(
snippet
.
hook_attrs
.
except
(
'updated_at'
))
expect
(
data
[
:snippet
].
except
(
'updated_at'
)).
to
eq
(
snippet
.
hook_attrs
.
except
(
'updated_at'
))
expect
(
data
[
:snippet
][
'updated_at'
]).
to
be
>
snippet
.
hook_attrs
[
'updated_at'
]
expect
(
data
[
:snippet
][
'updated_at'
]).
to
be
>
snippet
.
hook_attrs
[
'updated_at'
]
end
end
include_examples
'project hook data'
include_examples
'deprecated repository hook data'
end
end
end
end
spec/lib/gitlab/push_data_builder_spec.rb
View file @
dd68d100
require
'spec_helper'
require
'spec_helper'
describe
'Gitlab::PushDataBuilder'
,
lib:
true
do
describe
Gitlab
::
PushDataBuilder
,
lib:
true
do
let
(
:project
)
{
create
(
:project
)
}
let
(
:project
)
{
create
(
:project
)
}
let
(
:user
)
{
create
(
:user
)
}
let
(
:user
)
{
create
(
:user
)
}
describe
:build_sample
do
describe
'.build_sample'
do
let
(
:data
)
{
Gitlab
::
PushDataBuilder
.
build_sample
(
project
,
user
)
}
let
(
:data
)
{
described_class
.
build_sample
(
project
,
user
)
}
it
{
expect
(
data
).
to
be_a
(
Hash
)
}
it
{
expect
(
data
).
to
be_a
(
Hash
)
}
it
{
expect
(
data
[
:before
]).
to
eq
(
'6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9'
)
}
it
{
expect
(
data
[
:before
]).
to
eq
(
'6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9'
)
}
it
{
expect
(
data
[
:after
]).
to
eq
(
'5937ac0a7beb003549fc5fd26fc247adbce4a52e'
)
}
it
{
expect
(
data
[
:after
]).
to
eq
(
'5937ac0a7beb003549fc5fd26fc247adbce4a52e'
)
}
it
{
expect
(
data
[
:ref
]).
to
eq
(
'refs/heads/master'
)
}
it
{
expect
(
data
[
:ref
]).
to
eq
(
'refs/heads/master'
)
}
it
{
expect
(
data
[
:commits
].
size
).
to
eq
(
3
)
}
it
{
expect
(
data
[
:commits
].
size
).
to
eq
(
3
)
}
it
{
expect
(
data
[
:repository
][
:git_http_url
]).
to
eq
(
project
.
http_url_to_repo
)
}
it
{
expect
(
data
[
:repository
][
:git_ssh_url
]).
to
eq
(
project
.
ssh_url_to_repo
)
}
it
{
expect
(
data
[
:repository
][
:visibility_level
]).
to
eq
(
project
.
visibility_level
)
}
it
{
expect
(
data
[
:total_commits_count
]).
to
eq
(
3
)
}
it
{
expect
(
data
[
:total_commits_count
]).
to
eq
(
3
)
}
it
{
expect
(
data
[
:commits
].
first
[
:added
]).
to
eq
([
"gitlab-grack"
])
}
it
{
expect
(
data
[
:commits
].
first
[
:added
]).
to
eq
([
"gitlab-grack"
])
}
it
{
expect
(
data
[
:commits
].
first
[
:modified
]).
to
eq
([
".gitmodules"
])
}
it
{
expect
(
data
[
:commits
].
first
[
:modified
]).
to
eq
([
".gitmodules"
])
}
it
{
expect
(
data
[
:commits
].
first
[
:removed
]).
to
eq
([])
}
it
{
expect
(
data
[
:commits
].
first
[
:removed
]).
to
eq
([])
}
include_examples
'project hook data'
include_examples
'deprecated repository hook data'
end
end
describe
:build
do
describe
'.build'
do
let
(
:data
)
do
let
(
:data
)
do
Gitlab
::
PushDataBuilder
.
build
(
project
,
described_class
.
build
(
project
,
user
,
Gitlab
::
Git
::
BLANK_SHA
,
user
,
'8a2a6eb295bb170b34c24c76c49ed0e9b2eaf34b'
,
Gitlab
::
Git
::
BLANK_SHA
,
'refs/tags/v1.1.0'
)
'8a2a6eb295bb170b34c24c76c49ed0e9b2eaf34b'
,
'refs/tags/v1.1.0'
)
end
end
it
{
expect
(
data
).
to
be_a
(
Hash
)
}
it
{
expect
(
data
).
to
be_a
(
Hash
)
}
...
@@ -38,5 +36,10 @@ describe 'Gitlab::PushDataBuilder', lib: true do
...
@@ -38,5 +36,10 @@ describe 'Gitlab::PushDataBuilder', lib: true do
it
{
expect
(
data
[
:ref
]).
to
eq
(
'refs/tags/v1.1.0'
)
}
it
{
expect
(
data
[
:ref
]).
to
eq
(
'refs/tags/v1.1.0'
)
}
it
{
expect
(
data
[
:commits
]).
to
be_empty
}
it
{
expect
(
data
[
:commits
]).
to
be_empty
}
it
{
expect
(
data
[
:total_commits_count
]).
to
be_zero
}
it
{
expect
(
data
[
:total_commits_count
]).
to
be_zero
}
it
'does not raise an error when given nil commits'
do
expect
{
described_class
.
build
(
spy
,
spy
,
spy
,
spy
,
spy
,
nil
)
}.
not_to
raise_error
end
end
end
end
end
spec/models/concerns/issuable_spec.rb
View file @
dd68d100
...
@@ -69,27 +69,28 @@ describe Issue, "Issuable" do
...
@@ -69,27 +69,28 @@ describe Issue, "Issuable" do
end
end
describe
"#to_hook_data"
do
describe
"#to_hook_data"
do
let
(
:hook_data
)
{
issue
.
to_hook_data
(
user
)
}
let
(
:data
)
{
issue
.
to_hook_data
(
user
)
}
let
(
:project
)
{
issue
.
project
}
it
"returns correct hook data"
do
it
"returns correct hook data"
do
expect
(
hook_data
[
:object_kind
]).
to
eq
(
"issue"
)
expect
(
data
[
:object_kind
]).
to
eq
(
"issue"
)
expect
(
hook_data
[
:user
]).
to
eq
(
user
.
hook_attrs
)
expect
(
data
[
:user
]).
to
eq
(
user
.
hook_attrs
)
expect
(
hook_data
[
:repository
][
:name
]).
to
eq
(
issue
.
project
.
name
)
expect
(
data
[
:object_attributes
]).
to
eq
(
issue
.
hook_attrs
)
expect
(
hook_data
[
:repository
][
:url
]).
to
eq
(
issue
.
project
.
url_to_repo
)
expect
(
data
).
to_not
have_key
(
:assignee
)
expect
(
hook_data
[
:repository
][
:description
]).
to
eq
(
issue
.
project
.
description
)
expect
(
hook_data
[
:repository
][
:homepage
]).
to
eq
(
issue
.
project
.
web_url
)
expect
(
hook_data
[
:object_attributes
]).
to
eq
(
issue
.
hook_attrs
)
expect
(
hook_data
).
to_not
have_key
(
:assignee
)
end
end
context
"issue is assigned"
do
context
"issue is assigned"
do
before
{
issue
.
update_attribute
(
:assignee
,
user
)
}
before
{
issue
.
update_attribute
(
:assignee
,
user
)
}
it
"returns correct hook data"
do
it
"returns correct hook data"
do
expect
(
hook_
data
[
:object_attributes
][
'assignee_id'
]).
to
eq
(
user
.
id
)
expect
(
data
[
:object_attributes
][
'assignee_id'
]).
to
eq
(
user
.
id
)
expect
(
hook_
data
[
:assignee
]).
to
eq
(
user
.
hook_attrs
)
expect
(
data
[
:assignee
]).
to
eq
(
user
.
hook_attrs
)
end
end
end
end
include_examples
'project hook data'
include_examples
'deprecated repository hook data'
end
end
describe
'#card_attributes'
do
describe
'#card_attributes'
do
...
...
spec/models/merge_request_spec.rb
View file @
dd68d100
...
@@ -254,13 +254,22 @@ describe MergeRequest, models: true do
...
@@ -254,13 +254,22 @@ describe MergeRequest, models: true do
end
end
describe
"#hook_attrs"
do
describe
"#hook_attrs"
do
let
(
:attrs_hash
)
{
subject
.
hook_attrs
.
to_h
}
[
:source
,
:target
].
each
do
|
key
|
describe
"
#{
key
}
key"
do
include_examples
'project hook data'
,
project_key:
key
do
let
(
:data
)
{
attrs_hash
}
let
(
:project
)
{
subject
.
send
(
"
#{
key
}
_project"
)
}
end
end
end
it
"has all the required keys"
do
it
"has all the required keys"
do
attrs
=
subject
.
hook_attrs
expect
(
attrs_hash
).
to
include
(
:source
)
attrs
=
attrs
.
to_h
expect
(
attrs_hash
).
to
include
(
:target
)
expect
(
attrs
).
to
include
(
:source
)
expect
(
attrs_hash
).
to
include
(
:last_commit
)
expect
(
attrs
).
to
include
(
:target
)
expect
(
attrs_hash
).
to
include
(
:work_in_progress
)
expect
(
attrs
).
to
include
(
:last_commit
)
expect
(
attrs
).
to
include
(
:work_in_progress
)
end
end
end
end
...
...
spec/models/repository_spec.rb
View file @
dd68d100
...
@@ -355,6 +355,17 @@ describe Repository, models: true do
...
@@ -355,6 +355,17 @@ describe Repository, models: true do
end
end
end
end
describe
'#expire_emptiness_caches'
do
let
(
:cache
)
{
repository
.
send
(
:cache
)
}
it
'expires the caches'
do
expect
(
cache
).
to
receive
(
:expire
).
with
(
:empty?
)
expect
(
repository
).
to
receive
(
:expire_has_visible_content_cache
)
repository
.
expire_emptiness_caches
end
end
describe
:skip_merged_commit
do
describe
:skip_merged_commit
do
subject
{
repository
.
commits
(
Gitlab
::
Git
::
BRANCH_REF_PREFIX
+
"'test'"
,
nil
,
100
,
0
,
true
).
map
{
|
k
|
k
.
id
}
}
subject
{
repository
.
commits
(
Gitlab
::
Git
::
BRANCH_REF_PREFIX
+
"'test'"
,
nil
,
100
,
0
,
true
).
map
{
|
k
|
k
.
id
}
}
...
...
spec/services/system_note_service_spec.rb
View file @
dd68d100
...
@@ -424,6 +424,21 @@ describe SystemNoteService, services: true do
...
@@ -424,6 +424,21 @@ describe SystemNoteService, services: true do
to
be_falsey
to
be_falsey
end
end
end
end
context
'commit with cross-reference from fork'
do
let
(
:author2
)
{
create
(
:user
)
}
let
(
:forked_project
)
{
Projects
::
ForkService
.
new
(
project
,
author2
).
execute
}
let
(
:commit2
)
{
forked_project
.
commit
}
before
do
described_class
.
cross_reference
(
noteable
,
commit0
,
author2
)
end
it
'is true when a fork mentions an external issue'
do
expect
(
described_class
.
cross_reference_exists?
(
noteable
,
commit2
)).
to
be
true
end
end
end
end
include
JiraServiceHelper
include
JiraServiceHelper
...
...
spec/support/project_hook_data_shared_example.rb
0 → 100644
View file @
dd68d100
RSpec
.
shared_examples
'project hook data'
do
|
project_key: :project
|
it
'contains project data'
do
expect
(
data
[
project_key
][
:name
]).
to
eq
(
project
.
name
)
expect
(
data
[
project_key
][
:description
]).
to
eq
(
project
.
description
)
expect
(
data
[
project_key
][
:web_url
]).
to
eq
(
project
.
web_url
)
expect
(
data
[
project_key
][
:avatar_url
]).
to
eq
(
project
.
avatar_url
)
expect
(
data
[
project_key
][
:git_http_url
]).
to
eq
(
project
.
http_url_to_repo
)
expect
(
data
[
project_key
][
:git_ssh_url
]).
to
eq
(
project
.
ssh_url_to_repo
)
expect
(
data
[
project_key
][
:namespace
]).
to
eq
(
project
.
namespace
.
name
)
expect
(
data
[
project_key
][
:visibility_level
]).
to
eq
(
project
.
visibility_level
)
expect
(
data
[
project_key
][
:path_with_namespace
]).
to
eq
(
project
.
path_with_namespace
)
expect
(
data
[
project_key
][
:default_branch
]).
to
eq
(
project
.
default_branch
)
expect
(
data
[
project_key
][
:homepage
]).
to
eq
(
project
.
web_url
)
expect
(
data
[
project_key
][
:url
]).
to
eq
(
project
.
url_to_repo
)
expect
(
data
[
project_key
][
:ssh_url
]).
to
eq
(
project
.
ssh_url_to_repo
)
expect
(
data
[
project_key
][
:http_url
]).
to
eq
(
project
.
http_url_to_repo
)
end
end
RSpec
.
shared_examples
'deprecated repository hook data'
do
|
project_key: :project
|
it
'contains deprecated repository data'
do
expect
(
data
[
:repository
][
:name
]).
to
eq
(
project
.
name
)
expect
(
data
[
:repository
][
:description
]).
to
eq
(
project
.
description
)
expect
(
data
[
:repository
][
:url
]).
to
eq
(
project
.
url_to_repo
)
expect
(
data
[
:repository
][
:homepage
]).
to
eq
(
project
.
web_url
)
end
end
spec/workers/repository_fork_worker_spec.rb
View file @
dd68d100
...
@@ -19,6 +19,18 @@ describe RepositoryForkWorker do
...
@@ -19,6 +19,18 @@ describe RepositoryForkWorker do
fork_project
.
namespace
.
path
)
fork_project
.
namespace
.
path
)
end
end
it
'flushes the empty caches'
do
expect_any_instance_of
(
Gitlab
::
Shell
).
to
receive
(
:fork_repository
).
with
(
project
.
path_with_namespace
,
fork_project
.
namespace
.
path
).
and_return
(
true
)
expect_any_instance_of
(
Repository
).
to
receive
(
:expire_emptiness_caches
).
and_call_original
subject
.
perform
(
project
.
id
,
project
.
path_with_namespace
,
fork_project
.
namespace
.
path
)
end
it
"handles bad fork"
do
it
"handles bad fork"
do
expect_any_instance_of
(
Gitlab
::
Shell
).
to
receive
(
:fork_repository
).
and_return
(
false
)
expect_any_instance_of
(
Gitlab
::
Shell
).
to
receive
(
:fork_repository
).
and_return
(
false
)
subject
.
perform
(
subject
.
perform
(
...
...
spec/workers/repository_import_worker_spec.rb
0 → 100644
View file @
dd68d100
require
'spec_helper'
describe
RepositoryImportWorker
do
let
(
:project
)
{
create
(
:project
)
}
subject
{
described_class
.
new
}
describe
'#perform'
do
it
'imports a project'
do
expect_any_instance_of
(
Projects
::
ImportService
).
to
receive
(
:execute
).
and_return
({
status: :ok
})
expect_any_instance_of
(
Repository
).
to
receive
(
:expire_emptiness_caches
)
expect_any_instance_of
(
Project
).
to
receive
(
:import_finish
)
subject
.
perform
(
project
.
id
)
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