Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
m0_70890014
gitlabhq
提交
c0849101
G
gitlabhq
项目概览
m0_70890014
/
gitlabhq
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gitlabhq
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c0849101
编写于
1月 06, 2016
作者:
D
Douwe Maan
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' into merge-when-build-succeeds-unchecked
上级
097faeb4
95b1adb3
变更
15
隐藏空白更改
内联
并排
Showing
15 changed file
with
251 addition
and
60 deletion
+251
-60
.gitignore
.gitignore
+1
-0
CHANGELOG
CHANGELOG
+7
-0
app/assets/stylesheets/pages/commits.scss
app/assets/stylesheets/pages/commits.scss
+56
-0
app/controllers/projects/branches_controller.rb
app/controllers/projects/branches_controller.rb
+5
-0
app/models/project.rb
app/models/project.rb
+2
-0
app/models/project_services/asana_service.rb
app/models/project_services/asana_service.rb
+40
-42
app/models/repository.rb
app/models/repository.rb
+37
-0
app/models/tree.rb
app/models/tree.rb
+6
-8
app/views/abuse_report_mailer/notify.html.haml
app/views/abuse_report_mailer/notify.html.haml
+1
-1
app/views/projects/branches/_branch.html.haml
app/views/projects/branches/_branch.html.haml
+15
-0
doc/api/users.md
doc/api/users.md
+7
-0
lib/api/users.rb
lib/api/users.rb
+1
-1
lib/version_check.rb
lib/version_check.rb
+1
-1
spec/models/project_services/asana_service_spec.rb
spec/models/project_services/asana_service_spec.rb
+71
-6
spec/services/notification_service_spec.rb
spec/services/notification_service_spec.rb
+1
-1
未找到文件。
.gitignore
浏览文件 @
c0849101
...
...
@@ -26,6 +26,7 @@ config/initializers/smtp_settings.rb
config/resque.yml
config/unicorn.rb
config/secrets.yml
config/sidekiq.yml
coverage/*
db/*.sqlite3
db/*.sqlite3-journal
...
...
CHANGELOG
浏览文件 @
c0849101
...
...
@@ -18,6 +18,8 @@ v 8.4.0 (unreleased)
- Fix version check image in Safari
- Show 'All' tab by default in the builds page
- Fix API project lookups when querying with a namespace with dots (Stan Hu)
- Update version check images to use SVG
- Validate README format before displaying
v 8.3.3 (unreleased)
- Get "Merge when build succeeds" to work when commits were pushed to MR target branch while builds were running
...
...
@@ -25,6 +27,9 @@ v 8.3.3 (unreleased)
- Enable "Add key" button when user fills in a proper key (Stan Hu)
v 8.3.2
- Change single user API endpoint to return more detailed data (Michael Potthoff)
v 8.3.2 (unreleased)
- Disable --follow in `git log` to avoid loading duplicate commit data in infinite scroll (Stan Hu)
- Add support for Google reCAPTCHA in user registration
...
...
@@ -157,6 +162,8 @@ v 8.2.0
- Allow to define cache in `.gitlab-ci.yml`
- Fix: 500 error returned if destroy request without HTTP referer (Kazuki Shimizu)
- Remove deprecated CI events from project settings page
- Use issue editor as cross reference comment author when issue is edited with a new mention.
- Add graphs of commits ahead and behind default branch (Jeff Stubler)
- Improve personal snippet access workflow (Douglas Alexandre)
- [API] Add ability to fetch the commit ID of the last commit that actually touched a file
- Fix omniauth documentation setting for omnibus configuration (Jon Cairns)
...
...
app/assets/stylesheets/pages/commits.scss
浏览文件 @
c0849101
...
...
@@ -122,3 +122,59 @@ li.commit {
color
:
$gl-gray
;
}
}
.divergence-graph
{
padding
:
12px
12px
0
0
;
float
:
right
;
.graph-side
{
position
:
relative
;
width
:
80px
;
height
:
22px
;
padding
:
5px
0
13px
;
float
:
left
;
.bar
{
position
:
absolute
;
height
:
4px
;
background-color
:
#ccc
;
}
.bar-behind
{
right
:
0
;
border-radius
:
3px
0
0
3px
;
}
.bar-ahead
{
left
:
0
;
border-radius
:
0
3px
3px
0
;
}
.count
{
padding-top
:
6px
;
padding-bottom
:
0px
;
font-size
:
12px
;
color
:
#333
;
display
:
block
;
}
.count-behind
{
padding-right
:
4px
;
text-align
:
right
;
}
.count-ahead
{
padding-left
:
4px
;
text-align
:
left
;
}
}
.graph-separator
{
position
:
relative
;
width
:
1px
;
height
:
18px
;
margin
:
5px
0
0
;
float
:
left
;
background-color
:
#ccc
;
}
}
app/controllers/projects/branches_controller.rb
浏览文件 @
c0849101
...
...
@@ -9,6 +9,11 @@ class Projects::BranchesController < Projects::ApplicationController
@sort
=
params
[
:sort
]
||
'name'
@branches
=
@repository
.
branches_sorted_by
(
@sort
)
@branches
=
Kaminari
.
paginate_array
(
@branches
).
page
(
params
[
:page
]).
per
(
PER_PAGE
)
@max_commits
=
@branches
.
reduce
(
0
)
do
|
memo
,
branch
|
diverging_commit_counts
=
repository
.
diverging_commit_counts
(
branch
)
[
memo
,
diverging_commit_counts
[
:behind
],
diverging_commit_counts
[
:ahead
]].
max
end
end
def
recent
...
...
app/models/project.rb
浏览文件 @
c0849101
...
...
@@ -775,6 +775,8 @@ class Project < ActiveRecord::Base
end
def
change_head
(
branch
)
# Cached divergent commit counts are based on repository head
repository
.
expire_branch_cache
gitlab_shell
.
update_repository_head
(
self
.
path_with_namespace
,
branch
)
reload_default_branch
end
...
...
app/models/project_services/asana_service.rb
浏览文件 @
c0849101
...
...
@@ -40,8 +40,8 @@ get the commit comment added to it.
You can also close a task with a message containing: `fix #123456`.
You can
find your Api Keys
here:
http://
developer.asana.com/documentation/#api_keys
'
You can
create a Personal Access Token
here:
http://
app.asana.com/-/account_api
'
end
def
to_param
...
...
@@ -53,14 +53,12 @@ http://developer.asana.com/documentation/#api_keys'
{
type:
'text'
,
name:
'api_key'
,
placeholder:
'User API token. User must have access to task,
all comments will be attributed to this user.'
placeholder:
'User Personal Access Token. User must have access to task, all comments will be attributed to this user.'
},
{
type:
'text'
,
name:
'restrict_to_branch'
,
placeholder:
'Comma-separated list of branches which will be
automatically inspected. Leave blank to include all branches.'
placeholder:
'Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches.'
}
]
end
...
...
@@ -69,58 +67,58 @@ automatically inspected. Leave blank to include all branches.'
%w(push)
end
def
client
@_client
||=
begin
Asana
::
Client
.
new
do
|
c
|
c
.
authentication
:access_token
,
api_key
end
end
end
def
execute
(
data
)
return
unless
supported_events
.
include?
(
data
[
:object_kind
])
Asana
.
configure
do
|
client
|
client
.
api_key
=
api_key
end
user
=
data
[
:user_name
]
# check the branch restriction is poplulated and branch is not included
branch
=
Gitlab
::
Git
.
ref_name
(
data
[
:ref
])
branch_restriction
=
restrict_to_branch
.
to_s
# check the branch restriction is poplulated and branch is not included
if
branch_restriction
.
length
>
0
&&
branch_restriction
.
index
(
branch
).
nil?
return
end
user
=
data
[
:user_name
]
project_name
=
project
.
name_with_namespace
push_msg
=
user
+
' pushed to branch '
+
branch
+
' of '
+
project_name
data
[
:commits
].
each
do
|
commit
|
check_commit
(
' ( '
+
commit
[
:url
]
+
' ): '
+
commit
[
:message
],
push_msg
)
push_msg
=
"
#{
user
}
pushed to branch
#{
branch
}
of
#{
project_name
}
(
#{
commit
[
:url
]
}
):"
check_commit
(
commit
[
:message
],
push_msg
)
end
end
def
check_commit
(
message
,
push_msg
)
task_list
=
[]
close_list
=
[]
message
.
split
(
"
\n
"
).
each
do
|
line
|
# look for a task ID or a full Asana url
task_list
.
concat
(
line
.
scan
(
/#(\d+)/
))
task_list
.
concat
(
line
.
scan
(
/https:\/\/app\.asana\.com\/\d+\/\d+\/(\d+)/
))
# look for a word starting with 'fix' followed by a task ID
close_list
.
concat
(
line
.
scan
(
/(fix\w*)\W*#(\d+)/i
))
end
# post commit to every taskid found
task_list
.
each
do
|
taskid
|
task
=
Asana
::
Task
.
find
(
taskid
[
0
])
if
task
task
.
create_story
(
text:
push_msg
+
' '
+
message
)
end
end
# close all tasks that had 'fix(ed/es/ing) #:id' in them
close_list
.
each
do
|
taskid
|
task
=
Asana
::
Task
.
find
(
taskid
.
last
)
if
task
task
.
modify
(
completed:
true
)
# matches either:
# - #1234
# - https://app.asana.com/0/0/1234
# optionally preceded with:
# - fix/ed/es/ing
# - close/s/d
# - closing
issue_finder
=
/(fix\w*|clos[ei]\w*+)?\W*(?:https:\/\/app\.asana\.com\/\d+\/\d+\/(\d+)|#(\d+))/i
message
.
scan
(
issue_finder
).
each
do
|
tuple
|
# tuple will be
# [ 'fix', 'id_from_url', 'id_from_pound' ]
taskid
=
tuple
[
2
]
||
tuple
[
1
]
begin
task
=
Asana
::
Task
.
find_by_id
(
client
,
taskid
)
task
.
add_comment
(
text:
"
#{
push_msg
}
#{
message
}
"
)
if
tuple
[
0
]
task
.
update
(
completed:
true
)
end
rescue
=>
e
Rails
.
logger
.
error
(
e
.
message
)
next
end
end
end
...
...
app/models/repository.rb
浏览文件 @
c0849101
...
...
@@ -175,11 +175,29 @@ class Repository
def
size
cache
.
fetch
(
:size
)
{
raw_repository
.
size
}
end
def
diverging_commit_counts
(
branch
)
root_ref_hash
=
raw_repository
.
rev_parse_target
(
root_ref
).
oid
cache
.
fetch
(
:"diverging_commit_counts_
#{
branch
.
name
}
"
)
do
# Rugged seems to throw a `ReferenceError` when given branch_names rather
# than SHA-1 hashes
number_commits_behind
=
commits_between
(
branch
.
target
,
root_ref_hash
).
size
number_commits_ahead
=
commits_between
(
root_ref_hash
,
branch
.
target
).
size
{
behind:
number_commits_behind
,
ahead:
number_commits_ahead
}
end
end
def
cache_keys
%i(size branch_names tag_names commit_count
readme version contribution_guide changelog license)
end
def
branch_cache_keys
branches
.
map
do
|
branch
|
:"diverging_commit_counts_
#{
branch
.
name
}
"
end
end
def
build_cache
cache_keys
.
each
do
|
key
|
...
...
@@ -187,6 +205,12 @@ class Repository
send
(
key
)
end
end
branches
.
each
do
|
branch
|
unless
cache
.
exist?
(
:"diverging_commit_counts_
#{
branch
.
name
}
"
)
send
(
:diverging_commit_counts
,
branch
)
end
end
end
def
expire_tags_cache
...
...
@@ -203,6 +227,14 @@ class Repository
cache_keys
.
each
do
|
key
|
cache
.
expire
(
key
)
end
expire_branch_cache
end
def
expire_branch_cache
branches
.
each
do
|
branch
|
cache
.
expire
(
:"diverging_commit_counts_
#{
branch
.
name
}
"
)
end
end
def
rebuild_cache
...
...
@@ -210,6 +242,11 @@ class Repository
cache
.
expire
(
key
)
send
(
key
)
end
branches
.
each
do
|
branch
|
cache
.
expire
(
:"diverging_commit_counts_
#{
branch
.
name
}
"
)
diverging_commit_counts
(
branch
)
end
end
def
lookup_cache
...
...
app/models/tree.rb
浏览文件 @
c0849101
...
...
@@ -17,18 +17,16 @@ class Tree
def
readme
return
@readme
if
defined?
(
@readme
)
available_readmes
=
blobs
.
select
(
&
:readme?
)
# Take the first previewable readme, or return nil if none is available or
# we can't preview any of them
readme_tree
=
blobs
.
find
do
|
blob
|
blob
.
readme?
&&
(
previewable?
(
blob
.
name
)
||
plain?
(
blob
.
name
))
end
if
available_readmes
.
count
==
0
if
readme_tree
.
nil?
return
@readme
=
nil
end
# Take the first previewable readme, or the first available readme, if we
# can't preview any of them
readme_tree
=
available_readmes
.
find
do
|
readme
|
previewable?
(
readme
.
name
)
end
||
available_readmes
.
first
readme_path
=
path
==
'/'
?
readme_tree
.
name
:
File
.
join
(
path
,
readme_tree
.
name
)
git_repo
=
repository
.
raw_repository
...
...
app/views/abuse_report_mailer/notify.html.haml
浏览文件 @
c0849101
...
...
@@ -8,4 +8,4 @@
=
@abuse_report
.
message
%p
=
link_to
"View details"
,
abuse_reports_url
=
link_to
"View details"
,
a
dmin_a
buse_reports_url
app/views/projects/branches/_branch.html.haml
浏览文件 @
c0849101
-
commit
=
@repository
.
commit
(
branch
.
target
)
-
bar_graph_width_factor
=
@max_commits
>
0
?
100.0
/
@max_commits
:
0
-
diverging_commit_counts
=
@repository
.
diverging_commit_counts
(
branch
)
-
number_commits_behind
=
diverging_commit_counts
[
:behind
]
-
number_commits_ahead
=
diverging_commit_counts
[
:ahead
]
%li
(
class=
"js-branch-#{branch.name}"
)
%div
=
link_to
namespace_project_tree_path
(
@project
.
namespace
,
@project
,
branch
.
name
)
do
...
...
@@ -29,6 +33,17 @@
=
link_to
namespace_project_branch_path
(
@project
.
namespace
,
@project
,
branch
.
name
),
class:
'btn btn-grouped btn-xs btn-remove remove-row has_tooltip'
,
title:
"Delete branch"
,
method: :delete
,
data:
{
confirm:
"Deleting the '
#{
branch
.
name
}
' branch cannot be undone. Are you sure?"
,
container:
'body'
},
remote:
true
do
=
icon
(
"trash-o"
)
-
if
branch
.
name
!=
@repository
.
root_ref
.divergence-graph
{
title:
"#{number_commits_ahead} commits ahead, #{number_commits_behind} commits behind #{@repository.root_ref}"
}
.graph-side
.bar.bar-behind
{
style:
"width: #{number_commits_behind * bar_graph_width_factor}%"
}
%span
.count.count-behind
=
number_commits_behind
.graph-separator
.graph-side
.bar.bar-ahead
{
style:
"width: #{number_commits_ahead * bar_graph_width_factor}%"
}
%span
.count.count-ahead
=
number_commits_ahead
-
if
commit
=
render
'projects/branches/commit'
,
commit:
commit
,
project:
@project
-
else
...
...
doc/api/users.md
浏览文件 @
c0849101
...
...
@@ -123,6 +123,13 @@ Parameters:
"name"
:
"John Smith"
,
"state"
:
"active"
,
"avatar_url"
:
"http://localhost:3000/uploads/user/avatar/1/cd8.jpeg"
,
"created_at"
:
"2012-05-23T08:00:58Z"
,
"is_admin"
:
false
,
"bio"
:
null
,
"skype"
:
""
,
"linkedin"
:
""
,
"twitter"
:
""
,
"website_url"
:
""
}
```
...
...
lib/api/users.rb
浏览文件 @
c0849101
...
...
@@ -39,7 +39,7 @@ module API
if
current_user
.
is_admin?
present
@user
,
with:
Entities
::
UserFull
else
present
@user
,
with:
Entities
::
User
Basic
present
@user
,
with:
Entities
::
User
end
end
...
...
lib/version_check.rb
浏览文件 @
c0849101
...
...
@@ -13,6 +13,6 @@ class VersionCheck
end
def
host
'https://version.gitlab.com/check.
pn
g'
'https://version.gitlab.com/check.
sv
g'
end
end
spec/models/project_services/asana_service_spec.rb
浏览文件 @
c0849101
...
...
@@ -40,6 +40,20 @@ describe AsanaService, models: true do
let
(
:user
)
{
create
(
:user
)
}
let
(
:project
)
{
create
(
:project
)
}
def
create_data_for_commits
(
*
messages
)
{
object_kind:
'push'
,
ref:
'master'
,
user_name:
user
.
name
,
commits:
messages
.
map
do
|
m
|
{
message:
m
,
url:
'https://gitlab.com/'
,
}
end
}
end
before
do
@asana
=
AsanaService
.
new
allow
(
@asana
).
to
receive_messages
(
...
...
@@ -51,16 +65,67 @@ describe AsanaService, models: true do
)
end
it
'should call Asana service to created a story'
do
expect
(
Asana
::
Task
).
to
receive
(
:find
).
with
(
'123456'
).
once
it
'should call Asana service to create a story'
do
data
=
create_data_for_commits
(
'Message from commit. related to #123456'
)
expected_message
=
"
#{
data
[
:user_name
]
}
pushed to branch
#{
data
[
:ref
]
}
of
#{
project
.
name_with_namespace
}
(
#{
data
[
:commits
][
0
][
:url
]
}
):
#{
data
[
:commits
][
0
][
:message
]
}
"
@asana
.
check_commit
(
'related to #123456'
,
'pushed'
)
d1
=
double
(
'Asana::Task'
)
expect
(
d1
).
to
receive
(
:add_comment
).
with
(
text:
expected_message
)
expect
(
Asana
::
Task
).
to
receive
(
:find_by_id
).
with
(
anything
,
'123456'
).
once
.
and_return
(
d1
)
@asana
.
execute
(
data
)
end
it
'should call Asana service to created a story and close a task'
do
expect
(
Asana
::
Task
).
to
receive
(
:find
).
with
(
'456789'
).
twice
it
'should call Asana service to create a story and close a task'
do
data
=
create_data_for_commits
(
'fix #456789'
)
d1
=
double
(
'Asana::Task'
)
expect
(
d1
).
to
receive
(
:add_comment
)
expect
(
d1
).
to
receive
(
:update
).
with
(
completed:
true
)
expect
(
Asana
::
Task
).
to
receive
(
:find_by_id
).
with
(
anything
,
'456789'
).
once
.
and_return
(
d1
)
@asana
.
execute
(
data
)
end
it
'should be able to close via url'
do
data
=
create_data_for_commits
(
'closes https://app.asana.com/19292/956299/42'
)
d1
=
double
(
'Asana::Task'
)
expect
(
d1
).
to
receive
(
:add_comment
)
expect
(
d1
).
to
receive
(
:update
).
with
(
completed:
true
)
expect
(
Asana
::
Task
).
to
receive
(
:find_by_id
).
with
(
anything
,
'42'
).
once
.
and_return
(
d1
)
@asana
.
execute
(
data
)
end
it
'should allow multiple matches per line'
do
message
=
<<-
EOF
minor bigfix, refactoring, fixed #123 and Closes #456 work on #789
ref https://app.asana.com/19292/956299/42 and closing https://app.asana.com/19292/956299/12
EOF
data
=
create_data_for_commits
(
message
)
d1
=
double
(
'Asana::Task'
)
expect
(
d1
).
to
receive
(
:add_comment
)
expect
(
d1
).
to
receive
(
:update
).
with
(
completed:
true
)
expect
(
Asana
::
Task
).
to
receive
(
:find_by_id
).
with
(
anything
,
'123'
).
once
.
and_return
(
d1
)
d2
=
double
(
'Asana::Task'
)
expect
(
d2
).
to
receive
(
:add_comment
)
expect
(
d2
).
to
receive
(
:update
).
with
(
completed:
true
)
expect
(
Asana
::
Task
).
to
receive
(
:find_by_id
).
with
(
anything
,
'456'
).
once
.
and_return
(
d2
)
d3
=
double
(
'Asana::Task'
)
expect
(
d3
).
to
receive
(
:add_comment
)
expect
(
Asana
::
Task
).
to
receive
(
:find_by_id
).
with
(
anything
,
'789'
).
once
.
and_return
(
d3
)
d4
=
double
(
'Asana::Task'
)
expect
(
d4
).
to
receive
(
:add_comment
)
expect
(
Asana
::
Task
).
to
receive
(
:find_by_id
).
with
(
anything
,
'42'
).
once
.
and_return
(
d4
)
d5
=
double
(
'Asana::Task'
)
expect
(
d5
).
to
receive
(
:add_comment
)
expect
(
d5
).
to
receive
(
:update
).
with
(
completed:
true
)
expect
(
Asana
::
Task
).
to
receive
(
:find_by_id
).
with
(
anything
,
'12'
).
once
.
and_return
(
d5
)
@asana
.
check_commit
(
'fix #456789'
,
'pushed'
)
@asana
.
execute
(
data
)
end
end
end
spec/services/notification_service_spec.rb
浏览文件 @
c0849101
...
...
@@ -53,7 +53,7 @@ describe NotificationService, services: true do
add_users_with_subscription
(
note
.
project
,
issue
)
# Ensure create SentNotification by noteable = issue 6 times, not noteable = note
expect
(
SentNotification
).
to
receive
(
:record
).
with
(
issue
,
any_args
).
exactly
(
6
).
times
expect
(
SentNotification
).
to
receive
(
:record
).
with
(
issue
,
any_args
).
exactly
(
7
).
times
ActionMailer
::
Base
.
deliveries
.
clear
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录