Compare commits

..

26 Commits

Author SHA1 Message Date
viletyy 23679b7288 Merge branch 'dev_organization' into staging 2021-02-06 15:52:44 +08:00
viletyy 7f14b2fd50 Merge branch 'dev_organization' into staging 2021-02-06 14:30:09 +08:00
viletyy 446fede68c [FIX] 2021-02-06 14:27:47 +08:00
viletyy 0a3d236ece [FIX]org sync gitea_uid 2021-02-06 14:27:47 +08:00
viletyy b704c37495 [FIX]show teams, org name valid message 2021-02-06 14:27:47 +08:00
viletyy 2992bca4a0 [FIX]owner text 2021-02-06 14:27:47 +08:00
viletyy bf5dd7ed49 [FIX] 2021-02-06 14:27:47 +08:00
viletyy f876cfea54 [ADD]org team search, project teams add\remove, org can create field 2021-02-06 14:27:47 +08:00
viletyy eea0249346 [FIX]concat change to concat_ws, org render 403, normal team leave 2021-02-06 14:27:47 +08:00
viletyy c579dd6d42 [FIX]little vliad about team_user 2021-02-06 14:27:47 +08:00
viletyy 199b9c2b77 [ADD]organization add num_teams 2021-02-06 14:27:47 +08:00
viletyy d6ebaa038e [FIX]teams add user info 2021-02-06 14:27:47 +08:00
viletyy 4f5d54419c [ADD]search is_member is_admin 2021-02-06 14:27:47 +08:00
viletyy 2644a47da2 [FIX]add user organization count 2021-02-06 14:27:47 +08:00
viletyy 9296c8c6d2 [FIX]organization add created_at and total_count 2021-02-06 14:27:47 +08:00
viletyy cd8d82eec7 [FIX]组织可以不上传头像 2021-02-06 14:27:47 +08:00
viletyy 1715a27371 [FIX]一些筛选以及创建最大项目数量验证 2021-02-06 14:27:47 +08:00
viletyy a9ac1c7277 [ADD]组织项目相关 2021-02-06 14:27:47 +08:00
viletyy 8a201da025 [ADD]组织、组织团队 2021-02-06 14:27:47 +08:00
viletyy 3c95ef40a4 [FIX] 2021-02-06 14:27:47 +08:00
viletyy 5642d9b1e1 [FIX] 2021-02-06 14:27:47 +08:00
viletyy 6515b58172 [FIX]组织上传头像支持多种格式、项目详情返回拥有者类型 2021-02-06 14:27:47 +08:00
viletyy b1c686f690 [FIX] 2021-02-06 14:27:47 +08:00
viletyy 3362d6d24e [FIX]一些筛选以及创建最大项目数量验证 2021-02-06 14:27:47 +08:00
viletyy 4a2ab1b686 Merge branch 'dev_statistic' into staging 2021-02-06 14:13:44 +08:00
viletyy 6eed7d7283 [FIX]remove description 2021-02-06 14:12:11 +08:00
52 changed files with 168 additions and 1960 deletions

View File

