Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
gitcode_dev
csdn-workflow
提交
750bae4b
C
csdn-workflow
项目概览
gitcode_dev
/
csdn-workflow
通知
123
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 搜索 >>
提交
750bae4b
编写于
7月 05, 2021
作者:
T
Tomas Vik
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: create snippet patch
上级
16c65cca
变更
10
显示空白变更内容
内联
并排
Showing
10 changed file
with
168 addition
and
18 deletion
+168
-18
package.json
package.json
+8
-0
src/__mocks__/vscode.js
src/__mocks__/vscode.js
+2
-1
src/command_names.ts
src/command_names.ts
+1
-0
src/commands/create_snippet.ts
src/commands/create_snippet.ts
+16
-15
src/commands/create_snippet_patch.test.ts
src/commands/create_snippet_patch.test.ts
+70
-0
src/commands/create_snippet_patch.ts
src/commands/create_snippet_patch.ts
+63
-0
src/extension.js
src/extension.js
+2
-0
src/git/wrapped_repository.ts
src/git/wrapped_repository.ts
+4
-0
src/status_bar.test.ts
src/status_bar.test.ts
+1
-2
src/test_utils/as_mock.ts
src/test_utils/as_mock.ts
+1
-0
未找到文件。
package.json
浏览文件 @
750bae4b
...
@@ -83,6 +83,10 @@
...
@@ -83,6 +83,10 @@
"command"
:
"gl.openProjectPage"
,
"command"
:
"gl.openProjectPage"
,
"title"
:
"GitLab: Open current project on GitLab"
"title"
:
"GitLab: Open current project on GitLab"
},
},
{
"command"
:
"gl.createSnippetPatch"
,
"title"
:
"GitLab: Create snippet patch"
},
{
{
"command"
:
"gl.openCurrentPipeline"
,
"command"
:
"gl.openCurrentPipeline"
,
"title"
:
"GitLab: Open current pipeline on GitLab"
"title"
:
"GitLab: Open current pipeline on GitLab"
...
@@ -289,6 +293,10 @@
...
@@ -289,6 +293,10 @@
{
{
"command"
:
"gl.cloneWiki"
,
"command"
:
"gl.cloneWiki"
,
"when"
:
"!gitlab:noToken"
"when"
:
"!gitlab:noToken"
},
{
"command"
:
"gl.createSnippetPatch"
,
"when"
:
"gitlab:validState"
}
}
],
],
"view/title"
:
[
"view/title"
:
[
...
...
src/__mocks__/vscode.js
浏览文件 @
750bae4b
...
@@ -23,8 +23,9 @@ module.exports = {
...
@@ -23,8 +23,9 @@ module.exports = {
showWarningMessage
:
jest
.
fn
(),
showWarningMessage
:
jest
.
fn
(),
showErrorMessage
:
jest
.
fn
(),
showErrorMessage
:
jest
.
fn
(),
createStatusBarItem
:
jest
.
fn
(),
createStatusBarItem
:
jest
.
fn
(),
withProgress
:
jest
.
fn
(),
showInputBox
:
jest
.
fn
(),
showQuickPick
:
jest
.
fn
(),
showQuickPick
:
jest
.
fn
(),
withProgress
:
jest
.
fn
(),
createQuickPick
:
jest
.
fn
(),
createQuickPick
:
jest
.
fn
(),
},
},
commands
:
{
commands
:
{
...
...
src/command_names.ts
浏览文件 @
750bae4b
...
@@ -33,6 +33,7 @@ export const USER_COMMANDS = {
...
@@ -33,6 +33,7 @@ export const USER_COMMANDS = {
CREATE_COMMENT
:
'
gl.createComment
'
,
CREATE_COMMENT
:
'
gl.createComment
'
,
CHECKOUT_MR_BRANCH
:
'
gl.checkoutMrBranch
'
,
CHECKOUT_MR_BRANCH
:
'
gl.checkoutMrBranch
'
,
CLONE_WIKI
:
'
gl.cloneWiki
'
,
CLONE_WIKI
:
'
gl.cloneWiki
'
,
CREATE_SNIPPET_PATCH
:
'
gl.createSnippetPatch
'
,
};
};
/*
/*
...
...
src/commands/create_snippet.ts
浏览文件 @
750bae4b
...
@@ -4,20 +4,21 @@ import * as gitLabService from '../gitlab_service';
...
@@ -4,20 +4,21 @@ import * as gitLabService from '../gitlab_service';
import
{
gitExtensionWrapper
}
from
'
../git/git_extension_wrapper
'
;
import
{
gitExtensionWrapper
}
from
'
../git/git_extension_wrapper
'
;
import
{
GitLabProject
}
from
'
../gitlab/gitlab_project
'
;
import
{
GitLabProject
}
from
'
../gitlab/gitlab_project
'
;
const
visibilityOptions
=
[
type
VisibilityItem
=
vscode
.
QuickPickItem
&
{
type
:
string
};
{
label
:
'
Public
'
,
const
PRIVATE_VISIBILITY_ITEM
:
VisibilityItem
=
{
type
:
'
public
'
,
label
:
'
$(lock) Private
'
,
},
{
label
:
'
Internal
'
,
type
:
'
internal
'
,
},
{
label
:
'
Private
'
,
type
:
'
private
'
,
type
:
'
private
'
,
},
description
:
'
The snippet is visible only to project members.
'
,
];
};
const
PUBLIC_VISIBILITY_ITEM
:
VisibilityItem
=
{
label
:
'
$(globe) Public
'
,
type
:
'
public
'
,
description
:
'
The snippet can be accessed without any authentication.
'
,
};
export
const
VISIBILITY_OPTIONS
=
[
PRIVATE_VISIBILITY_ITEM
,
PUBLIC_VISIBILITY_ITEM
];
const
contextOptions
=
[
const
contextOptions
=
[
{
{
...
@@ -82,7 +83,7 @@ export async function createSnippet() {
...
@@ -82,7 +83,7 @@ export async function createSnippet() {
return
;
return
;
}
}
const
visibility
=
await
vscode
.
window
.
showQuickPick
(
visibilityOptions
);
const
visibility
=
await
vscode
.
window
.
showQuickPick
(
VISIBILITY_OPTIONS
);
if
(
!
visibility
)
return
;
if
(
!
visibility
)
return
;
const
context
=
await
vscode
.
window
.
showQuickPick
(
contextOptions
);
const
context
=
await
vscode
.
window
.
showQuickPick
(
contextOptions
);
...
...
src/commands/create_snippet_patch.test.ts
0 → 100644
浏览文件 @
750bae4b
import
*
as
vscode
from
'
vscode
'
;
import
{
createSnippetPatch
}
from
'
./create_snippet_patch
'
;
import
{
WrappedRepository
}
from
'
../git/wrapped_repository
'
;
import
{
project
}
from
'
../test_utils/entities
'
;
import
{
gitExtensionWrapper
}
from
'
../git/git_extension_wrapper
'
;
import
{
asMock
}
from
'
../test_utils/as_mock
'
;
import
{
createSnippet
}
from
'
../gitlab_service
'
;
import
{
openUrl
}
from
'
../openers
'
;
jest
.
mock
(
'
../git/git_extension_wrapper
'
);
jest
.
mock
(
'
../gitlab_service
'
);
jest
.
mock
(
'
../openers
'
);
const
SNIPPET_URL
=
'
https://gitlab.com/test-group/test-project/-/snippets/2146265
'
;
const
DIFF_OUTPUT
=
'
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
'
;
describe
(
'
create snippet patch
'
,
()
=>
{
let
wrappedRepository
:
WrappedRepository
;
beforeEach
(()
=>
{
const
mockRepository
:
Partial
<
WrappedRepository
>
=
{
lastCommitSha
:
'
abcd1234567
'
,
getTrackingBranchName
:
async
()
=>
'
tracking-branch-name
'
,
getProject
:
async
()
=>
project
,
diff
:
async
()
=>
DIFF_OUTPUT
,
};
wrappedRepository
=
mockRepository
as
WrappedRepository
;
asMock
(
gitExtensionWrapper
.
getActiveRepositoryOrSelectOne
).
mockResolvedValue
(
wrappedRepository
);
asMock
(
vscode
.
window
.
showInputBox
).
mockResolvedValue
(
'
snippet_name
'
);
asMock
(
vscode
.
window
.
showQuickPick
).
mockImplementation
(
options
=>
options
.
filter
((
o
:
any
)
=>
o
.
type
===
'
private
'
).
pop
(),
);
asMock
(
createSnippet
).
mockResolvedValue
({
web_url
:
SNIPPET_URL
,
});
});
afterEach
(()
=>
{
jest
.
resetAllMocks
();
});
it
(
'
creates a snippet patch and opens it in a browser
'
,
async
()
=>
{
await
createSnippetPatch
();
expect
(
openUrl
).
toHaveBeenCalledWith
(
SNIPPET_URL
);
});
describe
(
'
populating the create snippet request
'
,
()
=>
{
let
formData
:
Record
<
string
,
string
>
;
beforeEach
(
async
()
=>
{
await
createSnippetPatch
();
[[,
formData
]]
=
asMock
(
createSnippet
).
mock
.
calls
;
});
it
(
'
prepends "patch: " to the user input to create snippet title
'
,
()
=>
{
expect
(
formData
.
title
).
toBe
(
'
patch: snippet_name
'
);
});
it
(
'
appends ".patch" to the user input to create snippet file name
'
,
()
=>
{
expect
(
formData
.
file_name
).
toBe
(
'
snippet_name.patch
'
);
});
it
(
"
sets user's choice of visibility (private selected in test setup)
"
,
()
=>
{
expect
(
formData
.
visibility
).
toBe
(
'
private
'
);
});
it
(
'
sets the diff command output as the blob content
'
,
()
=>
{
expect
(
formData
.
content
).
toBe
(
DIFF_OUTPUT
);
});
});
});
src/commands/create_snippet_patch.ts
0 → 100644
浏览文件 @
750bae4b
import
*
as
vscode
from
'
vscode
'
;
import
*
as
assert
from
'
assert
'
;
import
*
as
gitLabService
from
'
../gitlab_service
'
;
import
*
as
openers
from
'
../openers
'
;
import
{
gitExtensionWrapper
}
from
'
../git/git_extension_wrapper
'
;
import
{
VISIBILITY_OPTIONS
}
from
'
./create_snippet
'
;
const
getSnippetPatchDescription
=
(
branch
:
string
,
commit
:
string
,
patchFileName
:
string
,
):
string
=>
`
This snippet contains suggested changes for branch
${
branch
}
(commit:
${
commit
}
).
Apply this snippet:
- In VS Code with the GitLab Workflow extension installed:
- Run
\`
GitLab: Apply snippet patch
\`
and select this snippet
- Using the
\`
git
\`
command:
- Download the
\`
${
patchFileName
}
\`
file to your project folder
- In your project folder, run
~~~sh
git apply '
${
patchFileName
}
'
~~~
*This snippet was created with the [GitLab Workflow VS Code extension](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow).*
`
;
export
const
createSnippetPatch
=
async
():
Promise
<
void
>
=>
{
const
repository
=
await
gitExtensionWrapper
.
getActiveRepositoryOrSelectOne
();
assert
(
repository
);
assert
(
repository
.
lastCommitSha
);
const
patch
=
await
repository
.
diff
();
const
name
=
await
vscode
.
window
.
showInputBox
({
placeHolder
:
'
patch name
'
,
prompt
:
'
The name is used as the snippet title and also as the filename (with .patch appended).
'
,
});
if
(
!
name
)
return
;
const
visibility
=
await
vscode
.
window
.
showQuickPick
(
VISIBILITY_OPTIONS
);
if
(
!
visibility
)
return
;
const
project
=
await
repository
.
getProject
();
assert
(
project
);
const
patchFileName
=
`
${
name
}
.patch`
;
const
data
=
{
id
:
project
.
restId
,
title
:
`patch:
${
name
}
`
,
description
:
getSnippetPatchDescription
(
await
repository
.
getTrackingBranchName
(),
repository
.
lastCommitSha
,
patchFileName
,
),
file_name
:
patchFileName
,
visibility
:
visibility
.
type
,
content
:
patch
,
};
const
snippet
=
await
gitLabService
.
createSnippet
(
repository
.
rootFsPath
,
data
);
await
openers
.
openUrl
(
snippet
.
web_url
);
};
src/extension.js
浏览文件 @
750bae4b
...
@@ -32,6 +32,7 @@ const { changeTypeDecorationProvider } = require('./review/change_type_decoratio
...
@@ -32,6 +32,7 @@ const { changeTypeDecorationProvider } = require('./review/change_type_decoratio
const
{
checkVersion
}
=
require
(
'
./utils/check_version
'
);
const
{
checkVersion
}
=
require
(
'
./utils/check_version
'
);
const
{
checkoutMrBranch
}
=
require
(
'
./commands/checkout_mr_branch
'
);
const
{
checkoutMrBranch
}
=
require
(
'
./commands/checkout_mr_branch
'
);
const
{
cloneWiki
}
=
require
(
'
./commands/clone_wiki
'
);
const
{
cloneWiki
}
=
require
(
'
./commands/clone_wiki
'
);
const
{
createSnippetPatch
}
=
require
(
'
./commands/create_snippet_patch
'
);
vscode
.
gitLabWorkflow
=
{
vscode
.
gitLabWorkflow
=
{
sidebarDataProviders
:
[],
sidebarDataProviders
:
[],
...
@@ -92,6 +93,7 @@ const registerCommands = (context, outputChannel) => {
...
@@ -92,6 +93,7 @@ const registerCommands = (context, outputChannel) => {
[
USER_COMMANDS
.
CREATE_COMMENT
]:
createComment
,
[
USER_COMMANDS
.
CREATE_COMMENT
]:
createComment
,
[
USER_COMMANDS
.
CHECKOUT_MR_BRANCH
]:
checkoutMrBranch
,
[
USER_COMMANDS
.
CHECKOUT_MR_BRANCH
]:
checkoutMrBranch
,
[
USER_COMMANDS
.
CLONE_WIKI
]:
cloneWiki
,
[
USER_COMMANDS
.
CLONE_WIKI
]:
cloneWiki
,
[
USER_COMMANDS
.
CREATE_SNIPPET_PATCH
]:
createSnippetPatch
,
[
PROGRAMMATIC_COMMANDS
.
NO_IMAGE_REVIEW
]:
()
=>
[
PROGRAMMATIC_COMMANDS
.
NO_IMAGE_REVIEW
]:
()
=>
vscode
.
window
.
showInformationMessage
(
"
GitLab MR review doesn't support images yet.
"
),
vscode
.
window
.
showInformationMessage
(
"
GitLab MR review doesn't support images yet.
"
),
};
};
...
...
src/git/wrapped_repository.ts
浏览文件 @
750bae4b
...
@@ -167,6 +167,10 @@ export class WrappedRepository {
...
@@ -167,6 +167,10 @@ export class WrappedRepository {
return
this
.
rawRepository
.
show
(
sha
,
absolutePath
).
catch
(()
=>
null
);
return
this
.
rawRepository
.
show
(
sha
,
absolutePath
).
catch
(()
=>
null
);
}
}
async
diff
():
Promise
<
string
>
{
return
this
.
rawRepository
.
diff
();
}
async
getTrackingBranchName
():
Promise
<
string
>
{
async
getTrackingBranchName
():
Promise
<
string
>
{
const
branchName
=
this
.
rawRepository
.
state
.
HEAD
?.
name
;
const
branchName
=
this
.
rawRepository
.
state
.
HEAD
?.
name
;
assert
(
assert
(
...
...
src/status_bar.test.ts
浏览文件 @
750bae4b
...
@@ -3,12 +3,11 @@ import * as gitLabService from './gitlab_service';
...
@@ -3,12 +3,11 @@ import * as gitLabService from './gitlab_service';
import
{
pipeline
,
mr
,
issue
}
from
'
./test_utils/entities
'
;
import
{
pipeline
,
mr
,
issue
}
from
'
./test_utils/entities
'
;
import
{
USER_COMMANDS
}
from
'
./command_names
'
;
import
{
USER_COMMANDS
}
from
'
./command_names
'
;
import
{
gitExtensionWrapper
}
from
'
./git/git_extension_wrapper
'
;
import
{
gitExtensionWrapper
}
from
'
./git/git_extension_wrapper
'
;
import
{
asMock
}
from
'
./test_utils/as_mock
'
;
jest
.
mock
(
'
./gitlab_service
'
);
jest
.
mock
(
'
./gitlab_service
'
);
jest
.
mock
(
'
./git/git_extension_wrapper
'
);
jest
.
mock
(
'
./git/git_extension_wrapper
'
);
const
asMock
=
(
mockFn
:
unknown
)
=>
mockFn
as
jest
.
Mock
;
asMock
(
vscode
.
workspace
.
getConfiguration
).
mockReturnValue
({
asMock
(
vscode
.
workspace
.
getConfiguration
).
mockReturnValue
({
showStatusBarLinks
:
true
,
showStatusBarLinks
:
true
,
showIssueLinkOnStatusBar
:
true
,
showIssueLinkOnStatusBar
:
true
,
...
...
src/test_utils/as_mock.ts
0 → 100644
浏览文件 @
750bae4b
export
const
asMock
=
(
mockFn
:
unknown
)
=>
mockFn
as
jest
.
Mock
;
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录