diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index e72017215..c7f096e53 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -41,13 +41,13 @@ DEFAULT_CLOSE_ISSUES_VIA_COMMITS_IN_ANY_BRANCH = false ; Allow users to push local repositories to Gitea and have them automatically created for a user or an org ENABLE_PUSH_CREATE_USER = false ENABLE_PUSH_CREATE_ORG = false -; Comma separated list of globally disabled repo units. Allowed values: repo.issues, repo.ext_issues, repo.pulls, repo.wiki, repo.ext_wiki +; Comma separated list of globally disabled repo units. Allowed values: repo.issues, repo.ext_issues, repo.pulls, repo.wiki, repo.ext_wiki, repo.datasets DISABLED_REPO_UNITS = -; Comma separated list of default repo units. Allowed values: repo.code, repo.releases, repo.issues, repo.pulls, repo.wiki. +; Comma separated list of default repo units. Allowed values: repo.code, repo.releases, repo.issues, repo.pulls, repo.wiki, repo.datasets. ; Note: Code and Releases can currently not be deactivated. If you specify default repo units you should still list them for future compatibility. ; External wiki and issue tracker can't be enabled by default as it requires additional settings. ; Disabled repo units will not be added to new repositories regardless if it is in the default list. -DEFAULT_REPO_UNITS = repo.code,repo.releases,repo.issues,repo.pulls,repo.wiki +DEFAULT_REPO_UNITS = repo.code,repo.releases,repo.issues,repo.pulls,repo.wiki,repo.datasets ; Prefix archive files by placing them in a directory named after the repository PREFIX_ARCHIVE_FILES = true diff --git a/custom/templates/base/footer_content.tmpl b/custom/templates/base/footer_content.tmpl deleted file mode 100644 index 2a144f821..000000000 --- a/custom/templates/base/footer_content.tmpl +++ /dev/null @@ -1,41 +0,0 @@ - diff --git a/custom/templates/base/head.tmpl b/custom/templates/base/head.tmpl deleted file mode 100644 index cad2c976d..000000000 --- a/custom/templates/base/head.tmpl +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - {{if .Title}}{{.Title}} - {{end}} {{if .Repository.Name}}{{.Repository.Name}} - {{end}}{{AppName}} - - {{if UseServiceWorker}} - - {{else}} - - {{end}} - - - - - - - {{if .IsSigned}} - - {{end}} - {{if .ContextUser}} - - {{end}} - {{if .SearchLimit}} - - {{end}} -{{if .GoGetImport}} - - -{{end}} - - - - - - - - -{{if .RequireSimpleMDE}} - -{{end}} - -{{if .RequireTribute}} - -{{end}} - - - -{{if .RequireMinicolors}} - -{{end}} - -{{if .PageIsUserProfile}} - - - - - {{if .Owner.Description}} - - {{end}} -{{else if .Repository}} - {{if .Issue}} - - - {{if .Issue.Content}} - - {{end}} - {{else}} - - - {{if .Repository.Description}} - - {{end}} - {{end}} - - -{{else}} - - - - - -{{end}} - -{{if .IsSigned }} - {{ if ne .SignedUser.Theme "gitea" }} - - {{end}} -{{else if ne DefaultTheme "gitea"}} - -{{end}} -{{template "custom/header" .}} - - - {{template "custom/body_outer_pre" .}} - -
- - - {{template "custom/body_inner_pre" .}} - - {{if not .PageIsInstall}} - - {{end}} -{{/* -
- - -*/}} diff --git a/custom/templates/base/head_navbar.tmpl b/custom/templates/base/head_navbar.tmpl deleted file mode 100644 index 2dc35b404..000000000 --- a/custom/templates/base/head_navbar.tmpl +++ /dev/null @@ -1,186 +0,0 @@ - diff --git a/custom/templates/custom/header.tmpl b/custom/templates/custom/header.tmpl deleted file mode 100644 index 8e11abcf4..000000000 --- a/custom/templates/custom/header.tmpl +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/custom/templates/datasets/dataset_list.tmpl b/custom/templates/datasets/dataset_list.tmpl deleted file mode 100644 index c57feeb0f..000000000 --- a/custom/templates/datasets/dataset_list.tmpl +++ /dev/null @@ -1,49 +0,0 @@ -

- {{.i18n.Tr "datasets"}} -

- - -
- -
-
- {{range .datasets}} -
-
- - {{.Title}} - -
- {{svg "octicon-tasklist" 16}} {{$.i18n.Tr (printf "dataset.task.%s" .Task)}} - {{svg "octicon-tag" 16}}{{$.i18n.Tr (printf "dataset.category.%s" .Category)}} - {{if ne .DownloadTimes 0}} - {{svg "octicon-flame" 16}} {{.DownloadTimes}} - {{end}} -
-
-
-
{{.Description}}
-

{{$.i18n.Tr "org.repo_updated"}} {{TimeSinceUnix .UpdatedUnix $.i18n.Lang}}

-
-
- {{else}} -
- {{$.i18n.Tr "explore.dataset_no_results"}} -
- {{end}} -
-
diff --git a/custom/templates/datasets/dataset_search.tmpl b/custom/templates/datasets/dataset_search.tmpl deleted file mode 100644 index 6c973026a..000000000 --- a/custom/templates/datasets/dataset_search.tmpl +++ /dev/null @@ -1,14 +0,0 @@ -
-
-
-
-
- - - - -
-
-
-
-
\ No newline at end of file diff --git a/custom/templates/datasets/index.tmpl b/custom/templates/datasets/index.tmpl deleted file mode 100644 index b3342fe4a..000000000 --- a/custom/templates/datasets/index.tmpl +++ /dev/null @@ -1,18 +0,0 @@ -{{template "base/head" .}} -
- {{template "explore/repo_search" .}} -
-
- {{template "explore/navbar" .}} - -
- {{template "datasets/dataset_list" .}} - {{template "base/paginate" .}} -
-
- {{template "explore/repo_right" .}} -
-
-
-
-{{template "base/footer" .}} diff --git a/custom/templates/explore/dataset_list.tmpl b/custom/templates/explore/dataset_list.tmpl deleted file mode 100644 index ddb5ee8af..000000000 --- a/custom/templates/explore/dataset_list.tmpl +++ /dev/null @@ -1,49 +0,0 @@ -

- {{.i18n.Tr "datasets"}} -

- - -
- -
-
- {{range .Datasets}} -
-
- - {{.Title}} - -
- {{svg "octicon-tasklist" 16}} {{$.i18n.Tr (printf "dataset.task.%s" .Task)}} - {{svg "octicon-tag" 16}}{{$.i18n.Tr (printf "dataset.category.%s" .Category)}} - {{if ne .DownloadTimes 0}} - {{svg "octicon-flame" 16}} {{.DownloadTimes}} - {{end}} -
-
-
-
{{.Description}}
-

{{$.i18n.Tr "org.repo_updated"}} {{TimeSinceUnix .UpdatedUnix $.i18n.Lang}}

-
-
- {{else}} -
- {{$.i18n.Tr "explore.dataset_no_results"}} -
- {{end}} -
-
diff --git a/custom/templates/explore/dataset_search.tmpl b/custom/templates/explore/dataset_search.tmpl deleted file mode 100644 index 6c973026a..000000000 --- a/custom/templates/explore/dataset_search.tmpl +++ /dev/null @@ -1,14 +0,0 @@ -
-
-
-
-
- - - - -
-
-
-
-
\ No newline at end of file diff --git a/custom/templates/explore/datasets.tmpl b/custom/templates/explore/datasets.tmpl deleted file mode 100644 index 748d51ba8..000000000 --- a/custom/templates/explore/datasets.tmpl +++ /dev/null @@ -1,17 +0,0 @@ -{{template "base/head" .}} -
- {{template "explore/dataset_search" .}} -
-
- {{template "explore/navbar" .}} -
- {{template "explore/dataset_list" .}} - {{template "base/paginate" .}} -
-
- {{template "explore/repo_right" .}} -
-
-
-
-{{template "base/footer" .}} diff --git a/custom/templates/explore/navbar.tmpl b/custom/templates/explore/navbar.tmpl deleted file mode 100644 index 6f86a7e7c..000000000 --- a/custom/templates/explore/navbar.tmpl +++ /dev/null @@ -1,47 +0,0 @@ -
- -
- - -
-
- -
-
- \ No newline at end of file diff --git a/custom/templates/explore/organizations.tmpl b/custom/templates/explore/organizations.tmpl deleted file mode 100644 index 1151c5a94..000000000 --- a/custom/templates/explore/organizations.tmpl +++ /dev/null @@ -1,68 +0,0 @@ -{{template "base/head" .}} -
- {{template "explore/search" .}} - -
-
- {{template "explore/navbar" .}} -
-

- {{.i18n.Tr "explore.organizations"}} -

- - -
- -
- {{range .Users}} -
- -
- - {{.Name}} {{.FullName}} - {{if .Visibility.IsPrivate}} - {{svg "octicon-lock" 16}} - {{end}} - -
- {{if .Location}} - {{svg "octicon-location" 16}} {{.Location}} - {{end}} - {{if and .Website}} - {{svg "octicon-link" 16}} - {{.Website}} - {{end}} - {{svg "octicon-clock" 16}} {{$.i18n.Tr "user.join_on"}} {{.CreatedUnix.FormatShort}} -
-
-
- {{else}} -
{{$.i18n.Tr "explore.org_no_results"}}
- {{end}} -
- - {{template "base/paginate" .}} -
-
- {{template "explore/repo_right" .}} -
-
-
-
-{{template "base/footer" .}} diff --git a/custom/templates/explore/repo_list.tmpl b/custom/templates/explore/repo_list.tmpl deleted file mode 100644 index b10a860ae..000000000 --- a/custom/templates/explore/repo_list.tmpl +++ /dev/null @@ -1,75 +0,0 @@ -

- {{.i18n.Tr "explore.repos"}} -

- - -
- -
- {{range .Repos}} -
-
- {{if .RelAvatarLink}} - - {{end}} - - {{if or $.PageIsExplore $.PageIsProfileStarList }}{{if .Owner}}{{.Owner.Name}} / {{end}}{{end}}{{.Name}} - {{if .IsArchived}}{{end}} - - {{if .IsPrivate}} - {{svg "octicon-lock" 16}} - {{else if .IsFork}} - {{svg "octicon-repo-forked" 16}} - {{else if .IsMirror}} - {{svg "octicon-repo-clone" 16}} - {{else if .Owner}} - {{if .Owner.Visibility.IsPrivate}} - {{svg "octicon-lock" 16}} - {{end}} - {{end}} -
- {{if .PrimaryLanguage }} - {{ .PrimaryLanguage.Language }} - {{end}} - {{svg "octicon-star" 16}} {{.NumStars}} - {{svg "octicon-git-branch" 16}} {{.NumForks}} -
-
-
- {{if .DescriptionHTML}}

{{.DescriptionHTML}}

{{end}} - {{if .Topics }} -
- {{range .Topics}} - {{if ne . "" }}
{{.}}
{{end}} - {{end}} -
- {{end}} -

{{$.i18n.Tr "org.repo_updated"}} {{TimeSinceUnix .UpdatedUnix $.i18n.Lang}}

-
-
- {{else}} -
- {{$.i18n.Tr "explore.repo_no_results"}} -
- {{end}} -
diff --git a/custom/templates/explore/repo_right.tmpl b/custom/templates/explore/repo_right.tmpl deleted file mode 100644 index 0ba8ebfb1..000000000 --- a/custom/templates/explore/repo_right.tmpl +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/custom/templates/explore/repo_search.tmpl b/custom/templates/explore/repo_search.tmpl deleted file mode 100644 index 6c973026a..000000000 --- a/custom/templates/explore/repo_search.tmpl +++ /dev/null @@ -1,14 +0,0 @@ -
-
-
-
-
- - - - -
-
-
-
-
\ No newline at end of file diff --git a/custom/templates/explore/repos.tmpl b/custom/templates/explore/repos.tmpl deleted file mode 100644 index 32a0093af..000000000 --- a/custom/templates/explore/repos.tmpl +++ /dev/null @@ -1,20 +0,0 @@ -{{template "base/head" .}} -
- - {{template "explore/repo_search" .}} - -
-
- {{template "explore/navbar" .}} - -
- {{template "explore/repo_list" .}} - {{template "base/paginate" .}} -
-
- {{template "explore/repo_right" .}} -
-
-
-
-{{template "base/footer" .}} diff --git a/custom/templates/explore/search.tmpl b/custom/templates/explore/search.tmpl deleted file mode 100644 index 11e89d50a..000000000 --- a/custom/templates/explore/search.tmpl +++ /dev/null @@ -1,13 +0,0 @@ -
-
-
-
-
- - - -
-
-
-
-
\ No newline at end of file diff --git a/custom/templates/explore/users.tmpl b/custom/templates/explore/users.tmpl deleted file mode 100644 index 39f118a58..000000000 --- a/custom/templates/explore/users.tmpl +++ /dev/null @@ -1,63 +0,0 @@ -{{template "base/head" .}} -
- {{template "explore/search" .}} -
-
- {{template "explore/navbar" .}} -
- -

- {{.i18n.Tr "explore.users"}} -

- - -
- -
- {{range .Users}} -
- -
- {{.Name}} {{.FullName}} -
- {{if .Location}} - {{svg "octicon-location" 16}} {{.Location}} - {{end}} - {{if and $.ShowUserEmail .Email $.IsSigned (not .KeepEmailPrivate)}} - {{svg "octicon-mail" 16}} - {{.Email}} - {{end}} - {{svg "octicon-clock" 16}} {{$.i18n.Tr "user.join_on"}} {{.CreatedUnix.FormatShort}} -
-
-
- {{else}} -
{{$.i18n.Tr "explore.user_no_results"}}
- {{end}} -
- {{template "base/paginate" .}} -
-
- {{template "explore/repo_right" .}} -
- -
-
-
-{{template "base/footer" .}} diff --git a/custom/templates/home.tmpl b/custom/templates/home.tmpl deleted file mode 100644 index f0fff1777..000000000 --- a/custom/templates/home.tmpl +++ /dev/null @@ -1,254 +0,0 @@ -{{template "base/head" .}} -
- -
-
-
-

启智社区 -

Open Intelligence,Open Source,Open Community,Open Ecosystem

-

