Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
徐晓伟工作室
gitlab-go
提交
8aad8010
G
gitlab-go
项目概览
徐晓伟工作室
/
gitlab-go
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gitlab-go
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
8aad8010
编写于
12月 04, 2023
作者:
徐晓伟
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
✨
转移(混合命令,多接口命令)
上级
c6ca0877
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
201 addition
and
0 deletion
+201
-0
README.md
README.md
+25
-0
constant/common.go
constant/common.go
+2
-0
flag/flag.go
flag/flag.go
+16
-0
main.go
main.go
+1
-0
mix/mix_transfer.go
mix/mix_transfer.go
+19
-0
mix/transfer_all.go
mix/transfer_all.go
+73
-0
projects/projects.go
projects/projects.go
+65
-0
未找到文件。
README.md
浏览文件 @
8aad8010
...
...
@@ -199,6 +199,7 @@ COMMANDS:
mix-delete, mix-rm 删除(混合命令,多接口命令)
mix-archive 归档(混合命令,多接口命令)
mix-export 导出(混合命令,多接口命令)
mix-transfer 转移(混合命令,多接口命令)
help
, h Shows a list of commands or
help
for
one
command
GLOBAL OPTIONS:
...
...
@@ -563,6 +564,30 @@ COPYRIGHT:
--help, -h show help
```
-
转移(混合命令,多接口命令)
```shell
$ go run main.go mix-transfer --help
NAME:
gitlab-go mix-transfer - 转移(混合命令,多接口命令)
USAGE:
gitlab-go mix-transfer command [command options] [arguments...]
COMMANDS:
all, a 将一个命令空间的项目转移到新的命名空间
help, h Shows a list of commands or help for one command
OPTIONS:
--base-url value 实例地址,例如:https://gitlab.xuxiaowei.com.cn/api/v4 (default: "https://gitlab.com/api/v4") [%CI_API_V4_URL%]
--token value your_access_token
--owned 当前用户明确拥有的项目。 (default: false)
--namespace-source value 源命名空间。如:用户名、群组名
--namespace-target value 源命名空间。如:用户名、群组名
--skip-project-path value [ --skip-project-path value ] 跳过项目路径
--help, -h show help
```
### test
```
shell
...
...
constant/common.go
浏览文件 @
8aad8010
...
...
@@ -25,6 +25,8 @@ const (
IssueIdRange
=
"issue-id-range"
Recursion
=
"recursion"
Owned
=
"owned"
NamespaceSource
=
"namespace-source"
NamespaceTarget
=
"namespace-target"
ExportFolder
=
"export-folder"
SkipProjectPath
=
"skip-project-path"
SkipProjectWikiPath
=
"skip-project-wiki-path"
...
...
flag/flag.go
浏览文件 @
8aad8010
...
...
@@ -192,6 +192,22 @@ func Owned(required bool) cli.Flag {
}
}
func
NamespaceSource
(
required
bool
)
cli
.
Flag
{
return
&
cli
.
StringFlag
{
Name
:
constant
.
NamespaceSource
,
Usage
:
"源命名空间。如:用户名、群组名"
,
Required
:
required
,
}
}
func
NamespaceTargetFlag
(
required
bool
)
cli
.
Flag
{
return
&
cli
.
StringFlag
{
Name
:
constant
.
NamespaceTarget
,
Usage
:
"源命名空间。如:用户名、群组名"
,
Required
:
required
,
}
}
func
IssueIdRange
(
required
bool
)
cli
.
Flag
{
return
&
cli
.
StringSliceFlag
{
Name
:
constant
.
IssueIdRange
,
...
...
main.go
浏览文件 @
8aad8010
...
...
@@ -79,6 +79,7 @@ func main() {
mix
.
Delete
(),
mix
.
Archive
(),
mix
.
Export
(),
mix
.
Transfer
(),
},
}
...
...
mix/mix_transfer.go
0 → 100644
浏览文件 @
8aad8010
package
mix
import
(
"github.com/urfave/cli/v2"
"github.com/xuxiaowei-com-cn/gitlab-go/flag"
)
// Transfer 转移
func
Transfer
()
*
cli
.
Command
{
return
&
cli
.
Command
{
Name
:
"mix-transfer"
,
Usage
:
"转移(混合命令,多接口命令)"
,
Flags
:
append
(
flag
.
Common
(),
flag
.
Owned
(
false
),
flag
.
NamespaceSource
(
false
),
flag
.
NamespaceTargetFlag
(
false
),
flag
.
SkipProjectPath
()),
Subcommands
:
[]
*
cli
.
Command
{
TransferAll
(),
},
}
}
mix/transfer_all.go
0 → 100644
浏览文件 @
8aad8010
package
mix
import
(
"github.com/urfave/cli/v2"
"github.com/xanzy/go-gitlab"
"github.com/xuxiaowei-com-cn/gitlab-go/constant"
"github.com/xuxiaowei-com-cn/gitlab-go/flag"
"github.com/xuxiaowei-com-cn/gitlab-go/projects"
"log"
"strings"
)
func
TransferAll
()
*
cli
.
Command
{
return
&
cli
.
Command
{
Name
:
"all"
,
Aliases
:
[]
string
{
"a"
},
Usage
:
"将一个命令空间的项目转移到新的命名空间"
,
Flags
:
append
(
flag
.
CommonTokenRequired
(),
flag
.
Owned
(
true
),
flag
.
NamespaceSource
(
true
),
flag
.
NamespaceTargetFlag
(
true
),
flag
.
SkipProjectPath
()),
Action
:
func
(
context
*
cli
.
Context
)
error
{
var
baseUrl
=
context
.
String
(
constant
.
BaseUrl
)
var
token
=
context
.
String
(
constant
.
Token
)
var
owned
=
context
.
Bool
(
constant
.
Owned
)
var
namespaceSource
=
context
.
String
(
constant
.
NamespaceSource
)
var
namespaceTarget
=
context
.
String
(
constant
.
NamespaceTarget
)
var
skipProjectPaths
=
context
.
StringSlice
(
constant
.
SkipProjectPath
)
for
index
,
skipProjectPath
:=
range
skipProjectPaths
{
skipProjectPath
=
strings
.
TrimPrefix
(
skipProjectPath
,
"/"
)
skipProjectPath
=
strings
.
TrimSuffix
(
skipProjectPath
,
"/"
)
skipProjectPaths
[
index
]
=
skipProjectPath
}
projectList
,
err
:=
projects
.
ListNamespaceProjects
(
owned
,
token
,
baseUrl
,
1
,
100
,
namespaceSource
,
skipProjectPaths
)
if
err
!=
nil
{
return
err
}
for
_
,
project
:=
range
projectList
{
log
.
Printf
(
project
.
WebURL
)
err
=
TransferProject
(
baseUrl
,
token
,
project
.
PathWithNamespace
,
namespaceTarget
)
if
err
!=
nil
{
return
err
}
}
return
nil
},
}
}
// TransferProject 将项目转移到新的命名空间 https://docs.gitlab.cn/jh/api/projects.html#%E5%B0%86%E9%A1%B9%E7%9B%AE%E8%BD%AC%E7%A7%BB%E5%88%B0%E6%96%B0%E7%9A%84%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4
func
TransferProject
(
baseUrl
string
,
token
string
,
id
string
,
namespace
string
)
error
{
gitClient
,
err
:=
gitlab
.
NewClient
(
token
,
gitlab
.
WithBaseURL
(
baseUrl
))
if
err
!=
nil
{
return
err
}
opt
:=
&
gitlab
.
TransferProjectOptions
{
Namespace
:
namespace
,
}
project
,
response
,
err
:=
gitClient
.
Projects
.
TransferProject
(
id
,
opt
)
if
err
!=
nil
{
return
err
}
log
.
Printf
(
"项目: %s 转移到: %s 结果: %s"
,
id
,
project
.
WebURL
,
response
.
Status
)
return
nil
}
projects/projects.go
浏览文件 @
8aad8010
...
...
@@ -5,6 +5,7 @@ import (
"github.com/xanzy/go-gitlab"
"github.com/xuxiaowei-com-cn/gitlab-go/flag"
"log"
"strings"
)
const
(
...
...
@@ -64,6 +65,70 @@ func ListProjects(owned bool, token string, baseUrl string, page int, perPage in
return
results
,
err
}
// ListNamespaceProjects 列出命名空间所有项目
func
ListNamespaceProjects
(
owned
bool
,
token
string
,
baseUrl
string
,
page
int
,
perPage
int
,
namespace
string
,
skipProjectPaths
[]
string
)
([]
*
gitlab
.
Project
,
error
)
{
var
results
[]
*
gitlab
.
Project
gitClient
,
err
:=
gitlab
.
NewClient
(
token
,
gitlab
.
WithBaseURL
(
baseUrl
))
if
err
!=
nil
{
return
nil
,
err
}
opt
:=
&
gitlab
.
ListProjectsOptions
{
ListOptions
:
gitlab
.
ListOptions
{
Page
:
page
,
PerPage
:
perPage
,
},
Owned
:
&
owned
,
}
projects
,
response
,
err
:=
gitClient
.
Projects
.
ListProjects
(
opt
)
if
err
!=
nil
{
return
nil
,
err
}
log
.
Printf
(
"ListProjects Page %d, PerPage: %d, Response StatusCode: %d
\n
"
,
page
,
perPage
,
response
.
Response
.
StatusCode
)
results
=
Namespace
(
results
,
projects
,
namespace
,
skipProjectPaths
)
if
len
(
projects
)
!=
0
{
projects
,
err
=
ListNamespaceProjects
(
owned
,
token
,
baseUrl
,
page
+
1
,
perPage
,
namespace
,
skipProjectPaths
)
if
err
!=
nil
{
return
nil
,
err
}
results
=
Namespace
(
results
,
projects
,
namespace
,
skipProjectPaths
)
}
return
results
,
err
}
func
Namespace
(
results
[]
*
gitlab
.
Project
,
projects
[]
*
gitlab
.
Project
,
namespace
string
,
skipProjectPaths
[]
string
)
[]
*
gitlab
.
Project
{
if
namespace
==
""
{
results
=
append
(
results
,
projects
...
)
}
else
{
for
_
,
project
:=
range
projects
{
var
c
bool
for
_
,
skipProjectPath
:=
range
skipProjectPaths
{
if
project
.
NameWithNamespace
==
skipProjectPath
{
c
=
true
break
}
}
if
c
{
break
}
if
strings
.
HasPrefix
(
project
.
PathWithNamespace
,
namespace
+
"/"
)
{
// 将 project 添加到 results 中
results
=
append
(
results
,
project
)
}
}
}
return
results
}
func
ArchiveProject
(
token
string
,
baseUrl
string
,
pathWithNamespace
string
)
error
{
gitClient
,
err
:=
gitlab
.
NewClient
(
token
,
gitlab
.
WithBaseURL
(
baseUrl
))
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录