Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
gitcode_dev
csdn-workflow
提交
c17f1492
C
csdn-workflow
项目概览
gitcode_dev
/
csdn-workflow
通知
124
Star
11
Fork
5
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
1
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
csdn-workflow
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
1
合并请求
1
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
c17f1492
编写于
4月 20, 2021
作者:
T
Tomas Vik
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor: show commenting range for old MR diff file
上级
a8d6bb8e
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
119 addition
and
22 deletion
+119
-22
src/data_providers/items/changed_file_item.ts
src/data_providers/items/changed_file_item.ts
+9
-7
src/data_providers/items/mr_item_model.ts
src/data_providers/items/mr_item_model.ts
+11
-9
src/review/commenting_range_provider.test.ts
src/review/commenting_range_provider.test.ts
+49
-0
src/review/commenting_range_provider.ts
src/review/commenting_range_provider.ts
+31
-0
src/review/git_content_provider.test.ts
src/review/git_content_provider.test.ts
+1
-0
src/review/gitlab_comment_thread.ts
src/review/gitlab_comment_thread.ts
+3
-1
src/review/review_uri.test.ts
src/review/review_uri.test.ts
+2
-1
src/review/review_uri.ts
src/review/review_uri.ts
+13
-4
未找到文件。
src/data_providers/items/changed_file_item.ts
浏览文件 @
c17f1492
import
{
TreeItem
,
Uri
}
from
'
vscode
'
;
import
{
posix
as
path
}
from
'
path
'
;
import
{
toReviewUri
}
from
'
../../review/review_uri
'
;
import
{
toReviewUri
,
ReviewParams
}
from
'
../../review/review_uri
'
;
import
{
PROGRAMMATIC_COMMANDS
,
VS_COMMANDS
}
from
'
../../command_names
'
;
import
{
ADDED
,
DELETED
,
RENAMED
,
MODIFIED
}
from
'
../../constants
'
;
...
...
@@ -63,23 +63,25 @@ export class ChangedFileItem extends TreeItem {
};
return
;
}
const
emptyFileUri
=
toReviewUri
({
workspacePath
:
workspace
.
uri
,
projectId
:
mr
.
project_id
});
const
commonParams
:
ReviewParams
=
{
workspacePath
:
workspace
.
uri
,
projectId
:
mr
.
project_id
,
mrId
:
mr
.
id
,
};
const
emptyFileUri
=
toReviewUri
(
commonParams
);
const
baseFileUri
=
file
.
new_file
?
emptyFileUri
:
toReviewUri
({
...
commonParams
,
path
:
file
.
old_path
,
commit
:
mrVersion
.
base_commit_sha
,
workspacePath
:
workspace
.
uri
,
projectId
:
mr
.
project_id
,
});
const
headFileUri
=
file
.
deleted_file
?
emptyFileUri
:
toReviewUri
({
...
commonParams
,
path
:
file
.
new_path
,
commit
:
mrVersion
.
head_commit_sha
,
workspacePath
:
workspace
.
uri
,
projectId
:
mr
.
project_id
,
});
this
.
command
=
{
...
...
src/data_providers/items/mr_item_model.ts
浏览文件 @
c17f1492
...
...
@@ -7,6 +7,7 @@ import { GqlDiscussion, GqlTextDiffDiscussion } from '../../gitlab/gitlab_new_se
import
{
handleError
}
from
'
../../log
'
;
import
{
UserFriendlyError
}
from
'
../../errors/user_friendly_error
'
;
import
{
GitLabCommentThread
}
from
'
../../review/gitlab_comment_thread
'
;
import
{
CommentingRangeProvider
}
from
'
../../review/commenting_range_provider
'
;
const
isTextDiffDiscussion
=
(
discussion
:
GqlDiscussion
):
discussion
is
GqlTextDiffDiscussion
=>
{
const
firstNote
=
discussion
.
notes
.
nodes
[
0
];
...
...
@@ -38,8 +39,10 @@ export class MrItemModel extends ItemModel {
arguments
:
[
this
.
mr
,
this
.
workspace
.
uri
],
title
:
'
Show MR Overview
'
,
};
const
gitlabService
=
await
createGitLabNewService
(
this
.
workspace
.
uri
);
const
mrVersion
=
await
gitlabService
.
getMrDiff
(
this
.
mr
);
try
{
await
this
.
getMrDiscussions
();
await
this
.
getMrDiscussions
(
mrVersion
);
}
catch
(
e
)
{
handleError
(
new
UserFriendlyError
(
...
...
@@ -50,16 +53,21 @@ export class MrItemModel extends ItemModel {
),
);
}
const
changedFiles
=
await
this
.
getChangedFiles
();
const
changedFiles
=
mrVersion
.
diffs
.
map
(
d
=>
new
ChangedFileItem
(
this
.
mr
,
mrVersion
,
d
,
this
.
workspace
),
);
return
[
overview
,
...
changedFiles
];
}
private
async
getMrDiscussions
():
Promise
<
void
>
{
private
async
getMrDiscussions
(
mrVersion
:
RestMrVersion
):
Promise
<
void
>
{
const
commentController
=
vscode
.
comments
.
createCommentController
(
this
.
mr
.
references
.
full
,
this
.
mr
.
title
,
);
commentController
.
commentingRangeProvider
=
new
CommentingRangeProvider
(
this
.
mr
,
mrVersion
);
const
gitlabService
=
await
createGitLabNewService
(
this
.
workspace
.
uri
);
const
discussions
=
await
gitlabService
.
getDiscussions
({
...
...
@@ -77,10 +85,4 @@ export class MrItemModel extends ItemModel {
});
this
.
setDisposableChildren
([...
threads
,
commentController
]);
}
private
async
getChangedFiles
():
Promise
<
vscode
.
TreeItem
[]
>
{
const
gitlabService
=
await
createGitLabNewService
(
this
.
workspace
.
uri
);
const
mrVersion
=
await
gitlabService
.
getMrDiff
(
this
.
mr
);
return
mrVersion
.
diffs
.
map
(
d
=>
new
ChangedFileItem
(
this
.
mr
,
mrVersion
,
d
,
this
.
workspace
));
}
}
src/review/commenting_range_provider.test.ts
0 → 100644
浏览文件 @
c17f1492
import
*
as
vscode
from
'
vscode
'
;
import
{
mr
,
mrVersion
}
from
'
../test_utils/entities
'
;
import
{
CommentingRangeProvider
}
from
'
./commenting_range_provider
'
;
import
{
toReviewUri
}
from
'
./review_uri
'
;
describe
(
'
CommentingRangeProvider
'
,
()
=>
{
let
commentingRangeProvider
:
CommentingRangeProvider
;
beforeEach
(()
=>
{
commentingRangeProvider
=
new
CommentingRangeProvider
(
mr
,
mrVersion
);
});
it
(
'
returns empty array for different URI schema
'
,
()
=>
{
const
testDocument
=
{
uri
:
vscode
.
Uri
.
parse
(
'
https://example.com
'
),
}
as
vscode
.
TextDocument
;
expect
(
commentingRangeProvider
.
provideCommentingRanges
(
testDocument
)).
toEqual
([]);
});
it
(
'
returns full range (all lines in the document) for old file
'
,
()
=>
{
const
testDocument
=
{
uri
:
toReviewUri
({
path
:
`/path`
,
mrId
:
mr
.
id
,
projectId
:
mr
.
project_id
,
commit
:
mrVersion
.
base_commit_sha
,
workspacePath
:
'
/
'
,
}),
lineCount
:
200
,
}
as
vscode
.
TextDocument
;
expect
(
commentingRangeProvider
.
provideCommentingRanges
(
testDocument
)).
toEqual
([
new
vscode
.
Range
(
new
vscode
.
Position
(
0
,
0
),
new
vscode
.
Position
(
199
,
0
)),
]);
});
it
(
'
returns empty array for new file
'
,
()
=>
{
const
testDocument
=
{
uri
:
toReviewUri
({
path
:
`/path`
,
mrId
:
mr
.
id
,
projectId
:
mr
.
project_id
,
commit
:
mrVersion
.
head_commit_sha
,
workspacePath
:
'
/
'
,
}),
lineCount
:
200
,
}
as
vscode
.
TextDocument
;
expect
(
commentingRangeProvider
.
provideCommentingRanges
(
testDocument
)).
toEqual
([]);
});
});
src/review/commenting_range_provider.ts
0 → 100644
浏览文件 @
c17f1492
import
*
as
vscode
from
'
vscode
'
;
import
{
REVIEW_URI_SCHEME
}
from
'
../constants
'
;
import
{
fromReviewUri
}
from
'
./review_uri
'
;
export
class
CommentingRangeProvider
implements
vscode
.
CommentingRangeProvider
{
private
mr
:
RestIssuable
;
private
mrVersion
:
RestMrVersion
;
constructor
(
mr
:
RestIssuable
,
mrVersion
:
RestMrVersion
)
{
this
.
mr
=
mr
;
this
.
mrVersion
=
mrVersion
;
}
provideCommentingRanges
(
document
:
vscode
.
TextDocument
):
vscode
.
Range
[]
{
const
{
uri
}
=
document
;
if
(
uri
.
scheme
!==
REVIEW_URI_SCHEME
)
return
[];
const
params
=
fromReviewUri
(
uri
);
if
(
params
.
mrId
!==
this
.
mr
.
id
||
params
.
projectId
!==
this
.
mr
.
project_id
||
!
params
.
path
)
{
return
[];
}
const
oldFile
=
params
.
commit
===
this
.
mrVersion
.
base_commit_sha
;
if
(
oldFile
)
{
return
[
new
vscode
.
Range
(
new
vscode
.
Position
(
0
,
0
),
new
vscode
.
Position
(
document
.
lineCount
-
1
,
0
)),
];
}
return
[];
}
}
src/review/git_content_provider.test.ts
浏览文件 @
c17f1492
...
...
@@ -14,6 +14,7 @@ describe('GitContentProvider', () => {
commit
:
'
abcdef
'
,
path
:
'
/review
'
,
projectId
:
1234
,
mrId
:
2345
,
workspacePath
:
'
path/to/workspace
'
,
};
...
...
src/review/gitlab_comment_thread.ts
浏览文件 @
c17f1492
...
...
@@ -30,6 +30,7 @@ const uriFromPosition = (
position
:
GqlTextPosition
,
workspaceFolder
:
string
,
gitlabProjectId
:
number
,
mrId
:
number
,
)
=>
{
const
onOldVersion
=
position
.
oldLine
!==
null
;
const
path
=
onOldVersion
?
position
.
oldPath
:
position
.
newPath
;
...
...
@@ -39,6 +40,7 @@ const uriFromPosition = (
commit
,
workspacePath
:
workspaceFolder
,
projectId
:
gitlabProjectId
,
mrId
,
});
};
...
...
@@ -152,7 +154,7 @@ export class GitLabCommentThread {
}:
CreateThreadOptions
):
GitLabCommentThread
{
const
{
position
}
=
firstNoteFrom
(
discussion
);
const
vsThread
=
commentController
.
createCommentThread
(
uriFromPosition
(
position
,
workspaceFolder
,
mr
.
project_id
),
uriFromPosition
(
position
,
workspaceFolder
,
mr
.
project_id
,
mr
.
id
),
commentRangeFromPosition
(
position
),
// the comments need to know about the thread, so we first
// create empty thread to be able to create comments
...
...
src/review/review_uri.test.ts
浏览文件 @
c17f1492
...
...
@@ -5,6 +5,7 @@ describe('review_uri.ts', () => {
commit
:
'
abcdef
'
,
path
:
'
/review
'
,
projectId
:
1234
,
mrId
:
2345
,
workspacePath
:
'
path/to/workspace
'
,
};
...
...
@@ -13,7 +14,7 @@ describe('review_uri.ts', () => {
const
result
=
toReviewUri
(
reviewUriParams
);
expect
(
result
.
toString
()).
toEqual
(
'
gl-review:///review{"commit":"abcdef","
workspacePath":"path/to/workspace","projectId":1234
}#
'
,
'
gl-review:///review{"commit":"abcdef","
mrId":2345,"projectId":1234,"workspacePath":"path/to/workspace"
}#
'
,
);
});
});
...
...
src/review/review_uri.ts
浏览文件 @
c17f1492
import
{
Uri
}
from
'
vscode
'
;
import
{
REVIEW_URI_SCHEME
}
from
'
../constants
'
;
interface
ReviewParams
{
export
interface
ReviewParams
{
path
?:
string
;
commit
?:
string
;
workspacePath
:
string
;
projectId
:
number
;
mrId
:
number
;
}
export
function
toReviewUri
({
path
=
''
,
commit
,
workspacePath
,
projectId
}:
ReviewParams
):
Uri
{
export
function
toReviewUri
({
path
=
''
,
commit
,
workspacePath
,
projectId
,
mrId
,
}:
ReviewParams
):
Uri
{
const
query
=
{
commit
,
workspacePath
,
projectId
,
mrId
};
return
Uri
.
file
(
path
).
with
({
scheme
:
REVIEW_URI_SCHEME
,
query
:
JSON
.
stringify
(
{
commit
,
workspacePath
,
projectId
}
),
query
:
JSON
.
stringify
(
query
,
Object
.
keys
(
query
).
sort
()
),
});
}
export
function
fromReviewUri
(
uri
:
Uri
):
ReviewParams
{
const
{
commit
,
workspacePath
,
projectId
}
=
JSON
.
parse
(
uri
.
query
);
const
{
commit
,
workspacePath
,
projectId
,
mrId
}
=
JSON
.
parse
(
uri
.
query
);
return
{
path
:
uri
.
path
||
undefined
,
commit
,
workspacePath
,
projectId
,
mrId
,
};
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录