-
-
-
-
-
-
- OpenI DL -
-
- OpenI RL -
-
-
-
- 贡献者:百度 -
-
-
- -
-
-
-
- Brain++·天元 -
-
-
Brain++·天元
-
-
-
- 贡献者:旷视 -
-
-
- -
-
-
-
-
-
OpenI 天璇
- -
-
-
OpenI 天枢
- -
-
-
AVS3 解码
-
-
-
AVS3 编码
-
-
-
-
- 贡献者:北大深研院、鹏城实验室、深圳市超高清创新中心 -
-
-
- -
-
-
-
-
OpenI 海参
-
基于深度学习的视频智能编码
-
-
-
- 贡献者:鹏城实验室、北大、武大、中科大、哈工大 -
-
-
- -
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- 启智章鱼 -
-
-
新一代智能资源管理系统
-
-
-
- 贡献者:鹏城实验室、北大 -
-
-
- -
-
-
-
- OpenI珊瑚 -
-
-
异构资源调度项目
-
-
-
- 贡献者:华为 -
-
-
- -
-
-
-
- 启智Trustie -
-
-
群体化协同创新环境
-
-
-
- 贡献者:国防科大、北航、北大… -
-
-
- -
-
-
-
- 华为 -
-
-
华为软开云
-
-
- -
-
-
-
- OpenI 纵横 -
-
-
数据协同环境
-
-
-
- 贡献者:微众银行 -
-
-
- -
-
-
- -
-
-
-
-
-
-
鹏城云脑1、2
-
-
- -
-
-
-
-
北京、合肥、苏州…
-
-
- -
-
-
-
-
-
-
OpenI 海藻
-
可配置指令集和微架构的AI开源芯片
-
-
-
- 贡献者:北大、中科院、鹏城实验室 -
-
-
- -
-
-
-
- 华为云 -
-
- -
-
-
-
-
-
-
-
-
-
-
-
- -
-
-

启智社区期待您的加入

-

- OpenI社区旨在促进人工智能领域的开源开放协同创新,构建OpenI的技术链、创新链和生态链、推动人工智能产业健康快速发展及其在社会经济各领域的广泛应用。围绕重大产业创新,汇聚创新资源,促进众创共享,形成产业生态的目标,让"一体两翼"构想下的以技术专家为主体组成的多个工作组(标准工作组、知识产权工作组、投融资工作组、开源治理工作组等)、和以企业为主体的多个应用推进组(智能交通推进组、智能医疗推进组、智能金融推进组、智能教育推进组等)作为一个整体进行工作。以"完全开源、完全开放、完全免费、尊重创新"为准则,汇聚学术机构、商业实体、自然人或任何其他法人,共建共享开源软件、开源硬件和开源数据的超级社区;以众智、赛智、创智、有智等工作方法,努力建设成具有国际影响力的人工智能开源开放平台。 -

- 加入OpenI社区 -
- OpenI前期参与成员 -
-
-
- -
-{{template "base/footer" .}} diff --git a/custom/templates/org/header.tmpl b/custom/templates/org/header.tmpl deleted file mode 100644 index a2ceaac5f..000000000 --- a/custom/templates/org/header.tmpl +++ /dev/null @@ -1,27 +0,0 @@ - -
-
-
-
-
- {{with .Org}} - - {{.DisplayName}} - {{end}} - - {{if .IsOrganizationOwner}} - - {{end}} - {{if .CanCreateOrgRepo}} - - {{end}} -
-
-
-
-
- diff --git a/custom/templates/org/home.tmpl b/custom/templates/org/home.tmpl deleted file mode 100644 index a81e8ac17..000000000 --- a/custom/templates/org/home.tmpl +++ /dev/null @@ -1,87 +0,0 @@ -{{template "base/head" .}} -
- {{/* overflow: auto is the clearfix - this avoids the image going beyond - the container where it is supposed to stay inside. */}} -
-
- -
-
- {{.Org.DisplayName}} - {{if .IsOrganizationOwner}}{{svg "octicon-gear" 16}}{{end}} -
- {{if .Org.Description}}

{{.Org.Description}}

{{end}} -
- {{if .Org.Location}}
{{svg "octicon-location" 16}} {{.Org.Location}}
{{end}} - {{if .Org.Website}}
{{svg "octicon-link" 16}} {{.Org.Website}}
{{end}} -
-
-
-
- -
-
- {{template "org/navber" .}} - -
-
-
- {{if .CanCreateOrgRepo}} - - {{end}} - {{template "org/repo_list" .}} - {{template "base/paginate" .}} -
- -
-

- {{.i18n.Tr "org.people"}} - {{if .IsOrganizationMember}} - - {{end}} -

-
- {{$isMember := .IsOrganizationMember}} - {{range .Members}} - {{if or $isMember (.IsPublicMember $.Org.ID)}} - - {{end}} - {{end}} -
- - {{if .IsOrganizationMember}} -
- {{.i18n.Tr "org.teams"}} - -
- - {{if .IsOrganizationOwner}} - - {{end}} - {{end}} -
-
-
- -
-
-
-{{template "base/footer" .}} diff --git a/custom/templates/org/member/members.tmpl b/custom/templates/org/member/members.tmpl deleted file mode 100644 index 810a9eabb..000000000 --- a/custom/templates/org/member/members.tmpl +++ /dev/null @@ -1,75 +0,0 @@ -{{template "base/head" .}} -
- {{template "org/header" .}} -
- {{template "base/alert" .}} -
- {{template "org/navber" .}} - -
- {{ range .Members}} -
-
- -
- -
{{.FullName}}
-
-
- {{$.i18n.Tr "org.members.membership_visibility"}} -
-
- {{ $isPublic := index $.MembersIsPublicMember .ID}} - {{if $isPublic}} - {{$.i18n.Tr "org.members.public"}} - {{if or (eq $.SignedUser.ID .ID) $.IsOrganizationOwner}}({{$.i18n.Tr "org.members.public_helper"}}){{end}} - {{else}} - {{$.i18n.Tr "org.members.private"}} - {{if or (eq $.SignedUser.ID .ID) $.IsOrganizationOwner}}({{$.i18n.Tr "org.members.private_helper"}}){{end}} - {{end}} -
-
-
- {{$.i18n.Tr "org.members.member_role"}} -
-
- {{if index $.MembersIsUserOrgOwner .ID}}{{svg "octicon-shield-lock" 16}} {{$.i18n.Tr "org.members.owner"}}{{else}}{{$.i18n.Tr "org.members.member"}}{{end}} -
-
-
- 2FA -
-
- - {{if index $.MembersTwoFaStatus .ID}} - {{svg "octicon-check" 16}} - {{else}} - {{svg "octicon-x" 16}} - {{end}} - -
-
-
- {{if eq $.SignedUser.ID .ID}} -
- {{$.CsrfTokenHtml}} - -
- {{else if $.IsOrganizationOwner}} -
- {{$.CsrfTokenHtml}} - -
- {{end}} -
-
-
- {{end}} -
- - {{template "base/paginate" .}} -
- -
-
-{{template "base/footer" .}} diff --git a/custom/templates/org/team/teams.tmpl b/custom/templates/org/team/teams.tmpl deleted file mode 100644 index 21bd47e9e..000000000 --- a/custom/templates/org/team/teams.tmpl +++ /dev/null @@ -1,48 +0,0 @@ -{{template "base/head" .}} -
- {{template "org/header" .}} -
- {{template "base/alert" .}} - -
- - {{template "org/navber" .}} - -
-
- {{range .Teams}} -
-
- {{.Name}} -
- {{if .IsMember $.SignedUser.ID}} -
- {{$.CsrfTokenHtml}} - -
- {{else if $.IsOrganizationOwner}} -
- {{$.CsrfTokenHtml}} - -
- {{end}} -
-
-
- {{range .Members}} - - - - {{end}} -
-
-

{{.NumMembers}} {{$.i18n.Tr "org.lower_members"}} · {{.NumRepos}} {{$.i18n.Tr "org.lower_repositories"}}

-
-
- {{end}} -
-
-
-
-
-{{template "base/footer" .}} diff --git a/custom/templates/user/auth/signin.tmpl b/custom/templates/user/auth/signin.tmpl deleted file mode 100644 index 3d874be3f..000000000 --- a/custom/templates/user/auth/signin.tmpl +++ /dev/null @@ -1,10 +0,0 @@ -{{template "base/head" .}} -
- {{template "user/auth/signin_navbar" .}} -
-
- {{template "user/auth/signin_inner" .}} -
-
-
-{{template "base/footer" .}} diff --git a/custom/templates/user/auth/signin_inner.tmpl b/custom/templates/user/auth/signin_inner.tmpl deleted file mode 100644 index a827bde9e..000000000 --- a/custom/templates/user/auth/signin_inner.tmpl +++ /dev/null @@ -1,103 +0,0 @@ - - {{if or (not .LinkAccountMode) (and .LinkAccountMode .LinkAccountModeSignIn)}} - {{template "base/alert" .}} - {{end}} - -
-
-
-
-

- {{if .LinkAccountMode}} - {{.i18n.Tr "auth.oauth_signin_title"}} - {{else}} - {{.i18n.Tr "auth.login_userpass"}} - {{end}} -

-
- {{if .ShowRegistrationButton}} - - {{end}} -
- -
-
-
- {{.CsrfTokenHtml}} -
-
- - -
-
- {{if or (not .DisablePassword) .LinkAccountMode}} -
-
- - -
-
- {{end}} - {{if not .LinkAccountMode}} -
-
-
- - -
-
- -
- {{end}} - - - -
- -
- - {{if and .OrderedOAuth2Names .OAuth2Providers}} -
-
-
-
-
-
-

{{.i18n.Tr "sign_in_with"}}

