* DELETE /api/devcontainer?repoId=${repoId} 删除 DevContainer
* refactor
* GET /api/devcontainer?repoId=${repoId}&wait=true 阻塞式等待打开就绪的 DevContainer
* POST /api/devcontainer 创建 DevContainer
* refactored the code
* Updated context usage with cancel function
* 预留接口,适配单机版 DevStar DevContainer
* bugFix: context canceled while deleting k8s CRD DevcontainerApp
* 用户界面删除 k8s CRD DevContainer
* 用户界面创建 DevContainer 并更新 NodePort
* 完成用户界面创建 DevContainer
* transplant test code into DevStar Studio
* refactored API router to /routers/api
* 更改 DevContainer Doc
* 更改 DevContainer namespace
* 特殊仓库重定向
* [Doc] 更新 Kubernetes 部署 DevStar Studio 文档说明,特别是 namespace 管理
* [Doc] 更新 CI脚本说明
* Revert "optimized CI workflow"
* optimized CI workflow
* fix typo
* [feature test]: 测试 Pod 内使用 Kubernetes Operator 功能
* [Optimization] error msg for archived repo
* [Optimization]: display detailed err msg on creating devContainer for …
58 lines
2.0 KiB
Go
58 lines
2.0 KiB
Go
package devcontainer
|
|
|
|
import (
|
|
"code.gitea.io/gitea/modules/log"
|
|
DevcontainersVO "code.gitea.io/gitea/routers/api/devcontainer/vo"
|
|
gitea_web_context "code.gitea.io/gitea/services/context"
|
|
DevcontainersService "code.gitea.io/gitea/services/devstar_devcontainer"
|
|
)
|
|
|
|
// CreateRepoDevContainer 创建仓库 Dev Container
|
|
func CreateRepoDevContainer(ctx *gitea_web_context.Context) {
|
|
if !isUserDevcontainerAlreadyInRepository(ctx) {
|
|
opts := &DevcontainersVO.RepoDevcontainerOptions{
|
|
Actor: ctx.Doer,
|
|
Repository: ctx.Repo.Repository,
|
|
}
|
|
err := DevcontainersService.CreateRepoDevcontainer(ctx, opts)
|
|
if err != nil {
|
|
log.Error("failed to create devContainer with option{%v}: %v", opts, err.Error())
|
|
ctx.Flash.Error(ctx.Tr("repo.dev_container_control.creation_failed_for_user", ctx.Doer.Name))
|
|
} else {
|
|
ctx.Flash.Success(ctx.Tr("repo.dev_container_control.creation_success_for_user", ctx.Doer.Name))
|
|
}
|
|
}
|
|
|
|
ctx.Redirect(ctx.Repo.RepoLink + "/dev-container")
|
|
}
|
|
|
|
// isValidRepoDevcontainerJsonFile 辅助判断当前仓库的当前分支是否存在有效的 /.devcontainer/devcontainer.json
|
|
func isValidRepoDevcontainerJsonFile(ctx *gitea_web_context.Context) bool {
|
|
|
|
// 1. 仓库非空,且非 Archived 状态
|
|
if ctx.Repo.Repository.IsEmpty || ctx.Repo.Repository.IsArchived {
|
|
return false
|
|
}
|
|
|
|
// 2. 当前分支的目录 .devcontainer 下存在 devcontainer.json 文件
|
|
fileDevcontainerJsonExists, err := ctx.Repo.FileExists(".devcontainer/devcontainer.json", ctx.Repo.BranchName)
|
|
if err != nil || !fileDevcontainerJsonExists {
|
|
return false
|
|
}
|
|
|
|
// 3. TODO: DevContainer 格式正确
|
|
return true
|
|
}
|
|
|
|
// isUserDevcontainerAlreadyInRepository 辅助判断当前用户在当前仓库是否已有 Dev Container
|
|
func isUserDevcontainerAlreadyInRepository(ctx *gitea_web_context.Context) bool {
|
|
|
|
opts := &DevcontainersVO.RepoDevcontainerOptions{
|
|
Actor: ctx.Doer,
|
|
Repository: ctx.Repo.Repository,
|
|
}
|
|
|
|
devcontainerDetails, _ := DevcontainersService.GetRepoDevcontainerDetails(ctx, opts)
|
|
return devcontainerDetails.DevContainerId > 0
|
|
}
|