Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
gitlab-foss
提交
bb8cc946
G
gitlab-foss
项目概览
李少辉-开发者
/
gitlab-foss
通知
15
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gitlab-foss
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
bb8cc946
编写于
3月 30, 2017
作者:
D
Douwe Maan
提交者:
Luke "Jared" Bennett
4月 05, 2017
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Don't use original_discussion_id
上级
2058e71e
变更
25
隐藏空白更改
内联
并排
Showing
25 changed file
with
47 addition
and
183 deletion
+47
-183
app/assets/javascripts/diff_notes/components/comment_resolve_btn.js
.../javascripts/diff_notes/components/comment_resolve_btn.js
+9
-3
app/assets/javascripts/files_comment_button.js
app/assets/javascripts/files_comment_button.js
+1
-1
app/assets/javascripts/notes.js
app/assets/javascripts/notes.js
+14
-18
app/controllers/projects/notes_controller.rb
app/controllers/projects/notes_controller.rb
+1
-6
app/helpers/notes_helper.rb
app/helpers/notes_helper.rb
+4
-8
app/models/concerns/noteable.rb
app/models/concerns/noteable.rb
+1
-1
app/models/diff_discussion.rb
app/models/diff_discussion.rb
+0
-8
app/models/diff_note.rb
app/models/diff_note.rb
+0
-3
app/models/discussion.rb
app/models/discussion.rb
+4
-19
app/models/individual_note_discussion.rb
app/models/individual_note_discussion.rb
+0
-4
app/models/legacy_diff_discussion.rb
app/models/legacy_diff_discussion.rb
+0
-4
app/models/note.rb
app/models/note.rb
+3
-24
app/models/out_of_context_discussion.rb
app/models/out_of_context_discussion.rb
+1
-1
app/models/sent_notification.rb
app/models/sent_notification.rb
+1
-1
app/models/simple_discussion.rb
app/models/simple_discussion.rb
+0
-7
app/services/notes/build_service.rb
app/services/notes/build_service.rb
+1
-3
app/views/discussions/_discussion.html.haml
app/views/discussions/_discussion.html.haml
+1
-1
app/views/discussions/_notes.html.haml
app/views/discussions/_notes.html.haml
+1
-1
lib/gitlab/diff/position.rb
lib/gitlab/diff/position.rb
+1
-1
spec/lib/gitlab/import_export/safe_model_attributes.yml
spec/lib/gitlab/import_export/safe_model_attributes.yml
+0
-1
spec/models/diff_note_spec.rb
spec/models/diff_note_spec.rb
+0
-25
spec/models/note_spec.rb
spec/models/note_spec.rb
+0
-39
spec/models/sent_notification_spec.rb
spec/models/sent_notification_spec.rb
+2
-2
spec/services/notes/build_service_spec.rb
spec/services/notes/build_service_spec.rb
+1
-1
spec/services/notification_service_spec.rb
spec/services/notification_service_spec.rb
+1
-1
未找到文件。
app/assets/javascripts/diff_notes/components/comment_resolve_btn.js
浏览文件 @
bb8cc946
...
@@ -42,10 +42,14 @@ import Vue from 'vue';
...
@@ -42,10 +42,14 @@ import Vue from 'vue';
}
}
},
},
created
()
{
created
()
{
this
.
discussion
=
CommentsStore
.
state
[
this
.
discussionId
];
if
(
this
.
discussionId
)
{
this
.
discussion
=
CommentsStore
.
state
[
this
.
discussionId
];
}
},
},
mounted
:
function
()
{
mounted
:
function
()
{
const
$textarea
=
$
(
`#new-discussion-note-form-
${
this
.
discussionId
}
.note-textarea`
);
if
(
!
this
.
discussionId
)
return
;
const
$textarea
=
$
(
`.js-discussion-note-form[data-discussion-id=
${
this
.
discussionId
}
] .note-textarea`
);
this
.
textareaIsEmpty
=
$textarea
.
val
()
===
''
;
this
.
textareaIsEmpty
=
$textarea
.
val
()
===
''
;
$textarea
.
on
(
'
input.comment-and-resolve-btn
'
,
()
=>
{
$textarea
.
on
(
'
input.comment-and-resolve-btn
'
,
()
=>
{
...
@@ -53,7 +57,9 @@ import Vue from 'vue';
...
@@ -53,7 +57,9 @@ import Vue from 'vue';
});
});
},
},
destroyed
:
function
()
{
destroyed
:
function
()
{
$
(
`#new-discussion-note-form-
${
this
.
discussionId
}
.note-textarea`
).
off
(
'
input.comment-and-resolve-btn
'
);
if
(
!
this
.
discussionId
)
return
;
$
(
`.js-discussion-note-form[data-discussion-id=
${
this
.
discussionId
}
] .note-textarea`
).
off
(
'
input.comment-and-resolve-btn
'
);
}
}
});
});
...
...
app/assets/javascripts/files_comment_button.js
浏览文件 @
bb8cc946
...
@@ -131,7 +131,7 @@ window.FilesCommentButton = (function() {
...
@@ -131,7 +131,7 @@ window.FilesCommentButton = (function() {
};
};
FilesCommentButton
.
prototype
.
validateLineContent
=
function
(
lineContentElement
)
{
FilesCommentButton
.
prototype
.
validateLineContent
=
function
(
lineContentElement
)
{
return
lineContentElement
.
attr
(
'
data-
discussion-id
'
)
&&
lineContentElement
.
attr
(
'
data-discussion-id
'
)
!==
''
;
return
lineContentElement
.
attr
(
'
data-
note-type
'
)
&&
lineContentElement
.
attr
(
'
data-note-type
'
)
!==
''
;
};
};
return
FilesCommentButton
;
return
FilesCommentButton
;
...
...
app/assets/javascripts/notes.js
浏览文件 @
bb8cc946
...
@@ -272,10 +272,10 @@ require('./task_list');
...
@@ -272,10 +272,10 @@ require('./task_list');
Note: for rendering inline notes use renderDiscussionNote
Note: for rendering inline notes use renderDiscussionNote
*/
*/
Notes
.
prototype
.
renderNote
=
function
(
note
)
{
Notes
.
prototype
.
renderNote
=
function
(
note
,
$form
)
{
var
$notesList
;
var
$notesList
;
if
(
note
.
discussion_html
!=
null
)
{
if
(
note
.
discussion_html
!=
null
)
{
return
this
.
renderDiscussionNote
(
note
);
return
this
.
renderDiscussionNote
(
note
,
$form
);
}
}
if
(
!
note
.
valid
)
{
if
(
!
note
.
valid
)
{
...
@@ -317,16 +317,13 @@ require('./task_list');
...
@@ -317,16 +317,13 @@ require('./task_list');
Note: for rendering inline notes use renderDiscussionNote
Note: for rendering inline notes use renderDiscussionNote
*/
*/
Notes
.
prototype
.
renderDiscussionNote
=
function
(
note
)
{
Notes
.
prototype
.
renderDiscussionNote
=
function
(
note
,
$form
)
{
var
discussionContainer
,
form
,
note_html
,
row
,
lineType
,
diffAvatarContainer
;
var
discussionContainer
,
form
,
note_html
,
row
,
lineType
,
diffAvatarContainer
;
if
(
!
this
.
isNewNote
(
note
))
{
if
(
!
this
.
isNewNote
(
note
))
{
return
;
return
;
}
}
this
.
note_ids
.
push
(
note
.
id
);
this
.
note_ids
.
push
(
note
.
id
);
form
=
$
(
"
.js-discussion-note-form[data-discussion-id='
"
+
note
.
discussion_id
+
"
']
"
);
form
=
$form
||
$
(
"
.js-discussion-note-form[data-discussion-id='
"
+
note
.
discussion_id
+
"
']
"
);
if
(
form
.
length
===
0
)
{
form
=
$
(
"
.js-discussion-note-form[data-original-discussion-id='
"
+
note
.
original_discussion_id
+
"
']
"
);
}
row
=
form
.
closest
(
"
tr
"
);
row
=
form
.
closest
(
"
tr
"
);
lineType
=
this
.
isParallelView
()
?
form
.
find
(
'
#line_type
'
).
val
()
:
'
old
'
;
lineType
=
this
.
isParallelView
()
?
form
.
find
(
'
#line_type
'
).
val
()
:
'
old
'
;
diffAvatarContainer
=
row
.
prevAll
(
'
.line_holder
'
).
first
().
find
(
'
.js-avatar-container.
'
+
lineType
+
'
_line
'
);
diffAvatarContainer
=
row
.
prevAll
(
'
.line_holder
'
).
first
().
find
(
'
.js-avatar-container.
'
+
lineType
+
'
_line
'
);
...
@@ -334,8 +331,8 @@ require('./task_list');
...
@@ -334,8 +331,8 @@ require('./task_list');
note_html
.
renderGFM
();
note_html
.
renderGFM
();
// is this the first note of discussion?
// is this the first note of discussion?
discussionContainer
=
$
(
"
.notes[data-discussion-id='
"
+
note
.
discussion_id
+
"
']
"
);
discussionContainer
=
$
(
"
.notes[data-discussion-id='
"
+
note
.
discussion_id
+
"
']
"
);
if
(
discussionContainer
.
length
===
0
)
{
if
(
!
discussionContainer
.
length
)
{
discussionContainer
=
$
(
"
.notes[data-original-discussion-id='
"
+
note
.
original_discussion_id
+
"
']
"
);
discussionContainer
=
form
.
closest
(
'
.discussion
'
).
find
(
'
.notes
'
);
}
}
if
(
discussionContainer
.
length
===
0
)
{
if
(
discussionContainer
.
length
===
0
)
{
if
(
!
this
.
isParallelView
()
||
row
.
hasClass
(
'
js-temp-notes-holder
'
))
{
if
(
!
this
.
isParallelView
()
||
row
.
hasClass
(
'
js-temp-notes-holder
'
))
{
...
@@ -525,7 +522,7 @@ require('./task_list');
...
@@ -525,7 +522,7 @@ require('./task_list');
}
}
}
}
this
.
renderNote
(
note
);
this
.
renderNote
(
note
,
$form
);
// cleanup after successfully creating a diff/discussion note
// cleanup after successfully creating a diff/discussion note
this
.
removeDiscussionNoteForm
(
$form
);
this
.
removeDiscussionNoteForm
(
$form
);
};
};
...
@@ -749,13 +746,13 @@ require('./task_list');
...
@@ -749,13 +746,13 @@ require('./task_list');
// setup note target
// setup note target
var
discussionID
=
dataHolder
.
data
(
"
discussionId
"
);
var
discussionID
=
dataHolder
.
data
(
"
discussionId
"
);
form
.
attr
(
'
id
'
,
"
new-discussion-note-form-
"
+
discussionID
);
if
(
discussionID
)
{
form
.
attr
(
"
data-discussion-id
"
,
discussionID
);
form
.
attr
(
"
data-discussion-id
"
,
discussionID
);
form
.
attr
(
"
data-original-discussion-id
"
,
dataHolder
.
data
(
"
originalDiscussionId
"
)
||
discussionID
);
form
.
find
(
"
#in_reply_to_discussion_id
"
).
val
(
discussionID
);
form
.
attr
(
"
data-line-code
"
,
dataHolder
.
data
(
"
lineCode
"
));
}
form
.
attr
(
"
data-line-code
"
,
dataHolder
.
data
(
"
lineCode
"
));
form
.
find
(
"
#line_type
"
).
val
(
dataHolder
.
data
(
"
lineType
"
));
form
.
find
(
"
#line_type
"
).
val
(
dataHolder
.
data
(
"
lineType
"
));
form
.
find
(
"
#in_reply_to_discussion_id
"
).
val
(
dataHolder
.
data
(
"
originalDiscussionId
"
));
form
.
find
(
"
#note_noteable_type
"
).
val
(
dataHolder
.
data
(
"
noteableType
"
));
form
.
find
(
"
#note_noteable_type
"
).
val
(
dataHolder
.
data
(
"
noteableType
"
));
form
.
find
(
"
#note_noteable_id
"
).
val
(
dataHolder
.
data
(
"
noteableId
"
));
form
.
find
(
"
#note_noteable_id
"
).
val
(
dataHolder
.
data
(
"
noteableId
"
));
...
@@ -775,8 +772,7 @@ require('./task_list');
...
@@ -775,8 +772,7 @@ require('./task_list');
if
(
typeof
gl
.
diffNotesCompileComponents
!==
'
undefined
'
)
{
if
(
typeof
gl
.
diffNotesCompileComponents
!==
'
undefined
'
)
{
var
$commentBtn
=
form
.
find
(
'
comment-and-resolve-btn
'
);
var
$commentBtn
=
form
.
find
(
'
comment-and-resolve-btn
'
);
$commentBtn
$commentBtn
.
attr
(
'
:discussion-id
'
,
"
'
"
+
discussionID
+
"
'
"
);
.
attr
(
'
:discussion-id
'
,
"
'
"
+
dataHolder
.
data
(
'
discussionId
'
)
+
"
'
"
);
gl
.
diffNotesCompileComponents
();
gl
.
diffNotesCompileComponents
();
}
}
...
@@ -784,7 +780,7 @@ require('./task_list');
...
@@ -784,7 +780,7 @@ require('./task_list');
form
.
find
(
"
.js-note-text
"
).
focus
();
form
.
find
(
"
.js-note-text
"
).
focus
();
form
form
.
find
(
'
.js-comment-resolve-button
'
)
.
find
(
'
.js-comment-resolve-button
'
)
.
attr
(
'
data-discussion-id
'
,
d
ataHolder
.
data
(
'
discussionId
'
)
);
.
attr
(
'
data-discussion-id
'
,
d
iscussionID
);
form
form
.
removeClass
(
'
js-main-target-form
'
)
.
removeClass
(
'
js-main-target-form
'
)
.
addClass
(
"
discussion-form js-discussion-note-form
"
);
.
addClass
(
"
discussion-form js-discussion-note-form
"
);
...
...
app/controllers/projects/notes_controller.rb
浏览文件 @
bb8cc946
...
@@ -173,12 +173,7 @@ class Projects::NotesController < Projects::ApplicationController
...
@@ -173,12 +173,7 @@ class Projects::NotesController < Projects::ApplicationController
discussion_resolvable:
discussion
.
resolvable?
,
discussion_resolvable:
discussion
.
resolvable?
,
diff_discussion_html:
diff_discussion_html
(
discussion
),
diff_discussion_html:
diff_discussion_html
(
discussion
),
discussion_html:
discussion_html
(
discussion
),
discussion_html:
discussion_html
(
discussion
)
# Since the `discussion_id` can change, for example when new commits are pushed into an MR,
# the never-changing `original_discussion_id` is used as a fallback to the find the relevant
# discussion container to add this note to.
original_discussion_id:
note
.
original_discussion_id
)
)
end
end
else
else
...
...
app/helpers/notes_helper.rb
浏览文件 @
bb8cc946
...
@@ -53,23 +53,19 @@ module NotesHelper
...
@@ -53,23 +53,19 @@ module NotesHelper
}
}
if
use_legacy_diff_note
if
use_legacy_diff_note
new_note
=
LegacyDiffNote
.
new
(
@new_diff_note_attrs
.
merge
(
line_code:
line_code
))
data
[
:note_type
]
=
LegacyDiffNote
.
name
else
else
new_note
=
DiffNote
.
new
(
@new_diff_note_attrs
.
merge
(
position:
position
))
data
[
:note_type
]
=
DiffNote
.
name
data
[
:position
]
=
position
.
to_json
data
[
:position
]
=
position
.
to_json
end
end
data
.
merge
(
data
note_type:
new_note
.
type
,
discussion_id:
new_note
.
discussion_class
.
discussion_id
(
new_note
)
)
end
end
def
link_to_reply_discussion
(
discussion
,
line_type
=
nil
)
def
link_to_reply_discussion
(
discussion
,
line_type
=
nil
)
return
unless
current_user
return
unless
current_user
data
=
{
discussion_id:
discussion
.
id
,
original_discussion_id:
discussion
.
original_id
,
line_type:
line_type
}
data
=
{
discussion_id:
discussion
.
id
,
line_type:
line_type
}
data
[
:line_code
]
=
discussion
.
line_code
if
discussion
.
respond_to?
(
:line_code
)
data
[
:line_code
]
=
discussion
.
line_code
if
discussion
.
respond_to?
(
:line_code
)
button_tag
'Reply...'
,
class:
'btn btn-text-field js-discussion-reply-button'
,
button_tag
'Reply...'
,
class:
'btn btn-text-field js-discussion-reply-button'
,
...
...
app/models/concerns/noteable.rb
浏览文件 @
bb8cc946
...
@@ -3,7 +3,7 @@ module Noteable
...
@@ -3,7 +3,7 @@ module Noteable
notes
notes
end
end
delegate
:find_discussion
,
:find_original_discussion
,
to: :discussion_notes
delegate
:find_discussion
,
to: :discussion_notes
def
discussions
def
discussions
@discussions
||=
discussion_notes
@discussions
||=
discussion_notes
...
...
app/models/diff_discussion.rb
浏览文件 @
bb8cc946
...
@@ -6,14 +6,6 @@ class DiffDiscussion < Discussion
...
@@ -6,14 +6,6 @@ class DiffDiscussion < Discussion
to: :first_note
to: :first_note
def
self
.
build_discussion_id
(
note
)
[
*
super
(
note
),
*
note
.
position
.
key
]
end
def
self
.
build_original_discussion_id
(
note
)
[
*
Discussion
.
build_discussion_id
(
note
),
*
note
.
original_position
.
key
]
end
def
legacy_diff_discussion?
def
legacy_diff_discussion?
false
false
end
end
...
...
app/models/diff_note.rb
浏览文件 @
bb8cc946
...
@@ -16,9 +16,6 @@ class DiffNote < Note
...
@@ -16,9 +16,6 @@ class DiffNote < Note
before_validation
:set_original_position
,
:update_position
,
on: :create
before_validation
:set_original_position
,
:update_position
,
on: :create
before_validation
:set_line_code
before_validation
:set_line_code
# We need to do this again, because it's already in `Note`, but is affected by
# `update_position` and needs to run after that.
before_validation
:set_discussion_id
,
if: :position_changed?
after_save
:keep_around_commits
after_save
:keep_around_commits
def
discussion_class
(
*
)
def
discussion_class
(
*
)
...
...
app/models/discussion.rb
浏览文件 @
bb8cc946
...
@@ -34,24 +34,13 @@ class Discussion
...
@@ -34,24 +34,13 @@ class Discussion
nil
nil
end
end
def
self
.
build_discussion_id
(
note
)
def
self
.
build_discussion_id
_base
(
note
)
noteable_id
=
note
.
noteable_id
||
note
.
commit_id
noteable_id
=
note
.
noteable_id
||
note
.
commit_id
[
:discussion
,
note
.
noteable_type
.
try
(
:underscore
),
noteable_id
]
[
:discussion
,
note
.
noteable_type
.
try
(
:underscore
),
noteable_id
]
end
end
def
self
.
original_discussion_id
(
note
)
def
self
.
build_discussion_id
(
note
)
original_discussion_id
=
build_original_discussion_id
(
note
)
[
*
build_discussion_id_base
(
note
),
SecureRandom
.
hex
]
if
original_discussion_id
Digest
::
SHA1
.
hexdigest
(
original_discussion_id
.
join
(
"-"
))
else
note
.
discussion_id
end
end
# Optionally build a separate original discussion ID that will never change,
# if the main discussion ID _can_ change, like in the case of DiffDiscussion.
def
self
.
build_original_discussion_id
(
note
)
nil
end
end
def
initialize
(
notes
,
noteable
=
nil
)
def
initialize
(
notes
,
noteable
=
nil
)
...
@@ -80,10 +69,6 @@ class Discussion
...
@@ -80,10 +69,6 @@ class Discussion
alias_method
:to_param
,
:id
alias_method
:to_param
,
:id
def
original_id
first_note
.
original_discussion_id
end
def
diff_discussion?
def
diff_discussion?
false
false
end
end
...
@@ -109,7 +94,7 @@ class Discussion
...
@@ -109,7 +94,7 @@ class Discussion
end
end
def
reply_attributes
def
reply_attributes
first_note
.
slice
(
:type
,
:noteable_type
,
:noteable_id
,
:commit_id
)
first_note
.
slice
(
:type
,
:noteable_type
,
:noteable_id
,
:commit_id
,
:discussion_id
)
end
end
private
private
...
...
app/models/individual_note_discussion.rb
浏览文件 @
bb8cc946
class
IndividualNoteDiscussion
<
Discussion
class
IndividualNoteDiscussion
<
Discussion
def
self
.
build_discussion_id
(
note
)
[
*
super
(
note
),
SecureRandom
.
hex
]
end
# Keep this method in sync with the `potentially_resolvable` scope on `ResolvableNote`
# Keep this method in sync with the `potentially_resolvable` scope on `ResolvableNote`
def
potentially_resolvable?
def
potentially_resolvable?
false
false
...
...
app/models/legacy_diff_discussion.rb
浏览文件 @
bb8cc946
class
LegacyDiffDiscussion
<
Discussion
class
LegacyDiffDiscussion
<
Discussion
include
DiscussionOnDiff
include
DiscussionOnDiff
def
self
.
build_discussion_id
(
note
)
[
*
super
(
note
),
note
.
line_code
]
end
def
legacy_diff_discussion?
def
legacy_diff_discussion?
true
true
end
end
...
...
app/models/note.rb
浏览文件 @
bb8cc946
...
@@ -52,7 +52,7 @@ class Note < ActiveRecord::Base
...
@@ -52,7 +52,7 @@ class Note < ActiveRecord::Base
validates
:noteable_id
,
presence:
true
,
unless:
[
:for_commit?
,
:importing?
]
validates
:noteable_id
,
presence:
true
,
unless:
[
:for_commit?
,
:importing?
]
validates
:commit_id
,
presence:
true
,
if: :for_commit?
validates
:commit_id
,
presence:
true
,
if: :for_commit?
validates
:author
,
presence:
true
validates
:author
,
presence:
true
validates
:discussion_id
,
:original_discussion_id
,
presence:
true
,
format:
{
with:
/\A\h{40}\z/
}
validates
:discussion_id
,
presence:
true
,
format:
{
with:
/\A\h{40}\z/
}
validate
unless:
[
:for_commit?
,
:importing?
,
:for_personal_snippet?
]
do
|
note
|
validate
unless:
[
:for_commit?
,
:importing?
,
:for_personal_snippet?
]
do
|
note
|
unless
note
.
noteable
.
try
(
:project
)
==
note
.
project
unless
note
.
noteable
.
try
(
:project
)
==
note
.
project
...
@@ -84,9 +84,9 @@ class Note < ActiveRecord::Base
...
@@ -84,9 +84,9 @@ class Note < ActiveRecord::Base
project:
[
:project_members
,
{
group:
[
:group_members
]
}])
project:
[
:project_members
,
{
group:
[
:group_members
]
}])
end
end
after_initialize
:ensure_discussion_id
,
:ensure_original_discussion_id
after_initialize
:ensure_discussion_id
before_validation
:nullify_blank_type
,
:nullify_blank_line_code
before_validation
:nullify_blank_type
,
:nullify_blank_line_code
before_validation
:set_discussion_id
,
:set_original_discussion_id
,
on: :create
before_validation
:set_discussion_id
,
on: :create
after_save
:keep_around_commit
,
unless: :for_personal_snippet?
after_save
:keep_around_commit
,
unless: :for_personal_snippet?
after_save
:expire_etag_cache
after_save
:expire_etag_cache
...
@@ -99,13 +99,6 @@ class Note < ActiveRecord::Base
...
@@ -99,13 +99,6 @@ class Note < ActiveRecord::Base
Discussion
.
build_collection
(
fresh
,
noteable
)
Discussion
.
build_collection
(
fresh
,
noteable
)
end
end
def
find_original_discussion
(
discussion_id
)
note
=
find_by
(
original_discussion_id:
discussion_id
)
return
unless
note
note
.
to_discussion
end
def
find_discussion
(
discussion_id
)
def
find_discussion
(
discussion_id
)
notes
=
where
(
discussion_id:
discussion_id
).
fresh
.
to_a
notes
=
where
(
discussion_id:
discussion_id
).
fresh
.
to_a
return
if
notes
.
empty?
return
if
notes
.
empty?
...
@@ -309,20 +302,6 @@ class Note < ActiveRecord::Base
...
@@ -309,20 +302,6 @@ class Note < ActiveRecord::Base
self
.
discussion_id
||=
discussion_class
.
discussion_id
(
self
)
self
.
discussion_id
||=
discussion_class
.
discussion_id
(
self
)
end
end
def
ensure_original_discussion_id
return
unless
self
.
persisted?
# Needed in case the SELECT statement doesn't ask for `original_discussion_id`
return
unless
self
.
has_attribute?
(:
original_discussion_id
)
return
if
self
.
original_discussion_id
set_original_discussion_id
update_column
(
:original_discussion_id
,
self
.
original_discussion_id
)
end
def
set_original_discussion_id
self
.
original_discussion_id
=
discussion_class
.
original_discussion_id
(
self
)
end
def
expire_etag_cache
def
expire_etag_cache
return
unless
for_issue?
return
unless
for_issue?
...
...
app/models/out_of_context_discussion.rb
浏览文件 @
bb8cc946
...
@@ -2,7 +2,7 @@ class OutOfContextDiscussion < Discussion
...
@@ -2,7 +2,7 @@ class OutOfContextDiscussion < Discussion
# To make sure all out-of-context notes are displayed in one discussion,
# To make sure all out-of-context notes are displayed in one discussion,
# we override the discussion ID to be a newly generated but consistent ID.
# we override the discussion ID to be a newly generated but consistent ID.
def
self
.
override_discussion_id
(
note
)
def
self
.
override_discussion_id
(
note
)
discussion_id
(
note
)
Digest
::
SHA1
.
hexdigest
(
build_discussion_id_base
(
note
).
join
(
"-"
)
)
end
end
# Keep this method in sync with the `potentially_resolvable` scope on `ResolvableNote`
# Keep this method in sync with the `potentially_resolvable` scope on `ResolvableNote`
...
...
app/models/sent_notification.rb
浏览文件 @
bb8cc946
...
@@ -46,7 +46,7 @@ class SentNotification < ActiveRecord::Base
...
@@ -46,7 +46,7 @@ class SentNotification < ActiveRecord::Base
end
end
def
record_note
(
note
,
recipient_id
,
reply_key
=
self
.
reply_key
,
attrs
=
{})
def
record_note
(
note
,
recipient_id
,
reply_key
=
self
.
reply_key
,
attrs
=
{})
attrs
[
:in_reply_to_discussion_id
]
=
note
.
original_
discussion_id
attrs
[
:in_reply_to_discussion_id
]
=
note
.
discussion_id
record
(
note
.
noteable
,
recipient_id
,
reply_key
,
attrs
)
record
(
note
.
noteable
,
recipient_id
,
reply_key
,
attrs
)
end
end
...
...
app/models/simple_discussion.rb
浏览文件 @
bb8cc946
class
SimpleDiscussion
<
Discussion
class
SimpleDiscussion
<
Discussion
def
self
.
build_discussion_id
(
note
)
[
*
super
(
note
),
SecureRandom
.
hex
]
end
def
reply_attributes
super
.
merge
(
discussion_id:
self
.
id
)
end
end
end
app/services/notes/build_service.rb
浏览文件 @
bb8cc946
...
@@ -5,9 +5,7 @@ module Notes
...
@@ -5,9 +5,7 @@ module Notes
new_discussion
=
params
.
delete
(
:new_discussion
)
new_discussion
=
params
.
delete
(
:new_discussion
)
if
project
&&
in_reply_to_discussion_id
.
present?
if
project
&&
in_reply_to_discussion_id
.
present?
discussion
=
discussion
=
project
.
notes
.
find_discussion
(
in_reply_to_discussion_id
)
project
.
notes
.
find_original_discussion
(
in_reply_to_discussion_id
)
||
project
.
notes
.
find_discussion
(
in_reply_to_discussion_id
)
unless
discussion
unless
discussion
note
=
Note
.
new
note
=
Note
.
new
...
...
app/views/discussions/_discussion.html.haml
浏览文件 @
bb8cc946
...
@@ -5,7 +5,7 @@
...
@@ -5,7 +5,7 @@
=
link_to
user_path
(
discussion
.
author
)
do
=
link_to
user_path
(
discussion
.
author
)
do
=
image_tag
avatar_icon
(
discussion
.
author
),
class:
"avatar s40"
=
image_tag
avatar_icon
(
discussion
.
author
),
class:
"avatar s40"
.timeline-content
.timeline-content
.discussion.js-toggle-container
{
class:
discussion
.
id
,
data:
{
discussion_id:
discussion
.
id
}
}
.discussion.js-toggle-container
{
data:
{
discussion_id:
discussion
.
id
}
}
.discussion-header
.discussion-header
.discussion-actions
.discussion-actions
%button
.note-action-button.discussion-toggle-button.js-toggle-button
{
type:
"button"
}
%button
.note-action-button.discussion-toggle-button.js-toggle-button
{
type:
"button"
}
...
...
app/views/discussions/_notes.html.haml
浏览文件 @
bb8cc946
%ul
.notes
{
data:
{
discussion_id:
discussion
.
id
,
original_discussion_id:
discussion
.
original_id
}
}
%ul
.notes
{
data:
{
discussion_id:
discussion
.
id
}
}
=
render
partial:
"projects/notes/note"
,
collection:
discussion
.
notes
,
as: :note
=
render
partial:
"projects/notes/note"
,
collection:
discussion
.
notes
,
as: :note
-
if
current_user
-
if
current_user
...
...
lib/gitlab/diff/position.rb
浏览文件 @
bb8cc946
...
@@ -42,7 +42,7 @@ module Gitlab
...
@@ -42,7 +42,7 @@ module Gitlab
def
encode_with
(
coder
)
def
encode_with
(
coder
)
coder
[
'attributes'
]
=
self
.
to_h
coder
[
'attributes'
]
=
self
.
to_h
end
end
def
key
def
key
@key
||=
[
base_sha
,
start_sha
,
head_sha
,
Digest
::
SHA1
.
hexdigest
(
old_path
||
""
),
Digest
::
SHA1
.
hexdigest
(
new_path
||
""
),
old_line
,
new_line
]
@key
||=
[
base_sha
,
start_sha
,
head_sha
,
Digest
::
SHA1
.
hexdigest
(
old_path
||
""
),
Digest
::
SHA1
.
hexdigest
(
new_path
||
""
),
old_line
,
new_line
]
end
end
...
...
spec/lib/gitlab/import_export/safe_model_attributes.yml
浏览文件 @
bb8cc946
...
@@ -55,7 +55,6 @@ Note:
...
@@ -55,7 +55,6 @@ Note:
-
resolved_at
-
resolved_at
-
resolved_by_id
-
resolved_by_id
-
discussion_id
-
discussion_id
-
original_discussion_id
LabelLink
:
LabelLink
:
-
id
-
id
-
label_id
-
label_id
...
...
spec/models/diff_note_spec.rb
浏览文件 @
bb8cc946
...
@@ -239,29 +239,4 @@ describe DiffNote, models: true do
...
@@ -239,29 +239,4 @@ describe DiffNote, models: true do
end
end
end
end
end
end
describe
"#original_discussion_id"
do
let
(
:note
)
{
create
(
:diff_note_on_merge_request
)
}
context
"when it is newly created"
do
it
"has a discussion id"
do
expect
(
note
.
original_discussion_id
).
not_to
be_nil
expect
(
note
.
original_discussion_id
).
to
match
(
/\A\h{40}\z/
)
end
end
context
"when it didn't store a discussion id before"
do
before
do
note
.
update_column
(
:original_discussion_id
,
nil
)
end
it
"has a discussion id"
do
# The original_discussion_id is set in `after_initialize`, so `reload` won't work
reloaded_note
=
Note
.
find
(
note
.
id
)
expect
(
reloaded_note
.
original_discussion_id
).
not_to
be_nil
expect
(
reloaded_note
.
original_discussion_id
).
to
match
(
/\A\h{40}\z/
)
end
end
end
end
end
spec/models/note_spec.rb
浏览文件 @
bb8cc946
...
@@ -245,20 +245,6 @@ describe Note, models: true do
...
@@ -245,20 +245,6 @@ describe Note, models: true do
end
end
end
end
describe
'.find_original_discussion'
do
let!
(
:note
)
{
create
(
:discussion_note_on_merge_request
)
}
let!
(
:note2
)
{
create
(
:discussion_note_on_merge_request
,
in_reply_to:
note
)
}
let
(
:merge_request
)
{
note
.
noteable
}
it
'returns a discussion with one note'
do
discussion
=
merge_request
.
notes
.
find_original_discussion
(
note
.
original_discussion_id
)
expect
(
discussion
).
not_to
be_nil
expect
(
discussion
.
notes
.
count
).
to
be
(
1
)
expect
(
discussion
.
first_note
.
original_discussion_id
).
to
eq
(
note
.
original_discussion_id
)
end
end
describe
'.find_discussion'
do
describe
'.find_discussion'
do
let!
(
:note
)
{
create
(
:discussion_note_on_merge_request
)
}
let!
(
:note
)
{
create
(
:discussion_note_on_merge_request
)
}
let!
(
:note2
)
{
create
(
:discussion_note_on_merge_request
,
in_reply_to:
note
)
}
let!
(
:note2
)
{
create
(
:discussion_note_on_merge_request
,
in_reply_to:
note
)
}
...
@@ -499,31 +485,6 @@ describe Note, models: true do
...
@@ -499,31 +485,6 @@ describe Note, models: true do
end
end
end
end
describe
"#original_discussion_id"
do
let
(
:note
)
{
create
(
:diff_note_on_merge_request
)
}
context
"when it is newly created"
do
it
"has a discussion id"
do
expect
(
note
.
original_discussion_id
).
not_to
be_nil
expect
(
note
.
original_discussion_id
).
to
match
(
/\A\h{40}\z/
)
end
end
context
"when it didn't store a discussion id before"
do
before
do
note
.
update_column
(
:original_discussion_id
,
nil
)
end
it
"has a discussion id"
do
# The original_discussion_id is set in `after_initialize`, so `reload` won't work
reloaded_note
=
Note
.
find
(
note
.
id
)
expect
(
reloaded_note
.
original_discussion_id
).
not_to
be_nil
expect
(
reloaded_note
.
original_discussion_id
).
to
match
(
/\A\h{40}\z/
)
end
end
end
describe
'#to_discussion'
do
describe
'#to_discussion'
do
subject
{
create
(
:discussion_note_on_merge_request
)
}
subject
{
create
(
:discussion_note_on_merge_request
)
}
let!
(
:note2
)
{
create
(
:discussion_note_on_merge_request
,
project:
subject
.
project
,
noteable:
subject
.
noteable
,
in_reply_to:
subject
)
}
let!
(
:note2
)
{
create
(
:discussion_note_on_merge_request
,
project:
subject
.
project
,
noteable:
subject
.
noteable
,
in_reply_to:
subject
)
}
...
...
spec/models/sent_notification_spec.rb
浏览文件 @
bb8cc946
...
@@ -12,7 +12,7 @@ describe SentNotification, model: true do
...
@@ -12,7 +12,7 @@ describe SentNotification, model: true do
end
end
context
"when the project doesn't match the discussion project"
do
context
"when the project doesn't match the discussion project"
do
let
(
:discussion_id
)
{
create
(
:note
).
original_
discussion_id
}
let
(
:discussion_id
)
{
create
(
:note
).
discussion_id
}
subject
{
build
(
:sent_notification
,
in_reply_to_discussion_id:
discussion_id
)
}
subject
{
build
(
:sent_notification
,
in_reply_to_discussion_id:
discussion_id
)
}
it
"is invalid"
do
it
"is invalid"
do
...
@@ -23,7 +23,7 @@ describe SentNotification, model: true do
...
@@ -23,7 +23,7 @@ describe SentNotification, model: true do
context
"when the noteable project and discussion project match"
do
context
"when the noteable project and discussion project match"
do
let
(
:project
)
{
create
(
:project
)
}
let
(
:project
)
{
create
(
:project
)
}
let
(
:issue
)
{
create
(
:issue
,
project:
project
)
}
let
(
:issue
)
{
create
(
:issue
,
project:
project
)
}
let
(
:discussion_id
)
{
create
(
:note
,
project:
project
,
noteable:
issue
).
original_
discussion_id
}
let
(
:discussion_id
)
{
create
(
:note
,
project:
project
,
noteable:
issue
).
discussion_id
}
subject
{
build
(
:sent_notification
,
project:
project
,
noteable:
issue
,
in_reply_to_discussion_id:
discussion_id
)
}
subject
{
build
(
:sent_notification
,
project:
project
,
noteable:
issue
,
in_reply_to_discussion_id:
discussion_id
)
}
it
"is valid"
do
it
"is valid"
do
...
...
spec/services/notes/build_service_spec.rb
浏览文件 @
bb8cc946
...
@@ -9,7 +9,7 @@ describe Notes::BuildService, services: true do
...
@@ -9,7 +9,7 @@ describe Notes::BuildService, services: true do
context
'when in_reply_to_discussion_id is specified'
do
context
'when in_reply_to_discussion_id is specified'
do
context
'when a note with that original discussion ID exists'
do
context
'when a note with that original discussion ID exists'
do
it
'sets the note up to be in reply to that note'
do
it
'sets the note up to be in reply to that note'
do
new_note
=
described_class
.
new
(
project
,
author
,
note:
'Test'
,
in_reply_to_discussion_id:
note
.
original_
discussion_id
).
execute
new_note
=
described_class
.
new
(
project
,
author
,
note:
'Test'
,
in_reply_to_discussion_id:
note
.
discussion_id
).
execute
expect
(
new_note
).
to
be_valid
expect
(
new_note
).
to
be_valid
expect
(
new_note
.
in_reply_to?
(
note
)).
to
be_truthy
expect
(
new_note
.
in_reply_to?
(
note
)).
to
be_truthy
end
end
...
...
spec/services/notification_service_spec.rb
浏览文件 @
bb8cc946
...
@@ -439,7 +439,7 @@ describe NotificationService, services: true do
...
@@ -439,7 +439,7 @@ describe NotificationService, services: true do
notification
.
new_note
(
note
)
notification
.
new_note
(
note
)
expect
(
SentNotification
.
last
.
in_reply_to_discussion_id
).
to
eq
(
note
.
original_
discussion_id
)
expect
(
SentNotification
.
last
.
in_reply_to_discussion_id
).
to
eq
(
note
.
discussion_id
)
end
end
end
end
end
end
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录