- {{range $key := .OrderedOAuth2Names}} - {{$provider := index $.OAuth2Providers $key}} - - {{$provider.DisplayName}}{{if eq $provider.Name - {{end}} -
-
-
-
-
- {{end}} -
-
-
-
-
diff --git a/custom/templates/user/auth/signup_inner.tmpl b/custom/templates/user/auth/signup_inner.tmpl deleted file mode 100644 index bb3c343b7..000000000 --- a/custom/templates/user/auth/signup_inner.tmpl +++ /dev/null @@ -1,85 +0,0 @@ - - -
-
-
-
-
-
-

- {{if .LinkAccountMode}} - {{.i18n.Tr "auth.oauth_signup_title"}} - {{else}} - {{.i18n.Tr "sign_up"}} - {{end}} -

-
- {{if not .LinkAccountMode}} - - {{end}} -
-
-
-
- {{.CsrfTokenHtml}} - {{if or (not .LinkAccountMode) (and .LinkAccountMode .LinkAccountModeRegister)}} - {{template "base/alert" .}} - {{end}} - - {{if .DisableRegistration}} -

{{.i18n.Tr "auth.disable_register_prompt"}}

- {{else}} -
- -
-
- -
- - {{if not .DisablePassword}} -
- -
-
- -
- {{end}} - - {{if and .EnableCaptcha (eq .CaptchaType "image")}} -
- {{.Captcha.CreateHtml}} -
-
- -
- {{end}} - - {{if and .EnableCaptcha (eq .CaptchaType "recaptcha")}} -
-
-
- {{end}} - - - -
- -
- {{end}} -
-
-
-
-
-
-
diff --git a/custom/templates/user/dashboard/navbar.tmpl b/custom/templates/user/dashboard/navbar.tmpl deleted file mode 100644 index 520738e87..000000000 --- a/custom/templates/user/dashboard/navbar.tmpl +++ /dev/null @@ -1,59 +0,0 @@ -
- -
diff --git a/models/attachment.go b/models/attachment.go index 621f34216..6a2aa84de 100644 --- a/models/attachment.go +++ b/models/attachment.go @@ -31,9 +31,24 @@ type Attachment struct { Name string DownloadCount int64 `xorm:"DEFAULT 0"` Size int64 `xorm:"DEFAULT 0"` + IsPrivate bool `xorm:"DEFAULT false"` CreatedUnix timeutil.TimeStamp `xorm:"created"` } +func (a *Attachment) AfterUpdate() { + if a.DatasetID > 0 { + datasetIsPublicCount, err := x.Where("dataset_id = ? AND is_private = ?", a.DatasetID, false).Count(new(Attachment)) + if err != nil { + return + } + if datasetIsPublicCount > 0 { + x.Table(new(Dataset)).ID(a.DatasetID).Update(map[string]interface{}{"status": DatasetStatusPublic}) + } else { + x.Table(new(Dataset)).ID(a.DatasetID).Update(map[string]interface{}{"status": DatasetStatusPrivate}) + } + } +} + // IncreaseDownloadCount is update download count + 1 func (a *Attachment) IncreaseDownloadCount() error { // Update download count. @@ -264,7 +279,7 @@ func updateAttachment(e Engine, atta *Attachment) error { // Use uuid only if id is not set and uuid is set sess = e.Where("uuid = ?", atta.UUID) } - _, err := sess.Cols("name", "issue_id", "release_id", "comment_id", "download_count").Update(atta) + _, err := sess.Cols("name", "issue_id", "release_id", "comment_id", "download_count", "is_private").Update(atta) return err } diff --git a/models/dataset.go b/models/dataset.go index 2b54e539e..24bd212a1 100644 --- a/models/dataset.go +++ b/models/dataset.go @@ -26,6 +26,8 @@ type Dataset struct { Task string ReleaseID int64 `xorm:"INDEX"` UserID int64 `xorm:"INDEX"` + RepoID int64 `xorm:"INDEX"` + Repo *Repository `xorm:"-"` CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` @@ -57,19 +59,28 @@ func (datasets DatasetList) loadAttributes(e Engine) error { datasetIDs := make([]int64, len(datasets)) for i := range datasets { set[datasets[i].UserID] = struct{}{} + set[datasets[i].RepoID] = struct{}{} datasetIDs[i] = datasets[i].ID } // Load owners. users := make(map[int64]*User, len(set)) + repos := make(map[int64]*Repository, len(set)) if err := e. Where("id > 0"). In("id", keysInt64(set)). Find(&users); err != nil { return fmt.Errorf("find users: %v", err) } + if err := e. + Where("id > 0"). + In("id", keysInt64(set)). + Find(&repos); err != nil { + return fmt.Errorf("find repos: %v", err) + } for i := range datasets { datasets[i].User = users[datasets[i].UserID] + datasets[i].Repo = repos[datasets[i].RepoID] } return nil @@ -78,6 +89,7 @@ func (datasets DatasetList) loadAttributes(e Engine) error { type SearchDatasetOptions struct { Keyword string OwnerID int64 + RepoID int64 IncludePublic bool ListOptions SearchOrderBy @@ -91,6 +103,22 @@ func CreateDataset(dataset *Dataset) (err error) { return nil } +func CreateDefaultDatasetToRepo(repo *Repository) (err error) { + dataset := &Dataset{RepoID: repo.ID} + has, err := x.Get(dataset) + if err != nil { + return err + } + if !has { + dataset.Status = DatasetStatusPrivate + dataset.Title = repo.Name + if err = CreateDataset(dataset); err != nil { + return err + } + } + return nil +} + func SearchDataset(opts *SearchDatasetOptions) (DatasetList, int64, error) { cond := SearchDatasetCondition(opts) return SearchDatasetByCondition(opts, cond) @@ -104,6 +132,10 @@ func SearchDatasetCondition(opts *SearchDatasetOptions) builder.Cond { cond = cond.And(builder.Like{"title", opts.Keyword}) } + if opts.RepoID > 0 { + cond = cond.And(builder.Eq{"repo_id": opts.RepoID}) + } + if opts.IncludePublic { cond = cond.And(builder.Eq{"status": DatasetStatusPublic}) if opts.OwnerID > 0 { @@ -165,11 +197,11 @@ func (s datasetMetaSearch) Less(i, j int) bool { return s.ID[i] < s.ID[j] } -func GeDatasetAttachments(rels ...*Dataset) (err error) { - return geDatasetAttachments(x, rels...) +func GetDatasetAttachments(rels ...*Dataset) (err error) { + return getDatasetAttachments(x, rels...) } -func geDatasetAttachments(e Engine, rels ...*Dataset) (err error) { +func getDatasetAttachments(e Engine, rels ...*Dataset) (err error) { if len(rels) == 0 { return } @@ -248,6 +280,22 @@ func GetDatasetByID(id int64) (*Dataset, error) { return rel, nil } +func GetDatasetByRepo(repo *Repository) (*Dataset, error) { + if err := CreateDefaultDatasetToRepo(repo); err != nil { + return nil, err + } + dataset := &Dataset{RepoID: repo.ID} + has, err := x.Get(dataset) + if err != nil { + return nil, err + } + if has { + return dataset, nil + } else { + return nil, errors.New("Not Found") + } +} + func DeleteDataset(datasetID int64, uid int64) error { var err error sess := x.NewSession() diff --git a/models/migrations/v140.go b/models/migrations/v140.go index 758a7ef19..9accefac0 100644 --- a/models/migrations/v140.go +++ b/models/migrations/v140.go @@ -23,6 +23,7 @@ func addDatasetTable(x *xorm.Engine) error { Task string ReleaseID int64 `xorm:"INDEX"` UserID int64 `xorm:"INDEX"` + RepoID int64 `xorm:"INDEX"` CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` } diff --git a/models/repo.go b/models/repo.go index b85529ad3..1720c0311 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1070,6 +1070,12 @@ func CreateRepository(ctx DBContext, doer, u *User, repo *Repository) (err error Type: tp, Config: &PullRequestsConfig{AllowMerge: true, AllowRebase: true, AllowRebaseMerge: true, AllowSquash: true}, }) + } else if tp == UnitTypeDatasets { + units = append(units, RepoUnit{ + RepoID: repo.ID, + Type: tp, + Config: &DatasetConfig{EnableDataset: true}, + }) } else { units = append(units, RepoUnit{ RepoID: repo.ID, @@ -1132,6 +1138,10 @@ func CreateRepository(ctx DBContext, doer, u *User, repo *Repository) (err error return fmt.Errorf("copyDefaultWebhooksToRepo: %v", err) } + if err = CreateDefaultDatasetToRepo(repo); err != nil { + return fmt.Errorf("models.CreateDefaultDatasetToRepo: %v", err) + } + return nil } @@ -1572,6 +1582,7 @@ func DeleteRepository(doer *User, uid, repoID int64) error { &LanguageStat{RepoID: repoID}, &Comment{RefRepoID: repoID}, &Task{RepoID: repoID}, + &Dataset{RepoID: repoID}, ); err != nil { return fmt.Errorf("deleteBeans: %v", err) } diff --git a/models/repo_unit.go b/models/repo_unit.go index 42ce8f6c8..ba97c5314 100644 --- a/models/repo_unit.go +++ b/models/repo_unit.go @@ -113,6 +113,20 @@ func (cfg *PullRequestsConfig) IsMergeStyleAllowed(mergeStyle MergeStyle) bool { mergeStyle == MergeStyleSquash && cfg.AllowSquash } +type DatasetConfig struct { + EnableDataset bool +} + +// FromDB fills up a IssuesConfig from serialized format. +func (cfg *DatasetConfig) FromDB(bs []byte) error { + return json.Unmarshal(bs, &cfg) +} + +// ToDB exports a IssuesConfig to a serialized format. +func (cfg *DatasetConfig) ToDB() ([]byte, error) { + return json.Marshal(cfg) +} + // BeforeSet is invoked from XORM before setting the value of a field of this object. func (r *RepoUnit) BeforeSet(colName string, val xorm.Cell) { switch colName { @@ -128,6 +142,8 @@ func (r *RepoUnit) BeforeSet(colName string, val xorm.Cell) { r.Config = new(PullRequestsConfig) case UnitTypeIssues: r.Config = new(IssuesConfig) + case UnitTypeDatasets: + r.Config = new(DatasetConfig) default: panic("unrecognized repo unit type: " + com.ToStr(*val)) } @@ -169,6 +185,10 @@ func (r *RepoUnit) ExternalTrackerConfig() *ExternalTrackerConfig { return r.Config.(*ExternalTrackerConfig) } +func (r *RepoUnit) DatasetConfig() *DatasetConfig { + return r.Config.(*DatasetConfig) +} + func getUnitsByRepoID(e Engine, repoID int64) (units []*RepoUnit, err error) { var tmpUnits []*RepoUnit if err := e.Where("repo_id = ?", repoID).Find(&tmpUnits); err != nil { diff --git a/models/unit.go b/models/unit.go index bd2e6b13a..ef9daf4ba 100644 --- a/models/unit.go +++ b/models/unit.go @@ -24,6 +24,7 @@ const ( UnitTypeWiki // 5 Wiki UnitTypeExternalWiki // 6 ExternalWiki UnitTypeExternalTracker // 7 ExternalTracker + UnitTypeDatasets UnitType = 10 // 10 Dataset ) // Value returns integer value for unit type @@ -47,6 +48,8 @@ func (u UnitType) String() string { return "UnitTypeExternalWiki" case UnitTypeExternalTracker: return "UnitTypeExternalTracker" + case UnitTypeDatasets: + return "UnitTypeDataset" } return fmt.Sprintf("Unknown UnitType %d", u) } @@ -68,6 +71,7 @@ var ( UnitTypeWiki, UnitTypeExternalWiki, UnitTypeExternalTracker, + UnitTypeDatasets, } // DefaultRepoUnits contains the default unit types @@ -77,6 +81,7 @@ var ( UnitTypePullRequests, UnitTypeReleases, UnitTypeWiki, + UnitTypeDatasets, } // NotAllowedDefaultRepoUnits contains units that can't be default @@ -242,6 +247,14 @@ var ( 4, } + UnitDataset = Unit{ + UnitTypeDatasets, + "repo.datasets", + "/datasets", + "repo.datasets.desc", + 5, + } + // Units contains all the units Units = map[UnitType]Unit{ UnitTypeCode: UnitCode, @@ -251,6 +264,7 @@ var ( UnitTypeReleases: UnitReleases, UnitTypeWiki: UnitWiki, UnitTypeExternalWiki: UnitExternalWiki, + UnitTypeDatasets: UnitDataset, } ) diff --git a/modules/auth/repo_form.go b/modules/auth/repo_form.go index 6c3421e4f..4f97acb1a 100644 --- a/modules/auth/repo_form.go +++ b/modules/auth/repo_form.go @@ -120,6 +120,7 @@ type RepoSettingForm struct { EnablePrune bool // Advanced settings + EnableDataset bool EnableWiki bool EnableExternalWiki bool ExternalWikiURL string diff --git a/modules/context/repo.go b/modules/context/repo.go index 5ebed0eb7..9d94030d8 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -813,6 +813,7 @@ func UnitTypes() macaron.Handler { return func(ctx *Context) { ctx.Data["UnitTypeCode"] = models.UnitTypeCode ctx.Data["UnitTypeIssues"] = models.UnitTypeIssues + ctx.Data["UnitTypeDatasets"] = models.UnitTypeDatasets ctx.Data["UnitTypePullRequests"] = models.UnitTypePullRequests ctx.Data["UnitTypeReleases"] = models.UnitTypeReleases ctx.Data["UnitTypeWiki"] = models.UnitTypeWiki diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index ca44a8685..fe913ecf7 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -625,6 +625,7 @@ email_notifications.submit = Set Email Preference [dataset] dataset = Dataset +dataset_setting= Dataset Setting title = Name description = Description create_dataset = Create Dataset @@ -632,14 +633,19 @@ show_dataset= Dataset edit_dataset= Edit Dataset update_dataset= Update Dataset category = Category +no_category = No Category task = Task +no_task = No Task license = License +no_license = No License file = Dataset File download = download +download_count = download count edit = edit private = private public = public back = back +copy_url=copy download url visibility = visibility visibility_description = Only the owner or the organization members if they have rights, will be able to see it. visibility_helper = Make Dataset Private @@ -688,6 +694,11 @@ category.computer_vision= computer vision category.natural_language_processing= natural language processing category.speech_processing= speech processing category.computer_vision_natural_language_processing= computer vision and natural language processing +attachment.delete= delete this version of dataset +attachment.delete_desc= Are you sure you will delete this version of dataset, once deelted can not be recovery +public= public +private= private +delete= deelte [repo] owner = Owner @@ -739,6 +750,7 @@ reactions_more = and %d more unit_disabled = The site administrator has disabled this repository section. language_other = Other datasets = Datasets +datasets.desc = Enable Dataset template.items = Template Items template.git_content = Git Content (Default Branch) @@ -1407,6 +1419,7 @@ settings.use_external_wiki = Use External Wiki settings.external_wiki_url = External Wiki URL settings.external_wiki_url_error = The external wiki URL is not a valid URL. settings.external_wiki_url_desc = Visitors are redirected to the external wiki URL when clicking the wiki tab. +settings.dataset_desc= Enable Repository Dataset settings.issues_desc = Enable Repository Issue Tracker settings.use_internal_issue_tracker = Use Built-In Issue Tracker settings.use_external_issue_tracker = Use External Issue Tracker diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index eaedc0e9b..40472338e 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -44,16 +44,16 @@ u2f_error_4=此请求不允许使用安全密钥。请确保该密钥尚未注 u2f_error_5=在读取到密钥之前超时。请重新加载本页面以重试。 u2f_reload=重新加载 -repository=仓库 +repository=项目 organization=组织 mirror=镜像 -new_repo=创建仓库 +new_repo=创建项目 new_dataset=创建数据集 -new_migrate=迁移外部仓库 +new_migrate=迁移外部项目 edit_dataset = Edit Dataset update_dataset = update Dataset new_mirror=创建新的镜像 -new_fork=新的仓库Fork +new_fork=新的项目Fork new_org=创建组织 manage_org=管理我的组织 admin_panel=管理后台 @@ -130,8 +130,8 @@ err_admin_name_is_invalid=管理员用户名无效 general_title=一般设置 app_name=站点名称 app_name_helper=您可以在此输入您公司的名称。 -repo_path=仓库根目录 -repo_path_helper=所有远程 Git 仓库将保存到此目录。 +repo_path=项目根目录 +repo_path_helper=所有远程 Git 项目将保存到此目录。 lfs_path=LFS根目录 lfs_path_helper=存储为Git LFS的文件将被存储在此目录。留空禁用LFS run_user=以用户名运行 @@ -184,7 +184,7 @@ install_btn_confirm=立即安装 test_git_failed=无法识别 'git' 命令:%v sqlite3_not_available=您所使用的发行版不支持 SQLite3,请从 %s 下载官方构建版,而不是 gobuild 版本。 invalid_db_setting=数据库设置无效: %v -invalid_repo_path=仓库根目录设置无效:%v +invalid_repo_path=项目根目录设置无效:%v run_user_not_match=运行用户名不是当前的用户名:%s -> %s save_config_failed=应用配置保存失败:%v invalid_admin_setting=管理员帐户设置无效: %v @@ -203,13 +203,13 @@ no_reply_address_helper=具有隐藏电子邮件地址的用户的域名。例 uname_holder=登录名或电子邮箱地址 password_holder=密码 switch_dashboard_context=切换控制面板用户 -my_repos=仓库列表 -show_more_repos=显示更多仓库… -collaborative_repos=参与协作的仓库 +my_repos=项目列表 +show_more_repos=显示更多项目… +collaborative_repos=参与协作的项目 my_orgs=我的组织 my_mirrors=我的镜像 view_home=访问 %s -search_repos=查找仓库… +search_repos=查找项目… filter=其他过滤器 show_archived=已存档 @@ -222,15 +222,15 @@ show_both_private_public=显示公开的和私有的 show_only_private=只显示私有的 show_only_public=只显示公开的 -issues.in_your_repos=属于该用户仓库的 +issues.in_your_repos=属于该用户项目的 [explore] -repos=仓库 +repos=项目 users=用户 organizations=组织 search=搜索 code=代码 -repo_no_results=未找到匹配的仓库。 +repo_no_results=未找到匹配的项目。 dataset_no_results = 未找到匹配的数据集。 user_no_results=未找到匹配的用户。 org_no_results=未找到匹配的组织。 @@ -293,7 +293,7 @@ email_domain_blacklisted=您不能使用您的电子邮件地址注册。 authorize_application=应用授权 authorize_redirect_notice=如果您授权此应用,您将会被重定向到 %s。 authorize_application_created_by=此应用由%s创建。 -authorize_application_description=如果您允许,它将能够读取和修改您的所有帐户信息,包括私人仓库和组织。 +authorize_application_description=如果您允许,它将能够读取和修改您的所有帐户信息,包括私人项目和组织。 authorize_title=授权 %s 访问您的帐户? authorization_failed=授权失败 authorization_failed_desc=授权失败,这是一个无效的请求。请联系尝试授权应用的管理员。 @@ -314,7 +314,7 @@ modify=更新 [form] UserName=用户名 -RepoName=仓库名称 +RepoName=项目名称 Email=邮箱地址 Password=密码 Retype=重新输入密码 @@ -352,12 +352,12 @@ password_not_match=密码不匹配。 lang_select_error=从列表中选出语言 username_been_taken=用户名已被使用。 -repo_name_been_taken=仓库名称已被使用。 +repo_name_been_taken=项目名称已被使用。 visit_rate_limit=远程访问达到速度限制。 2fa_auth_required=远程访问需要双重验证。 org_name_been_taken=组织名称已被使用。 team_name_been_taken=团队名称已被使用。 -team_no_units_error=至少选择一项仓库单元。 +team_no_units_error=至少选择一项项目单元。 email_been_used=该电子邮件地址已在使用中。 openid_been_used=OpenID 地址 '%s' 已被使用。 username_password_incorrect=用户名或密码不正确。 @@ -366,7 +366,7 @@ password_lowercase_one=至少一个小写字符 password_uppercase_one=至少一个大写字符 password_digit_one=至少一个数字 password_special_one=至少一个特殊字符(标点符号,括号,引号等) -enterred_invalid_repo_name=输入的仓库名称不正确 +enterred_invalid_repo_name=输入的项目名称不正确 enterred_invalid_owner_name=新的所有者名称无效。 enterred_invalid_password=输入的密码不正确 user_not_exist=该用户名不存在 @@ -379,16 +379,16 @@ invalid_gpg_key=无法验证您的 GPG 密钥: %s unable_verify_ssh_key=无法验证SSH密钥,再次检查是否有误。 auth_failed=授权验证失败:%v -still_own_repo=此帐户仍拥有至少一个仓库,您需要先删除或转移它们。 +still_own_repo=此帐户仍拥有至少一个项目,您需要先删除或转移它们。 still_has_org=此帐户仍隶属于一个或多个组织,您需要退出他们。 -org_still_own_repo=该组织仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除组织操作! +org_still_own_repo=该组织仍然是某些项目的拥有者,您必须先转移或删除它们才能执行删除组织操作! target_branch_not_exist=目标分支不存在。 [user] change_avatar=修改头像 join_on=加入于 -repositories=仓库列表 +repositories=项目列表 datasets=数据集 activity=公开活动 followers=关注者 @@ -413,7 +413,7 @@ ssh_gpg_keys=SSH / GPG 密钥 social=社交帐号绑定 applications=应用 orgs=管理组织 -repos=仓库列表 +repos=项目列表 delete=删除帐户 twofa=两步验证 account_link=已绑定帐户 @@ -491,7 +491,7 @@ openid_desc=OpenID 让你可以将认证转发到外部服务。 manage_ssh_keys=管理 SSH 密钥 manage_gpg_keys=管理 GPG 密钥 add_key=增加密钥 -ssh_desc=这些 SSH 公钥已经关联到你的账号。相应的私钥拥有完全操作你的仓库的权限。 +ssh_desc=这些 SSH 公钥已经关联到你的账号。相应的私钥拥有完全操作你的项目的权限。 gpg_desc=这些 GPG 公钥已经关联到你的账号。请妥善保管你的私钥因为他们将被用于认证提交。 ssh_helper=需要帮助? 请查看有关 如何生成 SSH 密钥常见 SSH 问题 寻找答案。 gpg_helper=需要帮助吗?看一看 GitHub 关于GPG 的指导。 @@ -610,7 +610,7 @@ remove_account_link_desc=删除已绑定帐户将吊销其对您的 Gitea 帐户 remove_account_link_success=已取消绑定帐户。 orgs_none=您现在还不是任何组织的成员。 -repos_none=你并不拥有任何仓库 +repos_none=你并不拥有任何项目 delete_account=删除当前帐户 delete_prompt=此操作将永久删除您的用户帐户。它 不能 被撤消。 @@ -625,6 +625,7 @@ email_notifications.submit=邮件通知设置 [dataset] dataset=数据集 +dataset_setting=数据集设置 title=名称 description=描述 create_dataset=创建数据集 @@ -632,14 +633,19 @@ show_dataset=数据集 edit_dataset=编辑数据集 update_dataset=更新数据集 category=分类 -task=针对的具体任务 +no_category=未设置分类 +task=研究方向/应用领域 +no_task=未设置研究方向/应用领域 license=license +no_license=没有设置license file=数据集文件 download=下载附件 +download_count = 下载统计 edit=编辑 private=私有 public=公有 back=返回 +copy_url=复制下载链接 visibility=可见性 visibility_description=只有组织所有人或拥有权利的组织成员才能看到。 visibility_helper=将数据集设为私有 @@ -649,7 +655,7 @@ settings.delete=删除数据集 settings.delete_desc=删除据集是永久性的, 无法撤消。 settings.delete_notices_1=- 此操作 不可以 被回滚。 settings.delete_notices_2=- 此操作将永久删除据集 %s。 -settings.delete_notices_fork_1=- 在此仓库删除后,它的派生据集将变成独立据集。 +settings.delete_notices_fork_1=- 在此项目删除后,它的派生据集将变成独立据集。 settings.deletion_success=据集已被删除。 task.machine_translation=机器翻译 task.question_answering_system=问答系统 @@ -688,30 +694,35 @@ category.computer_vision=计算机视觉 category.natural_language_processing=自然语言处理 category.speech_processing=语音处理 category.computer_vision_natural_language_processing=计算机视觉、自然语言处理 +attachment.delete= 删除该版本的数据集 +attachment.delete_desc= 你确定要删除该版本的数据集么?一旦删除不能恢复。 +public=公有 +private=私有 +delete=删除 [repo] owner=拥有者 -repo_name=仓库名称 +repo_name=项目名称 repo_name_helper=好的存储库名称使用简短、深刻和独特的关键字。 -repo_size=仓库大小 +repo_size=项目大小 template=模板 template_select=选择模板 -template_helper=设置仓库为模板仓库 -template_description=模板仓库让用户通过拷贝目录结构,文件和可选设置来生成仓库。 +template_helper=设置项目为模板项目 +template_description=模板项目让用户通过拷贝目录结构,文件和可选设置来生成项目。 visibility=可见性 visibility_description=只有组织所有人或拥有权利的组织成员才能看到。 -visibility_helper=将仓库设为私有 -visibility_helper_forced=站点管理员强制要求新仓库为私有。 -visibility_fork_helper=(修改该值将会影响到所有派生仓库) +visibility_helper=将项目设为私有 +visibility_helper_forced=站点管理员强制要求新项目为私有。 +visibility_fork_helper=(修改该值将会影响到所有派生项目) clone_helper=不知道如何克隆?查看帮助 。 -fork_repo=派生仓库 +fork_repo=派生项目 fork_from=派生自 -fork_visibility_helper=无法更改派生仓库的可见性。 +fork_visibility_helper=无法更改派生项目的可见性。 use_template=使用此模板 -generate_repo=生成仓库 +generate_repo=生成项目 generate_from=生成自 -repo_desc=仓库描述 -repo_lang=仓库语言 +repo_desc=项目描述 +repo_lang=项目语言 repo_gitignore_helper=选择 .gitignore 模板。 issue_labels=工单标签 issue_labels_helper=选择一个工单标签集 @@ -720,7 +731,7 @@ license_helper=选择授权许可文件。 readme=自述 readme_helper=选择自述文件模板。 auto_init=初始化存储库 (添加. gitignore、许可证和自述文件) -create_repo=创建仓库 +create_repo=创建项目 default_branch=默认分支 mirror_prune=修剪 mirror_prune_desc=删除过时的远程跟踪引用 @@ -733,35 +744,36 @@ mirror_address_protocol_invalid=提供的 url 无效。只能从 http(s):// 或 mirror_last_synced=上次同步 watchers=关注者 stargazers=称赞者 -forks=派生仓库 +forks=派生项目 pick_reaction=选择你的表情 reactions_more=再加载 %d -unit_disabled=站点管理员已禁用此仓库单元。 +unit_disabled=站点管理员已禁用此项目单元。 language_other=其它 datasets = 数据集 +datasets.desc = 数据集功能 template.items=模板选项 template.git_content=Git数据(默认分支) template.git_hooks=Git 钩子 -template.git_hooks_tooltip=您目前无法修改或删除曾经添加过的 git 钩子。请仅在您信任模板仓库时选择此项。 +template.git_hooks_tooltip=您目前无法修改或删除曾经添加过的 git 钩子。请仅在您信任模板项目时选择此项。 template.webhooks=Web 钩子 template.topics=主题 template.avatar=头像 template.issue_labels=工单标签 template.one_item=必须至少选择一个模板项 -template.invalid=必须选择一个模板仓库 +template.invalid=必须选择一个模板项目 -archive.title=此仓库已存档。您可以查看文件和克隆,但不能推送或创建工单/合并请求。 -archive.issue.nocomment=此仓库已存档,您不能在此工单添加评论。 -archive.pull.nocomment=此仓库已存档,您不能在此合并请求添加评论。 +archive.title=此项目已存档。您可以查看文件和克隆,但不能推送或创建工单/合并请求。 +archive.issue.nocomment=此项目已存档,您不能在此工单添加评论。 +archive.pull.nocomment=此项目已存档,您不能在此合并请求添加评论。 -form.reach_limit_of_creation=你已经达到了您的 %d 仓库的限制。 -form.name_reserved=仓库名称 '%s' 是被保留的。 -form.name_pattern_not_allowed=仓库名称中不允许使用模式 "%s"。 +form.reach_limit_of_creation=你已经达到了您的 %d 项目的限制。 +form.name_reserved=项目名称 '%s' 是被保留的。 +form.name_pattern_not_allowed=项目名称中不允许使用模式 "%s"。 need_auth=需要授权验证 migrate_type=迁移类型 -migrate_type_helper=该仓库将是一个 镜像 +migrate_type_helper=该项目将是一个 镜像 migrate_items=迁移项目 migrate_items_wiki=百科 migrate_items_milestones=里程碑 @@ -769,11 +781,11 @@ migrate_items_labels=标签 migrate_items_issues=工单 migrate_items_pullrequests=合并请求 migrate_items_releases=版本发布 -migrate_repo=迁移仓库 +migrate_repo=迁移项目 migrate.clone_address=从 URL 迁移/克隆 -migrate.clone_address_desc=现有仓库的 HTTP(s) 或 Git "clone" URL +migrate.clone_address_desc=现有项目的 HTTP(s) 或 Git "clone" URL migrate.clone_local_path=或服务器本地路径 -migrate.permission_denied=您没有获得导入本地仓库的权限。 +migrate.permission_denied=您没有获得导入本地项目的权限。 migrate.invalid_local_path=无效的本地路径,不存在或不是一个目录! migrate.failed=迁移失败:%v migrate.lfs_mirror_unsupported=不支持镜像 LFS 对象 - 使用 'git lfs fetch --all' 和 'git lfs push --all' 替代。 @@ -786,8 +798,8 @@ migrate.migrating_failed=从 %s 迁移失败。 mirror_from=镜像自地址 forked_from=派生自 generated_from=生成自 -fork_from_self=无法派生已经拥有的仓库! -fork_guest_user=登录并 派生 这个仓库。 +fork_from_self=无法派生已经拥有的项目! +fork_guest_user=登录并 派生 这个项目。 copy_link=复制链接 copy_link_success=已复制链接 copy_link_error=请按下 ⌘-C 或 Ctrl-C 复制 @@ -797,13 +809,13 @@ watch=关注 unstar=取消点赞 star=点赞 fork=派生 -download_archive=下载此仓库 +download_archive=下载此项目 no_desc=暂无描述 quick_guide=快速帮助 -clone_this_repo=克隆当前仓库 -create_new_repo_command=从命令行创建一个新的仓库 -push_exist_repo=从命令行推送已经创建的仓库 +clone_this_repo=克隆当前项目 +create_new_repo_command=从命令行创建一个新的项目 +push_exist_repo=从命令行推送已经创建的项目 empty_message=这个家伙很懒,什么都没有推送。 code=代码 @@ -816,7 +828,7 @@ tags=标签列表 issues=工单 pulls=合并请求 labels=标签 -org_labels_desc=组织级别的标签,可以被本组织下的 所有仓库 使用 +org_labels_desc=组织级别的标签,可以被本组织下的 所有项目 使用 org_labels_desc_manage=管理 milestones=里程碑 @@ -847,7 +859,7 @@ editor.cannot_edit_non_text_files=网页不能编辑二进制文件。 editor.edit_this_file=编辑文件 editor.this_file_locked=文件已锁定 editor.must_be_on_a_branch=您必须在某个分支上才能对此文件进行修改操作。 -editor.fork_before_edit=您必须在派生这个仓库才能对此文件进行修改操作 +editor.fork_before_edit=您必须在派生这个项目才能对此文件进行修改操作 editor.delete_this_file=删除文件 editor.must_have_write_access=您必须具有写权限才能对此文件进行修改操作。 editor.file_delete_success=文件 %s 已被删除。 @@ -870,15 +882,15 @@ editor.new_branch_name_desc=新的分支名称... editor.cancel=取消 editor.filename_cannot_be_empty=文件名不能为空。 editor.filename_is_invalid=文件名无效:'%s'。 -editor.branch_does_not_exist=此仓库中不存在名为 '%s' 的分支。 -editor.branch_already_exists=此仓库已存在名为 '%s' 的分支。 -editor.directory_is_a_file='%s' 已经作为文件名在此仓库中存在。 +editor.branch_does_not_exist=此项目中不存在名为 '%s' 的分支。 +editor.branch_already_exists=此项目已存在名为 '%s' 的分支。 +editor.directory_is_a_file='%s' 已经作为文件名在此项目中存在。 editor.file_is_a_symlink='%s' 是一个符号链接,无法在线编辑。 -editor.filename_is_a_directory='%s' 已经作为目录名在此仓库中存在。 +editor.filename_is_a_directory='%s' 已经作为目录名在此项目中存在。 editor.file_editing_no_longer_exists=正在编辑的文件 '%s' 已不存在。 -editor.file_deleting_no_longer_exists=仓库中不存在将被删除的文件‘%s’。 +editor.file_deleting_no_longer_exists=项目中不存在将被删除的文件‘%s’。 editor.file_changed_while_editing=文件内容在您进行编辑时已经发生变动。单击此处 查看变动的具体内容,或者 再次提交 覆盖已发生的变动。 -editor.file_already_exists=此仓库已经存在名为 '%s' 的文件。 +editor.file_already_exists=此项目已经存在名为 '%s' 的文件。 editor.commit_empty_file_header=提交一个空文件 editor.commit_empty_file_text=您要提交的文件是空的,继续吗? editor.no_changes_to_show=没有可以显示的变更。 @@ -1070,7 +1082,7 @@ issues.unlock_comment=解锁此对话 %s issues.lock_confirm=锁定 issues.unlock_confirm=解锁​​​​ issues.lock.notice_1=- 其他用户不能对这个工单添加新的评论。 -issues.lock.notice_2=- 您和仓库其他协作者仍可评论并可见。 +issues.lock.notice_2=- 您和项目其他协作者仍可评论并可见。 issues.lock.notice_3=- 您可以在未来再次解锁这个工单。 issues.unlock.notice_1=- 每个人都可以再次就这一工单发表评论。 issues.unlock.notice_2=- 您可以在未来再次解锁这个工单。 @@ -1106,7 +1118,7 @@ issues.due_date_form=yyyy年mm月dd日 issues.due_date_form_add=添加到期时间 issues.due_date_form_edit=编辑 issues.due_date_form_remove=删除 -issues.due_date_not_writer=你需要仓库写入权限来更新工单到期时间。 +issues.due_date_not_writer=你需要项目写入权限来更新工单到期时间。 issues.due_date_not_set=未设置到期时间。 issues.due_date_added=到期时间 %s %s 已添加 issues.due_date_modified=已将到期时间从 %s %s 修改为 %s @@ -1139,7 +1151,7 @@ issues.dependency.add_error_dep_issue_not_exist=依赖项不存在。 issues.dependency.add_error_dep_not_exist=依赖项不存在。 issues.dependency.add_error_dep_exists=依赖项已存在。 issues.dependency.add_error_cannot_create_circular=您不能创建依赖, 使得两个工单相互阻止。 -issues.dependency.add_error_dep_not_same_repo=这两个工单必须在同一仓库。 +issues.dependency.add_error_dep_not_same_repo=这两个工单必须在同一项目。 issues.review.self.approval=您不能批准您自己的合并请求。 issues.review.self.rejection=您不能请求对您自己的合并请求进行更改。 issues.review.approve=已于 %s 批准这些更改 @@ -1188,7 +1200,7 @@ pulls.is_closed=合并请求已经关闭。 pulls.has_merged=请求已合并。 pulls.title_wip_desc=`标题以 %s 开头以免合并请求意外合并。` pulls.cannot_merge_work_in_progress=这个合并请求被标记为尚未完成的工作。完成后请从标题中移除%s前缀。 -pulls.data_broken=此合并请求因为派生仓库信息缺失而中断。 +pulls.data_broken=此合并请求因为派生项目信息缺失而中断。 pulls.files_conflicted=此合并请求有变更与目标分支冲突。 pulls.is_checking=正在进行合并冲突检测,请稍后再试。 pulls.required_status_check_failed=一些必要的检查没有成功。 @@ -1210,7 +1222,7 @@ pulls.waiting_count_1=%d 个正在等待审核 pulls.waiting_count_n=%d 个正在等待审核 pulls.no_merge_desc=由于未启用合并选项,此合并请求无法被合并。 -pulls.no_merge_helper=在仓库设置中启用合并选项或者手工合并请求。 +pulls.no_merge_helper=在项目设置中启用合并选项或者手工合并请求。 pulls.no_merge_wip=这个合并请求无法合并,因为被标记为尚未完成的工作。 pulls.no_merge_not_ready=此拉取请求尚未准备好合并,请检查审核状态和状态检查。 pulls.no_merge_access=您无权合并此拉取请求。 @@ -1224,8 +1236,8 @@ pulls.merge_conflict=合并失败:合并时发生冲突:%[1]s
[2]
提 pulls.rebase_conflict=合并失败:Rebase合并时发生冲突:%[1]s
%[2]s
%[3]s
提示:尝试不同的合并策略 pulls.unrelated_histories=合并失败:两个分支没有共同历史。提示:尝试不同的策略 pulls.merge_out_of_date=合并失败:在生成合并时,主分支已更新。提示:再试一次。 -pulls.push_rejected=合并失败:这个推送被拒绝并收到以下消息:
%s
检查这个仓库的 githooks -pulls.push_rejected_no_message=合并失败:这个推送被拒绝但没有远程消息。
检查这个仓库的 githooks +pulls.push_rejected=合并失败:这个推送被拒绝并收到以下消息:
%s
检查这个项目的 githooks +pulls.push_rejected_no_message=合并失败:这个推送被拒绝但没有远程消息。
检查这个项目的 githooks pulls.open_unmerged_pull_exists=`您不能执行重新打开操作, 因为已经存在相同的合并请求 (#%d)。` pulls.status_checking=一些检测仍在等待运行 pulls.status_checks_success=所有检测均成功 @@ -1376,12 +1388,12 @@ activity.git_stats_deletion_1=删除 %d 行 activity.git_stats_deletion_n=删除 %d 行 search=搜索 -search.search_repo=搜索仓库... +search.search_repo=搜索项目... search.results=在 %s 中搜索 "%s" 的结果 -settings=仓库设置 -settings.desc=设置是你可以管理仓库设置的地方 -settings.options=仓库 +settings=项目设置 +settings.desc=设置是你可以管理项目设置的地方 +settings.options=项目 settings.collaboration=协作者 settings.collaboration.admin=管理员 settings.collaboration.write=可写权限 @@ -1399,14 +1411,15 @@ settings.email_notifications.onmention=只在被提到时邮件通知 settings.email_notifications.disable=停用邮件通知 settings.email_notifications.submit=邮件通知设置 settings.site=网站 -settings.update_settings=更新仓库设置 +settings.update_settings=更新项目设置 settings.advanced_settings=高级设置 -settings.wiki_desc=启用仓库百科 +settings.wiki_desc=启用项目百科 settings.use_internal_wiki=使用内置百科 settings.use_external_wiki=使用外部百科 settings.external_wiki_url=外部 Wiki 链接 settings.external_wiki_url_error=外部百科链接无效 settings.external_wiki_url_desc=当点击工单标签时,访问者将被重定向到外部工单系统的URL。 +settings.dataset_desc=启用数据集 settings.issues_desc=启用工单系统 settings.use_internal_issue_tracker=使用内置的轻量级工单管理系统 settings.use_external_issue_tracker=使用外部的工单管理系统 @@ -1418,7 +1431,7 @@ settings.tracker_url_format_error=外部工单链接无效 settings.tracker_issue_style=外部工单管理系统的编号格式 settings.tracker_issue_style.numeric=纯数字形式 settings.tracker_issue_style.alphanumeric=英文字母数字组合形式 -settings.tracker_url_format_desc=使用占位符 {user}, {repo}{index} 作为用户名、仓库名和工单索引。 +settings.tracker_url_format_desc=使用占位符 {user}, {repo}{index} 作为用户名、项目名和工单索引。 settings.enable_timetracker=启用时间跟踪 settings.allow_only_contributors_to_track_time=仅允许成员跟踪时间 settings.pulls_desc=启用合并请求 @@ -1428,56 +1441,56 @@ settings.pulls.allow_rebase_merge=启用变基合并提交 settings.pulls.allow_rebase_merge_commit=启用变基显式合并 (--no-ff) settings.pulls.allow_squash_commits=启用Squash合并提交 settings.admin_settings=管理员设置 -settings.admin_enable_health_check=启用仓库健康检查 (git fsck) +settings.admin_enable_health_check=启用项目健康检查 (git fsck) settings.admin_enable_close_issues_via_commit_in_any_branch=通过在非默认分支中提交来关闭工单 settings.danger_zone=危险操作区 -settings.new_owner_has_same_repo=新的仓库拥有者已经存在同名仓库! -settings.convert=转换为普通仓库 -settings.convert_desc=您可以将该镜像仓库转换为普通仓库,但此操作不可恢复。 -settings.convert_notices_1=该操作会将镜像仓库转换为普通仓库,但该操作不可恢复。 -settings.convert_confirm=转换仓库 -settings.convert_succeed=此镜像仓库已经转换为普通仓库。 -settings.transfer=转移仓库所有权 -settings.transfer_desc=您可以将仓库转移至您拥有管理员权限的帐户或组织。 +settings.new_owner_has_same_repo=新的项目拥有者已经存在同名项目! +settings.convert=转换为普通项目 +settings.convert_desc=您可以将该镜像项目转换为普通项目,但此操作不可恢复。 +settings.convert_notices_1=该操作会将镜像项目转换为普通项目,但该操作不可恢复。 +settings.convert_confirm=转换项目 +settings.convert_succeed=此镜像项目已经转换为普通项目。 +settings.transfer=转移项目所有权 +settings.transfer_desc=您可以将项目转移至您拥有管理员权限的帐户或组织。 settings.transfer_notices_1=-如果将其传输给单个用户, 您将失去对存储库的访问权限。 -settings.transfer_notices_2=-如果将其转移到您 (共同) 拥有的组织,您可以继续访问该仓库。 -settings.transfer_form_title=输入仓库名称以做确认: +settings.transfer_notices_2=-如果将其转移到您 (共同) 拥有的组织,您可以继续访问该项目。 +settings.transfer_form_title=输入项目名称以做确认: settings.wiki_delete=删除百科数据 -settings.wiki_delete_desc=删除仓库百科数据是永久性的,无法撤消。 +settings.wiki_delete_desc=删除项目百科数据是永久性的,无法撤消。 settings.wiki_delete_notices_1=- 这将永久删除和禁用 %s 的百科。 settings.confirm_wiki_delete=删除百科数据 -settings.wiki_deletion_success=仓库百科数据删除成功! -settings.delete=删除本仓库 -settings.delete_desc=删除仓库是永久性的, 无法撤消。 +settings.wiki_deletion_success=项目百科数据删除成功! +settings.delete=删除本项目 +settings.delete_desc=删除项目是永久性的, 无法撤消。 settings.delete_notices_1=- 此操作 不可以 被回滚。 -settings.delete_notices_2=- 此操作将永久删除仓库 %s,包括 Git 数据、 工单、评论、百科和协作者的操作权限。 -settings.delete_notices_fork_1=- 在此仓库删除后,它的派生仓库将变成独立仓库。 -settings.deletion_success=仓库已被删除。 -settings.update_settings_success=仓库设置已更新。 +settings.delete_notices_2=- 此操作将永久删除项目 %s,包括 Git 数据、 工单、评论、百科和协作者的操作权限。 +settings.delete_notices_fork_1=- 在此项目删除后,它的派生项目将变成独立项目。 +settings.deletion_success=项目已被删除。 +settings.update_settings_success=项目设置已更新。 settings.transfer_owner=新拥有者 settings.make_transfer=开始转移 -settings.transfer_succeed=仓库已被转移。 -settings.confirm_delete=删除本仓库 +settings.transfer_succeed=项目已被转移。 +settings.confirm_delete=删除本项目 settings.add_collaborator=增加协作者 settings.add_collaborator_success=协作者添加成功! settings.add_collaborator_inactive_user=无法添加未激活的用户作为合作者。 -settings.add_collaborator_duplicate=合作者已经被添加到本仓库。 +settings.add_collaborator_duplicate=合作者已经被添加到本项目。 settings.delete_collaborator=删除 settings.collaborator_deletion=删除协作者 -settings.collaborator_deletion_desc=删除协作者后他将无法再对此仓库的访问。继续? +settings.collaborator_deletion_desc=删除协作者后他将无法再对此项目的访问。继续? settings.remove_collaborator_success=协作者删除成功! settings.search_user_placeholder=搜索用户... -settings.org_not_allowed_to_be_collaborator=组织不允许被添加为仓库协作者! -settings.change_team_access_not_allowed=更改仓库的团队访问权限仅限于组织所有者 -settings.team_not_in_organization=团队不在与仓库相同的组织中 +settings.org_not_allowed_to_be_collaborator=组织不允许被添加为项目协作者! +settings.change_team_access_not_allowed=更改项目的团队访问权限仅限于组织所有者 +settings.team_not_in_organization=团队不在与项目相同的组织中 settings.teams=团队 settings.add_team=添加团队 -settings.add_team_duplicate=团队已经拥有仓库 -settings.add_team_success=团队现在可以访问仓库。 +settings.add_team_duplicate=团队已经拥有项目 +settings.add_team_success=团队现在可以访问项目。 settings.search_team=搜索团队... -settings.change_team_permission_tip=团队权限设置于团队设置页面,不能根据仓库更改 -settings.delete_team_tip=该团队仍有仓库, 无法删除 -settings.remove_team_success=团队访问仓库的权限已被删除。 +settings.change_team_permission_tip=团队权限设置于团队设置页面,不能根据项目更改 +settings.delete_team_tip=该团队仍有项目, 无法删除 +settings.remove_team_success=团队访问项目的权限已被删除。 settings.add_webhook=添加 Web 钩子 settings.add_webhook.invalid_channel_name=Webhook 通道名称不能为空且不能仅包含一个 # 字符。 settings.hooks_desc=当Gitea事件发生时,Web钩子自动发出HTTP POST请求。在 指南 中阅读更多内容。 @@ -1511,19 +1524,19 @@ settings.event_desc=触发条件: settings.event_push_only=推送事件 settings.event_send_everything=所有事件 settings.event_choose=自定义事件... -settings.event_header_repository=仓库事件 +settings.event_header_repository=项目事件 settings.event_create=创建 settings.event_create_desc=创建分支或标签 settings.event_delete=刪除 settings.event_delete_desc=分支或标签已删除。 settings.event_fork=派生 -settings.event_fork_desc=仓库被派生。 +settings.event_fork_desc=项目被派生。 settings.event_release=版本发布 settings.event_release_desc=发布、更新或删除版本时。 settings.event_push=推送 -settings.event_push_desc=Git 仓库推送 -settings.event_repository=仓库 -settings.event_repository_desc=创建或删除仓库 +settings.event_push_desc=Git 项目推送 +settings.event_repository=项目 +settings.event_repository_desc=创建或删除项目 settings.event_header_issue=工单事件 settings.event_issues=工单 settings.event_issues_desc=工单已打开、已关闭、已重新打开或已编辑。 @@ -1560,21 +1573,21 @@ settings.update_hook_success=Web 钩子更新成功! settings.delete_webhook=删除 Web 钩子 settings.recent_deliveries=最近推送记录 settings.hook_type=钩子类型 -settings.add_slack_hook_desc=将 Slack 集成到您的仓库中。 +settings.add_slack_hook_desc=将 Slack 集成到您的项目中。 settings.slack_token=令牌 settings.slack_domain=域名 settings.slack_channel=频道 -settings.add_discord_hook_desc=将 Discord 集成到您的仓库中。 -settings.add_dingtalk_hook_desc=将 Dingtalk 集成到您的仓库中。 -settings.add_telegram_hook_desc=将 Telegram 集成到您的仓库中。 -settings.add_matrix_hook_desc=将 Matrix 集成到您的仓库中。 -settings.add_msteams_hook_desc=将 Microsoft Teams 集成到您的仓库中。 -settings.add_feishu_hook_desc=将 Feishu 集成到您的仓库中。 +settings.add_discord_hook_desc=将 Discord 集成到您的项目中。 +settings.add_dingtalk_hook_desc=将 Dingtalk 集成到您的项目中。 +settings.add_telegram_hook_desc=将 Telegram 集成到您的项目中。 +settings.add_matrix_hook_desc=将 Matrix 集成到您的项目中。 +settings.add_msteams_hook_desc=将 Microsoft Teams 集成到您的项目中。 +settings.add_feishu_hook_desc=将 Feishu 集成到您的项目中。 settings.deploy_keys=管理部署密钥 settings.add_deploy_key=添加部署密钥 -settings.deploy_key_desc=部署密钥具有对仓库的只读拉取权限。 +settings.deploy_key_desc=部署密钥具有对项目的只读拉取权限。 settings.is_writable=启用写权限 -settings.is_writable_info=允许此部署密钥 推送 提交到仓库。 +settings.is_writable_info=允许此部署密钥 推送 提交到项目。 settings.no_deploy_keys=没有部署密钥。 settings.title=标题 settings.deploy_key_content=密钥文本 @@ -1609,7 +1622,7 @@ settings.protect_merge_whitelist_users=合并白名单用户: settings.protect_merge_whitelist_teams=合并白名单团队: settings.protect_check_status_contexts=启用状态检查 settings.protect_check_status_contexts_desc=要求状态检查通过才能合并,选择必须先通过哪些状态检查才能合并。如果启用,推送的合并请求必须先通过状态检查才能够合并到对应的分支。如果没有选择具体的状态检查上下文,则所有的状态检查都通过才能合并。 -settings.protect_check_status_contexts_list=此仓库上周进行过的状态检查 +settings.protect_check_status_contexts_list=此项目上周进行过的状态检查 settings.protect_required_approvals=所需的批准: settings.protect_required_approvals_desc=只允许合并有足够审核人数的拉取请求。 settings.protect_approvals_whitelist_enabled=批准仅限列入白名单的用户或团队 @@ -1643,22 +1656,22 @@ settings.matrix.homeserver_url=主服务器网址 settings.matrix.room_id=房间ID settings.matrix.access_token=访问令牌(Access Token) settings.matrix.message_type=消息类型 -settings.archive.button=归档仓库 -settings.archive.header=归档此仓库 -settings.archive.text=归档后仓库将只有只读权限,并在仪表盘中被隐藏。你将不能再对其建立提交、创建工单或建立合并请求。 -settings.archive.success=仓库已成功归档。 -settings.archive.error=仓库在归档时出现异常。请通过日志获取详细信息。 -settings.archive.error_ismirror=请不要对镜像仓库归档,谢谢! -settings.archive.branchsettings_unavailable=已归档仓库无法进行分支设置。 -settings.unarchive.button=撤销仓库归档 -settings.unarchive.header=撤销此仓库归档 -settings.unarchive.text=取消存档将恢复仓库接收提交,推送,新工单和合并请求。 -settings.unarchive.success=仓库已成功取消归档。 -settings.unarchive.error=仓库在撤销归档时出现异常。请通过日志获取详细信息。 -settings.update_avatar_success=仓库头像已经更新。 +settings.archive.button=归档项目 +settings.archive.header=归档此项目 +settings.archive.text=归档后项目将只有只读权限,并在仪表盘中被隐藏。你将不能再对其建立提交、创建工单或建立合并请求。 +settings.archive.success=项目已成功归档。 +settings.archive.error=项目在归档时出现异常。请通过日志获取详细信息。 +settings.archive.error_ismirror=请不要对镜像项目归档,谢谢! +settings.archive.branchsettings_unavailable=已归档项目无法进行分支设置。 +settings.unarchive.button=撤销项目归档 +settings.unarchive.header=撤销此项目归档 +settings.unarchive.text=取消存档将恢复项目接收提交,推送,新工单和合并请求。 +settings.unarchive.success=项目已成功取消归档。 +settings.unarchive.error=项目在撤销归档时出现异常。请通过日志获取详细信息。 +settings.update_avatar_success=项目头像已经更新。 settings.lfs=LFS -settings.lfs_filelist=存储在此仓库中的 LFS 文件 -settings.lfs_no_lfs_files=此仓库中没有 LFS 文件 +settings.lfs_filelist=存储在此项目中的 LFS 文件 +settings.lfs_no_lfs_files=此项目中没有 LFS 文件 settings.lfs_findcommits=查找提交 settings.lfs_lfs_file_no_commits=没有找到关于此 LFS 文件的提交 settings.lfs_noattribute=此路径在默认分支中没有可锁定的属性 @@ -1674,11 +1687,11 @@ settings.lfs_lock_path=要锁定的文件路径... settings.lfs_locks_no_locks=无锁定 settings.lfs_lock_file_no_exist=锁定的文件在默认分支中不存在 settings.lfs_force_unlock=强制解锁 -settings.lfs_pointers.found=找到 %d 个块指针 - %d 个关联, %d 个未关联(%d 个从仓库丢失) +settings.lfs_pointers.found=找到 %d 个块指针 - %d 个关联, %d 个未关联(%d 个从项目丢失) settings.lfs_pointers.sha=Blob SHA settings.lfs_pointers.oid=OID -settings.lfs_pointers.inRepo=在仓库中 -settings.lfs_pointers.exists=在仓库中存在 +settings.lfs_pointers.inRepo=在项目中 +settings.lfs_pointers.exists=在项目中存在 settings.lfs_pointers.accessible=用户可访问 settings.lfs_pointers.associateAccessible=关联可访问的 %d OID @@ -1745,7 +1758,7 @@ release.save_draft=保存草稿 release.edit_release=保存此次发布 release.delete_release=删除发布 release.deletion=删除发布 -release.deletion_desc=删除一个版本发布将从仓库中删除对应的Git标签。仓库内容和历史将保持不变,继续? +release.deletion_desc=删除一个版本发布将从项目中删除对应的Git标签。项目内容和历史将保持不变,继续? release.deletion_success=Release已被删除。 release.tag_name_already_exist=使用此标签名称的发布版本已经存在。 release.tag_name_invalid=标签名称无效。 @@ -1765,7 +1778,7 @@ branch.delete_branch_has_new_commits=因为合并之后有新的提交,分支 branch.create_branch=创建分支 %s branch.create_from=从 '%s' branch.create_success=分支 '%s' 已创建。 -branch.branch_already_exists=此仓库已存在名为 '%s' 的分支。 +branch.branch_already_exists=此项目已存在名为 '%s' 的分支。 branch.branch_name_conflict=分支 '%s' 与已存在的分支 '%s' 名称冲突。 branch.tag_collision=分支 '%s' 不能被创建因为同名的标签已经存在。 branch.deleted_by=删除人:%s @@ -1792,7 +1805,7 @@ repo_updated=最后更新于 people=组织成员 teams=组织团队 lower_members=名成员 -lower_repositories=个仓库 +lower_repositories=个项目 create_new_team=新建团队 create_team=创建团队 org_desc=组织描述 @@ -1800,13 +1813,13 @@ team_name=团队名称 team_desc=团队描述 team_name_helper=团队名字应该简单明了。 team_desc_helper=描述团队的目的或作用。 -team_access_desc=仓库权限 +team_access_desc=项目权限 team_permission_desc=权限 -team_unit_desc=允许访问仓库单元 +team_unit_desc=允许访问项目单元 team_unit_disabled=(已禁用) form.name_reserved=组织名称 '%s' 是被保留的。 -form.name_pattern_not_allowed=仓库名称中不允许使用 "%s"。 +form.name_pattern_not_allowed=项目名称中不允许使用 "%s"。 form.create_org_not_allowed=此账号禁止创建组织 settings=组织设置 @@ -1815,7 +1828,7 @@ settings.full_name=组织全名 settings.website=官方网站 settings.location=所在地区 settings.permission=权限 -settings.repoadminchangeteam=仓库管理员可以添加或移除团队的访问权限 +settings.repoadminchangeteam=项目管理员可以添加或移除团队的访问权限 settings.visibility=可见性 settings.visibility.public=公开 settings.visibility.limited=受限 (仅对登录用户可见) @@ -1831,9 +1844,9 @@ settings.delete_prompt=删除操作会永久清除该组织的信息,并且 所有仓库。 +settings.hooks_desc=在此处添加的 Web 钩子将会应用到该组织下的 所有项目。 -settings.labels_desc=添加能够被该组织下的 所有仓库 的工单使用的标签。 +settings.labels_desc=添加能够被该组织下的 所有项目 的工单使用的标签。 members.membership_visibility=成员可见性: members.public=可见 @@ -1850,17 +1863,17 @@ members.invite_now=立即邀请 teams.join=加入团队 teams.leave=离开团队 -teams.can_create_org_repo=创建仓库 -teams.can_create_org_repo_helper=成员可以在组织中创建仓库。创建者将自动获得创建的仓库的管理员权限。 +teams.can_create_org_repo=创建项目 +teams.can_create_org_repo_helper=成员可以在组织中创建项目。创建者将自动获得创建的项目的管理员权限。 teams.read_access=读取权限 -teams.read_access_helper=成员可以查看和克隆团队仓库。 +teams.read_access_helper=成员可以查看和克隆团队项目。 teams.write_access=写入权限 -teams.write_access_helper=成员可以查看和推送提交到团队仓库。 +teams.write_access_helper=成员可以查看和推送提交到团队项目。 teams.admin_access=管理员权限 -teams.admin_access_helper=成员可以拉取和推送到团队仓库同时可以添加协作者。 +teams.admin_access_helper=成员可以拉取和推送到团队项目同时可以添加协作者。 teams.no_desc=该团队暂无描述 teams.settings=团队设置 -teams.owners_permission_desc=管理员团队对 所有仓库 具有操作权限,且对组织具有 管理员权限。 +teams.owners_permission_desc=管理员团队对 所有项目 具有操作权限,且对组织具有 管理员权限。 teams.members=团队成员 teams.update_settings=更新团队设置 teams.delete_team=删除团队 @@ -1868,34 +1881,34 @@ teams.add_team_member=添加团队成员 teams.delete_team_title=删除团队 teams.delete_team_desc=删除一个团队将删除团队成员的访问权限,继续? teams.delete_team_success=该团队已被删除。 -teams.read_permission_desc=该团队拥有对所属仓库的 读取 权限,团队成员可以进行查看和克隆等只读操作。 -teams.write_permission_desc=该团队拥有对所属仓库的 读取写入 的权限。 -teams.admin_permission_desc=该团队拥有一定的 管理 权限,团队成员可以读取、克隆、推送以及添加其它仓库协作者。 -teams.create_repo_permission_desc=此外,该团队拥有了 创建仓库 的权限:成员可以在组织中创建新的仓库。 -teams.repositories=团队仓库 -teams.search_repo_placeholder=搜索仓库... -teams.remove_all_repos_title=移除所有团队仓库 -teams.remove_all_repos_desc=这将从团队中移除所有仓库。 -teams.add_all_repos_title=添加所有仓库 -teams.add_all_repos_desc=这将把组织的所有仓库添加到团队。 -teams.add_nonexistent_repo=您尝试添加到团队的仓库不存在,请先创建仓库! +teams.read_permission_desc=该团队拥有对所属项目的 读取 权限,团队成员可以进行查看和克隆等只读操作。 +teams.write_permission_desc=该团队拥有对所属项目的 读取写入 的权限。 +teams.admin_permission_desc=该团队拥有一定的 管理 权限,团队成员可以读取、克隆、推送以及添加其它项目协作者。 +teams.create_repo_permission_desc=此外,该团队拥有了 创建项目 的权限:成员可以在组织中创建新的项目。 +teams.repositories=团队项目 +teams.search_repo_placeholder=搜索项目... +teams.remove_all_repos_title=移除所有团队项目 +teams.remove_all_repos_desc=这将从团队中移除所有项目。 +teams.add_all_repos_title=添加所有项目 +teams.add_all_repos_desc=这将把组织的所有项目添加到团队。 +teams.add_nonexistent_repo=您尝试添加到团队的项目不存在,请先创建项目! teams.add_duplicate_users=用户已经是团队成员。 -teams.repos.none=此团队无法访问任何仓库。 +teams.repos.none=此团队无法访问任何项目。 teams.members.none=团队中没有成员。 -teams.specific_repositories=指定仓库 -teams.specific_repositories_helper=团队成员将只能访问添加到团队的仓库。 选择此项 将不会 自动删除已经添加的仓库。 -teams.all_repositories=所有仓库 -teams.all_repositories_helper=团队可以访问所有仓库。选择此选项将 添加所有现有的 仓库到指定团队。 -teams.all_repositories_read_permission_desc=此团队授予读取所有仓库的访问权限: 成员可以查看和克隆仓库。 -teams.all_repositories_write_permission_desc=此团队授予修改所有仓库的访问权限: 成员可以查看和推送至仓库。 -teams.all_repositories_admin_permission_desc=该团队拥有 管理 所有仓库的权限:团队成员可以读取、克隆、推送以及添加其它仓库协作者。 +teams.specific_repositories=指定项目 +teams.specific_repositories_helper=团队成员将只能访问添加到团队的项目。 选择此项 将不会 自动删除已经添加的项目。 +teams.all_repositories=所有项目 +teams.all_repositories_helper=团队可以访问所有项目。选择此选项将 添加所有现有的 项目到指定团队。 +teams.all_repositories_read_permission_desc=此团队授予读取所有项目的访问权限: 成员可以查看和克隆项目。 +teams.all_repositories_write_permission_desc=此团队授予修改所有项目的访问权限: 成员可以查看和推送至项目。 +teams.all_repositories_admin_permission_desc=该团队拥有 管理 所有项目的权限:团队成员可以读取、克隆、推送以及添加其它项目协作者。 [admin] dashboard=管理面板 users=帐户管理 organizations=组织管理 datasets=数据集 -repositories=仓库管理 +repositories=项目管理 hooks=默认Web钩子 systemhooks=系统 Web 钩子 authentication=认证源 @@ -1910,7 +1923,7 @@ total=总计:%d dashboard.statistic=摘要 dashboard.operations=维护操作 dashboard.system_status=系统状态 -dashboard.statistic_info=Gitea 数据库统计:%d 位用户,%d 个组织,%d 个公钥,%d 个仓库,%d 个仓库关注,%d 个赞,%d 次行为,%d 条权限记录,%d 张工单,%d 次评论,%d 个社交帐号,%d 个用户关注,%d 个镜像,%d 个版本发布,%d 个登录源,%d 个 Web 钩子,%d 个里程碑,%d 个标签,%d 个钩子任务,%d 个团队,%d 个更新任务,%d 个附件。 +dashboard.statistic_info=Gitea 数据库统计:%d 位用户,%d 个组织,%d 个公钥,%d 个项目,%d 个项目关注,%d 个赞,%d 次行为,%d 条权限记录,%d 张工单,%d 次评论,%d 个社交帐号,%d 个用户关注,%d 个镜像,%d 个版本发布,%d 个登录源,%d 个 Web 钩子,%d 个里程碑,%d 个标签,%d 个钩子任务,%d 个团队,%d 个更新任务,%d 个附件。 dashboard.operation_name=操作名称 dashboard.operation_switch=开关 dashboard.operation_run=执行 @@ -1929,22 +1942,22 @@ dashboard.cron.error=任务中的错误: %s: %[3]s dashboard.cron.finished=任务:%[1]s 已经完成 dashboard.delete_inactive_accounts=删除所有未激活的帐户 dashboard.delete_inactive_accounts.started=删除所有未激活的账户任务已启动。 -dashboard.delete_repo_archives=删除所有仓库存档 -dashboard.delete_repo_archives.started=删除所有仓库存档任务已启动。 -dashboard.delete_missing_repos=删除所有丢失 Git 文件的仓库 -dashboard.delete_missing_repos.started=删除所有丢失 Git 文件的仓库任务已启动。 -dashboard.delete_generated_repository_avatars=删除生成的仓库头像 -dashboard.update_mirrors=更新镜像仓库 -dashboard.repo_health_check=健康检查所有仓库 -dashboard.check_repo_stats=检查所有仓库统计 -dashboard.archive_cleanup=删除旧的仓库存档 +dashboard.delete_repo_archives=删除所有项目存档 +dashboard.delete_repo_archives.started=删除所有项目存档任务已启动。 +dashboard.delete_missing_repos=删除所有丢失 Git 文件的项目 +dashboard.delete_missing_repos.started=删除所有丢失 Git 文件的项目任务已启动。 +dashboard.delete_generated_repository_avatars=删除生成的项目头像 +dashboard.update_mirrors=更新镜像项目 +dashboard.repo_health_check=健康检查所有项目 +dashboard.check_repo_stats=检查所有项目统计 +dashboard.archive_cleanup=删除旧的项目存档 dashboard.deleted_branches_cleanup=清理已删除的分支 dashboard.update_migration_poster_id=更新迁移的发表者ID -dashboard.git_gc_repos=对仓库进行垃圾回收 +dashboard.git_gc_repos=对项目进行垃圾回收 dashboard.resync_all_sshkeys=使用 Gitea SSH 密钥更新'.ssh/authorized_keys' 文件。 dashboard.resync_all_sshkeys.desc=(内置的 SSH 服务器不需要。) -dashboard.resync_all_hooks=重新同步所有仓库的 pre-receive、update 和 post-receive 钩子 -dashboard.reinit_missing_repos=重新初始化所有丢失的 Git 仓库存在的记录 +dashboard.resync_all_hooks=重新同步所有项目的 pre-receive、update 和 post-receive 钩子 +dashboard.reinit_missing_repos=重新初始化所有丢失的 Git 项目存在的记录 dashboard.sync_external_users=同步外部用户数据 dashboard.server_uptime=服务运行时间 dashboard.current_goroutine=当前 Goroutines 数量 @@ -1983,7 +1996,7 @@ users.full_name=全名 users.activated=已激活 users.admin=管理员 users.restricted=受限 -users.repos=仓库数 +users.repos=项目数 users.created=创建时间 users.last_login=上次登录 users.never_login=从未登录 @@ -1996,7 +2009,7 @@ users.auth_login_name=认证登录名称 users.password_helper=保持密码为空将不更改密码。 users.update_profile_success=该帐户已被更新。 users.edit_account=编辑帐号 -users.max_repo_creation=最大仓库数 +users.max_repo_creation=最大项目数 users.max_repo_creation_desc=(设置为 -1 表示使用全局默认值) users.is_activated=该用户已被激活 users.prohibit_login=禁用登录 @@ -2004,11 +2017,11 @@ users.is_admin=是管理员 users.is_restricted=受限 users.allow_git_hook=允许创建 Git 钩子 users.allow_git_hook_tooltip=Git 钩子作为运行 Gitea 的操作系统用户执行,并且将拥有相同级别的主机访问权限 -users.allow_import_local=允许导入本地仓库 +users.allow_import_local=允许导入本地项目 users.allow_create_organization=允许创建组织 users.update_profile=更新帐户 users.delete_account=删除帐户 -users.still_own_repo=此用户仍然拥有一个或多个仓库。必须首先删除或转让这些仓库。 +users.still_own_repo=此用户仍然拥有一个或多个项目。必须首先删除或转让这些项目。 users.still_has_org=此用户是组织的成员。必须先从组织中删除用户。 users.deletion_success=用户帐户已被删除。 @@ -2031,7 +2044,7 @@ orgs.teams=团队 orgs.members=成员 orgs.new_orga=创建新的组织 -repos.repo_manage_panel=仓库管理 +repos.repo_manage_panel=项目管理 repos.owner=所有者 repos.name=名称 repos.private=私有库 @@ -2046,11 +2059,11 @@ datasets.owner=所有者 datasets.name=名称 datasets.private=私有 -hooks.desc=当某些 Gitea 事件触发时, Web 钩子会自动向服务器发出 HTTP POST 请求。此处定义的 Web 钩子是默认值, 将复制到所有新建仓库中。参阅 Web钩子指南 获取更多内容。 +hooks.desc=当某些 Gitea 事件触发时, Web 钩子会自动向服务器发出 HTTP POST 请求。此处定义的 Web 钩子是默认值, 将复制到所有新建项目中。参阅 Web钩子指南 获取更多内容。 hooks.add_webhook=新增默认Web钩子 hooks.update_webhook=更新默认Web钩子 -systemhooks.desc=当某些 Gitea 事件触发时, Web 钩子会自动向服务器发出 HTTP POST 请求。此处定义的 Web 钩子是默认值, 将复制到所有新建仓库中。参阅 Web钩子指南 获取更多内容。 +systemhooks.desc=当某些 Gitea 事件触发时, Web 钩子会自动向服务器发出 HTTP POST 请求。此处定义的 Web 钩子是默认值, 将复制到所有新建项目中。参阅 Web钩子指南 获取更多内容。 systemhooks.add_webhook=添加系统 Web 钩子 systemhooks.update_webhook=更新系统 Web 钩子 @@ -2156,7 +2169,7 @@ config.disable_router_log=关闭路由日志 config.run_user=以用户名运行 config.run_mode=运行模式 config.git_version=Git 版本 -config.repo_root_path=仓库根目录 +config.repo_root_path=项目根目录 config.lfs_root_path=LFS根目录 config.static_file_root_path=静态文件根目录 config.log_file_root_path=日志路径 @@ -2354,15 +2367,15 @@ notices.inverse_selection=反向选中 notices.delete_selected=删除选中项 notices.delete_all=删除所有提示 notices.type=提示类型 -notices.type_1=仓库 +notices.type_1=项目 notices.type_2=任务 notices.desc=提示描述 notices.op=操作 notices.delete_success=系统通知已被删除。 [action] -create_repo=创建了仓库 %s -rename_repo=重命名仓库 %[1]s%[3]s +create_repo=创建了项目 %s +rename_repo=重命名项目 %[1]s%[3]s commit_repo=推送了 %[3]s 分支的代码到 %[4]s create_issue=`创建了工单 %s#%[2]s` close_issue=`关闭了工单 %s#%[2]s` @@ -2373,7 +2386,7 @@ reopen_pull_request=`重新开启了合并请求 %s#%[2]s< comment_issue=`评论了工单 %s#%[2]s` comment_pull=`评论了合并请求 %s#%[2]s` merge_pull_request=`合并了合并请求 %s#%[2]s` -transfer_repo=将仓库 %s 转移至 %s +transfer_repo=将项目 %s 转移至 %s push_tag=推送了标签 %[2]s%[3]s delete_tag=从%[3]s 删除了标签 %[2]s delete_branch=从 %[3]s 删除分支 %[2]s @@ -2437,8 +2450,8 @@ error.probable_bad_signature=警告!虽然数据库中有一个此ID的密钥 error.probable_bad_default_signature=警告!虽然默认密钥拥有此ID,但它没有验证此提交!此提交是有疑问的。 [units] -error.no_unit_allowed_repo=您没有被允许访问此仓库的任何单元。 -error.unit_not_allowed=您没有权限访问此仓库单元 +error.no_unit_allowed_repo=您没有被允许访问此项目的任何单元。 +error.unit_not_allowed=您没有权限访问此项目单元 [custom] head.community=社区 diff --git a/routers/dataset/dataset.go b/routers/dataset/dataset.go deleted file mode 100644 index cef5da45a..000000000 --- a/routers/dataset/dataset.go +++ /dev/null @@ -1,256 +0,0 @@ -package dataset - -import ( - "errors" - "strings" - - "code.gitea.io/gitea/models" - "code.gitea.io/gitea/modules/auth" - "code.gitea.io/gitea/modules/base" - "code.gitea.io/gitea/modules/context" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/routers/repo" - "github.com/unknwon/com" -) - -const ( - tplDataSet base.TplName = "datasets/index" - tplShow base.TplName = "datasets/show" - tplCreate base.TplName = "datasets/create" - tplEdit base.TplName = "datasets/edit" -) - -type ListOptions struct { - PageSize int - Page int // start from 1 -} - -func List(ctx *context.Context) { - ctx.Data["PageIsDatasets"] = true - - var ( - datasets []*models.Dataset - count int64 - err error - orderBy models.SearchOrderBy - ) - - page := ctx.QueryInt("page") - if page <= 0 { - page = 1 - } - ctx.Data["SortType"] = ctx.Query("sort") - switch ctx.Query("sort") { - case "newest": - orderBy = models.SearchOrderByNewest - case "oldest": - orderBy = models.SearchOrderByOldest - case "recentupdate": - orderBy = models.SearchOrderByRecentUpdated - case "leastupdate": - orderBy = models.SearchOrderByLeastUpdated - case "reversealphabetically": - orderBy = models.SearchOrderByAlphabeticallyReverse - case "alphabetically": - orderBy = models.SearchOrderByAlphabetically - case "reversesize": - orderBy = models.SearchOrderBySizeReverse - default: - ctx.Data["SortType"] = "recentupdate" - orderBy = models.SearchOrderByRecentUpdated - } - keyword := strings.Trim(ctx.Query("q"), " ") - var userID int64 - if ctx.User != nil { - userID = ctx.User.ID - } - opts := &models.SearchDatasetOptions{ - Keyword: keyword, - IncludePublic: true, - SearchOrderBy: orderBy, - OwnerID: userID, - ListOptions: models.ListOptions{ - Page: page, - PageSize: setting.UI.ExplorePagingNum, - }, - } - - if len(opts.SearchOrderBy) == 0 { - opts.SearchOrderBy = models.SearchOrderByAlphabetically - } - - datasets, count, err = models.SearchDataset(opts) - if err != nil { - ctx.ServerError("SearchDatasets", err) - return - } - - pager := context.NewPagination(int(count), opts.PageSize, page, 5) - pager.SetDefaultParams(ctx) - ctx.Data["Page"] = pager - - ctx.Data["datasets"] = datasets - ctx.Data["datasetsCount"] = count - ctx.HTML(200, tplDataSet) -} - -func Create(ctx *context.Context) { - ctx.HTML(200, tplCreate) -} - -func CreatePost(ctx *context.Context, form auth.CreateDatasetForm) { - ctx.Data["Title"] = ctx.Tr("new_dataset") - - ctxUser := ctx.User - - if ctx.HasError() { - ctx.HTML(200, tplCreate) - return - } - - status := models.DatasetStatusPublic - if form.Private { - status = models.DatasetStatusPrivate - } - - var err error - opts := models.Dataset{ - Title: form.Title, - Category: form.Category, - Description: form.Description, - License: form.License, - Task: form.Task, - ReleaseID: form.ReleaseID, - UserID: ctxUser.ID, - Status: status, - } - - if err = models.CreateDataset(&opts); err != nil { - log.Error("%v", err) - } - - var attachmentUUIDs []string - if setting.Attachment.Enabled { - attachmentUUIDs = form.Files - } - - if err = models.AddDatasetAttachments(opts.ID, attachmentUUIDs); err != nil { - log.Error("%v", err) - } - - if err == nil { - log.Trace("Dataset created [%d]: %s/%s", opts.ID, ctxUser.Name, opts.Title) - ctx.Redirect(setting.AppSubURL + "/datasets/" + com.ToStr(opts.ID)) - return - } -} - -func Show(ctx *context.Context) { - ctx.Data["Title"] = ctx.Tr("dataset.show_dataset") - - user := ctx.User - dataset, err := models.GetOwnerDatasetByID(ctx.ParamsInt64((":id")), user) - if err != nil { - ctx.NotFound("GetDataset", err) - return - } - - err = models.GeDatasetAttachments(dataset) - if err != nil { - ctx.ServerError("GetDatasetAttachments", err) - return - } - - isOwner := (ctx.User != nil && dataset.UserID == user.ID) - - ctx.Data["dataset"] = dataset - ctx.Data["IsOwner"] = isOwner - - ctx.HTML(200, tplShow) -} - -// EditDataset render release edit page -func EditDataset(ctx *context.Context) { - ctx.Data["Title"] = ctx.Tr("dataset.edit_dataset") - ctx.Data["PageIsEditDataset"] = true - repo.RenderAttachmentSettings(ctx) - rel, err := models.GetOwnerDatasetByID(ctx.ParamsInt64(":id"), ctx.User) - if err != nil { - ctx.NotFound("GetDataset", err) - return - } - isOwner := (ctx.User != nil && rel.UserID == ctx.User.ID) - if !isOwner { - ctx.NotFound("403", errors.New("not owner")) - return - } - - ctx.Data["ID"] = rel.ID - ctx.Data["title"] = rel.Title - ctx.Data["private"] = rel.IsPrivate() - ctx.Data["description"] = rel.Description - ctx.Data["category"] = rel.Category - ctx.Data["task"] = rel.Task - ctx.Data["license"] = rel.License - - ctx.HTML(200, tplEdit) -} - -func EditDatasetPost(ctx *context.Context, form auth.EditDatasetForm) { - ctx.Data["Title"] = ctx.Tr("dataset.edit_dataset") - - rel, err := models.GetDatasetByID(ctx.ParamsInt64(":id")) - if err != nil { - ctx.ServerError("GetDataset", err) - return - } - isOwner := (ctx.User != nil && rel.UserID == ctx.User.ID) - if !isOwner { - ctx.NotFound("403", errors.New("not owner")) - return - } - ctx.Data["ID"] = rel.ID - ctx.Data["title"] = rel.Title - ctx.Data["description"] = rel.Description - ctx.Data["category"] = rel.Category - ctx.Data["task"] = rel.Task - ctx.Data["license"] = rel.License - ctx.Data["private"] = rel.IsPrivate() - - if ctx.HasError() { - ctx.HTML(200, tplCreate) - return - } - - var attachmentUUIDs []string - if setting.Attachment.Enabled { - attachmentUUIDs = form.Files - } - - status := models.DatasetStatusPublic - if form.Private { - status = models.DatasetStatusPrivate - } - - rel.Title = form.Title - rel.Status = status - rel.Description = form.Description - rel.Category = form.Category - rel.Task = form.Task - rel.License = form.License - if err = models.UpdateDataset(models.DefaultDBContext(), rel); err != nil { - log.Error("%v", err) - } - - if err = models.AddDatasetAttachments(rel.ID, attachmentUUIDs); err != nil { - log.Error("%v", err) - } - log.Trace("Dataset updated: %d", rel.ID) - - ctx.Redirect(setting.AppSubURL + "/datasets/" + com.ToStr(rel.ID)) -} - -func Delete(ctx *context.Context) { - log.Debug("[dataset] Delete...\n") -} diff --git a/routers/repo/attachment.go b/routers/repo/attachment.go index 1a1e9f186..5aa6e6b20 100644 --- a/routers/repo/attachment.go +++ b/routers/repo/attachment.go @@ -7,6 +7,7 @@ package repo import ( "fmt" "net/http" + "strconv" "strings" "code.gitea.io/gitea/models" @@ -57,9 +58,13 @@ func UploadAttachment(ctx *context.Context) { return } + datasetID, _ := strconv.ParseInt(ctx.Req.FormValue("dataset_id"), 10, 64) + attach, err := models.NewAttachment(&models.Attachment{ + IsPrivate: true, UploaderID: ctx.User.ID, Name: header.Filename, + DatasetID: datasetID, }, buf, file) if err != nil { ctx.Error(500, fmt.Sprintf("NewAttachment: %v", err)) @@ -72,6 +77,18 @@ func UploadAttachment(ctx *context.Context) { }) } +func UpdatePublicAttachment(ctx *context.Context) { + file := ctx.Query("file") + isPrivate, _ := strconv.ParseBool(ctx.Query("is_private")) + attach, err := models.GetAttachmentByUUID(file) + if err != nil { + ctx.Error(404, err.Error()) + return + } + attach.IsPrivate = isPrivate + models.UpdateAttachment(attach) +} + // DeleteAttachment response for deleting issue's attachment func DeleteAttachment(ctx *context.Context) { file := ctx.Query("file") @@ -182,7 +199,7 @@ func GetAttachment(ctx *context.Context) { } -func increaseDownloadCount(attach *models.Attachment, dataSet *models.Dataset) error{ +func increaseDownloadCount(attach *models.Attachment, dataSet *models.Dataset) error { if err := attach.IncreaseDownloadCount(); err != nil { return err } diff --git a/routers/repo/dataset.go b/routers/repo/dataset.go new file mode 100644 index 000000000..6db1b74b0 --- /dev/null +++ b/routers/repo/dataset.go @@ -0,0 +1,114 @@ +package repo + +import ( + "sort" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/auth" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/modules/log" +) + +const ( + tplIndex base.TplName = "repo/datasets/index" +) + +// MustEnableDataset check if repository enable internal dataset +func MustEnableDataset(ctx *context.Context) { + if !ctx.Repo.CanRead(models.UnitTypeDatasets) { + ctx.NotFound("MustEnableDataset", nil) + return + } +} + +func filterPrivateAttachments(ctx *context.Context, list []*models.Attachment) []*models.Attachment { + if ctx.Repo.CanWrite(models.UnitTypeDatasets) { + return list + } else { + var publicList []*models.Attachment + for _, attach := range list { + if !attach.IsPrivate { + publicList = append(publicList, attach) + } + } + return publicList + } + +} + +func DatasetIndex(ctx *context.Context) { + MustEnableDataset(ctx) + + repo := ctx.Repo.Repository + + dataset, err := models.GetDatasetByRepo(repo) + if err != nil { + ctx.NotFound("GetDatasetByRepo", err) + return + } + err = models.GetDatasetAttachments(dataset) + if err != nil { + ctx.ServerError("GetDatasetAttachments", err) + return + } + attachments := filterPrivateAttachments(ctx, dataset.Attachments) + + ctx.Data["SortType"] = ctx.Query("sort") + switch ctx.Query("sort") { + case "newest": + sort.Slice(attachments, func(i, j int) bool { + return attachments[i].CreatedUnix > attachments[j].CreatedUnix + }) + case "oldest": + sort.Slice(attachments, func(i, j int) bool { + return attachments[i].CreatedUnix < attachments[j].CreatedUnix + }) + default: + ctx.Data["SortType"] = "newest" + sort.Slice(attachments, func(i, j int) bool { + return attachments[i].CreatedUnix > attachments[j].CreatedUnix + }) + } + + ctx.Data["PageIsDataset"] = true + ctx.Data["Title"] = ctx.Tr("dataset.show_dataset") + ctx.Data["Link"] = ctx.Repo.RepoLink + "/datasets" + ctx.Data["dataset"] = dataset + ctx.Data["Attachments"] = attachments + ctx.Data["IsOwner"] = true + + ctx.HTML(200, tplIndex) +} + +func EditDatasetPost(ctx *context.Context, form auth.EditDatasetForm) { + ctx.Data["PageIsDataset"] = true + + ctx.Data["Title"] = ctx.Tr("dataset.edit_dataset") + + rel, err := models.GetDatasetByID(form.ID) + ctx.Data["dataset"] = rel + + if err != nil { + ctx.ServerError("GetDataset", err) + return + } + + if ctx.HasError() { + ctx.Data["Error"] = true + ctx.HTML(200, tplIndex) + return + } + + rel.Title = form.Title + rel.Description = form.Description + rel.Category = form.Category + rel.Task = form.Task + rel.License = form.License + if err = models.UpdateDataset(models.DefaultDBContext(), rel); err != nil { + ctx.Data["Error"] = true + ctx.HTML(200, tplIndex) + log.Error("%v", err) + } + ctx.Redirect(ctx.Repo.RepoLink + "/datasets") +} diff --git a/routers/repo/setting.go b/routers/repo/setting.go index 7a2db88c1..dd3490f12 100644 --- a/routers/repo/setting.go +++ b/routers/repo/setting.go @@ -210,6 +210,22 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) { // This section doesn't require repo_name/RepoName to be set in the form, don't show it // as an error on the UI for this action ctx.Data["Err_RepoName"] = nil + if err := models.CreateDefaultDatasetToRepo(repo); err != nil { + ctx.ServerError("CreateDefaultDatasetToRepo", err) + return + } + + if form.EnableDataset && !models.UnitTypeDatasets.UnitGlobalDisabled() { + units = append(units, models.RepoUnit{ + RepoID: repo.ID, + Type: models.UnitTypeDatasets, + Config: &models.DatasetConfig{ + EnableDataset: form.EnableDataset, + }, + }) + } else if !models.UnitTypeDatasets.UnitGlobalDisabled() { + deleteUnitTypes = append(deleteUnitTypes, models.UnitTypeDatasets) + } if form.EnableWiki && form.EnableExternalWiki && !models.UnitTypeExternalWiki.UnitGlobalDisabled() { if !validation.IsValidExternalURL(form.ExternalWikiURL) { diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 42e83242b..ea9dd7f65 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -26,7 +26,6 @@ import ( "code.gitea.io/gitea/routers" "code.gitea.io/gitea/routers/admin" apiv1 "code.gitea.io/gitea/routers/api/v1" - "code.gitea.io/gitea/routers/dataset" "code.gitea.io/gitea/routers/dev" "code.gitea.io/gitea/routers/events" "code.gitea.io/gitea/routers/org" @@ -467,7 +466,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Group("/datasets", func() { m.Get("", admin.Datasets) - m.Post("/delete", admin.DeleteDataset) + // m.Post("/delete", admin.DeleteDataset) }) m.Group("/^:configType(hooks|system-hooks)$", func() { @@ -521,6 +520,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Post("/delete", repo.DeleteAttachment) m.Get("/get_pre_url", repo.GetPresignedPutObjectURL) m.Post("/add", repo.AddAttachment) + m.Post("/private", repo.UpdatePublicAttachment) }, reqSignIn) m.Group("/:username", func() { @@ -542,6 +542,8 @@ func RegisterRoutes(m *macaron.Macaron) { reqRepoPullsReader := context.RequireRepoReader(models.UnitTypePullRequests) reqRepoIssuesOrPullsWriter := context.RequireRepoWriterOr(models.UnitTypeIssues, models.UnitTypePullRequests) reqRepoIssuesOrPullsReader := context.RequireRepoReaderOr(models.UnitTypeIssues, models.UnitTypePullRequests) + reqRepoDatasetReader := context.RequireRepoReader(models.UnitTypeDatasets) + reqRepoDatasetWriter := context.RequireRepoWriter(models.UnitTypeDatasets) // ***** START: Organization ***** m.Group("/org", func() { @@ -862,6 +864,11 @@ func RegisterRoutes(m *macaron.Macaron) { m.Get("/milestones", reqRepoIssuesOrPullsReader, repo.Milestones) }, context.RepoRef()) + m.Group("/datasets", func() { + m.Get("", reqRepoDatasetReader, repo.DatasetIndex) + m.Post("", reqRepoDatasetWriter, bindIgnErr(auth.EditDatasetForm{}), repo.EditDatasetPost) + }, context.RepoRef()) + m.Group("/wiki", func() { m.Get("/?:page", repo.Wiki) m.Get("/_pages", repo.WikiPages) @@ -1007,18 +1014,6 @@ func RegisterRoutes(m *macaron.Macaron) { }) }) // ***** END: Repository ***** - - // DataSet - m.Group("/datasets", func() { - // m.Get("", dataset.List) - m.Get("/create", dataset.Create) - m.Post("/create", bindIgnErr(auth.CreateDatasetForm{}), dataset.CreatePost) - m.Post("/delete", dataset.Delete) - m.Get("/:id", dataset.Show) - m.Get("/edit/:id", dataset.EditDataset) - m.Post("/edit/:id", bindIgnErr(auth.EditDatasetForm{}), dataset.EditDatasetPost) - }, ignSignIn) - // ***** END: DataSet***** m.Group("/notifications", func() { m.Get("", user.Notifications) m.Post("/status", user.NotificationStatusPost) diff --git a/templates/admin/dataset/list.tmpl b/templates/admin/dataset/list.tmpl index 0aa9a2895..1044e4c28 100644 --- a/templates/admin/dataset/list.tmpl +++ b/templates/admin/dataset/list.tmpl @@ -14,7 +14,6 @@ ID - {{.i18n.Tr "admin.datasets.owner"}} {{.i18n.Tr "admin.datasets.name"}} {{.i18n.Tr "admin.datasets.private"}} {{.i18n.Tr "admin.users.created"}} @@ -25,16 +24,10 @@ {{range .Datasets}} {{.ID}} - - {{.User.Name}} - {{if .User.Visibility.IsPrivate}} - {{svg "octicon-lock" 16}} - {{end}} - {{.Title}} {{.CreatedUnix.FormatShort}} - + {{end}} diff --git a/templates/base/footer_content.tmpl b/templates/base/footer_content.tmpl index db4c19c15..2a144f821 100644 --- a/templates/base/footer_content.tmpl +++ b/templates/base/footer_content.tmpl @@ -1,26 +1,41 @@ diff --git a/templates/base/head.tmpl b/templates/base/head.tmpl index eae238923..cad2c976d 100644 --- a/templates/base/head.tmpl +++ b/templates/base/head.tmpl @@ -1,10 +1,10 @@ - + - {{if .Title}}{{.Title | RenderEmojiPlain}} - {{end}} {{if .Repository.Name}}{{.Repository.Name}} - {{end}}{{AppName}} + {{if .Title}}{{.Title}} - {{end}} {{if .Repository.Name}}{{.Repository.Name}} - {{end}}{{AppName}} {{if UseServiceWorker}} \ No newline at end of file diff --git a/templates/datasets/create.tmpl b/templates/datasets/create.tmpl deleted file mode 100644 index 362a53043..000000000 --- a/templates/datasets/create.tmpl +++ /dev/null @@ -1,28 +0,0 @@ -{{template "base/head" .}} -
-
-
-
- {{.CsrfTokenHtml}} -

- {{if .PageIsEditDataset}} - {{.i18n.Tr "dataset.edit_dataset"}} - {{else}} - {{.i18n.Tr "new_dataset"}} - {{end}} -

-
- {{template "datasets/form" .}} -
- - - {{.i18n.Tr "cancel"}} -
-
-
-
-
-
-{{template "base/footer" .}} diff --git a/templates/datasets/dataset_list.tmpl b/templates/datasets/dataset_list.tmpl deleted file mode 100644 index 3c99e3e4a..000000000 --- a/templates/datasets/dataset_list.tmpl +++ /dev/null @@ -1,24 +0,0 @@ -
- {{range .datasets}} -
-
- - {{.Title}} - -
- {{svg "octicon-tasklist" 16}}{{$.i18n.Tr (printf "dataset.task.%s" .Task)}} - {{svg "octicon-tag" 16}}{{$.i18n.Tr (printf "dataset.category.%s" .Category)}} - {{svg "octicon-flame" 16}} 24 -
-
-
-
{{.Description}}
-

{{$.i18n.Tr "org.repo_updated"}} {{TimeSinceUnix .UpdatedUnix $.i18n.Lang}}

-
-
- {{else}} -
- {{$.i18n.Tr "explore.dataset_no_results"}} -
- {{end}} -
diff --git a/templates/datasets/dataset_search.tmpl b/templates/datasets/dataset_search.tmpl deleted file mode 100644 index ef057f1e4..000000000 --- a/templates/datasets/dataset_search.tmpl +++ /dev/null @@ -1,23 +0,0 @@ - -
- - -
- - -
-
-
diff --git a/templates/datasets/edit.tmpl b/templates/datasets/edit.tmpl deleted file mode 100644 index 7d5a63929..000000000 --- a/templates/datasets/edit.tmpl +++ /dev/null @@ -1,24 +0,0 @@ -{{template "base/head" .}} -
-
-
-
- {{.CsrfTokenHtml}} -

- {{.i18n.Tr "edit_dataset"}} -

-
- {{template "datasets/form" .}} -
- - - {{.i18n.Tr "cancel"}} -
-
-
-
-
-
-{{template "base/footer" .}} diff --git a/templates/datasets/form.tmpl b/templates/datasets/form.tmpl deleted file mode 100644 index 7b6d0c70f..000000000 --- a/templates/datasets/form.tmpl +++ /dev/null @@ -1,82 +0,0 @@ -{{template "base/alert" .}} -
- - -
- -
- -
- {{if .IsForcedPrivate}} - - - {{else}} - - - {{end}} -
- -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- -
- -
-
-
-
-
diff --git a/templates/datasets/index.tmpl b/templates/datasets/index.tmpl deleted file mode 100644 index 59bab3bc7..000000000 --- a/templates/datasets/index.tmpl +++ /dev/null @@ -1,11 +0,0 @@ -{{template "base/head" .}} -
-
- {{template "datasets/dataset_search" .}} -
- {{template "datasets/dataset_list" .}} - {{template "base/paginate" .}} -
-
-
-{{template "base/footer" .}} \ No newline at end of file diff --git a/templates/datasets/show.tmpl b/templates/datasets/show.tmpl deleted file mode 100644 index c87ec5ec4..000000000 --- a/templates/datasets/show.tmpl +++ /dev/null @@ -1,70 +0,0 @@ -{{template "base/head" .}} -
-
-

- {{$.i18n.Tr "dataset.dataset"}} - -

- -
-
-{{template "base/footer" .}} \ No newline at end of file diff --git a/templates/explore/dataset_list.tmpl b/templates/explore/dataset_list.tmpl index e69de29bb..b26a86ecd 100644 --- a/templates/explore/dataset_list.tmpl +++ b/templates/explore/dataset_list.tmpl @@ -0,0 +1,49 @@ +

+ {{.i18n.Tr "datasets"}} +

+ + +
+ +
+
+ {{range .Datasets}} +
+
+ + {{.Title}} + +
+ {{svg "octicon-tasklist" 16}} {{$.i18n.Tr (printf "dataset.task.%s" .Task)}} + {{svg "octicon-tag" 16}}{{$.i18n.Tr (printf "dataset.category.%s" .Category)}} + {{if ne .DownloadTimes 0}} + {{svg "octicon-flame" 16}} {{.DownloadTimes}} + {{end}} +
+
+
+
{{.Description}}
+

{{$.i18n.Tr "org.repo_updated"}} {{TimeSinceUnix .UpdatedUnix $.i18n.Lang}}

+
+
+ {{else}} +
+ {{$.i18n.Tr "explore.dataset_no_results"}} +
+ {{end}} +
+
diff --git a/templates/explore/dataset_search.tmpl b/templates/explore/dataset_search.tmpl index e69de29bb..6c973026a 100644 --- a/templates/explore/dataset_search.tmpl +++ b/templates/explore/dataset_search.tmpl @@ -0,0 +1,14 @@ +
+
+
+
+
+ + + + +
+
+
+
+
\ No newline at end of file diff --git a/templates/explore/datasets.tmpl b/templates/explore/datasets.tmpl index e69de29bb..748d51ba8 100644 --- a/templates/explore/datasets.tmpl +++ b/templates/explore/datasets.tmpl @@ -0,0 +1,17 @@ +{{template "base/head" .}} +
+ {{template "explore/dataset_search" .}} +
+
+ {{template "explore/navbar" .}} +
+ {{template "explore/dataset_list" .}} + {{template "base/paginate" .}} +
+
+ {{template "explore/repo_right" .}} +
+
+
+
+{{template "base/footer" .}} diff --git a/templates/explore/navbar.tmpl b/templates/explore/navbar.tmpl index 543342597..6f86a7e7c 100644 --- a/templates/explore/navbar.tmpl +++ b/templates/explore/navbar.tmpl @@ -1,16 +1,47 @@ -