@ -1,26 +0,0 @@
# Changelog
## [v3.0.1](https://forgeplus.trustie.net/projects/jasder/forgeplus/releases) - 2021-03-19
* BUGFIXES
* Fix pull reqeust模块中用户头像显示问题
* Fix 解决issue模块中指派用户的问题
* Fix 解决合并请求失败的后显示message信息不正确
* Fix 代码目录页面readme文件提供单独的api
* ENHANCEMENTS
* 重构项目详情页面
## [v3.0.0](https://forgeplus.trustie.net/projects/jasder/forgeplus/releases) - 2020-12-29
* BUGFIXES
* Fix pull reqeust的访问权限问题 (#14156) (#14171)
* Fix 部分页面访问403的问题
* Fix 合并请求失败的问题
* Fix 代码目录页面,文件夹和文件图片不显示的问题
* Fix Issue列表中按负责人过滤筛选时部分项目成员不在搜索范围没的问题
* Fix 项目更新时间不同步的问题, 添加了定时任务
* ENHANCEMENTS
* 提升获取版本库目录代码查询速度 (#43296)
* tag 列表慢查询速度问题 (#43332)
* API builder 模版中 render partial builder的性能问题

View File

@ -93,26 +93,26 @@ http://localhost:3000/
- 代码库
![](docs/figs/code.png?raw=true)
![](docs/figs/code.png)
- 任务管理
![](docs/figs/issue_manage.png?raw=true)
![](docs/figs/issue_manage.png)
- 任务查看
![](docs/figs/issue_view.png?raw=true)
![](docs/figs/issue_view.png)
- 任务指派
![](docs/figs/issue_assign2.png?raw=true)
![](docs/figs/issue_assign2.png)
- 里程碑
![](docs/figs/milestone.png?raw=true)
![](docs/figs/milestone.png)
### API
- [API文档](https://forgeplus.trustie.net/docs/api)
- [API](api_document.md)
- [API](showdoc.com.cn)
账号forgeplus@admin.com 密码forge123

View File

@ -1,3 +1,4 @@
---
# API文档
@ -18,6 +19,7 @@
### API接口
---
#### 用户注册(通过其他平台)
```
@ -4828,133 +4830,8 @@ curl --location --request DELETE 'http://localhost:3000/api/ci/templates/10'
------
#### 参数列表查询
```
GET /api/ci/secrets/secrets?owner={owner}&repo={repo}
```
*示例*
```bash
curl --location --request GET 'http://localhost:3000/api/ci/secrets?owner=test&repo=test'
```
*请求参数说明:*
| 参数名 | 必选 | 类型 | 说明 |
| ------ | ---- | ------ | ---------- |
| owner | 是 | string | 仓库所有人 |
| repo | 是 | string | 仓库名 |
*返回参数说明:*
| 参数名 | 类型 | 说明 |
| ------ | ------ | ------ |
| name | string | 参数名 |
| data | string | 参数值 |
| repo | string | 仓库 |
返回值
```json
[
{
"id": 1,
"name": "test",
"data": "test",
"repo": "test"
}
]
```
------
#### 参数新增/更新
```
POST /api/ci/secrets?owner={owner}&repo={repo}
```
*示例*
```bash
curl --location --request POST 'http://localhost:3000/api/ci/secrets?owner=test&repo=test' \
--data-raw ' {
"name": "ip",
"data": "1.1.1.1",
"id": 21
}'
```
*请求参数说明:*
| 参数名 | 必选 | 类型 | 说明 |
| ------ | ---- | ------ | ------------ |
| owner | 是 | string | 仓库拥有者 |
| repo | 是 | string | 仓库名 |
| name | 是 | string | 参数名 |
| data | 是 | string | 参数值 |
| id | 否 | int | id更新时传 |
*返回参数说明:*
| 参数名 | 类型 | 说明 |
| ------- | ------ | ------------ |
| status | int | 状态码 0成功 |
| message | string | 消息 |
返回值
```json
{
"status": 0,
"message": "success"
}
```
------
#### 参数删除
```
DELETE /api/ci/secrets/{id}?name={name}&owner={owner}&repo={repo}
```
*示例*
```bash
curl --location --request DELETE 'http://localhost:3000/api/ci/secrets/1?name=p1&owner=victor&repo=trustieTest' \
```
*请求参数说明:*
| 参数名 | 必选 | 类型 | 说明 |
| ------ | ---- | ------ | ------ |
| name | 是 | string | 参数名 |
| id | 是 | int | 参数id |
*返回参数说明:*
| 参数名 | 类型 | 说明 |
| ------- | ------ | ------------ |
| status | int | 状态码 0成功 |
| message | string | 返回消息 |
返回值
```json
{
"status": 0,
"message": "success"
}
```
------
#### 解除CI服务器绑定
```

View File

@ -1,53 +0,0 @@
class Ci::SecretsController < Ci::BaseController
before_action :load_repo
# 参数列表
def index
result = Ci::Drone::API.new(@ci_user.user_hash, ci_drone_url, params[:owner], params[:repo], nil).secrets
@secrets = result
end
#新增、更新参数
def create
options = {
name: params[:name],
data: params[:data]
}
id = params[:id]
if id
result = Ci::Drone::API.new(@ci_user.user_hash, ci_drone_url, params[:owner], params[:repo], options).update_secret
if result["id"]
render_ok
else
render_error(result["message"])
end
else
result = Ci::Drone::API.new(@ci_user.user_hash, ci_drone_url, params[:owner], params[:repo], options).create_secret
if result["id"]
render_ok
else
render_error(result["message"])
end
end
end
#删除参数
def destroy
name = params[:name]
if !name.blank?
Ci::Drone::API.new(@ci_user.user_hash, ci_drone_url, params[:owner], params[:repo], {name: name}).delete_secret
render_ok
else
render_error("参数名不能为空")
end
rescue Exception => ex
render_ok
end
def ci_drone_url
user = User.find_by(login: params[:owner])
user&.ci_cloud_account.drone_url
end
end

View File

@ -8,8 +8,6 @@ module RegisterHelper
user.password = password
user.platform = platform
user.activate
return unless user.valid?
interactor = Gitea::RegisterInteractor.call({username: username, email: email, password: password})
if interactor.success?

View File

@ -14,6 +14,6 @@ module Repository::LanguagesPercentagable
hash.transform_values { |v|
ActionController::Base.helpers
.number_to_percentage((v * 100.0 / total_byte_size), precision: 1)
}.select{|k,v| v != "0.0%"}
}
end
end

View File

@ -12,7 +12,6 @@ class IssuesController < ApplicationController
include TagChosenHelper
def index
return render_not_found unless @project.has_menu_permission("issues")
@user_admin_or_member = current_user.present? && current_user.logged? && (current_user.admin || @project.member?(current_user))
issues = @project.issues.issue_issue.issue_index_includes
issues = issues.where(is_private: false) unless @user_admin_or_member

View File

@ -1,24 +0,0 @@
class Projects::ProjectUnitsController < Projects::BaseController
def index
@project_units = @project.project_units
end
def create
if current_user.admin? || @project.owner?(current_user)
ActiveRecord::Base.transaction do
ProjectUnit.update_by_unit_types!(@project, unit_types)
render_ok
end
else
render_forbidden('你没有权限操作')
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def unit_types
params.fetch(:unit_types, [])
end
end

View File

@ -2,26 +2,11 @@ class ProjectsController < ApplicationController
include ApplicationHelper
include OperateProjectAbilityAble
include ProjectsHelper
before_action :require_login, except: %i[index branches group_type_list simple show fork_users praise_users watch_users recommend about menu_list]
before_action :require_login, except: %i[index branches group_type_list simple show fork_users praise_users watch_users recommend about]
before_action :load_project, except: %i[index group_type_list migrate create recommend]
before_action :authorizate_user_can_edit_project!, only: %i[update]
before_action :project_public?, only: %i[fork_users praise_users watch_users]
def menu_list
menu = []
menu.append(menu_hash_by_name("home"))
menu.append(menu_hash_by_name("code")) if @project.has_menu_permission("code")
menu.append(menu_hash_by_name("issues")) if @project.has_menu_permission("issues")
menu.append(menu_hash_by_name("pulls")) if @project.has_menu_permission("pulls")
menu.append(menu_hash_by_name("devops")) if @project.has_menu_permission("devops")
menu.append(menu_hash_by_name("versions")) if @project.has_menu_permission("versions")
menu.append(menu_hash_by_name("activity"))
menu.append(menu_hash_by_name("setting")) if current_user.admin? || @project.owner?(current_user)
render json: menu
end
def index
scope = Projects::ListQuery.call(params)
@ -88,11 +73,10 @@ class ProjectsController < ApplicationController
private = params[:private]
gitea_params = {
private: private,
default_branch: params[:default_branch],
website: params[:website]
default_branch: params[:default_branch]
}
if [true, false].include? private
new_project_params = project_params.except(:private).merge(is_public: !private)
new_project_params = project_params.merge(is_public: !private)
Gitea::Repository::UpdateService.call(@owner, @project.identifier, gitea_params)
@project.repository.update_column(:hidden, private)
end
@ -178,7 +162,7 @@ class ProjectsController < ApplicationController
private
def project_params
params.permit(:user_id, :name, :description, :repository_name, :website,
params.permit(:user_id, :name, :description, :repository_name,
:project_category_id, :project_language_id, :license_id, :ignore_id, :private)
end

View File

@ -8,7 +8,6 @@ class PullRequestsController < ApplicationController
def index
return render_not_found unless @project.has_menu_permission("pulls")
# @issues = Gitea::PullRequest::ListService.new(@user,@repository.try(:identifier)).call #通过gitea获取
issues = @project.issues.issue_pull_request.issue_index_includes.includes(pull_request: :user)
issues = issues.where(is_private: false) unless current_user.present? && (current_user.admin? || @project.member?(current_user))
@ -229,8 +228,7 @@ class PullRequestsController < ApplicationController
}
@requests_params = @local_params.merge({
assignee: current_user.try(:login),
# assignees: ["#{params[:assigned_login].to_s}"],
assignees: ["#{current_user.try(:login).to_s}"],
assignees: ["#{params[:assigned_login].to_s}"],
labels: params[:issue_tag_ids],
due_date: Time.now
})

View File

@ -7,30 +7,10 @@ class RepositoriesController < ApplicationController
before_action :load_repository
before_action :authorizate!, except: [:sync_mirror, :tags, :commit]
before_action :authorizate_user_can_edit_repo!, only: %i[sync_mirror]
before_action :get_ref, only: %i[entries sub_entries top_counts file]
before_action :get_ref, only: %i[entries sub_entries top_counts]
before_action :get_latest_commit, only: %i[entries sub_entries top_counts]
before_action :get_statistics, only: %i[top_counts]
def files
result = @project.educoder? ? nil : Gitea::Repository::Files::GetService.call(@owner, @project.identifier, @ref, params[:search], @owner.gitea_token)
render json: result
end
# 新版项目详情
def detail
return render_not_found unless @project.has_menu_permission("code")
@user = current_user
@result = Repositories::DetailService.call(@owner, @repository, @user)
@project_fork_id = @project.try(:forked_from_project_id)
if @project_fork_id.present?
@fork_project = Project.find_by(id: @project_fork_id)
@fork_project_user = @fork_project.owner
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def show
@user = current_user
@repo = @project.repository
@ -107,12 +87,7 @@ class RepositoriesController < ApplicationController
@tags = Gitea::Repository::Tags::ListService.call(current_user&.gitea_token, @owner.login, @project.identifier, {page: params[:page], limit: params[:limit]})
end
def contributors
@contributors = Gitea::Repository::Contributors::GetService.call(@owner, @repository.identifier)
end
def edit
return render_forbidden if !@project.manager?(current_user) && !current_user.admin?
end
def create_file
@ -211,7 +186,7 @@ class RepositoriesController < ApplicationController
end
def get_ref
@ref = params[:ref] || @project.default_branch
@ref = params[:ref] || "master"
end
def get_latest_commit

View File

@ -5,7 +5,6 @@ class VersionsController < ApplicationController
before_action :set_version, only: [:edit, :update, :destroy, :show,:update_status]
def index
return render_not_found unless @project.has_menu_permission("versions")
@user_admin_or_member = current_user.present? && (current_user.admin || @project.member?(current_user))
order_name = params[:order_name] || "created_on"
order_type = params[:order_type] || "desc"

View File

@ -168,55 +168,6 @@ Remember — a happy kitten is an authenticated kitten!
</aside>
## 项目导航
获取项目导航信息
> 示例:
```shell
curl -X GET \
http://localhost:3000/api/yystopf/ceshi/menu_list | jq
```
```javascript
await octokit.request('GET /api/yystopf/ceshi/menu_list')
```
### HTTP 请求
`GET api/:owner/:repo/menu_list`
### 请求参数
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
owner |是| |string |用户登录名
repo |是| |string |项目标识identifier
### 返回字段说明
参数 | 类型 | 字段说明
--------- | ----------- | -----------
menu_name |string|导航名称, home:主页,code:代码库,issues:易修,pulls:合并请求,devops:工作流,versions:里程碑,activity:动态,setting:仓库设置
> 返回的JSON示例:
```json
[
{
"menu_name": "home"
},
{
"menu_name": "code"
},
{
"menu_name": "pulls"
},
{
"menu_name": "activity"
}
]
```
## 项目主页
获取项目主页信息
@ -261,84 +212,6 @@ attachments |array|附件
Remember — a happy kitten is an authenticated kitten!
</aside>
## 项目模块信息
项目模块信息
> 示例:
```shell
curl -X GET \
http://localhost:3000/api/yystopf/ceshi/project_units.json
```
```javascript
await octokit.request('GET /api/yystopf/ceshi/project_units')
```
### HTTP 请求
`GET /api/yystopf/ceshi/project_units`
### 返回字段说明:
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|type |string|模块名称 |
> 返回的JSON示例:
```json
[
{
"type": "code"
},
{
"type": "pulls"
},
{
"type": "issues"
}
]
```
## 更改项目模块展示
更改项目模块展示
> 示例:
```shell
curl -X POST \
-H "accept: application/json" \
-H "Content-Type: application/json" \
-d "{ \"unit_typs\": [\"code\", \"pulls\"]}" \
http://localhost:3000/api/yystopf/ceshi/project_units.json
```
```javascript
await octokit.request('POST /api/yystopf/ceshi/project_units')
```
### HTTP 请求
`POST /api/yystopf/ceshi/project_units`
### 请求参数
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|unit_types |是| |array | 项目模块内容, 支持以下参数:code:代码库,issues:易修,pulls:合并请求,devops:工作流,versions:里程碑 |
### 返回字段说明:
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|status |int|返回状态, 0: 表示操作成功 |
|message |string|返回信息说明|
> 返回的JSON示例:
```json
{
"status": 0,
"message": "success"
}
```
## 创建项目
创建项目

View File

@ -97,182 +97,6 @@ await octokit.request('GET /api/jasder/jasder_test/simple.json')
}
```
## 仓库详情(新版)
仓库详情
> 示例:
```shell
curl -X GET http://localhost:3000/api/yystopf/ceshi/detail.json
```
```javascript
await octokit.request('GET /api/yystopf/ceshi/detail.json')
```
### HTTP 请求
`GET /api/:owner/:repo/detail`
### 请求参数:
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|owner |是| |string |用户登录名 |
|repo |是| |string |项目标识identifier |
### 返回字段说明:
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|content |string |仓库简介 |
|website |string |仓库网址 |
|readme |string |readme文件
|identifier |string |项目标识 |
|name |string |项目名称 |
|issues_count |int |项目issue数量|
|pull_requests_count |int |项目合并请求数量|
|project_identifier |int |项目标识|
|praises_count |int |项目点赞数量|
|forked_count |int |项目复刻数量|
|watchers_count |int |项目关注数量|
|versions_count |int |项目里程碑数量|
|version_releases_count |int |项目发行版数量|
|version_releasesed_count |int |项目发行版已发行数量|
|permission |string |项目权限|
|mirror_url |string |镜像地址|
|mirror |bool |是否为镜像项目|
|type |int |项目类型 0 普通项目 1 普通镜像项目 2 同步镜像项目|
|open_devops |int |是否开启devops|
|watched |bool |是否关注|
|praised |bool |是否点赞|
|status |int |项目状态|
|forked_from_project_id |int |fork项目id|
|fork_info |object |fork项目信息|
|size |string |仓库大小|
|ssh_url |string |项目ssh地址|
|clone_url |string |项目克隆地址|
|default_branch |string |仓库默认分支|
|empty |bool |仓库是否为空|
|full_name |string |仓库全称|
|private |bool |仓库是否为私有项目|
|license_name |string |许可证名称|
|release_versions.list.name |string |项目issue数量|
|release_versions.list.tag_name |string |发行版标签名称|
|release_versions.list.created_at |string |发行版创建时间|
|release_versions.total_count |int |发行版数量|
|branches.list.name |string |分支名称|
|branches.total_count |int |分支数量|
|tags.list.name |string |标签名称|
|tags.total_count |int |标签数量|
|contributors.list.contributions|int |贡献数量|
|contributors.list.login |string |贡献者登录名|
|contributors.list.name |string |贡献者用户名称|
|contributors.list.image_url |string |贡献者头像|
|languages |object |项目语言占比|
> 返回的JSON示例:
```json
{
"content": "仓库简介",
"website": "仓库网址",
"readme": {
"type": "file",
"encoding": "base64",
"size": 9,
"name": "README.md",
"path": "README.md",
"content": "# ceshi\n\n",
"sha": ""
},
"identifier": "ceshi",
"name": "测试项目",
"project_id": 2,
"repo_id": 2,
"issues_count": 0,
"pull_requests_count": 0,
"project_identifier": "ceshi",
"praises_count": 0,
"forked_count": 0,
"watchers_count": 0,
"versions_count": 0,
"version_releases_count": 0,
"version_releasesed_count": 0,
"permission": "Reporter",
"mirror_url": null,
"mirror": false,
"type": 0,
"open_devops": false,
"watched": false,
"praised": false,
"status": 1,
"forked_from_project_id": 1,
"fork_info": {
"fork_form_name": "测试项目",
"fork_project_user_login": "ceshi_org",
"fork_project_identifier": "ceshi",
"fork_project_user_name": "ceshi_org"
},
"size": "25.0 KB",
"ssh_url": "virus@localhost:yystopf/ceshi.git",
"clone_url": "http://localhost:10080/yystopf/ceshi.git",
"default_branch": "master",
"empty": false,
"full_name": "yystopf/ceshi",
"private": false,
"license_name": "gnu-javamail-exception",
"release_versions": {
"list": [
{
"id": 2,
"name": "vvvv",
"tag_name": "v1.1",
"created_at": "2019-07-18 10:16"
}
],
"total_count": 1
},
"branches": {
"list": [
{
"name": "master"
}
],
"total_count": 1
},
"tags": {
"list": [
{
"name": "v1.1"
},
{
"name": "v1.0"
}
],
"total_count": 2
},
"contributors": {
"list": [
{
"contributions": 1,
"gid": 2,
"login": "yystopf",
"type": "User",
"name": "yystopf",
"image_url": "avatars/User/b"
}
],
"total_count": 1
},
"languages": {
"HTML": "50.9%",
"Ruby": "25.6%",
"JavaScript": "21.4%",
"CSS": "1.3%",
"CoffeeScript": "0.7%",
"Shell": "0.1%"
}
}
```
## 编辑仓库信息
编辑仓库信息
@ -639,78 +463,6 @@ await octokit.request('GET /api/jasder/jasder_test/collaborators.json')
Success Data.
</aside>
## 获取仓库所有文件
获取仓库所有文件
> 示例:
```shell
curl -X GET \
-d "ref=develop" \
http://localhost:3000/api/yystopf/ceshi/files.json
```
```javascript
await octokit.request('GET /api/yystopf/ceshi/files.json')
```
### HTTP 请求
`GET /api/:owner/:repo/files`
### 请求参数:
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|owner |是| |string |用户登录名 |
|repo |是| |string |项目标识identifier |
|search |否| |string |文件搜索关键词 |
|ref |是| |string |分支名,默认为仓库默认分支 |
### 返回字段说明:
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|name |string |文件名称|
|path |string |文件路径|
|sha |string |文件标识|
|type |string |文件类型|
|size |int |文件大小|
|url |string |文件地址|
> 返回的JSON示例:
```json
[
{
"name": ".gitignore",
"path": ".gitignore",
"sha": "f83922d01ae60f6e637a1a2b9f08871b4f87dfc8",
"type": "file",
"size": 63,
"url": "http://localhost:10080/api/v1/repos/yystopf/ceshi/contents/.gitignore?ref=master",
"html_url": "http://localhost:10080/yystopf/ceshi/src/branch/master/.gitignore"
},
{
"name": "LICENSE",
"path": "LICENSE",
"sha": "8f3b9ab0d08afd3a624d822e3971a2f42b3bc2b9",
"type": "file",
"size": 341,
"url": "http://localhost:10080/api/v1/repos/yystopf/ceshi/contents/LICENSE?ref=master",
"html_url": "http://localhost:10080/yystopf/ceshi/src/branch/master/LICENSE"
},
{
"name": "README.md",
"path": "README.md",
"sha": "1bc8a60ac6ddc876ebc4b60fc68991435bfad93e",
"type": "file",
"size": 9,
"url": "http://localhost:10080/api/v1/repos/yystopf/ceshi/contents/README.md?ref=master",
"html_url": "http://localhost:10080/yystopf/ceshi/src/branch/master/README.md"
}
]
```
## 获取仓库代码目录
获取仓库代码目录

View File

@ -2,7 +2,7 @@ class Projects::MigrateForm < BaseForm
REPOSITORY_NAME_REGEX = /^(?!_)(?!.*?_$)[a-zA-Z0-9_-]+$/ #只含有数字、字母、下划线不能以下划线开头和结尾
URL_REGEX = /\A(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?\z/i
attr_accessor :user_id, :name, :description, :repository_name, :project_category_id, :project_language_id, :clone_addr, :private, :is_mirror, :auth_username, :auth_password, :owner
attr_accessor :user_id, :name, :description, :repository_name, :project_category_id, :project_language_id, :clone_addr, :private, :is_mirror, :auth_username, :auth_password
validates :user_id, :name, :description,:repository_name, :project_category_id, :project_language_id, presence: true
validates :repository_name, format: { with: REPOSITORY_NAME_REGEX, multiline: true, message: "只能含有数字、字母、下划线且不能以下划线开头和结尾" }
@ -12,18 +12,6 @@ class Projects::MigrateForm < BaseForm
check_repository_name(user_id, repository_name) unless repository_name.blank?
check_project_category(project_category_id)
check_project_language(project_language_id)
check_owner
check_max_repo_creation
end
def check_owner
@owner = Owner.find_by(id: user_id)
raise "user_id值无效." if user_id && owner.blank?
end
def check_max_repo_creation
return unless owner.is_a?(Organization)
return if owner.max_repo_creation <= -1
raise "已超过组织设置最大仓库数" if owner.max_repo_creation == owner.num_projects
end
end

View File

@ -1,9 +1,4 @@
module ProjectsHelper
def menu_hash_by_name(name)
{
menu_name: name
}
end
def render_zh_project_type(project_type)
case project_type

View File

@ -85,24 +85,4 @@ class Ci::Drone::API < Ci::Drone::Request
post(endpoint, "/api/users", {login: options[:login], email: options[:email], avatar_url:options[:avatar_url],active:true, drone_token: options[:token]})
end
# Creates a secret.
def create_secret
post(endpoint, "/api/repos/#{owner}/#{repo}/secrets", {name: options[:name], data: options[:data], pull_request:true, drone_token: drone_token})
end
# Update a secret.
def update_secret
patch(endpoint, "/api/repos/#{owner}/#{repo}/secrets/#{options[:name]}", { data: options[:data], pull_request:true, drone_token: drone_token})
end
# list of secrets.
def secrets
get(endpoint, "/api/repos/#{owner}/#{repo}/secrets", drone_token: drone_token)
end
# delete secret.
def delete_secret
delete(endpoint, "/api/repos/#{owner}/#{repo}/secrets/#{options[:name]}", drone_token: drone_token)
end
end

View File

@ -89,7 +89,4 @@ module ProjectOperable
member.member_roles.create!(role: role)
end
def has_menu_permission(unit_type)
self.project_units.where(unit_type: unit_type).exists?
end
end

View File

@ -11,6 +11,11 @@
# sync_subject :boolean default("0")
# sync_shixun :boolean default("0")
#
# Indexes
#
# index_laboratories_on_identifier (identifier) UNIQUE
# index_laboratories_on_school_id (school_id)
#
class Laboratory < ApplicationRecord
belongs_to :school, optional: true

View File

@ -6,6 +6,10 @@
# laboratory_id :integer
# config :text(65535)
#
# Indexes
#
# index_laboratory_settings_on_laboratory_id (laboratory_id)
#
class LaboratorySetting < ApplicationRecord
belongs_to :laboratory

View File

@ -59,7 +59,6 @@
#
class Owner < ApplicationRecord
self.abstract_class = true
self.table_name = "users"
include ProjectAbility

View File

@ -52,8 +52,6 @@
# open_devops_count :integer default("0")
# recommend :boolean default("0")
# platform :integer default("0")
# default_branch :string(255) default("master")
# website :string(255)
#
# Indexes
#
@ -71,8 +69,6 @@
#
class Project < ApplicationRecord
include Matchable
include Publicable
@ -113,15 +109,12 @@ class Project < ApplicationRecord
has_and_belongs_to_many :trackers, :order => "#{Tracker.table_name}.position"
has_one :project_detail, dependent: :destroy
has_many :team_projects, dependent: :destroy
has_many :project_units, dependent: :destroy
after_save :check_project_members
scope :project_statics_select, -> {select(:id,:name, :is_public, :identifier, :status, :project_type, :user_id, :forked_count, :visits, :project_category_id, :project_language_id, :license_id, :ignore_id, :watchers_count, :created_on)}
scope :no_anomory_projects, -> {where("projects.user_id is not null and projects.user_id != ?", 2)}
scope :recommend, -> { visible.project_statics_select.where(recommend: true) }
delegate :content, to: :project_detail, allow_nil: true
delegate :name, to: :license, prefix: true, allow_nil: true
def self.search_project(search)

View File

@ -1,35 +0,0 @@
# == Schema Information
#
# Table name: project_units
#
# id :integer not null, primary key
# project_id :integer
# unit_type :integer
# created_at :datetime not null
# updated_at :datetime not null
#
# Indexes
#
# index_project_units_on_project_id (project_id)
#
class ProjectUnit < ApplicationRecord
belongs_to :project
enum unit_type: {code: 1, issues: 2, pulls: 3, devops: 4, versions: 5}
validates :unit_type, uniqueness: { scope: :project_id}
def self.init_types(project_id)
ProjectUnit::unit_types.each do |_, v|
self.create!(project_id: project_id, unit_type: v)
end
end
def self.update_by_unit_types!(project, types)
project.project_units.where.not(unit_type: types).each(&:destroy!)
types.each do |type|
project.project_units.find_or_create_by!(unit_type: type)
end
end
end

View File

@ -41,8 +41,6 @@ class Repository < ApplicationRecord
validates :identifier, presence: true
delegate :default_branch, to: :project, allow_nil: true
def to_param
self.identifier.parameterize
end

View File

@ -137,6 +137,7 @@ class User < Owner
# 关注
# has_many :be_watchers, foreign_key: :user_id, dependent: :destroy # 我的关注
# has_many :be_watcher_users, through: :be_watchers, dependent: :destroy # 我关注的用户
has_many :watchers, as: :watchable, dependent: :destroy
has_one :ci_cloud_account, class_name: 'Ci::CloudAccount', dependent: :destroy

View File

@ -17,12 +17,15 @@ class Projects::ListMyQuery < ApplicationQuery
projects = Project.visible
end
if params[:is_public].present?
projects = projects.is_private.members_projects(user.id) if params[:is_public].to_s == "private"
projects = projects.visible.members_projects(user.id) if params[:is_public].to_s == "public"
end
if params[:category].blank?
projects = projects.members_projects(user.id)
elsif params[:category].to_s == "join"
normal_projects = projects.where.not(user_id: user.id).members_projects(user.id).to_sql
org_projects = projects.joins(team_projects: [team: :team_users]).where(team_users: {user_id: user.id}).to_sql
projects = Project.from("( #{ normal_projects} UNION #{ org_projects } ) AS projects").distinct
projects = projects.where.not(user_id: user.id).members_projects(user.id)
elsif params[:category].to_s == "manage"
projects = projects.where(user_id: user.id)
elsif params[:category].to_s == "watched" #我关注的
@ -36,11 +39,6 @@ class Projects::ListMyQuery < ApplicationQuery
# projects = projects.is_private.joins(:members).where(members: { user_id: user.id })
end
if params[:is_public].present?
projects = projects.is_private if params[:is_public].to_s == "private"
projects = projects.visible if params[:is_public].to_s == "public"
end
if params[:project_type].to_s === "common"
projects = projects.common
elsif params[:project_type].to_s === "mirror"

View File

@ -1,21 +0,0 @@
class Gitea::Organization::GetService < Gitea::ClientService
attr_reader :org
def initialize(org)
@org = org
end
def call
response = get(url, params)
render_status(response)
end
private
def params
Hash.new.merge(token: org.gitea_token)
end
def url
"/orgs/#{org.login}".freeze
end
end

View File

@ -1,22 +0,0 @@
class Gitea::Repository::Contributors::GetService < Gitea::ClientService
attr_reader :owner, :repo_name
def initialize(owner, repo_name)
@owner = owner
@repo_name = repo_name
end
def call
response = get(url, params)
render_status(response)
end
private
def params
Hash.new.merge(token: owner.gitea_token)
end
def url
"/repos/#{owner.login}/#{repo_name}/contributors"
end
end

View File

@ -1,25 +0,0 @@
class Gitea::Repository::Files::GetService < Gitea::ClientService
attr_reader :owner, :repo_name, :ref, :q, :token
def initialize(owner, repo_name, ref, q=nil, token=nil)
@owner = owner
@repo_name = repo_name
@ref = ref
@q = q
@token = token
end
def call
response = get(url, params)
render_status(response)
end
private
def params
Hash.new.merge(token: token, ref: ref, q: q)
end
def url
"/repos/#{owner.login}/#{repo_name}/find"
end
end

View File

@ -18,8 +18,7 @@ class Gitea::Versions::CreateService < Gitea::ClientService
end
def call
response = post(url, request_params)
render_status(response)
post(url, request_params)
end
private

View File

@ -13,7 +13,6 @@ class Projects::CreateService < ApplicationService
ActiveRecord::Base.transaction do
if @project.save!
Project.update_common_projects_count!
ProjectUnit.init_types(@project.id)
Repositories::CreateService.new(user, @project, repository_params).call
else
Rails.logger.info("#############___________create_project_erros______###########{@project.errors.messages}")
@ -37,7 +36,6 @@ class Projects::CreateService < ApplicationService
is_public: repo_is_public,
ignore_id: params[:ignore_id],
license_id: params[:license_id],
website: params[:website],
identifier: params[:repository_name] #新增,hs
}
end
@ -46,7 +44,6 @@ class Projects::CreateService < ApplicationService
{
hidden: !repo_is_public,
user_id: params[:user_id],
website: params[:website],
identifier: params[:repository_name]
}
end

View File

@ -9,7 +9,6 @@ class Projects::MigrateService < ApplicationService
def call
@project = Project.new(project_params)
if @project.save!
ProjectUnit.init_types(@project.id)
Project.update_mirror_projects_count!
Repositories::MigrateService.new(user, @project, repository_params).call
else
@ -45,7 +44,7 @@ class Projects::MigrateService < ApplicationService
hidden: project_secretion[:hidden],
identifier: params[:repository_name],
mirror_url: params[:clone_addr],
user_id: params[:user_id],
user_id: user.id,
login: params[:auth_username],
password: params[:auth_password],
is_mirror: params[:is_mirror]

View File

@ -1,5 +1,5 @@
class Projects::TransferService < ApplicationService
attr_accessor :project, :owner, :new_owner, :gitea_repo
attr_accessor :project, :owner, :new_owner
def initialize(project, new_owner)
@project = project
@ -12,7 +12,6 @@ class Projects::TransferService < ApplicationService
ActiveRecord::Base.transaction do
gitea_update_owner
update_owner
update_repo_url
update_visit_teams
end
@ -26,10 +25,6 @@ class Projects::TransferService < ApplicationService
project.update!(user_id: new_owner.id)
end
def update_repo_url
project.repository.update!(url: @gitea_repo["clone_url"])
end
def update_visit_teams
if new_owner.is_a?(Organization)
new_owner.teams.where(includes_all_project: true).each do |team|
@ -42,7 +37,7 @@ class Projects::TransferService < ApplicationService
def gitea_update_owner
begin
@gitea_repo = Gitea::Repository::TransferService.call(owner&.gitea_token, owner&.login, project.identifier, new_owner&.login)
Gitea::Repository::TransferService.call(owner&.gitea_token, owner&.login, project.identifier, new_owner&.login)
rescue Exception => e
Rails.logger.info("##### Project transfer_service, gitea transfer error #{e}")
end

View File

@ -1,7 +1,6 @@
class PullRequests::CreateService < ApplicationService
attr_reader :current_user, :owner, :project, :params
attr_accessor :pull_issue, :pull_request
def initialize(current_user, owner, project, params)
@owner = owner
@ -11,15 +10,13 @@ class PullRequests::CreateService < ApplicationService
end
def call
ActiveRecord::Base.transaction do
validate!
save_pull_issue!
save_pull_request!
save_issue_tags_relates!
save_tiding!
save_project_trend!
save_custom_journal_detail!
end
validate!
save_pull_issue!
save_pull_request!
save_issue_tags_relates!
save_tiding!
save_project_trend!
save_custom_journal_detail!
[pull_request, gitea_pull_request]
end
@ -46,7 +43,7 @@ class PullRequests::CreateService < ApplicationService
end
def save_pull_issue!
pull_issue.save!
pull_issue.save
end
def pull_request
@ -54,7 +51,7 @@ class PullRequests::CreateService < ApplicationService
end
def save_pull_request!
pull_request.save!
pull_request.save
end
def save_issue_tags_relates!
@ -79,7 +76,7 @@ class PullRequests::CreateService < ApplicationService
end
def save_project_trend!
project_trend.save!
project_trend.save
end
def project_trend
@ -145,7 +142,5 @@ class PullRequests::CreateService < ApplicationService
raise "title参数不能为空" if @params[:title].blank?
raise "head参数不能为空" if @params[:head].blank?
raise "base参数不能为空" if @params[:base].blank?
raise @pull_issue.errors.full_messages.join(", ") unless pull_issue.valid?
raise @pull_request.errors.full_messages.join(", ") unless pull_request.valid?
end
end

View File

@ -62,7 +62,6 @@ class Repositories::CreateService < ApplicationService
project.update_columns(
gpid: gitea_repository["id"],
identifier: repository.identifier,
default_branch: gitea_repository["default_branch"],
forked_count: gitea_repository["forks_count"])
end
end

View File

@ -1,64 +0,0 @@
class Repositories::DetailService < ApplicationService
include Repository::LanguagesPercentagable
attr_reader :owner, :repo, :user
def initialize(owner, repo, user)
@owner = owner
@repo = repo
@user = user
end
def call
if @repo.project.educoder?
return {
repo: {},
release: [],
branch: [],
tag: [],
contributor: [],
language: {},
readme: {}
}
else
return {
repo: repo_suitable,
release: release_suitable,
branch: branch_suitable,
tag: tag_suitable,
contributor: contributor_suitable,
language: language_suitable,
readme: readme_suitable
}
end
end
private
def repo_suitable
Gitea::Repository::GetService.call(@owner, @repo.identifier)
end
def release_suitable
Gitea::Versions::ListService.call(@owner.gitea_token, @owner.try(:login), @repo.try(:identifier))
end
def branch_suitable
Gitea::Repository::Branches::ListService.call(@owner, @repo.identifier)
end
def tag_suitable
Gitea::Repository::Tags::ListService.call(@owner&.gitea_token, @owner.login, @repo.identifier)
end
def contributor_suitable
Gitea::Repository::Contributors::GetService.call(@owner, @repo.identifier)
end
def language_suitable
result = Gitea::Repository::Languages::ListService.call(@owner.login, @repo.identifier, @user&.gitea_token)
result[:status] === :success ? hash_transform_precentagable(result[:body]) : nil
end
def readme_suitable
result = Gitea::Repository::Readme::GetService.call(@owner.login, @repo.identifier, @repo.default_branch, @owner.gitea_token)
result[:status] === :success ? result[:body] : nil
end
end

View File

@ -28,7 +28,7 @@ class Repositories::MigrateService < ApplicationService
{
clone_addr: params[:mirror_url],
repo_name: params[:identifier],
uid: project&.owner&.gitea_uid,
uid: user.gitea_uid,
private: params[:hidden],
mirror: wrapper_mirror || false,
auth_username: params[:login],

View File

@ -1,2 +0,0 @@
json.id secret['id']
json.name secret['name']

View File

@ -1,3 +0,0 @@
json.array! @secrets do |secret|
json.partial! "/ci/secrets/index", secret: secret
end

View File

@ -1 +0,0 @@
json.array! @project_units.pluck(:unit_type)

View File

@ -1,17 +0,0 @@
total_count = @contributors.size
json.contributors @contributors.each do |contributor|
user = User.find_by(gitea_uid: contributor["id"])
if contributor["login"] == "root"
total_count -= 1
next
end
json.contributions contributor["contributions"]
json.gid contributor["id"]
json.login user.login
json.type user&.type
json.name user.real_name
json.image_url url_to_avatar(user)
end
json.total_count total_count

View File

@ -1,94 +0,0 @@
json.content @project.content
json.website @project.website
if @result[:readme].blank?
json.readme nil!
else
json.readme @result[:readme].merge(content: readme_render_decode64_content(@result[:readme]["content"], nil))
end
json.identifier render_identifier(@project)
json.name @project.name
json.project_id @project.id
json.repo_id @repository.id
json.issues_count @project.issues_count.to_i - @project.pull_requests_count.to_i
json.pull_requests_count @project.pull_requests_count
json.project_identifier render_identifier(@project)
json.praises_count @project.praises_count.to_i
json.forked_count @project.forked_count.to_i
json.watchers_count @project.watchers_count.to_i
json.versions_count @project.versions_count #里程碑数量
json.version_releases_count @project.releases_size(@user.try(:id), "all")
json.version_releasesed_count @project.releases_size(@user.try(:id), "released") #已发行的版本
json.permission render_permission(@user, @project)
json.mirror_url @project&.repository.mirror_url
json.mirror @project&.repository.mirror_url.present?
json.type @project.numerical_for_project_type
json.open_devops @project.open_devops?
unless @project.common?
json.mirror_status @repository.mirror_status
json.mirror_num @repository.mirror_num
json.first_sync @repository.first_sync?
end
json.watched @project.watched_by? @user
json.praised @project.praised_by? @user
json.status @project.status
json.forked_from_project_id @project_fork_id
json.fork_info do
if @fork_project.present?
json.fork_form_name @fork_project.try(:name)
json.fork_project_user_login @fork_project_user.try(:login)
json.fork_project_identifier @fork_project.identifier
json.fork_project_user_name @fork_project_user.try(:show_real_name)
end
end
if @result[:repo]
json.size replace_bytes_to_b(number_to_human_size(@result[:repo]['size'].to_i*1024))
json.ssh_url @result[:repo]['ssh_url']
json.clone_url @result[:repo]['clone_url']
json.default_branch @result[:repo]['default_branch']
json.empty @result[:repo]['empty']
json.full_name @result[:repo]['full_name']
json.private @result[:repo]['private']
end
json.license_name @project.license_name
json.release_versions do
json.list @result[:release].each do |release|
forge_version = VersionRelease.find_by(version_gid: release["id"])
json.id forge_version&.id
json.name release["name"]
json.tag_name release["tag_name"]
json.created_at format_time(release["created_at"].to_time)
end
json.total_count @result[:release].size
end
json.branches do
json.list @result[:branch].each do |branch|
json.name branch["name"]
end
json.total_count @result[:branch].size
end
json.tags do
json.list @result[:tag].each do |tag|
json.name tag["name"]
end
json.total_count @result[:tag].size
end
json.contributors do
total_count = @result[:contributor].size
json.list @result[:contributor].each do |contributor|
user = User.find_by(gitea_uid: contributor["id"])
if contributor["login"] == "root"
total_count -= 1
next
end
json.contributions contributor["contributions"]
json.gid contributor["id"]
json.login user.login
json.type user&.type
json.name user.real_name
json.image_url url_to_avatar(user)
end
json.total_count total_count
end
json.languages @result[:language]

View File

@ -5,4 +5,3 @@ json.project_description @project.description
json.project_category_id @project.project_category_id
json.project_language_id @project.project_language_id
json.private !@project.is_public
json.project_units @project.project_units.pluck(:unit_type)

View File

@ -41,7 +41,7 @@ if @project.forge?
end
#json.tags_count @tags_count
#json.branches_count @branches_count
json.commits_count @commits_count
#json.commits_count @commits_count
json.zip_url render_zip_url(@project, @ref)
json.tar_url render_tar_url(@project, @ref)
json.entries do

View File

@ -39,9 +39,6 @@ Rails.application.routes.draw do
end
end
resources :secrets do
end
resources :pipelines do
collection do
get :list
@ -369,7 +366,6 @@ Rails.application.routes.draw do
resource :projects, path: '/', except: [:show, :edit] do
member do
get :menu_list
get :branches
get :simple
get :watchers, to: 'projects#watch_users'
@ -379,17 +375,14 @@ Rails.application.routes.draw do
end
end
resource :repositories, path: '/', only: [:show, :create, :edit] do
resource :repositories, path: '/', only: [:show, :create, :edit] do
member do
get :files
get :detail
get :archive
get :top_counts
get :entries
match :sub_entries, :via => [:get, :put]
get :commits
get :tags
get :contributors
post :create_file
put :update_file
delete :delete_file
@ -530,7 +523,6 @@ Rails.application.routes.draw do
scope module: :projects do
resources :teams, only: [:index, :create, :destroy]
resources :project_units, only: [:index, :create]
scope do
get(
'/blob/*id/diff',

View File

@ -1,6 +0,0 @@
class AddWebsiteToProjects < ActiveRecord::Migration[5.2]
def change
add_column :projects, :default_branch, :string, default: 'master'
add_column :projects, :website, :string
end
end

View File

@ -1,10 +0,0 @@
class CreateProjectUnits < ActiveRecord::Migration[5.2]
def change
create_table :project_units do |t|
t.references :project
t.integer :unit_type
t.timestamps
end
end
end

View File

@ -1,46 +0,0 @@
namespace :create_mulan_repository do
desc "sync mulan repository from gitee.com"
task sync_from_gitee: :environment do
doc = SimpleXlsxReader.open("#{Rails.root}/public/mulan_repo.xlsx")
data = doc.sheets.first.rows
data.each_with_index do |row, index|
next if index == 0
begin
user = User.find_by(login: row[1])
unless user.present?
username = row[1]
email = "#{row[1]}@forge.com"
password = "Mr123456."
user = User.new(nickname: row[0], login: username, mail: email, password: password, type: 'User')
interactor = Gitea::RegisterInteractor.call({username: username, email: email, password: password})
gitea_user = interactor.result
result = Gitea::User::GenerateTokenService.call(username, password)
user.gitea_token = result['sha1']
user.gitea_uid = gitea_user[:body]['id']
user.save!
UserExtension.create!(user_id: user.id)
end
project = user.projects.find_by(identifier: row[4])
unless project.present?
p_category = ProjectCategory.find_or_create_by(name: row[6])
p_language = ProjectLanguage.find_or_create_by(name: row[7].split("/")[0])
p_license = License.find_by(name: row[8])
mirror_params = {
user_id: user.id,
name: row[5],
description: row[9],
repository_name: row[4],
project_category_id: p_category.id,
project_language_id: p_language.id,
clone_addr: row[10]
}
Projects::MigrateService.call(user, mirror_params)
end
puts "sync mulan repository from gitee.com Success repo: #{row[5]} username: #{row[0]}"
rescue Exception => e
puts "sync mulan repository from gitee.com Error repo: #{row[5]} username: #{row[0]}"
end
end
end
end

View File

@ -1,48 +0,0 @@
# 执行示例 bundle exec rake sync_org_mirror_repo:init_org_gitea_uid
# RAILS_ENV=production bundle exec rake sync_org_mirror_repo:init_org_gitea_uid
#
namespace :sync_org_mirror_repo do
desc "更新组织gitea_uid"
task init_org_gitea_uid: :environment do
puts "=========begin to init organization gitea_uid=========="
need_init_orgs = Organization.where(gitea_uid: nil)
puts "=========need init count is [#{need_init_orgs.size}]=========="
need_init_orgs.find_each do |org|
puts "=== fix org name is [#{org.name}] ==="
gitea_org = Gitea::Organization::GetService.call(org)
if gitea_org[:status] == 404
org.destroy
next
end
org.update(gitea_uid: gitea_org["id"])
end
puts "========end to init organization gitea_uid==========="
end
desc "同步组织创建失败的镜像项目"
task fix_mirror_repo: :environment do
puts "========begin to fix mirror repository ========="
need_fix_repos = Repository.joins(:mirror, project: :owner)
.where.not(mirrors: {id: nil})
.where(users: {type: 'Organization'})
need_fix_repos.find_each do |repo|
next if repo.user_id == repo.project&.user_id
puts "=== fix repository owner is [#{repo&.project&.owner&.login}] ==="
puts "=== fix repository identifier is [#{repo.identifier}] ==="
Gitea::Repository::DeleteService.call(repo.project.owner, repo.identifier)
gitea_repository_params = {
clone_addr: repo.mirror_url,
repo_name: repo.identifier,
uid: repo.project.owner.gitea_uid,
private: repo.hidden,
mirror: ActiveModel::Type::Boolean.new.cast(repo.is_mirror) || false,
auth_username: repo.login,
auth_password: repo.password
}
MigrateRemoteRepositoryJob.perform_later(repo.id, repo.project&.owner&.gitea_token, gitea_repository_params)
repo.update_columns(user_id: repo.project&.user_id)
end
puts "========end to fix mirror repository ========="
end
end

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1,5 +0,0 @@
require 'rails_helper'
RSpec.describe ProjectUnit, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
end