Compare commits

...

794 Commits

Author SHA1 Message Date
jasder 2932866198 Merge branch 'master' of https://git.trustie.net/jasder/forgeplus 2021-03-22 09:50:35 +08:00
jasder 0d8ddc34cc FIX update Changelog 2021-03-22 09:50:24 +08:00
jasder 0909223867 FIX get readme api method 2021-03-21 11:24:34 +08:00
jasder c07c570061 动态导航权限控制,没有勾选模块不能进入页面,语言过滤0.0%
动态导航权限控制,没有勾选模块不能进入页面,语言过滤0.0%
2021-03-19 18:40:23 +08:00
vilet.yy 223755a965 fix: languages filter 0.0% 2021-03-19 18:36:55 +08:00
vilet.yy f1ed61c687 add: menu permission control 2021-03-19 18:01:29 +08:00
vilet.yy 553a584121 fix: migrate create unit
fix
2021-03-19 17:38:14 +08:00
jasder 04288a734e 木兰项目同步脚本以及动态导航简化 2021-03-19 15:07:07 +08:00
vilet.yy db2ba95e24 fadd: repo edit unit 2021-03-19 15:05:09 +08:00
vilet.yy 39f0811f0a fix:simple unit 2021-03-19 14:58:25 +08:00
vilet.yy 495de925dd add: sync mulan repo 2021-03-19 11:29:31 +08:00
jasder f18c56129e FIX 改版项目详情页面 2021-03-18 18:08:38 +08:00
vilet.yy 6a7ef2a1a7 add: repo contributors 2021-03-18 16:35:46 +08:00
vilet.yy 25186b4e81 fix 2021-03-18 09:55:58 +08:00
vilet.yy a627ab4d82 fix 2021-03-18 09:51:56 +08:00
vilet.yy 187ad1d263 fix 2021-03-17 13:51:08 +08:00
vilet.yy 8f98a83379 add: project unit list 2021-03-17 13:50:26 +08:00
vilet.yy a14459da50 add: project menu list 2021-03-17 11:52:36 +08:00
vilet.yy f17e436d62 add: doc 2021-03-16 11:10:58 +08:00
vilet.yy 34d95451b5 add: get project all files 2021-03-16 10:25:37 +08:00
vilet.yy b43926f69f add: new project detail 2021-03-15 19:01:35 +08:00
jasder bd46d2dcc7 fix 2021-03-11 14:59:21 +08:00
jasder 6063c7c414 fix 更新api文档 2021-03-11 14:58:44 +08:00
jasder af289d1f5e Update changelog 2021-03-05 15:52:50 +08:00
jasder 899e7ccab8 FIX CI 修复参数设置的bug 2021-03-05 15:48:08 +08:00
victor d3df04fb97 参数管理修改 2021-03-05 15:43:42 +08:00
jasder 50928f82c0 FIX valid user before register action 2021-03-05 15:36:26 +08:00
victor 33984e16d0 参数管理修改 2021-03-05 15:26:29 +08:00
jasder 8942c694c4 Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-03-05 11:38:45 +08:00
jasder d3a3c645c8 集成CI/CD参数管理功能 2021-03-05 10:48:38 +08:00
victor 3b5d971964 参数删除接口文档 2021-03-04 17:00:29 +08:00
victor 61e5b9132a 参数删除接口修改 2021-03-04 16:52:00 +08:00
victor d7bc309d49 参数管理删除 2021-03-04 09:33:04 +08:00
victor cb90dc1f51 参数管理 2021-03-03 15:36:59 +08:00
jasder 347af1a8ad Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-03-02 15:21:50 +08:00
jasder 41118f6d12 解决pull创建和更新操作的bug 2021-03-02 10:07:13 +08:00
vilet.yy ccbaa8efe5 [FIX]pull_request create and update error 2021-03-01 16:43:09 +08:00
jasder 11350bb76f Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-03-01 10:02:35 +08:00
jasder b6b3cb0825 fix bug 2021-02-26 17:51:42 +08:00
jasder fc680b5372 fix notice api 2021-02-26 14:38:32 +08:00
vilet.yy c299c9fa69 [FIX]repository setting entry error 2021-02-26 13:49:29 +08:00
vilet.yy 70922b81db [FIX]watcher type error 2021-02-25 11:52:24 +08:00
vilet.yy 93fa02bd7b [FIX]
[FIX]

[FIX]
2021-02-22 10:53:01 +08:00
vilet.yy ef0c44f29c [ADD]fix error script 2021-02-22 10:10:22 +08:00
vilet.yy 9681a1a491 [FIX]sync mirror project 2021-02-21 17:14:51 +08:00
vilet.yy f7b7122d60 [FIX]join projects add org projects and update project private bug 2021-02-21 15:20:04 +08:00
Gitea 11471b1520 [FIX]transfer need to save clone_url 2021-02-21 10:02:47 +08:00
jasder 50d81b2490 FIX schema 2021-02-09 11:49:47 +08:00
jasder 9f4c2bd673 FIX repo setting api for forbidden 2021-02-09 11:48:05 +08:00
viletyy 2b898b0d1f [FIX]remove description 2021-02-06 16:43:41 +08:00
jasder 8e4d6c7064 合并组织模块功能 2021-02-06 16:21:47 +08:00
viletyy f06a1f63dd [ADD]project transfer
[FIX]

[FIX]
2021-02-06 15:49:59 +08:00
viletyy d85075f951 [FIX]org sync gitea_uid
[FIX]
2021-02-06 15:49:56 +08:00
viletyy ec1acde99a [FIX]show teams, org name valid message 2021-02-06 15:49:56 +08:00
viletyy 55528950f1 [FIX]owner text 2021-02-06 15:49:56 +08:00
viletyy 54204d4db8 [ADD]org team search, project teams add\remove, org can create field
[FIX]
2021-02-06 15:49:55 +08:00
viletyy 4f6f257b37 [FIX]concat change to concat_ws, org render 403, normal team leave 2021-02-06 15:49:54 +08:00
viletyy 629f3fbbe1 [FIX]little vliad about team_user 2021-02-06 15:49:54 +08:00
viletyy ddaca5bafc [ADD]organization add num_teams 2021-02-06 15:49:54 +08:00
viletyy 1e70764d63 [FIX]teams add user info 2021-02-06 15:49:54 +08:00
viletyy 152e301bf3 [ADD]search is_member is_admin 2021-02-06 15:49:54 +08:00
viletyy c6269f44ee [FIX]add user organization count 2021-02-06 15:49:54 +08:00
viletyy 3d495797c0 [FIX]organization add created_at and total_count 2021-02-06 15:49:54 +08:00
viletyy ce4c71c6a0 [FIX]组织可以不上传头像 2021-02-06 15:49:54 +08:00
viletyy dab57e9af3 [FIX]一些筛选以及创建最大项目数量验证 2021-02-06 15:49:53 +08:00
viletyy fef43caf4c [ADD]组织项目相关 2021-02-06 15:49:53 +08:00
viletyy 289d1877d6 [ADD]组织、组织团队 2021-02-06 15:49:53 +08:00
viletyy 0c58447afb [FIX]组织上传头像支持多种格式、项目详情返回拥有者类型
[FIX]

[FIX]
2021-02-06 15:49:52 +08:00
viletyy 3f73484596 [FIX]一些筛选以及创建最大项目数量验证
[FIX]
2021-02-06 15:49:49 +08:00
viletyy f094fe1799 [ADD]组织项目相关 2021-02-06 14:27:47 +08:00
viletyy 1dc43a23b7 [FIX]为组织创建项目做准备 2021-02-06 14:27:47 +08:00
viletyy 31858a79e3 [FIX]成员细节修改 2021-02-06 14:27:47 +08:00
viletyy 7f309edc91 [ADD]组织、组织团队 2021-02-06 14:27:47 +08:00
viletyy c278ed1863 [FIX] 2021-02-06 14:27:47 +08:00
viletyy 2434ca9681 [ADD]组织模块相关代码 2021-02-06 14:27:47 +08:00
jasder 178991b245 平台数据统计功能
1. 新增平台数据统计相关API
2.新增平台数据统计邮件消息系统
2021-02-06 11:27:28 +08:00
viletyy c00336e7b5 [ADD]统计平台概况
[FIX]更改请求参数

[FIX]

[ADD]rank statistic

[FIX]
2021-02-06 11:15:25 +08:00
Jasder 713b249fa5 ADD requierd nodejs version for deploy document 2021-02-03 11:50:31 +08:00
Jasder 5875c625ab FIX set login column value ro ci_templates table 2021-02-02 18:08:27 +08:00
Jasder be57c75166 ADD schema for pipeline model 2021-02-02 16:42:48 +08:00
Jasder 440cedc109 Merge branch 'develop' of http://git.trustie.net/jasder/forgeplus into develop 2021-02-02 16:40:33 +08:00
jasder bbcb515e24 模板管理功能
新增功能:
1. 支持多条流水线
2. 完善CI/CD模板管理功能
2021-02-02 16:39:31 +08:00
victor b18fbd698f Merge branch 'develop' into trustie-pipeline
# Conflicts:
#	app/models/ci/pipeline.rb
2021-02-02 14:41:23 +08:00
Jasder 6053907828 fix change stoage file derictory 2021-02-02 14:32:16 +08:00
Jasder 9f7c9d6ec7 FIX CORS problem for develop 2021-02-02 14:32:13 +08:00
Jasder 9121033a10 ADD upload avatar api with support multiple image formats 2021-02-02 14:32:08 +08:00
victor 8d3838614f FIX pipeline model schma
# Conflicts:
#	app/models/ci/pipeline.rb
2021-02-02 14:32:02 +08:00
Jasder 165f8108f7 ADD api document on line 2021-02-02 14:07:46 +08:00
victor 4816ee04d3 流水线列表查询 2021-02-02 13:10:53 +08:00
victor d2209619f0 流水线增加owner选项 2021-02-02 11:48:09 +08:00
victor 155fc35cfa 获取代码库文件sha 2021-02-01 16:19:42 +08:00
victor ce31875c19 根据阶段查询模板接口 2021-02-01 15:17:03 +08:00
victor d214b1ddae 流水线初始化模板名称修改 2021-02-01 13:40:15 +08:00
victor 22d7478349 content接口返回分支 2021-02-01 10:36:30 +08:00
Jasder 458fca9992 fix change stoage file derictory 2021-01-28 15:11:47 +08:00
victor c3f69a48d6 流水线sha查询 2021-01-28 15:04:51 +08:00
victor c3136fc1a8 流水线查询接口修改 2021-01-28 14:14:22 +08:00
Jasder a93baa908f FIX CORS problem for develop 2021-01-27 17:22:16 +08:00
victor 2c648b7941 流水线创建修改 2021-01-27 16:27:56 +08:00
victor e1ddad5040 新增流水线接口修改 2021-01-27 10:22:53 +08:00
victor 24d5f16302 接口文档修改 2021-01-27 09:35:41 +08:00
victor 6c77b73ec6 创建多条流水线、模板管理 2021-01-26 17:15:53 +08:00
Jasder 3b7d425198 ADD upload avatar api with support multiple image formats 2021-01-26 14:49:02 +08:00
moshenglv 131ccc36c7 Merge branch 'master' into trustie-pipeline 2021-01-21 16:15:18 +08:00
Jasder dcda8671b3 FIX pipeline model schma 2021-01-20 17:00:19 +08:00
jasder 122667c67c Merge pull request '【devops】可视化创建流水线' (#13) from trustie-pipeline into develop
Reviewed-on: https://git.trustie.net/jasder/forgeplus/pulls/13
2021-01-20 16:01:21 +08:00
Jasder 6d51657ecf FIX get latest commit bug
(cherry picked from commit b7e23a62d0)
2021-01-20 14:30:49 +08:00
Jasder 67a7df085c ADD sync repo time print log
(cherry picked from commit f3d4f437cb)
2021-01-20 14:30:44 +08:00
Jasder 0adcbaa19f ADD repository languages percentage api
(cherry picked from commit efa99e0f06)
2021-01-20 14:30:41 +08:00
Jasder 1c59832abf FIX get assignees bug in issues
(cherry picked from commit e9223c53de)
2021-01-20 14:30:39 +08:00
Jasder 814a1d9e6a FIX deal with gitea api response body bug
(cherry picked from commit e7662b66ce)
2021-01-20 14:30:36 +08:00
Jasder 18c989bb6f Update api document
(cherry picked from commit 0f338ede7d)
2021-01-20 14:30:32 +08:00
Jasder ffeb076086 FIX pull api bug
(cherry picked from commit 36a3e36edb)
2021-01-20 14:30:29 +08:00
Jasder 06a7cb7558 FIX get readme file bug
(cherry picked from commit 30138cc1fa)
2021-01-20 14:30:26 +08:00
Jasder 6fa4ee6c14 ADD get readme api
(cherry picked from commit 232f26ea3b)
2021-01-20 14:30:24 +08:00
Jasder 4b34822fe2 FIX sidekiq cron config yml bug
(cherry picked from commit 2253dce4d7)
2021-01-20 14:30:21 +08:00
Jasder 536e78ffd6 FIX code bug
(cherry picked from commit 0e8d475de7)
2021-01-20 14:30:19 +08:00
Jasder e796776f1e FIX updage sidekiq cron
(cherry picked from commit 1e9bd451e5)
2021-01-20 14:30:16 +08:00
Jasder 10883bf05a FIX update cron
(cherry picked from commit f959b38a89)
2021-01-20 14:30:13 +08:00
Jasder 5667c0854c FIX [api] get pull bug
(cherry picked from commit fa01194d3c)
2021-01-20 14:30:10 +08:00
Jasder b6aa0fd76c FIX render json builder partil performance for pull some api
(cherry picked from commit f084b72e3a)
2021-01-20 14:30:06 +08:00
Jasder f212c5213d FIX base and head params problem for compare api
(cherry picked from commit 4c2c3d17e2)
2021-01-20 14:30:01 +08:00
Jasder d2e2793d29 FIX pull request bug
(cherry picked from commit 2b140d6f7c)
2021-01-20 14:29:52 +08:00
Jasder 20b06473be ADD gem 'sidekiq-cron'
(cherry picked from commit 8f24f65820)
2021-01-20 14:29:48 +08:00
Jasder 8c8d9f64c4 ADD sync repo updated at time
(cherry picked from commit 8c6df359a5)
2021-01-20 14:28:56 +08:00
Jasder b7e23a62d0 FIX get latest commit bug 2021-01-20 14:25:07 +08:00
moshenglv f4dc82f7d5 初始化模板脚本 2021-01-20 14:21:16 +08:00
moshenglv f2efed0f1f 初始化数据脚本 2021-01-20 14:03:08 +08:00
moshenglv ab4af170fb 连接ci数据库名修改,根据repo 2021-01-20 13:52:30 +08:00
moshenglv ab3242569d 流水线查询 2021-01-20 11:54:10 +08:00
Jasder f3d4f437cb ADD sync repo time print log 2021-01-20 09:38:11 +08:00
moshenglv 69c6e2ac3f cotent接口修改 2021-01-19 18:39:57 +08:00
moshenglv efdbc6fd4e 创建流水线文件新增接口返回内容修改 2021-01-19 18:23:28 +08:00
moshenglv 3946c7116b 创建pipeline文件接口 2021-01-19 18:11:00 +08:00
moshenglv 0d6ddad013 查询steps接口修改 2021-01-19 16:23:19 +08:00
Jasder efa99e0f06 ADD repository languages percentage api 2021-01-19 16:21:31 +08:00
moshenglv 7e9acd1850 返回流水线文件sha 2021-01-19 14:19:06 +08:00
moshenglv 1001d10017 流水线字段校验 2021-01-19 14:00:22 +08:00
moshenglv 703be3f9a1 返回流水线内容同步状态 2021-01-19 13:59:55 +08:00
moshenglv f90bc0897b 流水线关联项目 2021-01-19 11:52:29 +08:00
moshenglv 05416339e5 流水线查询返回字段修改 2021-01-19 11:10:47 +08:00
moshenglv 5e0cdba1f9 流水线与项目关联 2021-01-19 11:03:27 +08:00
Jasder 5fd5bf32d8 Merge branch 'develop' 2021-01-18 15:28:38 +08:00
Jasder e9223c53de FIX get assignees bug in issues 2021-01-18 15:28:20 +08:00
Jasder e7662b66ce FIX deal with gitea api response body bug 2021-01-18 11:22:31 +08:00
moshenglv c6aeecb33c 查询阶段返回流水线名称 2021-01-18 09:58:33 +08:00
Jasder 0f338ede7d Update api document 2021-01-18 09:51:07 +08:00
moshenglv 2d99713cd0 流水线增加用户字段 2021-01-18 09:32:23 +08:00
Jasder 36a3e36edb FIX pull api bug 2021-01-15 18:38:53 +08:00
Jasder 30138cc1fa FIX get readme file bug 2021-01-15 18:36:19 +08:00
Jasder 232f26ea3b ADD get readme api 2021-01-15 15:38:49 +08:00
moshenglv 9af0ff4a71 步骤查询接口返回模板信息修改 2021-01-15 11:05:38 +08:00
Jasder 2253dce4d7 FIX sidekiq cron config yml bug 2021-01-14 18:39:12 +08:00
Jasder 0e8d475de7 FIX code bug 2021-01-14 18:25:49 +08:00
Jasder 1e9bd451e5 FIX updage sidekiq cron 2021-01-14 18:22:01 +08:00
Jasder f959b38a89 FIX update cron 2021-01-14 17:04:58 +08:00
moshenglv ac6858a205 阶段步骤修改接口 2021-01-14 15:36:22 +08:00
moshenglv a71f0b0550 阶段步骤新增接口 2021-01-14 15:34:35 +08:00
moshenglv 4ac7634031 流水线步骤新增、更新 2021-01-14 15:32:49 +08:00
moshenglv da1a992670 流水线查询返回时间格式化 2021-01-13 15:10:24 +08:00
moshenglv cb6c4b1e3f 阶段新增、删除、查询步骤接口修改 2021-01-12 17:40:42 +08:00
Jasder fa01194d3c FIX [api] get pull bug 2021-01-12 17:34:07 +08:00
Jasder f084b72e3a FIX render json builder partil performance for pull some api 2021-01-12 15:55:11 +08:00
Jasder 4c2c3d17e2 FIX base and head params problem for compare api 2021-01-12 15:47:04 +08:00
Jasder 2b140d6f7c FIX pull request bug 2021-01-12 15:45:18 +08:00
moshenglv bcb4e78829 修改模板查询相关接口 2021-01-12 13:54:11 +08:00
moshenglv 77529319a1 可视化创建流水线后端代码 2021-01-12 10:23:26 +08:00
Jasder 8c6df359a5 ADD sync repo updated at time 2021-01-08 18:07:48 +08:00
Jasder 8f24f65820 ADD gem 'sidekiq-cron' 2021-01-08 18:03:51 +08:00
jasder 2f140d13f0 Merge pull request '用户可以查看其他用户的构建列表' (#10) from trustie_server into develop
Reviewed-on: https://git.trustie.net/jasder/forgeplus/pulls/10
2021-01-06 18:50:31 +08:00
moshenglv 9a66b48726 用户可以查看其他用户的构建列表 2021-01-06 18:47:39 +08:00
jasder 5cdfc4ba62 Merge pull request '解绑流程修改' (#9) from trustie_server into develop
Reviewed-on: https://git.trustie.net/jasder/forgeplus/pulls/9
2021-01-06 16:53:22 +08:00
moshenglv 06b8aab455 解绑时先判断是否是trustie提供服务器的场景 2021-01-06 16:45:18 +08:00
jasder 2abf1f0665 Merge pull request '【devops】trustie提供服务器后台代码' (#8) from trustie_server into develop
Reviewed-on: https://git.trustie.net/jasder/forgeplus/pulls/8
2021-01-06 15:38:29 +08:00
moshenglv cbe5b3afde 解绑时取消激活该用户的所有项目 2021-01-06 14:45:34 +08:00
Jasder 8f846ae29b FIX gitea user register service 2021-01-06 14:00:15 +08:00
moshenglv f7a5157788 使用trustie提供的服务器,需要多增加一条授权信息 2021-01-06 12:59:34 +08:00
moshenglv 910425ddb3 修改授权接口,当选择trustie服务器时,clientId使用创建drone的clientId 2021-01-05 16:40:09 +08:00
moshenglv e412b97003 修改授权接口 2021-01-05 15:04:01 +08:00
moshenglv 387a565fe3 自有服务器进行判断是否已经绑定云账号 2021-01-04 16:18:49 +08:00
moshenglv bab9174966 选trustie服务器解绑时删除drone用户 2021-01-04 14:57:28 +08:00
moshenglv 4aae60f3d8 打印调用drone创建用户接口日志 2021-01-04 09:49:42 +08:00
moshenglv 1108b298f0 绑定调用gitea接口,,错误,抛出异常 2021-01-04 09:41:04 +08:00
moshenglv 47093ffcb9 调用drone创建用户接口 2020-12-31 19:39:20 +08:00
moshenglv 3d332c75d6 连接ci数据库方法 2020-12-31 17:13:41 +08:00
moshenglv a84af1d743 根据用户选择的服务器类型创建不同的CI数据库连接 2020-12-31 17:07:10 +08:00
moshenglv 2b86c7eb95 修改turstie提供服务器,认证时调用drone url 2020-12-31 16:47:16 +08:00
Jasder 0476246585 Merge branch 'develop' 2020-12-30 15:05:24 +08:00
Jasder d62df0f087 ADD MuLan licenses 2020-12-30 15:05:07 +08:00
Jasder a80037ae8a FIX init db structrue and add records of roles 2020-12-30 15:00:15 +08:00
Jasder ad129db4e6 Merge branch 'develop' 2020-12-30 14:02:32 +08:00
Jasder fa98636eb9 FIX migrate bug 2020-12-30 14:02:21 +08:00
Jasder e127d12390 Merge branch 'develop' 2020-12-30 13:47:26 +08:00
Jasder 56965910a5 ADD column to cloud table 2020-12-30 13:47:00 +08:00
jasder 584ed2e852 NICE 2020-12-30 09:37:02 +08:00
Jasder 6b244b7b80 Merge branch 'develop' 2020-12-29 18:18:44 +08:00
Jasder 50021a278b FIX generate token bug for regitster api 2020-12-29 18:18:17 +08:00
Jasder 1420a47a5c FIX bug 2020-12-28 13:44:03 +08:00
Jasder 72d8af8d7b FIX update deploy file 2020-12-28 13:42:59 +08:00
moshenglv b5ab230a5c 删除调用drone创建用户接口 2020-12-24 10:40:42 +08:00
moshenglv 2666a95176 Merge branch 'master' of https://git.trustie.net/moshenglv/forgeplus into master 2020-12-24 10:38:16 +08:00
moshenglv a3724e80b9 增加trustie提供服务器流程。
1、增加接口trustie_bind
2、根据server_type字段判断使用哪个数据库连接
2020-12-24 10:35:38 +08:00
jasder e370c4df1b Update deploy file 2020-12-24 10:07:36 +08:00
jasder 9e5cf6c2f6 Update README.md 2020-12-24 10:00:39 +08:00
Jasder 32a52a5c7a Update model schemas 2020-12-23 15:48:07 +08:00
Jasder 01f79c81cc FIX code review for create pull request 2020-12-23 15:47:08 +08:00
Jasder ffb71512fc FIX code review for create pull request 2020-12-23 15:46:06 +08:00
moshenglv d70168d255 增加trustie提供服务器流程。
1、增加接口trustie_bind
2、根据server_type字段判断使用哪个数据库连接
2020-12-18 13:14:30 +08:00
Jasder 6cbaf410b2 FIX Grammatical errors 2020-12-10 18:05:33 +08:00
Jasder 5a25ffe101 FIX get repository protected branches bug 2020-12-08 16:48:28 +08:00
Jasder 61c8e41136 FIX log writing failed. xE6 from ASCII-8BIT to UTF-8 2020-12-07 16:04:13 +08:00
Jasder 087ad08303 Merge branch 'develop' 2020-12-07 10:29:37 +08:00
Jasder a4a315ea32 FIX bug 2020-12-07 10:29:18 +08:00
Jasder 0c98d13dbe Merge branch 'develop' 2020-12-07 10:12:49 +08:00
Jasder 07caa77f97 FIX code review 2020-12-07 10:06:08 +08:00
Jasder a357ea3ecd Merge branch 'develop' 2020-12-06 21:48:47 +08:00
Jasder 4c980b5774 FIX create protected branch params 2020-12-04 18:15:48 +08:00
Jasder 539b4a10a0 Upate README.md 2020-12-04 18:15:19 +08:00
Jasder aaf3661fd6 FIX Forces conversion str to boolean 2020-12-04 17:13:58 +08:00
Jasder 7c0c90b9bf Update api document 2020-12-04 16:31:52 +08:00
Jasder 3f60dd3f83 ADD edit protected branch api 2020-12-04 16:18:27 +08:00
Jasder b3649f03e7 ADD get protected branch api 2020-12-04 11:06:12 +08:00
Jasder 23a28cd1a9 FIX delete route regx 2020-12-03 16:06:15 +08:00
Jasder 6a8ae5234b ADD protected branch Features 2020-12-03 15:24:40 +08:00
jasder e8b5811151 test 2020-11-30 18:37:52 +08:00
jasder 6743f9c74c test 2020-11-30 18:27:21 +08:00
jasder c27ff02168 更新 'README.md' 2020-11-30 17:59:36 +08:00
jasder 1f804ceee7 更新 'README.md' 2020-11-30 17:46:06 +08:00
jasder bb93fde1f7 更新 'README.md' 2020-11-30 17:29:13 +08:00
jasder 6bc9ca50ee 更新 '.trustie-pipeline.yml' 2020-11-30 17:23:19 +08:00
jasder d6f57786ba 更新 '.trustie-pipeline.yml' 2020-11-30 17:20:03 +08:00
jasder 38873b25f7 Update '.trustie-pipeline.yml' 2020-11-30 17:19:21 +08:00
jasder ec3c64dc04 Update '.trustie-pipeline.yml' 2020-11-30 17:17:12 +08:00
jasder 0e8467987f Update '.trustie-pipeline.yml' 2020-11-30 17:12:17 +08:00
jasder 4305842a7d Update '.trustie-pipeline.yml' 2020-11-30 16:59:22 +08:00
jasder e40eeaef35 test the ci 2020-11-30 16:50:46 +08:00
jasder c4651fd578 Update '.trustie-pipeline.yml' 2020-11-30 13:47:27 +08:00
Jasder a24f0f8b45 FIX . 2020-11-30 11:50:41 +08:00
jasder e6e616a037 FIX update bunlder version 2020-11-30 11:47:48 +08:00
Jasder 5ab6d0db04 Merge branch 'master' of http://git.trustie.net/jasder/forgeplus 2020-11-30 11:39:35 +08:00
Jasder 8ee5bdbb5b Update deploy file 2020-11-30 11:39:28 +08:00
jasder 40cb8d7e68 Update ruby 2020-11-30 11:21:21 +08:00
Jasder 0089c1b8ba Update ruby version to 2.4.5
* delete ruby 2.3.7 version in Gemfile
* delete .ruby-version for local file with development
2020-11-30 10:27:49 +08:00
Jasder 44572d9b5c Merge branch 'master' of http://git.trustie.net/jasder/forgeplus 2020-11-27 18:09:34 +08:00
Jasder a74dd6605b FIX connection ci db when find repo 2020-11-27 18:09:12 +08:00
jasder c634f7dfeb Update '.trustie-pipeline.yml' 2020-11-27 17:56:33 +08:00
jasder 5cfff14cf1 Update '.trustie-pipeline.yml' 2020-11-27 17:34:52 +08:00
Jasder d3a088e5b6 Update ci yml 2020-11-27 16:50:00 +08:00
Jasder eb730e5d91 Merge branch 'master' of http://git.trustie.net/jasder/forgeplus 2020-11-27 16:46:41 +08:00
Jasder 60b74664e9 Merge branch 'develop' 2020-11-27 16:46:26 +08:00
Jasder a0cd50ffe6 Delete create pr when create or update repo file 2020-11-27 16:46:12 +08:00
jasder c865c948e7 Update '.trustie-pipeline.yml' 2020-11-27 15:46:51 +08:00
jasder 1f35d8ba53 Update '.trustie-pipeline.yml' 2020-11-27 15:22:11 +08:00
jasder dfeb053b30 Update '.trustie-pipeline.yml' 2020-11-27 14:58:45 +08:00
jasder dc8e44b553 Update '.trustie-pipeline.yml' 2020-11-27 13:48:17 +08:00
jasder c2f71c35c2 Update '.trustie-pipeline.yml' 2020-11-27 13:45:57 +08:00
jasder 7805e8d471 Update '.trustie-pipeline.yml' 2020-11-27 11:51:02 +08:00
jasder 2cf1b2b744 Update '.trustie-pipeline.yml' 2020-11-27 11:47:33 +08:00
jasder fbd189d610 Update '.trustie-pipeline.yml' 2020-11-27 11:02:58 +08:00
Jasder 8facfc96e4 FIX merge develop branch 2020-11-27 11:00:37 +08:00
Jasder ba14fce0bd ADD string to strip when crate ci cloud account 2020-11-27 10:19:11 +08:00
Jasder 1daf8591ca FIX Adjust call gitea api for security 2020-11-27 10:18:31 +08:00
Jasder a8cbe566cb FIX delete Chain job when create repo 2020-11-27 09:39:46 +08:00
Jasder 21169b4523 ADD api document 2020-11-26 15:16:23 +08:00
Jasder 0f81caefdf FIX register api for platform default forge 2020-11-26 15:15:51 +08:00
Jasder 9a27b26cef FIX local bug 2020-11-26 15:15:15 +08:00
Jasder 58a80af929 FIX bug 2020-11-24 17:56:30 +08:00
Jasder 17e182788f FIX bug 2020-11-24 17:55:12 +08:00
Jasder 225bb9f7b7 Update table structure's rake task 2020-11-24 17:00:42 +08:00
Jasder d7e0431606 Upate database.yml.example 2020-11-24 16:58:39 +08:00
Jasder 146c21648b FIX . 2020-11-24 11:33:23 +08:00
Jasder 75202b1fc3 FIX code bug 2020-11-24 11:32:03 +08:00
Jasder 5d5f0f42c0 FIX local register bug 2020-11-24 11:30:01 +08:00
Jasder 8f9e12a5e0 Update local register method 2020-11-24 11:22:32 +08:00
Jasder 69f2fd2fbb FIX code review 2020-11-23 15:52:00 +08:00
Jasder 60ac66ebe3 ADD db schema in models 2020-11-23 15:35:03 +08:00
Jasder ba1115f1f3 ADD annotate for models and migration with auto generate 2020-11-23 10:53:59 +08:00
Jasder 558abb71bb Update repository with default branch params 2020-11-19 10:30:18 +08:00
Jasder a54613752e FIX code bug when user register 2020-11-18 10:35:56 +08:00
Jasder f1e3e935af FIX check email exists for register 2020-11-18 10:25:44 +08:00
Jasder 66407eefe1 FIX only email register 2020-11-18 10:17:40 +08:00
Jasder fa6b25a22d FIX render commit bug for sub entries api 2020-11-16 16:03:41 +08:00
Jasder 7449351270 FIX sub entries api return hash object when entries is file 2020-11-16 15:34:16 +08:00
Jasder 0ca699cc49 FIX find educoder project's bug 2020-11-11 10:14:41 +08:00
Jasder b5d3f32d68 FIX code review 2020-11-10 18:18:08 +08:00
Jasder cc19783651 FIX code bug 2020-11-10 18:17:46 +08:00
jasder 3e25089066 Delete 'test_pr.rb' 2020-11-10 16:23:30 +08:00
jasder 1fa878f119 add 2020-11-10 15:40:56 +08:00
jasder 793c616a3b Update '.trustie-pipeline.yml' 2020-11-10 15:40:31 +08:00
jasder 228585c8f0 add 2020-11-10 15:20:36 +08:00
jasder 36e6f7cea0 Add '.trustie-pipeline.yml' 2020-11-10 15:19:42 +08:00
Jasder 1c386e0ab3 FIX coder review 2020-11-10 10:03:30 +08:00
Jasder 939f33a8a2 FIX sha value bug 2020-11-09 17:23:19 +08:00
Jasder 97973b95bf ADD sha column ro pull request's files compare api 2020-11-06 22:03:12 +08:00
Jasder 6b505a34cb Update README.md 2020-11-06 17:29:44 +08:00
Jasder a8c3328bd6 ADD get a commit api 2020-11-06 17:23:14 +08:00
Jasder 181bb05d4a FIX check pr can merge 2020-11-06 15:21:27 +08:00
Jasder 9438bf5cd1 FIX routes bug 2020-11-06 11:01:29 +08:00
Jasder c85ad6444d FIX code bug 2020-11-04 15:03:21 +08:00
Jasder 0fe0f8a38b ADD some fileds for pull api 2020-11-04 14:08:34 +08:00
Jasder 5d84df064a ADD some columns for pull 2020-11-04 14:07:53 +08:00
Jasder 58d8c911a8 ADD format time method 2020-11-04 11:21:51 +08:00
Jasder cfb794c94f FIX bug 2020-11-04 10:09:49 +08:00
Jasder 2347697e93 ADD some api
* api/v1/repos/{owner}/{repo}/pulls/{number}/commits
* api/v1/repos/{owner}/{repo}/pulls/{number}/files
* api/v1/repos/{owner}/{repo}/compare/{base}...{head}
2020-11-03 18:37:47 +08:00
Jasder 70f7b59349 Update search projects api 2020-10-30 17:20:06 +08:00
Jasder 1bc935ffd5 FIX code review and user cache 2020-10-30 15:47:09 +08:00
Jasder ece6cba4a4 FIX skip some action 2020-10-28 17:39:00 +08:00
Jasder b784bb97fd FIX delet some index with projects table 2020-10-23 12:25:08 +08:00
Jasder abcff440e7 ADD index for project_educodes table 2020-10-23 00:50:02 +08:00
Jasder af6c8efb2b FIX 更改 educoder用户头像链接 2020-10-23 00:16:41 +08:00
Jasder bf056a1531 FIX projects page count 2020-10-23 00:07:26 +08:00
Jasder 3f29c09b1b FIX project category order positoin 2020-10-22 22:45:05 +08:00
Jasder bfbe1fdce5 FIX bug 2020-10-22 22:16:55 +08:00
Jasder 91c9423c72 add platform column for projects api 2020-10-22 20:12:28 +08:00
Jasder 58f8d60646 FIX 版本库兼容euducoder平台数据 2020-10-22 18:00:31 +08:00
Jasder 1feb238e80 ADD educode repo api 2020-10-22 17:59:07 +08:00
Jasder 0192fa9f85 FIX bug 2020-10-21 18:14:06 +08:00
Jasder 84854e5c0c FIX code bug 2020-10-21 18:12:58 +08:00
Jasder 0c92b571c5 FIX perfect devops languages formate 2020-10-21 18:07:18 +08:00
Jasder f6937d96f4 ADD some index 2020-10-21 16:46:23 +08:00
Jasder 6cedf3b530 ADD some index to projects table 2020-10-21 15:13:30 +08:00
Jasder e0826da950 ADD index for updated_on column with projects table 2020-10-21 12:13:53 +08:00
Jasder 9477555ebd FIX merge dev_devops branch 2020-10-21 11:56:30 +08:00
Jasder a713e61437 FIX query branches bug 2020-10-21 11:55:03 +08:00
Jasder 99f67cf3a7 FIX merge 2020-10-21 11:54:22 +08:00
Jasder 495dc0d2e1 FIX query project 2020-10-21 11:53:52 +08:00
Jasder e3d9dae8fd Update projects sime api with statics 2020-10-21 11:45:55 +08:00
Jasder ca3b5f4284 ADD index for project_type column in projects table 2020-10-21 11:43:11 +08:00
Jasder f5eecdffdc ADD some columns for project_educoders table 2020-10-20 17:43:03 +08:00
Jasder 2eca095608 Merge branch 'dev_devops' into dev_sync_project_educoder 2020-10-20 16:45:04 +08:00
Jasder cb7d49506c FIX change description 'longtext' type with projects table 2020-10-20 15:19:26 +08:00
Jasder 831aea8b73 FIX bug 2020-10-20 00:10:29 +08:00
Jasder 46ccbbe699 ADD console info 2020-10-20 00:05:43 +08:00
Jasder 2f7b6c9b75 FIX bug 2020-10-19 23:41:05 +08:00
Jasder a63d675a92 FIX 同步educoder平台实训项目放入job中执行 2020-10-19 23:39:44 +08:00
Jasder 7f685e4119 FIX 完善同步educoder平台实训 2020-10-19 23:08:17 +08:00
Jasder 2eef143251 ADD 同步educoder平台实训项目 2020-10-19 22:59:41 +08:00
Jasder 1ac606a8aa FIX 去掉区块链相关的token值 2020-10-19 15:20:30 +08:00
Jasder 913f4b26a4 FIX 解决issue不能更改为 ‘关闭’状态的bug 2020-10-19 11:05:30 +08:00
Jasder 47f8197841 FIX ci connect database before fiter 2020-10-19 09:27:59 +08:00
Jasder 9332750aa7 FIX 2020-10-16 19:09:43 +08:00
Jasder 77de74fd4b FIX unbind account bug 2020-10-16 19:08:39 +08:00
Jasder 232bb054ce Merge branch 'dev_trustie' into dev_devops 2020-10-16 16:48:26 +08:00
sylor_huang@126.com 32bc3fe9f5 FIX merge 2020-10-16 16:48:11 +08:00
Jasder 1bff81bb66 Merge branch 'dev_trustie' into dev_devops 2020-10-16 16:44:44 +08:00
sylor_huang@126.com 248eadb918 Add Setting button 2020-10-16 16:43:59 +08:00
Jasder 7372911fea FIX 重构项目管理权限 2020-10-16 16:02:26 +08:00
Jasder 5156450eac ADD 更改工作流的权限 2020-10-16 11:57:20 +08:00
Jasder 6df01dead1 FIX unbind devops bug 2020-10-16 11:07:28 +08:00
Jasder 9a9540ad50 Fix forge connection ci databases bug 2020-10-16 09:50:30 +08:00
Jasder edcb9f863c FIX ci certification bug 2020-10-16 09:47:36 +08:00
Jasder e430645304 FIX ci connection database bug 2020-10-16 09:42:08 +08:00
Jasder a0c80d8d25 FIX code bug 2020-10-15 19:49:43 +08:00
Jasder d8910e3dbf FIX unbind ci cloud account bug 2020-10-15 19:46:56 +08:00
Jasder 7b0f219a82 FIX pwd bug 2020-10-15 19:40:50 +08:00
Jasder cfd285cbcd FIX delete drone database with undind cloud account 2020-10-15 17:40:39 +08:00
Jasder e0db7067ca FIX piple value 2020-10-15 17:20:09 +08:00
Jasder 6456a0f90c FIX code bug 2020-10-15 17:04:42 +08:00
Jasder 0c2c917c7f FIX 纠正drone授权流程 2020-10-15 17:00:02 +08:00
Jasder 38ca183bcd FIX code review 2020-10-15 16:04:32 +08:00
Jasder 8628891582 FIX gitea oauth grant url bug 2020-10-15 15:17:52 +08:00
Jasder 4ea033df23 FIX unbind ci user bug 2020-10-15 15:02:48 +08:00
Jasder 64a3ab24e2 FIX devops pwd auth bug 2020-10-15 14:37:24 +08:00
whystar 516b254aa3 smaller size of fig issue_assign 2020-10-14 10:35:33 +08:00
Jasder 28d6aa2dda ADD drone user oauth 2020-10-13 19:49:52 +08:00
whystar 774bcdd8b1 use high-quality figs in readme 2020-10-13 16:42:20 +08:00
whystar a9358552c0 upate readme 2020-10-13 16:29:49 +08:00
Jasder 9af3b5b757 Merge branch 'dev_trustie' into dev_devops 2020-10-09 11:40:34 +08:00
Jasder fbae5a36d0 Merge branch 'dev_trustie' into dev_devops 2020-10-05 17:41:54 +08:00
Jasder c7f141c468 Merge branch 'dev_trustie' into dev_devops 2020-10-05 17:30:21 +08:00
Jasder b8cace558b Merge branch 'dev_trustie' into dev_devops 2020-10-04 17:33:21 +08:00
Jasder 705ae1020b FIX merge dev_trustie branch 2020-10-04 12:05:53 +08:00
Jasder e2daffc826 Merge branch 'dev_trustie' into dev_devops 2020-09-29 13:51:32 +08:00
Jasder 2636923c9b FIX merge 2020-09-29 11:53:41 +08:00
Jasder 74a19bd2ce FIX code bug 2020-09-28 11:30:49 +08:00
Jasder fc6a05fe12 FIX code bug 2020-09-28 11:26:37 +08:00
Jasder 7f9674baf3 FIX bug 2020-09-27 16:35:38 +08:00
Jasder d9ed3baa02 Update readme.md 2020-09-27 15:37:02 +08:00
Jasder 3621f4ff48 ADD gitea databse config 2020-09-27 15:30:44 +08:00
Jasder a308862567 FIX 优化ci流程,并配置gitea相关database 2020-09-27 11:30:37 +08:00
Jasder 6cbb22acaf ADD open_devops_count column fro projects tables 2020-09-27 10:56:08 +08:00
Jasder f116e3347d FIX build detail render user bug 2020-09-24 11:14:16 +08:00
Jasder 7435d96eed ADD check cloud account 2020-09-23 16:22:18 +08:00
Jasder 27da6d9904 FIX ci create cloud account bug 2020-09-23 15:38:47 +08:00
Jasder 53224881ba ADD devops中限制每台服务器只能绑定一个用户 2020-09-23 11:40:13 +08:00
Jasder aa89103669 FIX connection ci database add condition 2020-09-23 11:15:14 +08:00
Jasder 135bdfd69f FIX code bug 2020-09-23 11:12:15 +08:00
Jasder 0f22110870 FIX ci author 2020-09-23 11:10:30 +08:00
Jasder 76b9031fc8 FIX bug 2020-09-23 11:06:54 +08:00
Jasder a97bbb6ddb Update ci db schema 2020-09-23 09:17:30 +08:00
Jasder a4c5db95bb FIX get user info api's bug 2020-09-22 18:12:13 +08:00
Jasder 1b1801319a FIX code bug 2020-09-22 17:40:21 +08:00
Jasder 4b3359108f FIX ci drone server cmd bug 2020-09-22 17:40:01 +08:00
Jasder 7e851fe5af FIX delete nil or empty string from sqls arrary 2020-09-22 16:22:55 +08:00
Jasder 9ebc0aa1dc ADD rails log 2020-09-22 16:15:30 +08:00
Jasder 88b2dd1208 FIX perfect ci init datbase 2020-09-22 15:50:16 +08:00
Jasder 7750ed18d7 FIX ci db init 2020-09-22 11:59:33 +08:00
Jasder a904adaaa0 FIX test ci init tables structure 2020-09-22 10:43:34 +08:00
Jasder 8f279753cc FIX code bug 2020-09-18 16:50:35 +08:00
Jasder 7789c30e5b FIX ci db bug 2020-09-18 16:44:38 +08:00
Jasder 467f278de5 ADD ci datbase config 2020-09-18 16:40:54 +08:00
Jasder 0467119605 FIX ci db bug 2020-09-18 15:46:36 +08:00
Jasder b74d43083e FIX 解决ci 数据库安全性问题 2020-09-18 15:26:14 +08:00
Jasder 12bef27260 Merge branch 'dev_trustie' into dev_devops 2020-09-11 23:24:50 +08:00
Jasder 1e823aef97 FIX ci log data with null bug 2020-09-11 17:08:40 +08:00
Jasder 5b8b74b808 ADD ci authorue column for get user info api 2020-09-11 16:35:08 +08:00
Jasder fae4907fd1 FIX set ci repo default value 2020-09-11 16:34:19 +08:00
Jasder 868ffbabac FIX ci query log with 404 bug 2020-09-11 15:05:03 +08:00
Jasder f9ec41f9bc FIX ci repo asstassion 2020-09-11 10:41:27 +08:00
Jasder 2e0d76575c FIX repo instance method's bug 2020-09-11 10:13:54 +08:00
Jasder 9568523286 FIX user bug 2020-09-11 10:00:29 +08:00
Jasder f3d6244fee FIX ci certification bug 2020-09-11 09:55:21 +08:00
Jasder ad43c6975b ADD 解决ci端用户授权后,项目同步失败的问题 2020-09-10 18:00:37 +08:00
Jasder 6419453fca FIX ci code review 2020-09-10 16:01:24 +08:00
Jasder 9b1f95bf08 ADD builds authorization 2020-09-10 11:52:54 +08:00
Jasder 217dfc03b2 ADD ci namespace modle associations 2020-09-10 10:53:12 +08:00
Jasder d802b8aba4 Merge branch 'dev_trustie' into dev_devops 2020-09-09 10:35:11 +08:00
Jasder be6ff6a043 FIX update query ci user and ci repo method 2020-09-09 09:57:44 +08:00
Jasder 0edac45e82 FIX 解决自动触发构建失败的问题 2020-09-09 09:17:11 +08:00
Jasder 5dfc6504a0 ADD sync ci user repos api 2020-09-08 15:29:38 +08:00
Jasder 3290609bbc FIX request devops languages api authoure 2020-09-08 15:29:19 +08:00
Jasder e877c2cde6 FIX code review 2020-09-07 16:25:06 +08:00
Jasder 2b470eed50 Delete some log info 2020-09-07 16:05:03 +08:00
Jasder 4a20caed0e FIX gitea webhook bug 2020-09-07 15:11:43 +08:00
Jasder 6985699989 Upage ci certifacate 2020-09-07 14:44:26 +08:00
Jasder c875451ac1 Merge branch 'dev_trustie' into dev_devops 2020-09-07 13:50:46 +08:00
Jasder a8821de85f Update gitea hooks api 2020-09-07 11:23:09 +08:00
Jasder 5cc5404915 FIX . 2020-09-04 18:20:50 +08:00
Jasder 401efd7c9b FIX code bug 2020-09-04 18:16:38 +08:00
Jasder 9613f4c485 FIX test gitea create webhook 2020-09-04 17:51:39 +08:00
Jasder e77475e26a ADD ci cloud account authenticate url 2020-09-04 17:35:29 +08:00
Jasder 81ec264483 Update destroy ci_user attassion 2020-09-04 17:26:37 +08:00
Jasder 0777db4ab4 FIX 2020-09-04 17:11:02 +08:00
Jasder 5c2bb71e57 FIX ci activate repo's bug 2020-09-04 16:57:23 +08:00
Jasder e0dac72114 FIX ci repos dependent destroy bug 2020-09-04 16:45:38 +08:00
Jasder 48350dc6f2 FIX delete webhook for bind ci service 2020-09-04 16:26:00 +08:00
Jasder 930f8195b7 FIX project search wrong 2020-09-04 16:24:20 +08:00
Jasder 15c92597a9 FIX code bug 2020-09-04 16:21:06 +08:00
Jasder f7d83acafe ADD webhook manager 2020-09-04 16:17:18 +08:00
Jasder eb2f1f46e0 ADD create gitea webhook api 2020-09-04 15:46:07 +08:00
Jasder 8c908a35ac FIX bug 2020-09-04 10:28:41 +08:00
Jasder 32ec60bbe3 FIX 完善ci服务的解绑流程 2020-09-04 10:17:44 +08:00
Jasder 74b2a5b021 FIX rename ucloud view dir 2020-09-03 17:10:23 +08:00
Jasder b31a11302c FIX devops admin bug 2020-09-03 17:05:38 +08:00
Jasder 562d0b7b07 ADD 个人中心添加devops管理功能 2020-09-03 15:52:54 +08:00
Jasder 731c06185b Merge branch 'dev_trustie' into dev_devops 2020-09-03 15:34:05 +08:00
Jasder 57ee5c5397 Merge branch 'dev_trustie' into dev_devops 2020-09-01 15:23:37 +08:00
Jasder d674fad604 Update readme.md 2020-09-01 15:16:00 +08:00
Jasder 003db1405d Merge branch 'dev_trustie' into dev_devops 2020-08-29 12:07:37 +08:00
Jasder 26f03badbc FIX change routes 2020-08-29 10:35:22 +08:00
Jasder 1290b3446f FIX update_column bug 2020-08-28 11:50:14 +08:00
Jasder 903103ec5d FIX ci active repo bug 2020-08-28 11:40:29 +08:00
Jasder b9a57be67d FIX code bug 2020-08-28 10:56:04 +08:00
Jasder f47eae3aeb FIX app/views/projects/ci_authorize.json.jbuilder 2020-08-28 10:46:23 +08:00
Jasder 27b6a251af FIX . 2020-08-28 10:43:32 +08:00
Jasder 30ff51f93b FIX devops author url 2020-08-28 10:38:39 +08:00
Jasder b75896821f FIX 优化ci初始化流程 2020-08-28 10:25:08 +08:00
Jasder b26c2f273f FIX build time bug 2020-08-27 16:01:10 +08:00
Jasder 0461c2735b Merge branch 'dev_trustie' into dev_devops 2020-08-27 15:10:25 +08:00
Jasder f09a9bdedc Merge branch 'dev_trustie' into dev_devops 2020-08-27 15:05:24 +08:00
Jasder 43a8576089 Merge branch 'dev_trustie' into dev_devops 2020-08-27 14:44:26 +08:00
Jasder 016971287c ADD open_devops for repositores show api 2020-08-27 11:50:17 +08:00
Jasder 82c4f4f38a ADD build error status 2020-08-27 11:39:11 +08:00
Jasder 2866c060c7 FIx code review 2020-08-26 16:24:51 +08:00
Jasder 518e966a87 FIX update trustie-pileline 2020-08-26 16:23:59 +08:00
Jasder 8c9c085259 ADD cloud account id 2020-08-26 15:14:00 +08:00
Jasder 72cacb72a6 FIX devops author api 2020-08-26 15:02:02 +08:00
Jasder 1e99e87228 FIX delete 'docker rm -f' command 2020-08-26 14:34:32 +08:00
Jasder 21fa22ed21 FIX 2020-08-26 12:02:51 +08:00
Jasder fc7b714d4c FIX delete project_id with create cloud_account 2020-08-26 11:57:47 +08:00
Jasder aac6df8790 FIX time count bug 2020-08-26 10:46:54 +08:00
Jasder 7e9d5a9acb FIX code bug 2020-08-26 10:45:21 +08:00
Jasder d16713e611 FIX buid time bug 2020-08-26 10:43:47 +08:00
Jasder 087f81a6aa ADD duration time for stage and step 2020-08-25 17:59:32 +08:00
Jasder c54723a6c6 FIX step bug 2020-08-25 17:14:55 +08:00
Jasder 21192d70b6 FIX stage bug 2020-08-25 17:09:44 +08:00
Jasder 5375c3ec71 ADD build status with killed 2020-08-25 17:01:03 +08:00
Jasder 66efdcc1b6 FIX build's number params 2020-08-25 16:39:31 +08:00
Jasder ec7becc26e FIX user search cloud account's bug 2020-08-25 16:34:13 +08:00
Jasder 1617a541fe FIX code review 2020-08-25 15:59:53 +08:00
Jasder 3e25a7b28c FIX code review 2020-08-25 15:49:47 +08:00
Jasder 41f876a714 FIX build finished time bug 2020-08-25 15:48:41 +08:00
Jasder 1ea9e420be ADD paginate for builds api 2020-08-25 15:43:30 +08:00
Jasder 4932eae285 ADD branch and sha for builds api 2020-08-25 14:25:42 +08:00
Jasder 405e5b5d3d FIX bug 2020-08-25 11:05:46 +08:00
sylor_huang@126.com e23ce05b1b Fixed: Issues2 2020-08-24 15:09:16 +08:00
sylor_huang@126.com 200cb70f4b Fixed: Issues 2020-08-24 15:06:05 +08:00
sylor_huang@126.com 46801284aa Test Project Validate Failed15 2020-08-24 14:28:30 +08:00
sylor_huang@126.com 7e7ab71231 Test Project Validate Failed14 2020-08-24 14:20:48 +08:00
sylor_huang@126.com 79bc2655b7 Test Project Validate Failed13 2020-08-24 14:19:32 +08:00
sylor_huang@126.com 5a065d83b7 Test Project Validate Failed12 2020-08-24 14:17:23 +08:00
sylor_huang@126.com 3586952a89 Test Project Validate Failed1 2020-08-24 14:16:11 +08:00
sylor_huang@126.com 72feacecbb Test Project Validate Failed 2020-08-24 14:12:59 +08:00
Jasder 8abf748778 FIX bug 2020-08-21 16:25:13 +08:00
Jasder 8758ec3197 Update trustie pipeline api 2020-08-21 16:06:47 +08:00
Jasder c1e6792f29 FIX cloud account bug 2020-08-21 15:26:42 +08:00
Jasder ae9d857d7f FIX ci server 2020-08-21 14:53:48 +08:00
Jasder e7a0bc7e0f FIX code bug 2020-08-21 10:46:37 +08:00
Jasder 137e780db4 FIX . 2020-08-21 10:15:26 +08:00
Jasder 3aa0cb70fe Merge branch 'dev_devops' of http://git.trustie.net/jasder/forgeplus into dev_devops 2020-08-20 18:38:05 +08:00
Jasder 7c1ab2cddf FIX 重构ci流程 2020-08-20 18:37:53 +08:00
sylor_huang@126.com 957df36fb1 Merge branch 'dev_trustie' into dev_devops 2020-08-20 18:04:53 +08:00
Jasder 89b2e263ae FIX devops builds api bug 2020-08-19 18:19:27 +08:00
Jasder ac2d2b842d Merge branch 'dev_trustie' into dev_devops 2020-08-19 17:13:48 +08:00
Jasder 1159a47b3e Update readme 2020-08-19 15:51:53 +08:00
Jasder 70e6c1395d FIX readme 2020-08-18 16:42:17 +08:00
Jasder 9b25b7a9e6 FIX ci drone server database 2020-08-18 16:40:39 +08:00
Jasder 5ac6133aef FIX ci drone server connect database 2020-08-18 09:23:23 +08:00
Jasder 3a18772de0 Merge branch 'dev_trustie' into dev_devops 2020-08-18 09:07:59 +08:00
Jasder a9012b4c53 Merge branch 'dev_trustie' into dev_devops 2020-08-17 18:08:41 +08:00
Jasder 90693d4745 Merge branch 'dev_trustie' into dev_devops 2020-08-17 17:48:07 +08:00
Jasder ad229081f0 Merge branch 'dev_trustie' into dev_devops 2020-08-17 17:41:39 +08:00
Jasder a4d8338cb5 ADD ci database port 2020-08-17 14:29:09 +08:00
Jasder af220cfffc FIX config drone database 2020-08-17 14:22:26 +08:00
Jasder 7bb43700b4 ADD namespace ci for model 2020-08-17 11:22:53 +08:00
Jasder 7b8bb996a6 Merge branch 'dev_trustie' into dev_devops 2020-08-17 11:14:35 +08:00
Jasder 480cfb66b1 Merge branch 'dev_devops' of http://git.trustie.net/jasder/forgeplus into dev_devops 2020-08-15 19:57:35 +08:00
Jasder b233586779 FIX merge 2020-08-15 19:57:20 +08:00
sylor_huang@126.com 8fd167b578 Merge branch 'dev_trustie' into dev_devops 2020-08-15 15:04:24 +08:00
sylor_huang@126.com 09802819b8 Merge branch 'dev_trustie' into dev_devops 2020-08-15 14:50:12 +08:00
sylor_huang@126.com 2979eaaeb4 Merge branch 'dev_trustie' into dev_devops 2020-08-15 14:48:42 +08:00
sylor_huang@126.com bc8240b772 Merge branch 'dev_trustie' into dev_devops 2020-08-15 14:35:52 +08:00
sylor_huang@126.com 372687e509 Merge branch 'dev_trustie' into dev_devops 2020-08-15 13:49:52 +08:00
sylor_huang@126.com a7b096d00e Merge branch 'dev_trustie' into dev_devops 2020-08-15 13:36:03 +08:00
sylor_huang@126.com 2267872076 Chnage 2020-08-15 13:30:44 +08:00
sylor_huang@126.com 929b56629c Change 2020-08-15 13:28:22 +08:00
sylor_huang@126.com 2154892a0b Merge branch 'dev_trustie' into dev_devops 2020-08-15 13:27:32 +08:00
sylor_huang@126.com 0af359ec0c Change 2020-08-15 13:21:33 +08:00
sylor_huang@126.com a0d287b1df Change 2020-08-15 12:50:04 +08:00
sylor_huang@126.com 466bdedfcd Change 2020-08-15 12:40:31 +08:00
sylor_huang@126.com e1c49c0ba8 Change 2020-08-15 12:38:25 +08:00
sylor_huang@126.com aa0f7ff873 Change 2020-08-15 12:37:26 +08:00
Jasder fb733722d6 Merge branch 'dev_change_route' into dev_devops 2020-08-15 11:06:04 +08:00
Jasder ef285f54c6 Merge branch 'dev_change_route' into dev_devops 2020-08-15 10:59:42 +08:00
Jasder 90f14d2051 FIX projects fork users bug 2020-08-15 10:58:56 +08:00
Jasder bd9f32cfaa Merge branch 'dev_change_route' into dev_devops 2020-08-15 10:26:47 +08:00
Jasder dac91f9a0c Merge branch 'dev_change_route' into dev_devops 2020-08-14 23:25:10 +08:00
Jasder 0c64b36fab FIX merge 2020-08-14 22:17:09 +08:00
Jasder 775c27a45b FIX login bug 2020-08-14 22:14:59 +08:00
Jasder 10adc42257 Merge branch 'dev_change_route' into dev_devops 2020-08-14 22:05:35 +08:00
Jasder 58d0044764 Merge branch 'dev_change_route' into dev_devops 2020-08-14 22:00:52 +08:00
Jasder 652654e606 Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:57:10 +08:00
Jasder f7db9c0892 Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:53:25 +08:00
Jasder 07edd5f8b4 Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:49:47 +08:00
Jasder 94bf6f99cc Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:43:53 +08:00
Jasder 840e048d77 Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:32:09 +08:00
Jasder 9317e21dd5 Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:17:50 +08:00
Jasder 39424ec8da Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:09:12 +08:00
Jasder b2a6630e15 Merge branch 'dev_change_route' into dev_devops 2020-08-14 19:47:19 +08:00
Jasder 06d0065173 Merge branch 'dev_change_route' into dev_devops 2020-08-14 18:40:32 +08:00
Jasder 63148c339c Merge branch 'dev_change_route' into dev_devops 2020-08-14 18:21:04 +08:00
Jasder cf43a64ada FIX rewrite devops with ci 2020-08-13 23:38:32 +08:00
Jasder 8e7c25b5ed FIX code bug 2020-08-13 21:11:33 +08:00
Jasder 7a2d7f50fd Merge branch 'dev_change_route' into dev_devops 2020-08-13 20:49:33 +08:00
Jasder 78b091ddd3 FIX merge bug 2020-08-13 09:44:38 +08:00
Jasder 69ea60dfd5 FIX update devops process 2020-08-06 14:26:19 +08:00
Jasder 0b9a69ec56 ADD sha for get trsitie-pileline.yml file api 2020-07-24 15:35:43 +08:00
Jasder 3f92d99136 Merge branch 'dev_trustie' into dev_devops 2020-07-23 09:32:35 +08:00
sylor_huang@126.com 9694074b01 Fix trustie projects projectscore 2020-07-22 16:48:31 +08:00
sylor_huang@126.com c45b8184c6 Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-22 16:43:09 +08:00
sylor_huang@126.com 5d7458bede Add trustie projects projectscore 2020-07-22 16:42:55 +08:00
Jasder b7b3751d43 ADD devops authorize 2020-07-22 15:16:01 +08:00
Jasder 3c7b257462 FIX devops 所有仓库相关的请求参数repo_id 改为project_id 2020-07-22 14:28:54 +08:00
Jasder 3d99dee31b Update devops redirect_url 2020-07-22 11:44:42 +08:00
Jasder 8b5c3797e9 FIX devops ucloud account 2020-07-22 11:27:30 +08:00
Jasder 1c2264f721 ADD get .trustie-pipeline.yml file api with devops 2020-07-22 11:18:02 +08:00
Jasder a22bd280bc Update api document 2020-07-21 17:34:47 +08:00
Jasder 07dfc06c9f FIX code review 2020-07-21 17:27:57 +08:00
Jasder 77b55daf04 Update README.md 2020-07-21 17:24:30 +08:00
Jasder cf244390ef FIX git drone logs api params's bug 2020-07-21 17:13:15 +08:00
Jasder 794f281787 FIX bug 2020-07-21 17:11:28 +08:00
Jasder 0f92aa7981 FIX test devops 2020-07-21 17:08:07 +08:00
Jasder 20d8f21ebb FIX bug 2020-07-21 15:19:43 +08:00
Jasder 236782eca8 FIX drone server command's bug 2020-07-21 15:07:42 +08:00
Jasder 5d34ac68d5 FIX create oauth bug 2020-07-21 14:17:19 +08:00
Jasder 15fc5de3de FIX 测试giteawebhook 2020-07-21 12:35:26 +08:00
Jasder 5fcb4a5500 FIX drone sever request params 2020-07-20 16:52:26 +08:00
Jasder 1f54e02ace ADD devops .trustie-pipeline.ym file 2020-07-20 16:12:37 +08:00
Jasder 9cc2e80e98 FIX bug 2020-07-20 15:47:58 +08:00
Jasder 2633e65a6c Update README.md 2020-07-20 15:39:12 +08:00
Jasder 3b26434c78 Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-20 15:38:20 +08:00
Jasder e414960153 Update drone request server 2020-07-20 15:38:12 +08:00
sylor_huang@126.com 0fddf09e47 Merge branch 'dev_trustie' into dev_devops 2020-07-20 11:40:05 +08:00
sylor_huang@126.com b89598d452 Merge branch 'dev_trustie' into dev_devops 2020-07-20 09:58:21 +08:00
sylor_huang@126.com b07f84a3a0 Merge branch 'dev_trustie' into dev_devops 2020-07-20 09:53:12 +08:00
sylor_huang@126.com 1f86ad6349 Merge branch 'dev_trustie' into dev_devops 2020-07-20 09:45:53 +08:00
sylor_huang@126.com b47f38137b Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-17 18:30:09 +08:00
sylor_huang@126.com 8a7464cf6c change 2020-07-17 18:29:56 +08:00
Jasder 97b5193e2b Merge branch 'dev_trustie' into dev_devops 2020-07-17 18:18:31 +08:00
sylor_huang@126.com 26e1592d93 Merge branch 'dev_trustie' into dev_devops 2020-07-17 17:55:00 +08:00
sylor_huang@126.com 1223a8c2a1 Merge branch 'dev_trustie' into dev_devops 2020-07-17 17:04:27 +08:00
sylor_huang@126.com 0fd97e31a5 Merge branch 'dev_trustie' into dev_devops 2020-07-17 16:58:13 +08:00
sylor_huang@126.com 69d319ef3b Merge branch 'dev_trustie' into dev_devops 2020-07-17 16:18:51 +08:00
sylor_huang@126.com b73dc77a4b Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-17 16:16:44 +08:00
sylor_huang@126.com d4220efc00 Merge branch 'dev_trustie' into dev_devops 2020-07-17 16:16:23 +08:00
Jasder 69425d6d0a FIX . 2020-07-17 16:02:54 +08:00
sylor_huang@126.com bb9c79537d Merge branch 'dev_trustie' into dev_devops 2020-07-17 15:59:06 +08:00
Jasder 2defd123b3 Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-17 15:38:28 +08:00
Jasder e9af85cd16 Merge branch 'dev_trustie' into dev_devops 2020-07-17 15:38:10 +08:00
sylor_huang@126.com bc10e0cfe5 Merge branch 'dev_trustie' into dev_devops 2020-07-17 15:37:58 +08:00
sylor_huang@126.com 46e8920f25 Merge branch 'dev_trustie' into dev_devops 2020-07-17 15:31:34 +08:00
sylor_huang@126.com 5439078427 Merge branch 'dev_trustie' into dev_devops 2020-07-17 14:33:41 +08:00
sylor_huang@126.com 6b725acbff Merge branch 'dev_trustie' into dev_devops 2020-07-17 14:24:48 +08:00
sylor_huang@126.com 4ab24c581b Merge branch 'dev_trustie' into dev_devops 2020-07-17 11:55:04 +08:00
sylor_huang@126.com 11ff3b8b12 Merge branch 'dev_trustie' into dev_devops 2020-07-17 11:28:04 +08:00
sylor_huang@126.com 6357bf91cd change versions_count and check mirrors 2020-07-17 11:25:13 +08:00
sylor_huang@126.com 4be353e239 Merge branch 'dev_trustie' into dev_devops 2020-07-16 14:26:00 +08:00
sylor_huang@126.com a10a3768c9 Merge branch 'dev_trustie' into dev_devops 2020-07-16 13:55:48 +08:00
sylor_huang@126.com 780480bc0b Merge branch 'dev_trustie' into dev_devops 2020-07-16 12:01:15 +08:00
sylor_huang@126.com 5100c352fe Merge branch 'dev_trustie' into dev_devops 2020-07-16 11:57:39 +08:00
sylor_huang@126.com f4a54dbb38 Merge branch 'dev_trustie' into dev_devops 2020-07-16 11:02:10 +08:00
sylor_huang@126.com 0c624f3503 Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-15 23:48:52 +08:00
sylor_huang@126.com 02a16748ec Merge branch 'dev_trustie' into dev_devops 2020-07-15 23:48:39 +08:00
Jasder 98469f3e0a FIX merge 2020-07-15 23:32:35 +08:00
Jasder cdbca5c845 FIX merge 2020-07-15 23:31:48 +08:00
sylor_huang@126.com 1e96ecd440 chang 2020-07-15 23:28:24 +08:00
sylor_huang@126.com d08ebb3012 change 2020-07-15 22:56:36 +08:00
sylor_huang@126.com b077d0c361 change 2020-07-15 22:38:58 +08:00
sylor_huang@126.com 2ed819af39 Merge branch 'dev_trustie' into dev_devops 2020-07-15 22:02:47 +08:00
sylor_huang@126.com 289f4495b6 chang issues 2020-07-15 22:01:12 +08:00
sylor_huang@126.com 4411f469b0 Merge branch 'dev_trustie' into dev_devops 2020-07-15 21:31:18 +08:00
sylor_huang@126.com fb54d57561 change 2020-07-15 21:29:59 +08:00
sylor_huang@126.com 02e6ecae9e Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-15 21:17:44 +08:00
sylor_huang@126.com c2f702eacd add users 2020-07-15 21:17:30 +08:00
Jasder 7098692f08 Merge branch 'dev_trustie' into dev_devops 2020-07-15 20:35:15 +08:00
Jasder 00c0fa0eb4 Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-15 20:34:38 +08:00
Jasder 8d5a373c6b Update readme.md ducument 2020-07-15 20:34:25 +08:00
Jasder 006ff7fd62 ADD devops builds's api 2020-07-15 20:34:01 +08:00
sylor_huang@126.com 4f0b10a3da Merge branch 'dev_trustie' into dev_devops 2020-07-15 20:31:39 +08:00
sylor_huang@126.com f2df2e84cc Merge branch 'dev_trustie' into dev_devops 2020-07-15 18:33:36 +08:00
sylor_huang@126.com a7f80a5dde Merge branch 'dev_trustie' into dev_devops 2020-07-15 18:28:16 +08:00
sylor_huang@126.com d8ace90037 Merge branch 'dev_trustie' into dev_devops 2020-07-15 18:17:45 +08:00
sylor_huang@126.com 90d5fb7276 Merge branch 'dev_trustie' into dev_devops 2020-07-15 18:04:29 +08:00
sylor_huang@126.com bc82451fcc Change 2020-07-15 18:02:43 +08:00
sylor_huang@126.com df0fcdb5ce Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-15 17:35:21 +08:00
sylor_huang@126.com d2ef7ec5e4 Merge branch 'dev_trustie' into dev_devops 2020-07-15 17:34:55 +08:00
Jasder 8f96341679 FIX merge dev_trustie conflict 2020-07-15 17:16:41 +08:00
Jasder b9abd6a152 FIX 插销掉dev_chain分支的合并 2020-07-15 17:13:16 +08:00
Jasder c181abce81 FIX 完善devops流程 2020-07-15 16:53:38 +08:00
sylor_huang@126.com 57fb06a1b3 Merge branch 'dev_trustie' into dev_devops 2020-07-15 16:25:54 +08:00
sylor_huang@126.com 86fc1efb67 Merge branch 'dev_chain' into dev_devops 2020-07-15 16:06:31 +08:00
sylor_huang@126.com f71e65f600 change bugs 2020-07-15 16:06:06 +08:00
sylor_huang@126.com 2db35b6d40 Merge branch 'dev_chain' into dev_devops 2020-07-15 16:00:58 +08:00
sylor_huang@126.com bacfc5299b Merge branch 'dev_trustie' into dev_chain 2020-07-15 15:43:28 +08:00
Jasder 123e8d7659 FIX ucloud account bug 2020-07-15 10:22:41 +08:00
Jasder f358361b89 FIX bug 2020-07-15 09:59:12 +08:00
Jasder e0ae7b2aec Merge branch 'dev_trustie' into dev_devops 2020-07-15 09:44:55 +08:00
Jasder da0e45a3c6 ADD devops 2020-07-15 09:43:30 +08:00
sylor_huang@126.com 14628af4a5 Merge branch 'dev_trustie' into dev_chain 2020-07-14 22:45:27 +08:00
sylor_huang@126.com d09e0fd5fa Change bugs 2020-07-14 22:07:10 +08:00
sylor_huang@126.com eedaba9bed change 2020-07-14 20:19:16 +08:00
sylor_huang@126.com b8e1e7540a Merge branch 'dev_trustie' into dev_chain 2020-07-14 19:28:05 +08:00
Jasder 4518a3ea87 FIX simple api with open_devops columen 2020-07-14 15:34:01 +08:00
Jasder 4d9b8738d8 ADD a column 2020-07-14 15:33:32 +08:00
Jasder 2b6fe8f9a8 FIX merge 2020-07-14 15:15:50 +08:00
Jasder 6527603e24 FIX 完善devops流程 2020-07-14 15:06:09 +08:00
sylor_huang@126.com 944e5de8c6 Merge branch 'dev_trustie' into dev_chain 2020-07-14 14:25:26 +08:00
sylor_huang@126.com afd49eabdc Merge branch 'dev_trustie' into dev_chain 2020-07-14 14:15:49 +08:00
sylor_huang@126.com b0e6646c8e Merge branch 'dev_trustie' into dev_chain 2020-07-14 13:57:02 +08:00
sylor_huang@126.com dd2c70fcee Merge branch 'dev_trustie' into dev_chain 2020-07-14 13:46:28 +08:00
sylor_huang@126.com 0eb1abf850 Merge branch 'dev_trustie' into dev_chain 2020-07-14 11:27:59 +08:00
sylor_huang@126.com eb46496fb1 Merge branch 'dev_trustie' into dev_chain 2020-07-13 21:01:33 +08:00
sylor_huang@126.com d12fc65da5 chang 2020-07-13 20:58:48 +08:00
sylor_huang@126.com 4417f8c070 Merge branch 'dev_trustie' into dev_chain 2020-07-13 13:54:48 +08:00
sylor_huang@126.com 224b7c7cd4 Merge branch 'dev_trustie' into dev_chain 2020-07-13 11:49:25 +08:00
sylor_huang@126.com 86c63e39a0 Merge branch 'dev_trustie' into dev_chain 2020-07-13 11:08:37 +08:00
sylor_huang@126.com 27ee469d24 Merge branch 'dev_trustie' into dev_chain 2020-07-13 10:58:53 +08:00
sylor_huang@126.com 0180ec93bf Merge branch 'dev_trustie' into dev_chain 2020-07-13 10:09:05 +08:00
sylor_huang@126.com 2ccf667f20 change bugs 2020-07-13 10:08:20 +08:00
sylor_huang@126.com 2632cbb010 Merge branch 'dev_trustie' into dev_chain 2020-07-13 09:50:52 +08:00
sylor_huang@126.com 2941652375 Merge branch 'dev_trustie' into dev_chain 2020-07-10 21:13:44 +08:00
sylor_huang@126.com 94cd6202a9 Merge branch 'dev_trustie' into dev_chain 2020-07-10 21:09:25 +08:00
sylor_huang@126.com 3fe0c4752f Merge branch 'dev_trustie' into dev_chain 2020-07-10 20:43:12 +08:00
sylor_huang@126.com 9a1db03dca Merge branch 'dev_trustie' into dev_chain 2020-07-10 20:20:43 +08:00
sylor_huang@126.com ab2fe592ec Merge branch 'dev_trustie' into dev_chain 2020-07-10 20:10:48 +08:00
sylor_huang@126.com bb97f33732 Merge branch 'dev_trustie' into dev_chain 2020-07-10 20:04:03 +08:00
sylor_huang@126.com bfb437ae3e Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:56:24 +08:00
sylor_huang@126.com 3c66b92e90 Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:50:20 +08:00
sylor_huang@126.com 9e310f992e Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:44:21 +08:00
sylor_huang@126.com ce11dbba2e Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:37:54 +08:00
sylor_huang@126.com 6db500c0a6 Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:25:39 +08:00
sylor_huang@126.com 569a68e199 Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:20:57 +08:00
sylor_huang@126.com ed80de25f3 Merge branch 'dev_trustie' into dev_chain 2020-07-10 18:44:25 +08:00
sylor_huang@126.com 2e2b4a9469 Merge branch 'dev_trustie' into dev_chain 2020-07-10 18:12:28 +08:00
sylor_huang@126.com 4b8563db5d Merge branch 'dev_trustie' into dev_chain 2020-07-10 18:03:29 +08:00
sylor_huang@126.com b936e0a3e8 Merge branch 'dev_trustie' into dev_chain 2020-07-10 17:47:30 +08:00
sylor_huang@126.com ee95464033 Merge branch 'dev_trustie' into dev_chain 2020-07-10 17:36:36 +08:00
sylor_huang@126.com 7415fa2b3c Merge branch 'dev_trustie' into dev_chain 2020-07-10 17:20:44 +08:00
sylor_huang@126.com f4e1414f2a Merge branch 'dev_trustie' into dev_chain 2020-07-10 17:05:16 +08:00
sylor_huang@126.com 3746db7fde Merge branch 'dev_trustie' into dev_chain 2020-07-10 17:00:17 +08:00
sylor_huang@126.com 06e914f398 Merge branch 'dev_trustie' into dev_chain 2020-07-10 16:51:51 +08:00
sylor_huang@126.com 7d76c6c85f Merge branch 'dev_trustie' into dev_chain 2020-07-10 16:32:33 +08:00
sylor_huang@126.com 1c482761cf Merge branch 'dev_trustie' into dev_chain 2020-07-10 16:25:27 +08:00
sylor_huang@126.com 4893edd6c1 Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:56:16 +08:00
sylor_huang@126.com 61d8753b89 Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:45:12 +08:00
sylor_huang@126.com 47c18cb218 Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:36:13 +08:00
sylor_huang@126.com ad14aa758e Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:24:40 +08:00
sylor_huang@126.com 90aa97c444 Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:12:19 +08:00
sylor_huang@126.com 4fdb2c2221 Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:11:00 +08:00
sylor_huang@126.com 93b2872ad9 Merge branch 'dev_trustie' into dev_chain 2020-07-10 14:53:46 +08:00
sylor_huang@126.com 0323166499 Merge branch 'dev_trustie' into dev_chain 2020-07-10 14:45:10 +08:00
sylor_huang@126.com 962a92eeca Merge branch 'dev_trustie' into dev_chain 2020-07-10 14:24:43 +08:00
sylor_huang@126.com 50b79ee3cf Merge branch 'dev_trustie' into dev_chain 2020-07-10 14:10:06 +08:00
Jasder e74bba9092 ADD test devops 2020-07-10 14:08:16 +08:00
sylor_huang@126.com 05615500e6 change bugs 2020-07-10 14:06:26 +08:00
sylor_huang@126.com 66beab3457 s 2020-07-10 11:54:30 +08:00
sylor_huang@126.com a20cb9eb5b Merge branch 'dev_trustie' into dev_chain 2020-07-10 11:53:49 +08:00
sylor_huang@126.com 0db202585b change bugs 2020-07-10 11:15:04 +08:00
sylor_huang@126.com 8860a584ca change bugs 2020-07-10 11:13:27 +08:00
sylor_huang@126.com 28f777f5eb Merge branch 'dev_trustie' into dev_chain 2020-07-10 10:58:58 +08:00
sylor_huang@126.com 066a720525 Merge branch 'dev_trustie' into dev_chain 2020-07-10 10:53:15 +08:00
sylor_huang@126.com a6a65eb4c8 Merge branch 'dev_trustie' into dev_chain 2020-07-10 10:21:02 +08:00
sylor_huang@126.com 2664be17f9 Merge branch 'dev_trustie' into dev_chain 2020-07-10 10:10:36 +08:00
sylor_huang@126.com cd32b7e300 Merge branch 'dev_trustie' into dev_chain 2020-07-10 09:53:33 +08:00
sylor_huang@126.com ac2b8c9f65 Merge branch 'dev_trustie' into dev_chain 2020-07-09 20:58:11 +08:00
sylor_huang@126.com dcbbf66e61 Merge branch 'dev_trustie' into dev_chain 2020-07-09 20:40:59 +08:00
sylor_huang@126.com c6c7f0968b change bugs 2020-07-09 20:37:43 +08:00
sylor_huang@126.com 97844c47d7 Merge branch 'dev_trustie' into dev_chain 2020-07-09 20:36:49 +08:00
sylor_huang@126.com 265562a260 change bugs 2020-07-09 20:33:18 +08:00
sylor_huang@126.com 7724c1bcce Merge branch 'dev_trustie' into dev_chain 2020-07-09 20:24:53 +08:00
sylor_huang@126.com 946a5cc44a Merge branch 'dev_trustie' into dev_chain 2020-07-09 20:18:44 +08:00
sylor_huang@126.com a78ba32923 Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:57:50 +08:00
sylor_huang@126.com 704dda3a1c Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:47:03 +08:00
sylor_huang@126.com 7fdc61040c Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:43:39 +08:00
sylor_huang@126.com 7df67ebca6 Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:33:27 +08:00
sylor_huang@126.com bf85203a25 Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:30:43 +08:00
sylor_huang@126.com 62ab4805a2 Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:27:55 +08:00
sylor_huang@126.com 9e2181392b Merge branch 'dev_trustie' into dev_chain 2020-07-09 17:52:09 +08:00
sylor_huang@126.com bcd6ffdfda Merge branch 'dev_trustie' into dev_chain 2020-07-09 16:47:55 +08:00
sylor_huang@126.com b9a596bb2c Merge branch 'dev_trustie' into dev_chain 2020-07-07 13:55:17 +08:00
sylor_huang@126.com 8a1abaed8a change 2020-07-06 16:35:03 +08:00
sylor_huang@126.com b189d16f58 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-07-03 17:37:45 +08:00
sylor_huang@126.com 153496c089 Merge branch 'dev_trustie' into dev_chain 2020-07-03 17:37:33 +08:00
Jasder e35f8515ee Merge branch 'dev_trustie' into dev_chain 2020-07-03 17:36:36 +08:00
sylor_huang@126.com c96dcb14e7 Merge branch 'dev_trustie' into dev_chain 2020-07-03 17:15:15 +08:00
sylor_huang@126.com d812929152 Merge branch 'dev_trustie' into dev_chain 2020-07-03 17:01:16 +08:00
sylor_huang@126.com 943d14ebfe change errors 2020-07-03 16:23:04 +08:00
sylor_huang@126.com 73d3715cca change 2020-07-03 16:17:06 +08:00
sylor_huang@126.com 21417ad300 Merge branch 'dev_trustie' into dev_chain 2020-07-03 16:13:24 +08:00
sylor_huang@126.com 8eb3b149d7 Merge branch 'dev_trustie' into dev_chain 2020-07-03 15:26:46 +08:00
Jasder 1541cb4fc3 Merge branch 'dev_trustie' into dev_chain 2020-07-02 15:52:15 +08:00
sylor_huang@126.com 2e3438d75b Merge branch 'dev_trustie' into dev_chain 2020-07-02 15:00:43 +08:00
sylor_huang@126.com d5849976a3 Merge branch 'dev_trustie' into dev_chain 2020-07-02 10:13:17 +08:00
sylor_huang@126.com 2efb212751 Merge branch 'dev_trustie' into dev_chain 2020-07-01 10:07:16 +08:00
sylor_huang@126.com 964e015588 Merge branch 'dev_trustie' into dev_chain 2020-06-30 18:49:37 +08:00
sylor_huang@126.com 784ce1aea0 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-30 16:23:25 +08:00
sylor_huang@126.com 25efc96d0d Merge branch 'dev_trustie' into dev_chain 2020-06-30 16:23:09 +08:00
Jasder b6c51f7dcf Merge branch 'dev_trustie' into dev_chain 2020-06-30 15:54:30 +08:00
Jasder c00cb33799 Merge branch 'dev_trustie' into dev_chain 2020-06-30 15:02:01 +08:00
sylor_huang@126.com da81e7ae73 Merge branch 'dev_trustie' into dev_chain 2020-06-30 13:50:40 +08:00
sylor_huang@126.com ec6e962248 Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:53:38 +08:00
sylor_huang@126.com 26dc737ee3 Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:47:56 +08:00
sylor_huang@126.com b0afa38258 Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:43:51 +08:00
sylor_huang@126.com d59b30e6e2 Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:39:53 +08:00
sylor_huang@126.com 12019f554c Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:27:51 +08:00
sylor_huang@126.com 88d658dde4 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-30 11:22:43 +08:00
sylor_huang@126.com f6739a9502 Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:22:30 +08:00
Jasder e0e09d90d8 FIX merge bug 2020-06-30 11:16:56 +08:00
Jasder c6f4d7157f ADD mirror_url to simpe project api 2020-06-30 11:15:03 +08:00
Jasder 0aa6521fae Merge branch 'dev_trustie' into dev_chain 2020-06-30 10:45:47 +08:00
sylor_huang@126.com e75b84544a Merge branch 'dev_trustie' into dev_chain 2020-06-30 10:44:42 +08:00
sylor_huang@126.com aa19747dd6 Merge branch 'dev_trustie' into dev_chain 2020-06-30 10:07:47 +08:00
sylor_huang@126.com 45eb65ce88 change pr 2020-06-30 09:45:26 +08:00
sylor_huang@126.com 1e7826a298 Merge branch 'dev_trustie' into dev_chain 2020-06-30 09:44:49 +08:00
Jasder d806c4cc09 Merge branch 'dev_trustie' into dev_chain 2020-06-29 18:29:07 +08:00
sylor_huang@126.com 94227b104c Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-29 17:07:53 +08:00
sylor_huang@126.com 86c6a7bbdd Merge branch 'dev_trustie' into dev_chain 2020-06-29 17:07:38 +08:00
Jasder 750094f68f Merge branch 'dev_trustie' into dev_chain 2020-06-29 16:06:48 +08:00
sylor_huang@126.com 6b9c424b07 Merge branch 'dev_trustie' into dev_chain 2020-06-24 16:16:33 +08:00
sylor_huang@126.com 40347aaa66 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-24 15:34:03 +08:00
sylor_huang@126.com cfae67c3c9 Merge branch 'dev_trustie' into dev_chain 2020-06-24 15:33:48 +08:00
Jasder 7f9af73fdd Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-23 15:10:24 +08:00
Jasder 0a7ab3469d Merge branch 'dev_trustie' into dev_chain 2020-06-23 15:10:04 +08:00
sylor_huang@126.com d09e7b3439 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-23 15:00:57 +08:00
sylor_huang@126.com b7c86fd83c Merge branch 'dev_trustie' into dev_chain 2020-06-23 15:00:33 +08:00
Jasder faaa165684 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-23 11:59:51 +08:00
sylor_huang@126.com 8ffbfdd7e8 Merge branch 'dev_trustie' into dev_chain 2020-06-18 16:29:14 +08:00
sylor_huang@126.com e469629106 Merge branch 'dev_trustie' into dev_chain 2020-06-18 16:00:42 +08:00
sylor_huang@126.com 8af997bf9f change 2020-06-18 15:59:37 +08:00
sylor_huang@126.com b90bc0aed2 change bug 2020-06-18 15:47:43 +08:00
sylor_huang@126.com 7ffe33858b change 2020-06-12 18:48:32 +08:00
sylor_huang@126.com 9d7e7b2eb7 change 2020-06-12 18:28:20 +08:00
sylor_huang@126.com 459d836154 merge 2020-06-12 18:24:10 +08:00
sylor_huang@126.com 77b995e958 remove dump.mb 2020-06-11 11:46:58 +08:00
sylor_huang@126.com 851f0de0a7 change 2020-06-10 18:47:03 +08:00
sylor_huang@126.com 6b29621485 change token issue bug 2020-06-10 18:33:23 +08:00
sylor_huang@126.com 4b4bb0ab14 change check_token 2020-06-10 18:24:03 +08:00
sylor_huang@126.com 844699dd1b change 2020-06-10 16:34:34 +08:00
sylor_huang@126.com fc820238c4 修改chain相关的 2020-06-10 16:04:14 +08:00
sylor_huang@126.com 79641e859c change chain 2020-06-09 18:55:09 +08:00
jasder 0bd6952567 Update 'README.md' 2020-05-07 18:12:36 +08:00
Jasder b2274aae0c Merge branch 'master' of http://gitea.trustie.net/jasder/forgeplus 2020-04-26 10:15:08 +08:00
Jasder 3be16db2a8 FIX merge 2020-04-26 10:14:54 +08:00
jasder b1493bd081 Update 'README.md' 2020-04-26 09:55:00 +08:00
666 changed files with 43769 additions and 9845 deletions

1
.gitignore vendored
View File

@ -36,6 +36,7 @@ public/react/yarn.lock
/.idea/*
# Ignore react node_modules
public/react/*
/public/react/.cache
/public/react/node_modules/
/public/react/config/stats.json

22
.trustie-pipeline.yml Normal file
View File

@ -0,0 +1,22 @@
kind: pipeline
name: default
platform:
os: linux
arch: arm64
steps:
- name: install
image: ruby:2.4.5
commands:
- gem install bundler
- bundle -v
- bundle install --jobs=1 --retry=1
- name: test
image: ruby:2.4.5
volumes:
- name: bundle
path: /usr/local/bundle
commands:
- rake

26
CHANGELOG.md Normal file
View File

@ -0,0 +1,26 @@
# 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

@ -1,8 +1,6 @@
source 'https://gems.ruby-china.com'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby '2.3.7'
gem 'rails', '~> 5.2.0'
gem 'mysql2', '>= 0.4.4', '< 0.6.0'
gem 'puma', '~> 3.11'
@ -19,8 +17,6 @@ gem 'kaminari', '~> 1.1', '>= 1.1.1'
gem 'bootsnap', '>= 1.1.0', require: false
gem 'gitlab', path: 'lib/gitlab-cli'
gem 'chinese_pinyin'
gem 'rack-cors'
@ -74,6 +70,7 @@ group :development do
gem 'listen', '>= 3.0.5', '< 3.2'
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
gem "annotate", "~> 2.6.0"
end
group :test do
@ -103,6 +100,7 @@ gem 'rails-i18n', '~> 5.1'
# job
gem 'sidekiq'
gem 'sinatra'
gem "sidekiq-cron", "~> 1.1"
# batch insert
gem 'bulk_insert'

View File

@ -1,10 +1,3 @@
PATH
remote: lib/gitlab-cli
specs:
gitlab (3.2.0)
httparty
terminal-table
GEM
remote: https://gems.ruby-china.com/
specs:
@ -61,6 +54,9 @@ GEM
public_suffix (>= 2.0.2, < 5.0)
ancestry (3.0.7)
activerecord (>= 3.2.0)
annotate (2.6.5)
activerecord (>= 2.3.0)
rake (>= 0.8.7)
archive-zip (0.12.0)
io-like (~> 0.3.0)
arel (9.0.0)
@ -122,12 +118,17 @@ GEM
enumerize (2.3.1)
activesupport (>= 3.2)
erubi (1.9.0)
et-orbi (1.2.4)
tzinfo
execjs (2.7.0)
faraday (0.15.4)
multipart-post (>= 1.2, < 3)
ffi (1.12.2)
font-awesome-sass (4.7.0)
sass (>= 3.2)
fugit (1.4.1)
et-orbi (~> 1.1, >= 1.1.8)
raabro (~> 1.4)
globalid (0.4.2)
activesupport (>= 4.2.0)
grape-entity (0.7.1)
@ -138,9 +139,6 @@ GEM
harmonious_dictionary (0.0.1)
hashie (3.6.0)
htmlentities (4.3.4)
httparty (0.18.0)
mime-types (~> 3.0)
multi_xml (>= 0.5.2)
i18n (1.8.2)
concurrent-ruby (~> 1.0)
io-like (0.3.1)
@ -177,9 +175,6 @@ GEM
mimemagic (~> 0.3.2)
maruku (0.7.3)
method_source (0.9.2)
mime-types (3.3.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2019.1009)
mimemagic (0.3.4)
mini_mime (1.0.2)
mini_portile2 (2.4.0)
@ -221,6 +216,7 @@ GEM
prettier (0.18.2)
public_suffix (4.0.3)
puma (3.12.2)
raabro (1.4.0)
rack (2.0.9)
rack-cors (1.1.1)
rack (>= 2.0.0)
@ -363,6 +359,9 @@ GEM
rack (< 2.1.0)
rack-protection (>= 1.5.0)
redis (>= 3.3.5, < 5)
sidekiq-cron (1.2.0)
fugit (~> 1.1)
sidekiq (>= 4.2.1)
simple_form (5.0.2)
actionpack (>= 5.0)
activemodel (>= 5.0)
@ -402,8 +401,6 @@ GEM
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
thor (1.0.1)
thread_safe (0.3.6)
tilt (2.0.10)
@ -437,6 +434,7 @@ DEPENDENCIES
acts-as-taggable-on (~> 6.0)
acts_as_list
ancestry
annotate (~> 2.6.0)
awesome_print
axlsx (~> 3.0.0.pre)
axlsx_rails (~> 0.5.2)
@ -452,7 +450,6 @@ DEPENDENCIES
enumerize
faraday (~> 0.15.4)
font-awesome-sass (= 4.7.0)
gitlab!
grape-entity (~> 0.7.1)
groupdate (~> 4.1.0)
harmonious_dictionary (~> 0.0.1)
@ -489,6 +486,7 @@ DEPENDENCIES
searchkick
selenium-webdriver
sidekiq
sidekiq-cron (~> 1.1)
simple_form
simple_xlsx_reader
sinatra
@ -502,8 +500,5 @@ DEPENDENCIES
web-console (>= 3.3.0)
wkhtmltopdf-binary
RUBY VERSION
ruby 2.3.7p456
BUNDLED WITH
2.1.4

5084
README.md

File diff suppressed because it is too large Load Diff

5062
api_document.md Normal file

File diff suppressed because it is too large Load Diff

View File

@ -110,33 +110,33 @@ class AccountsController < ApplicationController
# params[:login] 邮箱或者手机号
# params[:code] 验证码
# code_type 1注册手机验证码 8邮箱注册验证码
# 本地forge注册入口
def register
begin
# 查询验证码是否正确;type只可能是1或者8
type = phone_mail_type(params[:login].strip)
code = params[:code].strip
# code = params[:code].strip
if type == 1
uid_logger("start register by phone: type is #{type}")
pre = 'p'
email = nil
phone = params[:login]
verifi_code = VerificationCode.where(phone: phone, code: code, code_type: 1).last
# verifi_code = VerificationCode.where(phone: phone, code: code, code_type: 1).last
# TODO: 暂时限定邮箱注册
return normal_status(-1, '只支持邮箱注册')
else
uid_logger("start register by email: type is #{type}")
pre = 'm'
email = params[:login]
phone = nil
verifi_code = VerificationCode.where(email: email, code: code, code_type: 8).last
return normal_status(-1, "该邮箱已注册") if User.exists?(mail: params[:login])
return normal_status(-1, "邮箱格式错误") unless params[:login] =~ CustomRegexp::EMAIL
# verifi_code = VerificationCode.where(email: email, code: code, code_type: 8).last
end
uid_logger("start register: verifi_code is #{verifi_code}, code is #{code}, time is #{Time.now.to_i - verifi_code.try(:created_at).to_i}")
# uid_logger("start register: verifi_code is #{verifi_code}, code is #{code}, time is #{Time.now.to_i - verifi_code.try(:created_at).to_i}")
# check_code = (verifi_code.try(:code) == code.strip && (Time.now.to_i - verifi_code.created_at.to_i) <= 10*60)
# todo 上线前请删除万能验证码"513231"
unless code == "513231" && request.subdomain == "test-newweb"
return normal_status(-2, "验证码不正确") if verifi_code.try(:code) != code.strip
return normal_status(-2, "验证码已失效") if !verifi_code&.effective?
end
return normal_status(-1, "8~16位密码支持字母数字和符号") unless params[:password] =~ CustomRegexp::PASSWORD
code = generate_identifier User, 8, pre
@ -146,23 +146,20 @@ class AccountsController < ApplicationController
# 现在因为是验证码,所以在注册的时候就可以激活
@user.activate
# 必须要用save操作密码的保存是在users中
if @user.save!
# todo user_extension
UserExtension.create!(user_id: @user.id)
# 注册完成手机号或邮箱想可以奖励500金币
# RewardGradeService.call(
# @user,
# container_id: @user.id,
# container_type: pre == 'p' ? 'Phone' : 'Mail',
# score: 500
# )
# 注册时,记录是否是引流用户
ip = request.remote_ip
ua = UserAgent.find_by_ip(ip)
ua.update_column(:agent_type, UserAgent::USER_REGISTER) if ua
successful_authentication(@user)
# session[:user_id] = @user.id
normal_status("注册成功")
interactor = Gitea::RegisterInteractor.call({username: login, email: email, password: params[:password]})
if interactor.success?
gitea_user = interactor.result
result = Gitea::User::GenerateTokenService.new(login, params[:password]).call
@user.gitea_token = result['sha1']
@user.gitea_uid = gitea_user[:body]['id']
if @user.save!
UserExtension.create!(user_id: @user.id)
successful_authentication(@user)
normal_status("注册成功")
end
else
tip_exception(-1, interactor.error)
end
rescue Exception => e
uid_logger_error(e.message)

View File

@ -6,6 +6,12 @@ class Admins::LaboratoriesController < Admins::BaseController
@laboratories = paginate laboratories.preload(:laboratory_users)
end
def new
respond_to do |format|
format.js
end
end
def create
Admins::CreateLaboratoryService.call(create_params)
render_ok

View File

@ -1,4 +1,11 @@
class Admins::LaboratorySettingsController < Admins::BaseController
def new
respond_to do |format|
format.js
end
end
def show
@laboratory = current_laboratory
end

View File

@ -343,7 +343,8 @@ class ApplicationController < ActionController::Base
elsif params[:debug] == 'student'
User.current = User.find 8686
elsif params[:debug] == 'admin'
user = User.find 1
logger.info "@@@@@@@@@@@@@@@@@@@@@@ debug mode....."
user = User.find 36480
User.current = user
cookies.signed[:user_id] = user.id
end
@ -384,11 +385,7 @@ class ApplicationController < ActionController::Base
end
def current_user
if Rails.env.development?
User.current = User.find 1
else
User.current
end
User.current
end
## 默认输出json
@ -683,6 +680,14 @@ class ApplicationController < ActionController::Base
relation.page(page).per(limit)
end
def kaminari_array_paginate(relation)
limit = params[:limit] || params[:per_page]
limit = (limit.to_i.zero? || limit.to_i > 15) ? 15 : limit.to_i
page = params[:page].to_i.zero? ? 1 : params[:page].to_i
Kaminari.paginate_array(relation).page(page).per(limit)
end
def strf_time(time)
time.blank? ? '' : time.strftime("%Y-%m-%d %H:%M:%S")
end
@ -744,7 +749,7 @@ class ApplicationController < ActionController::Base
namespace = params[:owner]
id = params[:repo] || params[:id]
@project = Project.find_with_namespace(namespace, id)
@project, @owner = Project.find_with_namespace(namespace, id)
if @project and current_user.can_read_project?(@project)
logger.info "########### has project and can read project"
@ -762,7 +767,7 @@ class ApplicationController < ActionController::Base
end
def load_repository
@repository ||= load_project.repository
@repository ||= load_project&.repository
end
private

View File

@ -28,8 +28,8 @@ class AttachmentsController < ApplicationController
update_downloads(@file)
end
def get_file
def get_file
normal_status(-1, "参数缺失") if params[:download_url].blank?
url = URI.encode(params[:download_url].to_s.gsub("http:", "https:"))
response = Faraday.get(url)
@ -45,7 +45,7 @@ class AttachmentsController < ApplicationController
uid_logger("#########################file_params####{params["#{params[:file_param_name]}"]}")
raise "未上传文件" unless upload_file
folder = edu_setting('attachment_folder')
folder = file_storage_directory
raise "存储目录未定义" unless folder.present?
month_folder = current_month_folder
@ -108,7 +108,7 @@ class AttachmentsController < ApplicationController
end
# 附件为视频时,点击播放
def preview_attachment
def preview_attachment
attachment = Attachment.find_by(id: params[:id])
dir_path = "#{Rails.root}/public/preview"
Dir.mkdir(dir_path) unless Dir.exist?(dir_path)
@ -118,10 +118,10 @@ class AttachmentsController < ApplicationController
else
normal_status(-1, "出现错误,请稍后重试")
end
else
else
if system("rm -rf #{dir_path}/#{attachment.disk_filename}")
normal_status(1, "操作成功")
else
else
normal_status(-1, "出现错误,请稍后重试")
end
end

View File

@ -0,0 +1,76 @@
class Ci::BaseController < ApplicationController
include Ci::DbConnectable
before_action :require_login
before_action :connect_to_ci_db
def load_repo
namespace = params[:owner]
id = params[:repo] || params[:id]
@ci_user, @repo = Ci::Repo.find_with_namespace(namespace, id)
end
def load_all_repo
namespace = current_user.login
@repos = Ci::Repo.find_all_with_namespace(namespace)
end
def load_repo_by_repo_slug(slug)
@repo_slug = Ci::Repo.load_repo_by_repo_slug(slug)
end
private
def authorize_access_project!
unless @project.manager?(current_user)
return render_forbidden
end
end
def authenticate_manager!
unless @project.manager?(current_user)
return render_forbidden
end
end
def authenticate_admin!
return render_forbidden unless current_user.admin?
end
def authorize_owner!
unless @project.owner?(current_user)
return render_forbidden
end
end
def find_cloud_account
@cloud_account ||= current_user.ci_cloud_account
@cloud_account.blank? ? nil : @cloud_account
end
def load_ci_user
@ci_user ||= Ci::User.find_by(user_login: params[:owner])
@ci_user.blank? ? raise("未找到相关的记录") : @ci_user
end
def connect_to_ci_db(options={})
current = current_user
owner = params[:owner]
if owner
current = User.find_by(login: owner)
end
if !(current && !current.is_a?(AnonymousUser) && !current.devops_uninit?)
return
end
if current.ci_cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_TRUSTIE
connect_to_trustie_ci_database(options)
else
options = options.merge(db_name: current.login)
connect_to_ci_database(options)
end
end
end

View File

@ -0,0 +1,53 @@
class Ci::BuildsController < Ci::BaseController
include RepositoriesHelper
before_action :load_project
before_action :authorize_owner!, only: [:restart, :stop]
before_action :load_repo
before_action :find_cloud_account, except: [:index, :show]
def index
@user = current_user
scope = Ci::Builds::ListQuery.call(@repo, params)
@total_count = scope.map(&:build_id).size
@builds = paginate scope
end
def show
@build = @repo.builds.includes(stages: [:steps]).find_by(build_number: params[:build])
end
def restart
result = Ci::Drone::API.new(@ci_user.user_hash, @cloud_account.drone_url, @repo.repo_namespace, @repo.repo_name, number: params[:build]).restart
render json: result
end
def stop
result = Ci::Drone::API.new(@ci_user.user_hash, @cloud_account.drone_url, @repo.repo_namespace, @repo.repo_name, number: params[:build]).stop
render json: result
end
def logs
# TODO **待优化**
# 因直接操作ci库如下查询待优化可直接根据log id查询即可
build = @repo.builds.find_by(build_number: params[:build])
return render_not_found("Couldn't found build with 'number'= #{params[:build]}") if build.blank?
stage = build.stages.includes(steps: [:log]).find_by(stage_number: params[:stage])
return render_not_found("Couldn't found build with 'number'= #{params[:stage]}") if stage.blank?
step = stage.steps.find_by(step_number: params[:step])
return render_not_found("Couldn't found build with 'number'= #{params[:step]}") if step.blank?
log = step.log
result = log.blank? ? nil : (log.log_data[0..5].include?('null') ? nil : JSON.parse(log.log_data))
# result = Ci::Drone::API.new(@user.user_hash, @cloud_account.drone_url, @repo.repo_namespace, @repo.repo_name, build: params[:build], stage: params[:stage], step: params[:step]).logs
render json: result
end
end

View File

@ -0,0 +1,129 @@
class Ci::CloudAccountsController < Ci::BaseController
include Ci::CloudAccountManageable
skip_before_action :connect_to_ci_db, only: %i[create bind trustie_bind]
before_action :load_project, only: %i[create activate]
before_action :authorize_owner!, only: %i[create activate]
before_action :load_repo, only: %i[activate]
before_action :load_all_repo, only: %i[unbind]
before_action :find_cloud_account, only: %i[show oauth_grant]
before_action :validate_params!, only: %i[create bind]
before_action only: %i[create bind] do
connect_to_ci_database(master_db: true)
end
def create
flag, msg = check_bind_cloud_account!
return render_error(msg) if flag === true
ActiveRecord::Base.transaction do
@cloud_account = bind_account!
if @cloud_account.blank?
render_error('激活失败, 请检查你的云服务器信息是否正确.')
raise ActiveRecord::Rollback
else
current_user.set_drone_step!(User::DEVOPS_UNVERIFIED)
render_ok(redirect_url: @cloud_account.authenticate_url)
end
end
rescue Exception => ex
render_error(ex.message)
end
def activate
return render_error('请先认证') unless current_user.ci_certification?
begin
@cloud_account = Ci::CloudAccount.find params[:id]
ActiveRecord::Base.transaction do
if @repo
return render_error('该项目已经激活') if @repo.repo_active?
@repo.activate!(@project)
else
@repo = Ci::Repo.auto_create!(@ci_user, @project)
@user.update_column(:user_syncing, false)
end
result = bind_hook!(current_user, @cloud_account, @repo)
@project.update_columns(open_devops: true, gitea_webhook_id: result['id'])
@cloud_account.update_column(:ci_user_id, @ci_user.user_id)
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
end
def show
end
def bind
flag, msg = check_bind_cloud_account!
return render_error(msg) if flag === true
ActiveRecord::Base.transaction do
@cloud_account = bind_account!
if @cloud_account.blank?
render_error('激活失败, 请检查你的云服务器信息是否正确.')
raise ActiveRecord::Rollback
else
current_user.set_drone_step!(User::DEVOPS_UNVERIFIED)
end
end
rescue Exception => ex
render_error(ex.message)
end
def trustie_bind
account = params[:account].to_s
return render_error("account不能为空.") if account.blank?
flag, msg = check_trustie_bind_cloud_account!
return render_error(msg) if flag === true
ActiveRecord::Base.transaction do
@cloud_account = trustie_bind_account!
if @cloud_account.blank?
render_error('激活失败, 请检查你的云服务器信息是否正确.')
raise ActiveRecord::Rollback
else
current_user.set_drone_step!(User::DEVOPS_UNVERIFIED)
end
end
rescue Exception => ex
render_error(ex.message)
end
def unbind
ActiveRecord::Base.transaction do
if current_user.ci_cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_TRUSTIE
if @repos
@repos.each do |repo|
repo.deactivate!
end
end
end
unbind_account!
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def oauth_grant
password = params[:password].to_s
return render_error('你输入的密码不正确.') unless current_user.check_password?(password)
oauth = current_user.oauths.last
return render_error("服务器出小差了.") if oauth.blank?
result = gitea_oauth_grant!(password, oauth)
return render_error('授权失败.') unless result === true
current_user.set_drone_step!(User::DEVOPS_CERTIFICATION)
end
private
def validate_params!
Ci::CreateCloudAccountForm.new(devops_params).validate!
end
end

View File

@ -0,0 +1,20 @@
class Ci::LanguagesController < Ci::BaseController
# TODO 需要开启权限认证只有该项目devops初始化成功后才能获取语言列表
before_action :find_langugae, only: :show
def index
@languages = Ci::Language.by_usage_amount_desc
end
def show
end
def common
@languages = Ci::Language.six_common
end
private
def find_langugae
@language = Ci::Language.find params[:id]
end
end

View File

@ -0,0 +1,294 @@
class Ci::PipelinesController < Ci::BaseController
before_action :require_login, only: %i[list create content]
skip_before_action :connect_to_ci_db, except: %i[list create destroy content]
before_action :load_project, only: %i[create content]
before_action :load_repo, only: %i[create content]
# ======流水线相关接口========== #
def list
@result = Array.new
list = Ci::Pipeline.where('identifier=? and owner=?', params[:identifier], params[:owner])
# 查询build状态
list.collect do |pipeline|
pipeline.last_build_time = nil
repo = load_repo_by_repo_slug("#{pipeline.owner}/#{pipeline.identifier}")
if repo
build = repo.builds.order("build_created desc").find_by(build_target: pipeline.branch)
if build
pipeline.pipeline_status = build.build_status
pipeline.last_build_time = Time.at(build.build_created)
end
end
@result.push(pipeline)
end
@total_count = @result.size
@pipelines = paginate @result
end
def create
ActiveRecord::Base.transaction do
size = Ci::Pipeline.where('branch=? and identifier=? and owner=?', params[:branch], params[:repo], params[:owner]).size
if size > 0
render_error("#{params[:branch]}分支已经存在流水线!")
return
end
pipeline = Ci::Pipeline.new(pipeline_name: params[:pipeline_name], file_name: params[:file_name],owner: params[:owner],
login: current_user.login, identifier: params[:repo], branch: params[:branch], event: params[:event])
pipeline.save!
# 默认创建四个初始阶段
init_stages = Ci::PipelineStage::INIT_STAGES
index = 1
init_stages.each do |type, name|
pipeline.pipeline_stages.build(
stage_name: name,
stage_type: type,
show_index: index
).save!
index += 1
end
create_pipeline_file(pipeline)
create_ci_repo(pipeline)
render_ok({id: pipeline.id})
end
rescue Exception => ex
render_error(ex.message)
end
# 在代码库创建文件
def create_pipeline_file(pipeline)
sha = get_pipeline_file_sha(pipeline.file_name, pipeline.branch)
if sha
logger.info "#{pipeline.file_name}已存在"
else
interactor = Gitea::CreateFileInteractor.call(current_user.gitea_token, @owner.login, content_params)
if interactor.success?
logger.info "#{pipeline.file_name}创建成功"
end
end
end
# 在drone数据库repo表新增一条repo记录
def create_ci_repo(pipeline)
if pipeline.branch != 'master'
create_params = {
repo_user_id: @ci_user.user_id,
repo_namespace: @project.owner.login,
repo_name: @project.identifier,
repo_slug: "#{@project.owner.login}/#{@project.identifier}-" + pipeline.id.to_s,
repo_clone_url: @project.repository.url,
repo_branch: pipeline.branch,
repo_config: pipeline.file_name
}
repo = Ci::Repo.create_repo(create_params)
repo
end
nil
end
def get_pipeline_file_sha(file_name, branch)
file_path_uri = URI.parse(file_name)
interactor = Repositories::EntriesInteractor.call(@project.owner, @project.identifier, file_path_uri, ref: branch || 'master')
if interactor.success?
file = interactor.result
file['sha']
end
end
def content_params
{
filepath: params[:file_name],
branch: params[:branch],
new_branch: params[:new_branch],
content: "#pipeline \n",
message: 'create pipeline',
committer: {
email: current_user.mail,
name: current_user.login
},
identifier: params[:repo]
}
end
def update
pipeline = Ci::Pipeline.find(params[:id])
if pipeline
pipeline.update!(pipeline_name: params[:pipeline_name],branch: params[:branch], event: params[:event])
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
def destroy
pipeline = Ci::Pipeline.find(params[:id])
if pipeline
repo = load_repo_by_repo_slug("#{pipeline.login}/#{pipeline.identifier}-" + pipeline.id.to_s)
if repo
repo.destroy!
end
pipeline.destroy!
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
def content
@yaml = "\n"
pipeline = Ci::Pipeline.find(params[:id])
stages = pipeline.pipeline_stages
if stages && !stages.empty?
init_step = stages.first.pipeline_stage_steps.first
@yaml += init_step.content + "\n" + "steps:\n"
stages = stages.slice(1, stages.size - 1)
unless stages.empty?
stages.each do |stage|
steps = stage.pipeline_stage_steps
next unless steps && !steps.empty?
steps.each do |step|
@yaml += step.content + "\n"
end
end
end
end
@sha = get_pipeline_file_sha(pipeline.file_name, pipeline.branch)
trigger = ''
trigger += " branch:\r\n - #{pipeline.branch}\r\n" unless pipeline.branch.blank?
unless pipeline.event.blank?
trigger += " event:\r\n"
pipeline.event.split(',').each { |event| trigger += " - #{event}\r\n"}
end
@yaml += "trigger:\r\n" + trigger unless trigger.blank?
@branch = pipeline.branch
end
# =========阶段相关接口========= #
def stages
pipeline_id = params[:id]
@pipeline_name = Ci::Pipeline.find(pipeline_id).pipeline_name
@pipeline_stages = Ci::PipelineStage.where('pipeline_id=?', pipeline_id).order('show_index asc')
end
def create_stage
ActiveRecord::Base.transaction do
# 修改stage排序
update_stage_index(params[:id], params[:show_index], 1)
pipeline_stage = Ci::PipelineStage.new(stage_name: params[:stage_name],
stage_type: params[:stage_type].blank? ? 'customize' : params[:stage_type],
pipeline_id: params[:id], show_index: params[:show_index])
pipeline_stage.save!
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def update_stage
pipeline_stage = Ci::PipelineStage.find(params[:stage_id])
if pipeline_stage
pipeline_stage.update!(stage_name: params[:stage_name])
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
def delete_stage
ActiveRecord::Base.transaction do
update_stage_index(params[:id], params[:show_index].to_i, -1)
pipeline_stage = Ci::PipelineStage.find(params[:stage_id])
if pipeline_stage
pipeline_stage.destroy!
end
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def update_stage_index(pipeline_id, show_index, diff)
stages = Ci::Pipeline.find(pipeline_id).pipeline_stages
stages.each do |stage|
if stage.show_index >= show_index
stage.update!(show_index: stage.show_index + diff)
end
end
end
# ========步骤相关接口========= #
def steps
@stage_type = Ci::PipelineStage.find(params[:stage_id]).stage_type
@pipeline_stage_steps = Ci::PipelineStageStep.where('stage_id=?', params[:stage_id]).order('show_index asc')
end
def stage_step
ActiveRecord::Base.transaction do
steps = params[:steps]
unless steps.empty?
steps.each do |step|
unless step[:template_id]
render_error('请选择模板!')
return
end
if !step[:id]
step = Ci::PipelineStageStep.new(step_name: step[:step_name], stage_id: params[:stage_id],
template_id: step[:template_id], content: step[:content], show_index: step[:show_index])
step.save!
else
pipeline_stage_step = Ci::PipelineStageStep.find(step[:id])
pipeline_stage_step.update(step_name: step[:step_name], content: step[:content],
show_index: step[:show_index], template_id: step[:template_id])
end
end
end
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def create_stage_step
ActiveRecord::Base.transaction do
steps = params[:steps]
unless steps.empty?
steps.each do |step|
step = Ci::PipelineStageStep.new(step_name: step[:step_name], stage_id: params[:stage_id],
template_id: step[:template_id], content: step[:content], show_index: step[:show_index])
step.save!
end
end
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def update_stage_step
ActiveRecord::Base.transaction do
steps = params[:steps]
unless steps.empty?
steps.each do |step|
pipeline_stage_step = Ci::PipelineStageStep.find(step[:id])
if pipeline_stage_step
pipeline_stage_step.update(step_name: step[:step_name], content: step[:content], template_id: step[:template_id])
end
end
end
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def delete_stage_step
pipeline_stage_step = Ci::PipelineStageStep.find(params[:step_id])
if pipeline_stage_step
pipeline_stage_step.destroy!
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
end

View File

@ -0,0 +1,70 @@
class Ci::ProjectsController < Ci::BaseController
include RepositoriesHelper
include Ci::CloudAccountManageable
before_action :load_project
before_action :load_repo, only: [:update_trustie_pipeline, :activate, :deactivate]
before_action :authorize_owner!, only: [:authorize]
before_action :find_cloud_account, only: [:authorize, :activate, :deactivate]
def authorize
@user = current_user
end
# get .trustie-pipeline.yml file
def get_trustie_pipeline
file_path_uri = URI.parse('.trustie-pipeline.yml')
interactor = Repositories::EntriesInteractor.call(@project.owner, @project.identifier, file_path_uri, ref: params[:ref] || "master")
if interactor.success?
file = interactor.result
return render json: {} if file[:status]
json = {name: file['name'], path: file['path'], sha: file['sha'], content: render_decode64_content(file['content'])}
render json: json
end
end
def update_trustie_pipeline
interactor = Gitea::UpdateFileInteractor.call(current_user.gitea_token, params[:owner], params.merge(identifier: @project.identifier))
if interactor.success?
@file = interactor.result
render_result(1, "更新成功")
else
render_error(interactor.error)
end
end
def activate
return render_error('你还未认证') unless current_user.ci_certification?
begin
ActiveRecord::Base.transaction do
if @repo
return render_error('该项目已经激活') if @repo.repo_active?
@repo.activate!(@project)
return render_ok
else
@repo = Ci::Repo.auto_create!(@ci_user, @project)
@ci_user.update_column(:user_syncing, false)
end
result = bind_hook!(current_user, @cloud_account, @repo)
@project.update_columns(open_devops: true, gitea_webhook_id: result['id'])
@project.increment!(:open_devops_count)
@cloud_account.update_column(:ci_user_id, @ci_user.user_id)
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
end
def deactivate
return render_error('该项目已经取消激活') if !@repo.repo_active?
@project.update_column(:open_devops, false)
@repo.deactivate_repos!
render_ok
end
end

View File

@ -0,0 +1,53 @@
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

@ -0,0 +1,104 @@
class Ci::TemplatesController < Ci::BaseController
before_action :require_login, only: %i[list create]
skip_before_action :connect_to_ci_db
#======模板管理======#
def list
stage_type = params[:stage_type]
template_name = params[:name]
templates = template_name.blank? ? Ci::Template.all : Ci::Template.where("template_name like ?", "%#{template_name}%")
templates = templates.select{ |template| template.login == current_user.login} unless current_user.admin?
if !stage_type.blank? && stage_type != 'all'
templates = templates.select{ |template| template.stage_type == stage_type}
end
@total_count = templates.map(&:id).count
@templates = paginate templates
end
def show
@template = Ci::Template.find(params[:id])
end
def create
stage_type = params[:stage_type]
category = params[:category]
if category.blank?
category = Ci::Template::STAGE_TYPES[:"#{stage_type}"]
end
if params[:id]
template = Ci::Template.find(params[:id])
if template
template.update!(template_name: params[:template_name],
stage_type: stage_type,
category: category,
parent_category: Ci::Template::STAGE_TYPES[:"#{stage_type}"],
content: params[:content],
login: current_user.admin? ? 'admin' : current_user.login
)
end
else
template = Ci::Template.new(template_name: params[:template_name],
stage_type: stage_type,
category: category,
parent_category: Ci::Template::STAGE_TYPES[:"#{stage_type}"],
content: params[:content],
login: current_user.admin? ? 'admin' : current_user.login
)
template.save!
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
def update
template = Ci::Template.find(params[:id])
template.update!(template_name: params[:template_name],
stage_type: params[:stage_type],
category: params[:category],
parent_category: params[:parent_category],
content: params[:content]
)
render_ok
rescue Exception => ex
render_error(ex.message)
end
def destroy
template = Ci::Template.find(params[:id])
if template
template.destroy!
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
#======流水线模板查询=====#
def templates_by_stage
stage_type = params[:stage_type]
if stage_type != Ci::PipelineStage::CUSTOMIZE_STAGE_TYPE
@templates = Ci::Template.where("stage_type = ?", stage_type)
@templates = @templates.select{ |template| template.login == current_user.login || template.login == 'admin'} unless current_user.admin?
if stage_type == Ci::PipelineStage::INIT_STAGE_TYPE && !@templates.nil?
@templates.each do |template|
content = template.content
unless content.blank?
pipeline = Ci::Pipeline.find(params[:id])
template.content = content.gsub(/{name}/, pipeline.pipeline_name) unless pipeline.nil?
end
end
end
# 根据模板类别分组
@category_templates = @templates.group_by{ |template| template.category }
else
# 自定义阶段,按阶段分类分类返回模板列表
@templates = Ci::Template.where("stage_type != ?", Ci::PipelineStage::INIT_STAGE_TYPE)
@templates = @templates.select{ |template| template.login == current_user.login || template.login == 'admin'} unless current_user.admin?
@category_templates = @templates.group_by{ |template| template.parent_category }
end
end
end

View File

@ -0,0 +1,31 @@
class CompareController < ApplicationController
# skip_before_action :require_login
before_action :load_repository
def index
end
def show
compare
end
private
def compare
base, head = compare_params
# TODO: 处理fork的项目向源项目发送PR的base、head参数问题
@compare_result ||=
head.include?(":") ? gitea_compare(base, head) : gitea_compare(head, base)
end
def compare_params
base = Addressable::URI.unescape(params[:base])
head = params[:head].include?('json') ? params[:head]&.split('.json')[0] : params[:head]
[base, head]
end
def gitea_compare(base, head)
Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, base, head)
end
end

View File

@ -0,0 +1,209 @@
module Ci::CloudAccountManageable
extend ActiveSupport::Concern
included do
end
# 自有服务器绑定流程
def bind_account!
# 1. 保存华为云服务器帐号
create_params = devops_params.merge(ip_num: IPAddr.new(devops_params[:ip_num].strip).to_i, secret: Ci::CloudAccount.encrypted_secret(devops_params[:secret]), server_type: Ci::CloudAccount::SERVER_TYPE_SELF)
cloud_account = Ci::CloudAccount.new(create_params)
cloud_account.user = current_user
cloud_account.save!
# 2. 生成oauth2应用程序的client_id和client_secrete
gitea_oauth = Gitea::Oauth2::CreateService.call(current_user.gitea_token, {name: "pipeline-#{SecureRandom.hex(8)}", redirect_uris: ["#{cloud_account.drone_url}/login"]})
logger.info "######### gitea_oauth: #{gitea_oauth}"
raise 'Gitea接口异常' if gitea_oauth['client_id'].blank?
oauth = Oauth.new(client_id: gitea_oauth['client_id'],
client_secret: gitea_oauth['client_secret'],
redirect_uri: gitea_oauth['redirect_uris'],
gitea_oauth_id: gitea_oauth['id'],
user_id: current_user.id)
oauth.save!
# 创建数据ci端数据库
database_result = auto_create_database!(@connection, "#{current_user.login}_drone")
logger.info "[CI::DbConnectable] auto_create_database's result: #{database_result}"
# 初始化表结构
sub_connection = connect_to_ci_database
auto_create_table_structure!(sub_connection)
rpc_secret = SecureRandom.hex 16
logger.info "######### rpc_secret: #{rpc_secret}"
# 3. 创建drone server
drone_server_cmd = Ci::Drone::Server.new(current_user.login, oauth.client_id, oauth.client_secret, cloud_account.drone_host, rpc_secret).generate_cmd
logger.info "######### drone_server_cmd: #{drone_server_cmd}"
# 4. 创建drone client
drone_client_cmd = Ci::Drone::Client.new(oauth.client_id, cloud_account.drone_ip, rpc_secret).generate_cmd
logger.info "######### drone_client_cmd: #{drone_client_cmd}"
# 5. 登录远程服务器启动drone服务
result = Ci::Drone::Start.new(cloud_account.account, cloud_account.visible_secret, cloud_account.drone_ip, drone_server_cmd, drone_client_cmd).run
logger.info "######### result: #{result}"
redirect_url = "#{cloud_account.drone_url}/login"
logger.info "######### redirect_url: #{redirect_url}"
return nil unless result.present?
result && !result.blank? ? cloud_account : nil
end
def trustie_drone_server_config
# 读取drone配置信息
config = Rails.application.config_for(:configuration).symbolize_keys!
trustie_drone_config = config[:trustie_drone].symbolize_keys!
return trustie_drone_config
end
# trustie提供服务器,绑定流程
def trustie_bind_account!
trustie_drone_config = trustie_drone_server_config
raise 'trustie_drone config missing' if trustie_drone_config.blank?
# 创建云账号
create_params = devops_params.merge(ip_num: IPAddr.new(trustie_drone_config[:ip_num].strip).to_i, secret: Ci::CloudAccount.encrypted_secret(trustie_drone_config[:secret]), server_type: Ci::CloudAccount::SERVER_TYPE_TRUSTIE)
cloud_account = Ci::CloudAccount.new(create_params)
cloud_account.user = current_user
cloud_account.save!
#生成oauth2应用程序的client_id和client_secrete
gitea_oauth = Gitea::Oauth2::CreateService.call(current_user.gitea_token, {name: "pipeline-#{SecureRandom.hex(8)}", redirect_uris: ["#{cloud_account.drone_url}/login"]})
logger.info "######### gitea_oauth: #{gitea_oauth}"
raise 'Gitea接口异常' if gitea_oauth['client_id'].blank?
oauth = Oauth.new(client_id: gitea_oauth['client_id'],
client_secret: gitea_oauth['client_secret'],
redirect_uri: gitea_oauth['redirect_uris'],
gitea_oauth_id: gitea_oauth['id'],
user_id: current_user.id)
result = oauth.save!
redirect_url = "#{cloud_account.drone_url}/login"
logger.info "######### redirect_url: #{redirect_url}"
return nil unless result.present?
result ? cloud_account : nil
end
def unbind_account!
cloud_account = current_user.ci_cloud_account
return render_error('你未绑定CI服务器') if current_user.devops_step == User::DEVOPS_UNINIT || cloud_account.blank?
if cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_SELF
@connection.execute("DROP DATABASE IF EXISTS #{current_user.login}_drone") # TOTO drop drone database
end
cloud_account.destroy! unless cloud_account.blank?
current_user.unbind_account!
end
def bind_hook!(user, cloud_account, repo)
hook_params = {
active: true,
config: {
content_type: "json",
url: cloud_account.drone_url + "/hook?secret=#{repo.repo_signer}"
},
type: "gitea"
}
result = Gitea::Hooks::CreateService.call(user.gitea_token, user.login, repo.repo_name, hook_params)
result[:status].present? ? nil : result
end
def check_bind_cloud_account!
return [true, "你已经绑定了云帐号."] unless current_user.ci_cloud_account.blank?
ip_num = IPAddr.new(devops_params[:ip_num]).to_i
#自有服务器进行判断
cloud_account = current_user.ci_cloud_account
if cloud_account && cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_SELF
Ci::CloudAccount.exists?(ip_num: ip_num) ? [true, "#{devops_params[:ip_num]}服务器已被使用."] : [false, nil]
end
end
def check_trustie_bind_cloud_account!
return [true, "你已经绑定了云帐号."] unless current_user.ci_cloud_account.blank?
end
def gitea_auto_create_auth_grant!(gitea_oauth_id)
connection = Gitea::Database.set_connection.connection
unix_time = Time.now.to_i
# 目前直接操作db可以建立对应的model进行操作
sql = "REPLACE INTO oauth2_grant ( user_id, application_id, counter, created_unix, updated_unix ) VALUES ( #{current_user.gitea_uid}, #{gitea_oauth_id}, 0, #{unix_time}, #{unix_time} );"
connection.execute(sql)
#如果使用trustie提供的服务器需要多增加一条授权信息
if current_user.ci_cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_TRUSTIE
trustie_drone_config = trustie_drone_server_config
admin_application_id = trustie_drone_config[:admin_application_id]
sql = "REPLACE INTO oauth2_grant ( user_id, application_id, counter, created_unix, updated_unix ) VALUES ( #{current_user.gitea_uid}, #{admin_application_id}, 0, #{unix_time}, #{unix_time} );"
connection.execute(sql)
end
end
def gitea_oauth_grant!(password, oauth)
gitea_auto_create_auth_grant!(oauth&.gitea_oauth_id)
state = SecureRandom.hex(8)
# redirect_uri eg:
# https://localhost:3000/login/oauth/authorize?client_id=94976481-ad0e-4ed4-9247-7eef106007a2&redirect_uri=http%3A%2F%2F121.69.81.11%3A80%2Flogin&response_type=code&state=9cab990b9cfb1805
redirect_uri = CGI.escape("#{@cloud_account.drone_url}/login")
clientId = client_id(oauth)
grant_url = "#{Gitea.gitea_config[:domain]}/login/oauth/authorize?client_id=#{clientId}&redirect_uri=#{redirect_uri}&response_type=code&state=#{state}"
logger.info "[gitea] grant_url: #{grant_url}"
conn = Faraday.new(url: grant_url) do |req|
req.request :url_encoded
req.adapter Faraday.default_adapter
req.basic_auth(current_user.login, password)
end
response = conn.get
logger.info "[gitea] response headers: #{response.headers}"
drone_oauth_user!(response.headers.to_h['location'], state)
end
def drone_oauth_user!(url, state)
logger.info "[drone] drone_oauth_user url: #{url}"
conn = Faraday.new(url: url) do |req|
req.request :url_encoded
req.adapter Faraday.default_adapter
req.headers["cookie"] = "_session_=#{SecureRandom.hex(28)}; _oauth_state_=#{state}"
end
response = conn.get
logger.info "[drone] response headers: #{response.headers}"
response.headers['location'].include?('error') ? false : true
end
private
def devops_params
params.permit(:account, :secret, :ip_num)
end
def client_id(oauth)
#如果是使用trustie服务器使用管理员用户的clientId
if current_user.ci_cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_TRUSTIE
trustie_drone_config = trustie_drone_server_config
return trustie_drone_config[:client_id]
else
return oauth&.client_id
end
end
end

View File

@ -0,0 +1,59 @@
module Ci::DbConnectable
extend ActiveSupport::Concern
included do
end
# Dynamically sets the database connection.
def connect_to_ci_database(options={})
master_db = options[:master_db] || false
config = Rails.application.config_for(:configuration).symbolize_keys!
db_config = config[:ci_db_server].symbolize_keys!
raise 'ci database config missing' if db_config.blank?
req_params = {
host: db_config[:host],
username: db_config[:username],
password: db_config[:password],
port: db_config[:port]
}
db_name = options[:db_name].blank? ? current_user.login : options[:db_name]
req_params = req_params.merge(database: "#{db_name}_#{db_config[:database]}") unless master_db === true
db_params = Ci::Database.get_connection_params(req_params)
@connection = Ci::Database.set_connection(db_params).connection
end
def connect_to_trustie_ci_database(options={})
master_db = options[:master_db] || false
config = Rails.application.config_for(:configuration).symbolize_keys!
db_config = config[:ci_db_server_trustie].symbolize_keys!
raise 'ci database config missing' if db_config.blank?
req_params = {
host: db_config[:host],
username: db_config[:username],
password: db_config[:password],
port: db_config[:port]
}
req_params = req_params.merge(database: "#{db_config[:database]}") unless master_db === true
db_params = Ci::Database.get_connection_params(req_params)
@trustie_db_connection = Ci::Database.set_connection(db_params).connection
end
def auto_create_database!(connection, database)
Rails.logger.info "[CI::DbConnectable] auto_create_database's connection: #{connection}"
connection.execute("CREATE DATABASE IF NOT EXISTS #{database}")
end
def auto_create_table_structure!(connection)
Rails.logger.info "[CI::DbConnectable] auto_create_table_structure's connection: #{connection}"
sqls = Ci::Schema.statement.split(';').map(&:strip).reject { |e| e.to_s.empty? }
sqls.each do |sql|
con_result = connection.execute(sql)
Rails.logger.info "=============> ci create tabels result: #{con_result}"
end
end
end

View File

@ -127,6 +127,8 @@ module LoginHelper
token = config[:sync_token]
api_host = config[:sync_url]
return if api_host.blank?
url = "#{api_host}/api/v1/users/sync_user_token"
sync_json = {
"token": token,

View File

@ -1,12 +1,14 @@
module PaginateHelper
def paginate(objs, **opts)
page = params[:page].to_i <= 0 ? 1 : params[:page].to_i
per_page = params[:per_page].to_i > 0 && params[:per_page].to_i < 50 ? params[:per_page].to_i : opts[:per_page] || 20
if objs.is_a?(Array)
Kaminari.paginate_array(objs).page(page).per(per_page)
def paginate(relation)
limit = params[:limit] || params[:per_page]
limit = (limit.to_i.zero? || limit.to_i > 15) ? 15 : limit.to_i
page = params[:page].to_i.zero? ? 1 : params[:page].to_i
if relation.is_a?(Array)
Kaminari.paginate_array(relation).page(page).per(limit)
else
objs.page(page).per(per_page)
relation.page(page).per(limit)
end
end
end

View File

@ -1,20 +1,22 @@
module RegisterHelper
extend ActiveSupport::Concern
def autologin_register(username, email, password, platform= '')
def autologin_register(username, email, password, platform= 'forge')
result = {message: nil, user: nil}
user = User.new(admin: false, login: username, mail: email, type: "User")
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?
gitea_user = interactor.result
result = Gitea::User::GenerateTokenService.new(username, password).call
result = Gitea::User::GenerateTokenService.call(username, password)
user.gitea_token = result['sha1']
user.gitea_uid = gitea_user['id']
user.gitea_uid = gitea_user[:body]['id']
if user.save!
UserExtension.create!(user_id: user.id)
result[:user] = {id: user.id, token: user.gitea_token}

View File

@ -0,0 +1,19 @@
module Repository::LanguagesPercentagable
extend ActiveSupport::Concern
def languages_precentagable
result = Gitea::Repository::Languages::ListService.call(@owner.login,
@repository.identifier, current_user&.gitea_token)
result[:status] === :success ? hash_transform_precentagable(result[:body]) : nil
end
# hash eq:{"JavaScript": 301681522,"Ruby": 1444004,"Roff": 578781}
def hash_transform_precentagable(hash)
total_byte_size = hash.values.sum
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

@ -4,18 +4,18 @@ class HooksController < ApplicationController
before_action :check_user
before_action :set_repository
def index
hooks_response = Gitea::Hooks::ListService.new(@user, @repository.try(:identifier)).call
if hooks_response.status == 200
def index
hooks_response = Gitea::Hooks::ListService.new(@user.gitea_token, @user.login, @repository.try(:identifier)).call
if hooks_response.status == 200
lists = JSON.parse(hooks_response.body)
@hooks_size = lists.size
@hooks = paginate(lists)
else
else
normal_status(-1, "出现错误")
end
end
def create
def create
#根据gitea的api
# hook_params = {
# active: true,
@ -36,17 +36,17 @@ class HooksController < ApplicationController
# content_type: params[:content_type].to_i,
# secret: params[:secret],
# events: {
# push_only: params[:push_only] || false, # 是否为推送事件
# send_everything: params[:send_everything] || false, #是否为所有事件
# push_only: params[:push_only] || false, # 是否为推送事件
# send_everything: params[:send_everything] || false, #是否为所有事件
# choose_events: params[:choose_events] || false, #是否为自定义事件
# branch_filter: params[:branch_filter] || "*",
# events: {
# create: params[:create] || false, #创建分支/标签
# delete: params[:delete] || false, #删除分支/标签
# fork: params[:fork] || false, #仓库被派生
# delete: params[:delete] || false, #删除分支/标签
# fork: params[:fork] || false, #仓库被派生
# issues: params[:issues] || false, #工单
# issue_comment: params[:issue_comment] || false, #评论
# push: params[:push] || false # 推送
# issue_comment: params[:issue_comment] || false, #评论
# push: params[:push] || false # 推送
# pull_request: params[:pull_request] || false #合并请求
# repository: params[:repository] || false #仓库
# release: params[:release] || false #版本发布
@ -58,28 +58,28 @@ class HooksController < ApplicationController
Gitea::Hooks::CreateService.new(@user, @repository.try(:identifier), hook_params).call #创建gitea的hook功能
Gitea::Hooks::CreateService.new(user, p.try(:identifier), hook_params).call #创建gitea的hook功能
end
end
def update
def update
hook_params = params[:hook_params]
response = Gitea::Hooks::UpdateService.new(@user, @repository.try(:identifier), hook_params, params[:id]).call
if response.status == 200
if response.status == 200
normal_status(1, "更新成功")
else
else
normal_status(-1, "更新失败")
end
end
end
def destroy
def destroy
response = Gitea::Hooks::DestroyService.new(@user, @repository.try(:identifier), params[:id]).call
if response.status == 204
normal_status(1, "删除成功")
else
else
normal_status(-1, "删除失败")
end
end
end
private
private
def set_repository
@repository = @project.repository
@ -88,9 +88,9 @@ class HooksController < ApplicationController
normal_status(-1, "用户不存在") unless @user.present?
end
def check_user
unless @project.user_id == current_user.id
tip_exception(403, "您没有权限进入")
def check_user
unless @project.user_id == current_user.id
tip_exception(403, "您没有权限进入")
end
end
end

View File

@ -6,12 +6,13 @@ class IssuesController < ApplicationController
before_action :check_project_public, only: [:index ,:show, :copy, :index_chosen, :close_issue]
before_action :set_issue, only: [:edit, :update, :destroy, :show, :copy, :close_issue, :lock_issue]
before_action :get_branches, only: [:new, :edit]
before_action :check_token_enough, only: [:create, :update]
include ApplicationHelper
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
@ -96,8 +97,7 @@ class IssuesController < ApplicationController
end
def new
@all_branches = get_branches
@issue_chosen = issue_left_chosen(@project, nil)
@issue_chosen = get_associated_data(@project)
end
def create
@ -105,9 +105,6 @@ class IssuesController < ApplicationController
normal_status(-1, "标题不能为空")
elsif params[:subject].to_s.size > 255
normal_status(-1, "标题不能超过255个字符")
elsif (params[:issue_type].to_s == "2")
return normal_status(-1, "悬赏的奖金必须大于0") if params[:token].to_i == 0
else
issue_params = issue_send_params(params)
@ -136,25 +133,30 @@ class IssuesController < ApplicationController
tiding_type: 'issue', status: 0)
end
#为悬赏任务时, 扣除当前用户的积分
if params[:issue_type].to_s == "2"
post_to_chain("minus", params[:token].to_i, current_user.try(:login))
end
@issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
# normal_status(0, "创建成功",)
render :json => { status: 0, message: "创建成功", id: @issue.id}
render json: {status: 0, message: "创建成", id: @issue.id}
else
normal_status(-1, "创建失败")
end
end
end
def edit
# @all_branches = get_branches
# @issue_chosen = issue_left_chosen(@project, @issue.id)
@cannot_edit_tags = @issue.issue_type=="2" && @issue.status_id == 5 #悬赏任务已解决且关闭的状态下,不能修改
@issue_attachments = @issue.attachments
end
def update
issue_params = issue_send_params(params).except(:issue_classify, :author_id, :project_id)
return normal_status(-1, "您没有权限修改token") if @issue.will_save_change_to_token? && @issue.user_id != current_user&.id
last_token = @issue.token
last_status_id = @issue.status_id
if params[:issue_tag_ids].present? && !@issue&.issue_tags_relates.where(issue_tag_id: params[:issue_tag_ids]).exists?
@issue&.issue_tags_relates&.destroy_all
params[:issue_tag_ids].each do |tag|
@ -162,23 +164,22 @@ class IssuesController < ApplicationController
end
end
if @issue.update_attributes(issue_params)
issue_files = params[:attachment_ids]
change_files = false
issue_file_ids = []
issue_files = params[:attachment_ids]
change_files = false
issue_file_ids = []
if issue_files.present?
change_files = true
issue_files.each do |id|
attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id)
unless attachment.blank?
attachment.container = @issue
attachment.author_id = current_user.id
attachment.description = ""
attachment.save
end
if issue_files.present?
change_files = true
issue_files.each do |id|
attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id)
unless attachment.blank?
attachment.container = @issue
attachment.author_id = current_user.id
attachment.description = ""
attachment.save
end
end
end
# if params[:issue_tag_ids].present?
# issue_current_tags = @issue&.issue_tags&.select(:id)&.pluck(:id)
@ -194,17 +195,36 @@ class IssuesController < ApplicationController
# end
# end
if params[:status_id].to_i == 5
@issue.issue_times.update_all(end_time: Time.now)
# @issue.update_closed_issues_count_in_project! #已经有after_update方法了这里就不需要了
end
@issue.create_journal_detail(change_files, issue_files, issue_file_ids, current_user&.id)
normal_status(0, "更新成功")
if @issue.issue_type.to_s == "2" && params[:status_id].to_i == 5 && @issue.author_id != current_user.try(:id)
normal_status(-1, "不允许修改为关闭状态")
else
normal_status(-1, "更新失败")
end
issue_params = issue_send_params(params).except(:issue_classify, :author_id, :project_id)
if @issue.update_attributes(issue_params)
if params[:status_id].to_i == 5 #任务由非关闭状态到关闭状态时
@issue.issue_times.update_all(end_time: Time.now)
@issue.update_closed_issues_count_in_project!
if @issue.issue_type.to_s == "2" && last_status_id != 5
if @issue.assigned_to_id.present? && last_status_id == 3 #只有当用户完成100%时才给token
post_to_chain("add", @issue.token, @issue.get_assign_user.try(:login))
else
post_to_chain("add", @issue.token, @issue.user.try(:login))
end
end
end
if @issue.issue_type.to_s == "2" && @issue.status_id != 5 && @issue.saved_change_to_attribute("token")
#表示修改token值
change_token = last_token - @issue.token
change_type = change_token > 0 ? "add" : "minus"
post_to_chain(change_type, change_token.abs, current_user.try(:login))
end
@issue.create_journal_detail(change_files, issue_files, issue_file_ids, current_user&.id)
normal_status(0, "更新成功")
else
normal_status(-1, "更新失败")
end
end
end
def show
@ -224,17 +244,32 @@ class IssuesController < ApplicationController
end
def destroy
if @issue.destroy
normal_status(0, "删除成功")
else
begin
issue_type = @issue.issue_type
status_id = @issue.status_id
token = @issue.token
login = @issue.user.try(:login)
if @issue.destroy
if issue_type == "2" && status_id != 5
post_to_chain("add", token, login)
end
normal_status(0, "删除成功")
else
normal_status(-1, "删除失败")
end
rescue => exception
Rails.logger.info("#########_______exception.message_________##########{exception.message}")
normal_status(-1, "删除失败")
else
end
end
def clean
#批量删除,暂时只能删除未悬赏的
issue_ids = params[:ids]
if issue_ids.present?
if Issue.where(id: issue_ids).destroy_all
if Issue.where(id: issue_ids, issue_type: "1").destroy_all
normal_status(0, "删除成功")
else
normal_status(-1, "删除失败")
@ -306,6 +341,9 @@ class IssuesController < ApplicationController
if type == 5
@issue&.project_trends&.update_all(action_type: "close")
@issue.issue_times.update_all(end_time: Time.now)
if @issue.issue_type.to_s == "2"
post_to_chain("add", @issue.token, @issue.get_assign_user.try(:login))
end
if @issue.issue_classify.to_s == "pull_request"
@issue&.pull_request&.update_attribute(:status, 2)
end
@ -399,17 +437,6 @@ class IssuesController < ApplicationController
tracker_array
end
def get_branches
all_branches = []
get_all_branches = Gitea::Repository::Branches::ListService.new(@user, @project&.repository.try(:identifier)).call
if get_all_branches && get_all_branches.size > 0
get_all_branches.each do |b|
all_branches.push(b["name"])
end
end
all_branches
end
def issue_send_params(params)
{
subject: params[:subject],
@ -434,4 +461,32 @@ class IssuesController < ApplicationController
project_id: @project.id
}
end
def post_to_chain(type, amount,login)
change_params = {
type: type,
chain_params: {
amount: amount,
reponame: @project.try(:identifier),
username: login
}
}
PostChainJob.perform_later(change_params)
end
def check_token_enough
if params[:issue_type].to_s == "2" && (@issue.blank? || (@issue.present? && @issue.author_id == current_user.try(:id)))
return normal_status(-1, "悬赏的奖金必须大于0") if params[:token].to_i == 0
query_params = {
type: "query",
chain_params: {
reponame: @project.try(:identifier),
username: current_user.try(:login)
}
}
response = Gitea::Chain::ChainGetService.new(query_params).call
return normal_status(-1, "获取token失败请稍后重试") if response.status != 200
return normal_status(-1, "您的token值不足") if JSON.parse(response.body)["balance"].to_i < params[:token].to_i
end
end
end

View File

@ -2,7 +2,7 @@ class MainController < ApplicationController
protect_from_forgery except: :index
skip_before_action :check_sign
skip_before_action :user_setup
# skip_before_action :setup_laboratory
skip_before_action :setup_laboratory
def first_stamp
render :json => { status: 0, message: Time.now.to_i }

View File

@ -0,0 +1,34 @@
class Organizations::BaseController < ApplicationController
include ApplicationHelper
include PaginateHelper
protected
def can_edit_org?
current_user.admin? || @organization.is_owner?(current_user.id)
end
def check_user_can_edit_org
tip_exception("您没有权限进行该操作") unless can_edit_org?
end
def org_limited_condition
@organization.organization_extension.limited? && !current_user.logged?
end
def org_privacy_condition
@organization.organization_extension.privacy? && @organization.organization_users.where(user_id: current_user.id).blank?
end
def team_not_found_condition
@team.team_users.where(user_id: current_user.id).blank? && !@organization.is_owner?(current_user.id)
end
def user_mark
params[:username] || params[:id]
end
def project_mark
params[:repo_name] || params[:id]
end
end

View File

@ -0,0 +1,57 @@
class Organizations::OrganizationUsersController < Organizations::BaseController
before_action :load_organization
before_action :load_operate_user, :load_organization_user, :check_user_can_edit_org, only: [:destroy]
def index
@organization_users = @organization.organization_users.includes(:user)
search = params[:search].to_s.downcase
@organization_users = @organization_users.joins(:user).where("LOWER(CONCAT_WS(users.lastname, users.firstname, users.login, users.mail)) LIKE ?", "%#{search.split(" ").join('|')}%") if search.present?
@organization_users = kaminari_paginate(@organization_users)
end
def destroy
tip_exception("您不能从所有者团队中删除最后一个用户") if @organization.is_owner_team_last_one?(@operate_user.id)
ActiveRecord::Base.transaction do
@organization_user.destroy!
TeamUser.where(organization_id: @organization.id, user_id: @operate_user.id).map{|u| u.destroy!}
Gitea::Organization::OrganizationUser::DeleteService.call(@organization.gitea_token, @organization.login, @operate_user.login)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def quit
@organization_user = @organization.organization_users.find_by(user_id: current_user.id)
tip_exception("您不在该组织中") if @organization_user.nil?
tip_exception("您不能从所有者团队中删除最后一个用户") if @organization.is_owner_team_last_one?(current_user.id)
ActiveRecord::Base.transaction do
@organization_user.destroy!
TeamUser.where(organization_id: @organization.id, user_id: current_user.id).map{|u| u.destroy!}
Gitea::Organization::OrganizationUser::DeleteService.call(@organization.gitea_token, @organization.login, current_user.login)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def load_organization
@organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def load_operate_user
@operate_user = User.find_by(login: user_mark) if user_mark.present?
tip_exception("平台用户不存在") if @operate_user.nil?
end
def load_organization_user
@organization_user = OrganizationUser.find_by(organization_id: @organization.id, user_id: @operate_user.id)
tip_exception("组织成员不存在") if @organization_user.nil?
end
end

View File

@ -0,0 +1,106 @@
class Organizations::OrganizationsController < Organizations::BaseController
before_action :require_login, except: [:index, :show]
before_action :convert_image!, only: [:create, :update]
before_action :load_organization, only: [:show, :update, :destroy]
before_action :check_user_can_edit_org, only: [:update, :destroy]
def index
if current_user.logged?
logged_organizations_sql = Organization.with_visibility(%w(common limited)).to_sql
privacy_organizations_sql = Organization.with_visibility("privacy").joins(:organization_users).where(organization_users: {user_id: current_user.id}).to_sql
@organizations = Organization.from("( #{ logged_organizations_sql } UNION #{ privacy_organizations_sql } ) AS users")
else
@organizations = Organization.with_visibility("common")
end
@organizations = @organizations.ransack(login_cont: params[:search]).result if params[:search].present?
@organizations = @organizations.includes(:organization_extension).order("organization_extensions.#{sort_by} #{sort_direction}")
@organizations = kaminari_paginate(@organizations)
end
def show
@can_create_project = @organization.can_create_project?(current_user.id)
@is_admin = can_edit_org?
@is_member = @organization.is_member?(current_user.id)
end
def create
ActiveRecord::Base.transaction do
@organization = Organizations::CreateService.call(current_user, organization_params)
Util.write_file(@image, avatar_path(@organization)) if params[:image].present?
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def update
ActiveRecord::Base.transaction do
login = @organization.login
@organization.update!(login: organization_params[:name]) if organization_params[:name].present?
@organization.organization_extension.update_attributes!(organization_params.except(:name))
Gitea::Organization::UpdateService.call(@organization.gitea_token, login, @organization.reload)
Util.write_file(@image, avatar_path(@organization)) if params[:image].present?
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def destroy
tip_exception("密码不正确") unless current_user.check_password?(password)
ActiveRecord::Base.transaction do
Gitea::Organization::DeleteService.call(@organization.gitea_token, @organization.login)
@organization.destroy!
end
render_ok
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def convert_image!
return unless params[:image].present?
max_size = EduSetting.get('upload_avatar_max_size') || 2 * 1024 * 1024 # 2M
if params[:image].class == ActionDispatch::Http::UploadedFile
@image = params[:image]
render_error('请上传文件') if @image.size.zero?
render_error('文件大小超过限制') if @image.size > max_size.to_i
else
image = params[:image].to_s.strip
return render_error('请上传正确的图片') if image.blank?
@image = Util.convert_base64_image(image, max_size: max_size.to_i)
end
rescue Base64ImageConverter::Error => ex
render_error(ex.message)
end
def avatar_path(organization)
ApplicationController.helpers.disk_filename(organization.class, organization.id)
end
def organization_params
params.permit(:name, :description, :website, :location,
:repo_admin_change_team_access, :visibility,
:max_repo_creation)
end
def password
params.fetch(:password, "")
end
def load_organization
@organization = Organization.find_by(login: params[:id]) || Organization.find_by(id: params[:id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def sort_by
params.fetch(:sort_by, "created_at")
end
def sort_direction
params.fetch(:sort_direction, "desc")
end
end

View File

@ -0,0 +1,45 @@
class Organizations::ProjectsController < Organizations::BaseController
before_action :load_organization
def index
public_projects_sql = @organization.projects.where(is_public: true).to_sql
private_projects_sql = @organization.projects
.where(is_public: false)
.joins(team_projects: {team: :team_users})
.where(team_users: {user_id: current_user.id}).to_sql
@projects = Project.from("( #{ public_projects_sql} UNION #{ private_projects_sql } ) AS projects")
@projects = @projects.ransack(name_or_identifier_cont: params[:search]).result if params[:search].present?
@projects = @projects.includes(:owner).order("projects.#{sort} #{sort_direction}")
@projects = paginate(@projects)
end
def search
tip_exception("请输入搜索关键词") if params[:search].nil?
public_projects_sql = @organization.projects.where(is_public: true).to_sql
private_projects_sql = @organization.projects
.where(is_public: false)
.joins(team_projects: {team: :team_users})
.where(team_users: {user_id: current_user.id}).to_sql
@projects = Project.from("( #{ public_projects_sql} UNION #{ private_projects_sql } ) AS projects")
@projects = @projects.ransack(name_or_identifier_cont: params[:search]).result
@projects = @projects.includes(:owner).order("projects.#{sort} #{sort_direction}")
end
private
def load_organization
@organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def sort
params.fetch(:sort_by, "updated_on")
end
def sort_direction
params.fetch(:sort_direction, "desc")
end
end

View File

@ -0,0 +1,58 @@
class Organizations::TeamProjectsController < Organizations::BaseController
before_action :load_organization
before_action :load_team
before_action :load_operate_project, :check_user_can_edit_org, only: [:create, :destroy]
before_action :load_team_project, only: [:destroy]
def index
@team_projects = @team.team_projects
@team_projects = paginate(@team_projects)
end
def create
tip_exception("该组织团队项目包括组织所有项目,不允许更改") if @team.includes_all_project
ActiveRecord::Base.transaction do
@team_project = TeamProject.build(@organization.id, @team.id, @operate_project.id)
Gitea::Organization::TeamProject::CreateService.call(@organization.gitea_token, @team.gtid, @organization.login, @operate_project.identifier)
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def destroy
tip_exception("该组织团队项目包括组织所有项目,不允许更改") if @team.includes_all_project
ActiveRecord::Base.transaction do
@team_project.destroy!
Gitea::Organization::TeamProject::DeleteService.call(@organization.gitea_token, @team.gtid, @organization.login, @operate_project.identifier)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def load_organization
@organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def load_team
@team = Team.find_by_id(params[:team_id])
return render_not_found("组织团队不存在") if @team.nil?
return render_forbidden("没有查看组织团队的权限") if team_not_found_condition
end
def load_operate_project
@operate_project = Project.find_by(id: project_mark) || Project.find_by(identifier: project_mark)
tip_exception("项目不存在") if @operate_project.nil?
end
def load_team_project
@team_project = TeamProject.find_by(organization_id: @organization.id, team_id: @team.id, project_id: @operate_project.id)
tip_exception("组织团队项目不存在") if @team_project.nil?
end
end

View File

@ -0,0 +1,76 @@
class Organizations::TeamUsersController < Organizations::BaseController
before_action :load_organization, :load_team
before_action :load_operate_user, only: [:create, :destroy]
before_action :load_team_user, only: [:destroy]
before_action :check_user_can_edit_org, only: [:create, :destroy]
def index
@team_users = @team.team_users.includes(:user)
search = params[:search].to_s.downcase
@team_users = @team_users.joins(:user).where("LOWER(CONCAT_WS(users.lastname, users.firstname, users.login, users.mail, users.nickname)) LIKE ?", "%#{search.split(" ").join('|')}%") if search.present?
@team_users = kaminari_paginate(@team_users)
end
def create
ActiveRecord::Base.transaction do
@team_user = TeamUser.build(@organization.id, @operate_user.id, @team.id)
@organization_user = OrganizationUser.build(@organization.id, @operate_user.id)
Gitea::Organization::TeamUser::CreateService.call(@organization.gitea_token, @team.gtid, @operate_user.login)
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def destroy
tip_exception("您不能从所有者团队中删除最后一个用户") if @team.owner? && @organization.is_owner_team_last_one?(@operate_user.id)
ActiveRecord::Base.transaction do
@team_user.destroy!
Gitea::Organization::TeamUser::DeleteService.call(@organization.gitea_token, @team.gtid, @operate_user.login)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def quit
@team_user = @team.team_users.find_by(user_id: current_user.id)
tip_exception("您不在该组织团队中") if @team_user.nil?
tip_exception("您不能从所有者团队中删除最后一个用户") if @team.owner? && @organization.is_owner_team_last_one?(current_user.id)
ActiveRecord::Base.transaction do
@team_user.destroy!
Gitea::Organization::TeamUser::DeleteService.call(@organization.gitea_token, @team.gtid, current_user.login)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def load_organization
@organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def load_team
@team = Team.find_by_id(params[:team_id])
return render_not_found("组织团队不存在") if @team.nil?
return render_forbidden("没有查看组织团队的权限") if team_not_found_condition
end
def load_operate_user
@operate_user = User.find_by(login: user_mark) if user_mark.present?
tip_exception("平台用户不存在") if @operate_user.nil?
end
def load_team_user
@team_user = TeamUser.find_by(team_id: @team.id, user_id: @operate_user.id)
tip_exception("组织团队成员不存在") if @team_user.nil?
end
end

View File

@ -0,0 +1,77 @@
class Organizations::TeamsController < Organizations::BaseController
before_action :load_organization
before_action :load_team, only: [:show, :update, :destroy]
before_action :check_user_can_edit_org, only: [:create, :update, :destroy]
def index
#if @organization.is_owner?(current_user) || current_user.admin?
@teams = @organization.teams
#else
# @teams = @organization.teams.joins(:team_users).where(team_users: {user_id: current_user.id})
#end
@is_admin = can_edit_org?
@teams = @teams.includes(:team_units, :team_users)
@teams = kaminari_paginate(@teams)
end
def search
tip_exception("请输入搜索关键词") if params[:search].nil?
if @organization.is_owner?(current_user) || current_user.admin?
@teams = @organization.teams
else
@teams = @organization.teams.joins(:team_users).where(team_users: {user_id: current_user.id})
end
@is_admin = can_edit_org?
@teams = @teams.ransack(name_cont: params[:search]).result if params[:search].present?
@teams = @teams.includes(:team_units, :team_users)
end
def show
@is_admin = can_edit_org?
@is_member = @team.is_member?(current_user.id)
end
def create
@team = Organizations::Teams::CreateService.call(current_user, @organization, team_params)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def update
@team = Organizations::Teams::UpdateService.call(current_user, @team, team_params)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def destroy
tip_exception("组织团队不允许被删除") if @team.owner?
ActiveRecord::Base.transaction do
Gitea::Organization::Team::DeleteService.call(@organization.gitea_token, @team.gtid)
@team.destroy!
end
render_ok
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def team_params
params.permit(:name, :description, :authorize, :includes_all_project, :can_create_org_project, :unit_types => [])
end
def load_organization
@organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def load_team
@team = Team.find_by_id(params[:id])
return render_not_found("组织团队不存在") if @team.nil?
return render_forbidden("没有查看组织团队的权限") if team_not_found_condition
end
end

View File

@ -0,0 +1,12 @@
class OwnersController < ApplicationController
before_action :require_login
def index
@owners = []
@owners += [current_user]
@owners += Organization.joins(team_users: :team)
.where(team_users: {user_id: current_user.id},
teams: {can_create_org_project: true})
.distinct
end
end

View File

@ -40,8 +40,5 @@ class PraiseTreadController < ApplicationController
end
private
def render_result
end
end

View File

@ -6,12 +6,8 @@ class ProjectCategoriesController < ApplicationController
end
def group_list
# if current_user&.logged?
# projects = Project.list_user_projects(current_user.id)
# else
# projects = Project.visible
# end
projects = Project.no_anomory_projects.visible
@category_group_list = projects.joins(:project_category).group("project_categories.id", "project_categories.name").size
@project_categories = ProjectCategory.where('projects_count > 0').order(projects_count: :desc)
# projects = Project.no_anomory_projects.visible
# @category_group_list = projects.joins(:project_category).group("project_categories.id", "project_categories.name").size
end
end

View File

@ -0,0 +1,24 @@
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

@ -0,0 +1,47 @@
class Projects::TeamsController < Projects::BaseController
before_action :load_operate_team, only: [:create, :destroy]
before_action :load_team_project, only: :destroy
def index
if @project.owner.is_a?(Organization)
@teams = Team.joins(:team_projects).where(team_projects: {project_id: @project.id})
else
@teams = Team.none
end
@teams = paginate(@teams)
end
def create
ActiveRecord::Base.transaction do
@team_project = TeamProject.build(@owner.id, @operate_team.id, @project.id)
Gitea::Organization::TeamProject::CreateService.call(@owner.gitea_token, @operate_team.gtid, @owner.login, @project.identifier)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def destroy
ActiveRecord::Base.transaction do
@team_project.destroy!
Gitea::Organization::TeamProject::DeleteService.call(@owner.gitea_token, @operate_team.gtid, @owner.login, @project.identifier)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def load_operate_team
@operate_team = Team.find_by(id: params[:team_id]) || Team.find_by(id: params[:id])
tip_exception("项目不存在") if @operate_team.nil?
tip_exception("该组织团队拥有组织所有项目,无法进行操作") if @operate_team.includes_all_project
end
def load_team_project
@team_project = TeamProject.find_by(organization_id: @owner.id, team_id: @operate_team.id, project_id: @project.id)
tip_exception("组织团队项目不存在") if @team_project.nil?
end
end

View File

@ -2,16 +2,41 @@ 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]
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 :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)
@projects = kaminari_paginate(scope)
@total_count = @projects.total_count
# @projects = kaminari_paginate(scope)
@projects = paginate scope.includes(:project_category, :project_language, :repository, :project_educoder, :owner)
category_id = params[:category_id]
@total_count =
if category_id.blank?
ps = ProjectStatistic.first
ps.common_projects_count + ps.mirror_projects_count unless ps.blank?
else
cate = ProjectCategory.find_by(id: category_id)
cate&.projects_count || 0
end
end
def create
@ -34,26 +59,41 @@ class ProjectsController < ApplicationController
end
def branches
@branches = Gitea::Repository::Branches::ListService.new(@project.owner, @project.identifier).call
@branches = @project.forge? ? Gitea::Repository::Branches::ListService.new(@owner, @project.identifier).call : []
end
def group_type_list
# if current_user&.logged?
# projects = Project.list_user_projects(current_user.id)
# else
# projects = Project.visible
# end
projects = Project.no_anomory_projects.visible
@project_group_list = projects.group(:project_type).size
project_statics = ProjectStatistic.first
@project_statics_list = [
{
project_type: 'common',
name: '开源托管项目',
projects_count: project_statics&.common_projects_count || 0
},
{
project_type: 'mirror',
name: '开源镜像项目',
projects_count: project_statics&.mirror_projects_count || 0
}
]
# projects = Project.no_anomory_projects.visible
# @project_group_list = projects.group(:project_type).size
end
def update
ActiveRecord::Base.transaction do
# Projects::CreateForm.new(project_params).validate!
private = params[:private]
gitea_params = {
private: private,
default_branch: params[:default_branch],
website: params[:website]
}
if [true, false].include? private
new_project_params = project_params.merge(is_public: !private)
Gitea::Repository::UpdateService.new(@project.owner, @project.repository.identifier, {private: private}).call
new_project_params = project_params.except(:private).merge(is_public: !private)
Gitea::Repository::UpdateService.call(@owner, @project.identifier, gitea_params)
@project.repository.update_column(:hidden, private)
end
@project.update_attributes!(new_project_params)
@ -100,11 +140,11 @@ class ProjectsController < ApplicationController
end
def simple
json_response(@project)
json_response(@project, current_user)
end
def recommend
@projects = Project.recommend.includes(:repository, :project_category, owner: :user_extension).limit(5)
@projects = Project.recommend.includes(:repository, :project_category, :owner).limit(5)
end
def about
@ -138,8 +178,8 @@ class ProjectsController < ApplicationController
private
def project_params
params.permit(:user_id, :name, :description, :repository_name,
:project_category_id, :project_language_id, :license_id, :ignore_id)
params.permit(:user_id, :name, :description, :repository_name, :website,
:project_category_id, :project_language_id, :license_id, :ignore_id, :private)
end
def mirror_params

View File

@ -0,0 +1,43 @@
class ProtectedBranchesController < ApplicationController
include OperateProjectAbilityAble
before_action :require_login
before_action :load_repository
before_action :authorizate_user_can_edit_project!
def index
scope = @repository.protected_branches
@total_count = scope.size
@protected_branches = paginate(scope)
end
def create
@protected_branch = ProtectedBranches::CreateService.call(@repository, @owner, params)
render_protected_branch_json
end
def update
@protected_branch = ProtectedBranches::UpdateService.call(@repository, @owner, params)
end
def destroy
ProtectedBranches::DestroyService.call(@repository, @owner, params[:branch_name])
render_ok
end
def show
@protected_branch = ProtectedBranches::GetService.call(@repository, @owner, params)
end
def edit
@branch, @protected_branch = ProtectedBranches::EditService.call(@repository, @owner, params[:branch_name])
end
private
def render_protected_branch_json
@protected_branch.persisted? ? @protected_branch : render_error('创建失败!')
end
end

View File

@ -1,14 +1,14 @@
class PullRequestsController < ApplicationController
before_action :require_login, except: [:index, :show]
before_action :require_login, except: [:index, :show, :files, :commits]
before_action :load_repository
before_action :set_user, only: [:new, :get_branches]
before_action :find_pull_request, except: [:index, :new, :create, :check_can_merge,:get_branches,:create_merge_infos]
# before_action :get_relatived, only: [:edit]
before_action :find_pull_request, except: [:index, :new, :create, :check_can_merge,:get_branches,:create_merge_infos, :files, :commits]
before_action :load_pull_request, only: [:files, :commits]
include TagChosenHelper
include ApplicationHelper
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))
@ -24,11 +24,11 @@ class PullRequestsController < ApplicationController
end
def new
@all_branches = PullRequests::BranchesService.new(@user, @project).call
@all_branches = Branches::ListService.call(@owner, @project)
@is_fork = @project.forked_from_project_id.present?
@projects_names = [{
project_user_login: @user.try(:login),
project_name: "#{@user.try(:show_real_name)}/#{@repository.try(:identifier)}",
project_user_login: @owner.try(:login),
project_name: "#{@owner.try(:show_real_name)}/#{@repository.try(:identifier)}",
project_id: @project.identifier,
id: @project.id
}]
@ -45,64 +45,20 @@ class PullRequestsController < ApplicationController
end
def get_branches
branch_result = PullRequests::BranchesService.new(@user, @project).call
branch_result = Branches::ListService.call(@owner, @project)
render json: branch_result
# return json: branch_result
end
def create
if params[:title].nil?
normal_status(-1, "名称不能为空")
elsif params[:issue_tag_ids].nil?
normal_status(-1, "标签不能为空")
else
ActiveRecord::Base.transaction do
begin
merge_params
pull_issue = Issue.new(@issue_params)
if pull_issue.save!
pr_params = {
user_id: current_user.try(:id),
project_id: @project.id,
issue_id: pull_issue.id,
fork_project_id: params[:fork_project_id],
is_original: params[:is_original]
}
local_requests = PullRequest.new(@local_params.merge(pr_params))
if local_requests.save
remote_pr_params = @local_params
remote_pr_params = remote_pr_params.merge(head: "#{params[:merge_user_login]}:#{params[:head]}").compact if local_requests.is_original && params[:merge_user_login]
gitea_request = Gitea::PullRequest::CreateService.call(current_user.try(:gitea_token), @project.owner, @repository.try(:identifier), remote_pr_params.except(:milestone))
if gitea_request && local_requests.update_attributes(gpid: gitea_request["number"])
if params[:issue_tag_ids].present?
params[:issue_tag_ids].each do |tag|
IssueTagsRelate.create!(issue_id: pull_issue.id, issue_tag_id: tag)
end
end
if params[:assigned_to_id].present?
Tiding.create!(user_id: params[:assigned_to_id], trigger_user_id: current_user.id,
container_id: local_requests.id, container_type: 'PullRequest',
parent_container_id: @project.id, parent_container_type: "Project",
tiding_type: 'pull_request', status: 0)
end
local_requests.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
if params[:title].to_s.include?("WIP:")
pull_issue.custom_journal_detail("WIP", "", "这个合并请求被标记为尚未完成的工作。完成后请从标题中移除WIP:前缀。", current_user&.id)
end
# render :json => { status: 0, message: "PullRequest创建成功", id: pull_issue.id}
normal_status(0, "PullRequest创建成功")
else
normal_status(-1, "PullRequest创建失败")
end
else
normal_status(-1, "PullRequest创建失败")
end
end
rescue => e
normal_status(-1, e.message)
raise ActiveRecord::Rollback
end
ActiveRecord::Base.transaction do
@pull_request, @gitea_pull_request = PullRequests::CreateService.call(current_user, @owner, @project, params)
if @gitea_pull_request[:status] == :success
@pull_request.bind_gitea_pull_request!(@gitea_pull_request[:body]["number"])
render_ok
else
render_error("create pull request error: #{@gitea_pull_request[:status]}")
raise ActiveRecord::Rollback
end
end
end
@ -132,8 +88,10 @@ class PullRequestsController < ApplicationController
if @issue.update_attributes(@issue_params)
if @pull_request.update_attributes(@local_params.compact)
gitea_request = Gitea::PullRequest::UpdateService.new(@project.owner, @repository.try(:identifier), @requests_params, @pull_request.try(:gpid)).call
if gitea_request
gitea_pull = Gitea::PullRequest::UpdateService.call(@owner.login, @repository.identifier,
@pull_request.gpid, @requests_params, current_user.gitea_token)
if gitea_pull[:status] === :success
if params[:issue_tag_ids].present?
params[:issue_tag_ids].each do |tag|
IssueTagsRelate.create(issue_id: @issue.id, issue_tag_id: tag)
@ -162,9 +120,8 @@ class PullRequestsController < ApplicationController
def refuse_merge
ActiveRecord::Base.transaction do
begin
@pull_request.update(status: 2)
@pull_request.issue.update(status_id: 5)
normal_status(1, "已拒绝")
colsed = PullRequests::CloseService.call(@owner, @repository, @pull_request, current_user)
colsed === true ? normal_status(1, "已拒绝") : normal_status(-1, '合并失败')
rescue => e
normal_status(-1, e.message)
raise ActiveRecord::Rollback
@ -190,15 +147,10 @@ class PullRequestsController < ApplicationController
else
ActiveRecord::Base.transaction do
begin
requests_params = {
Do: params[:do],
MergeMessageField: params[:body],
MergeTitleField: params[:title]
}
merge_pr = Gitea::PullRequest::MergeService.call(current_user.gitea_token, @project.owner.login,
@repository.try(:identifier), @pull_request.try(:gpid), requests_params)
if @pull_request.update_attribute(:status, 1) && merge_pr[:status].to_i == 200
@pull_request&.project_trends&.update_all(action_type: "close")
result = PullRequests::MergeService.call(@owner, @repository, @pull_request, current_user, params)
if result && @pull_request.merge!
@pull_request.project_trend_status!
@issue&.custom_journal_detail("merge", "", "该合并请求已被合并", current_user&.id)
normal_status(1, "合并成功")
else
@ -222,11 +174,11 @@ class PullRequestsController < ApplicationController
elsif target_head === target_base && !is_original
normal_status(-2, "分支内容相同,无需创建合并请求")
else
can_merge = @project&.pull_requests.where(user_id: current_user&.id, head: target_head, base: target_base, status: 0, is_original: is_original, fork_project_id: params[:fork_project_id])
can_merge = @project&.pull_requests.where(head: target_head, base: target_base, status: 0, is_original: is_original, fork_project_id: params[:fork_project_id])
if can_merge.present?
render json: {
status: -2,
message: "在这些分支之间的合并请求已存在:<a href='/projects/#{@project.id}/merge/#{can_merge.first.id}/Messagecount''>#{can_merge.first.try(:title)}</a>",
message: "在这些分支之间的合并请求已存在:<a href='/projects/#{@owner.login}/#{@project.identifier}/pulls/#{can_merge.first.id}/Messagecount''>#{can_merge.first.try(:title)}</a>",
}
else
normal_status(0, "可以合并")
@ -235,9 +187,19 @@ class PullRequestsController < ApplicationController
end
def files
@files_result = Gitea::PullRequest::FilesService.call(@owner.login, @project.identifier, @pull_request.gpid, current_user&.gitea_token)
# render json: @files_result
end
def commits
@commits_result = Gitea::PullRequest::CommitsService.call(@owner.login, @project.identifier, @pull_request.gpid, current_user&.gitea_token)
# render json: @commits_result
end
private
def set_user
@user = @project.owner
def load_pull_request
@pull_request = PullRequest.find params[:id]
end
def find_pull_request
@ -267,7 +229,8 @@ class PullRequestsController < ApplicationController
}
@requests_params = @local_params.merge({
assignee: current_user.try(:login),
assignees: ["#{params[:assigned_login].to_s}"],
# assignees: ["#{params[:assigned_login].to_s}"],
assignees: ["#{current_user.try(:login).to_s}"],
labels: params[:issue_tag_ids],
due_date: Time.now
})

View File

@ -1,19 +1,40 @@
class RepositoriesController < ApplicationController
include ApplicationHelper
include OperateProjectAbilityAble
include Repository::LanguagesPercentagable
before_action :require_login, only: %i[edit update create_file update_file delete_file sync_mirror]
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]
before_action :get_ref, only: %i[entries sub_entries top_counts file]
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
@result = Gitea::Repository::GetService.new(@project.owner, @project.identifier).call
@result = @project.forge? ? Gitea::Repository::GetService.new(@owner, @project.identifier).call : nil
@project_fork_id = @project.try(:forked_from_project_id)
if @project_fork_id.present?
@fork_project = Project.find_by(id: @project_fork_id)
@ -26,62 +47,101 @@ class RepositoriesController < ApplicationController
def entries
@project.increment!(:visits)
@project_owner = @project.owner
@entries = Gitea::Repository::Entries::ListService.new(@project_owner, @project.identifier, ref: @ref).call
@entries = @entries.present? ? @entries.sort_by{ |hash| hash['type'] } : []
@path = Gitea.gitea_config[:domain]+"/#{@project.owner.login}/#{@project.identifier}/raw/branch/#{@ref}/"
if @project.educoder?
@entries = Educoder::Repository::Entries::ListService.call(@project&.project_educoder.repo_name)
else
@entries = Gitea::Repository::Entries::ListService.new(@owner, @project.identifier, ref: @ref).call
@entries = @entries.present? ? @entries.sort_by{ |hash| hash['type'] } : []
@path = Gitea.gitea_config[:domain]+"/#{@project.owner.login}/#{@project.identifier}/raw/branch/#{@ref}/"
end
end
def top_counts
@result = Gitea::Repository::GetService.new(@project.owner, @project.identifier).call
@result = @project.educoder? ? nil : Gitea::Repository::GetService.new(@project.owner, @project.identifier).call
end
def sub_entries
file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip))
interactor = Repositories::EntriesInteractor.call(@project.owner, @project.identifier, file_path_uri, ref: @ref)
if interactor.success?
result = interactor.result
return @sub_entries = [] if result.is_a?(Hash) && result[:status] == -1
@sub_entries = result.is_a?(Array) ? result : [result]
@sub_entries = @sub_entries.sort_by{ |hash| hash['type'] }
if @project.educoder?
if params[:type] === 'file'
@sub_entries = Educoder::Repository::Entries::GetService.call(@project&.project_educoder&.repo_name, file_path_uri)
logger.info "######### sub_entries: #{@sub_entries}"
return render_error('该文件暂未开放,敬请期待.') if @sub_entries['status'].to_i === -1
tmp_entries = [{
"content" => @sub_entries['data']['content'],
"type" => "blob"
}]
@sub_entries = {
"trees"=>tmp_entries,
"commits" => [{}]
}
else
@sub_entries = Educoder::Repository::Entries::ListService.call(@project&.project_educoder&.repo_name, {path: file_path_uri})
end
else
render_error(interactor.error)
interactor = Repositories::EntriesInteractor.call(@owner, @project.identifier, file_path_uri, ref: @ref)
if interactor.success?
result = interactor.result
@sub_entries = result.is_a?(Array) ? result.sort_by{ |hash| hash['type'] } : result
else
render_error(interactor.error)
end
end
end
def commits
@project_owner = @project.owner
@hash_commit = Gitea::Repository::Commits::ListService.new(@project_owner.login, @project.identifier,
@hash_commit = Gitea::Repository::Commits::ListService.new(@owner.login, @project.identifier,
sha: params[:sha], page: params[:page], limit: params[:limit], token: current_user&.gitea_token).call
end
def commit
@commit = Gitea::Repository::Commits::GetService.new(@repository.user.login, @repository.identifier, params[:sha], current_user.gitea_token).call
@sha = params[:sha]
@commit = Gitea::Repository::Commits::GetService.call(@owner.login, @repository.identifier, @sha, current_user&.gitea_token)
@commit_diff = Gitea::Repository::Commits::GetService.call(@owner.login, @repository.identifier, @sha, current_user&.gitea_token, {diff: true})
end
def tags
@tags = Gitea::Repository::Tags::ListService.new(current_user&.gitea_token, @project.owner.login, @project.identifier, {page: params[:page], limit: params[:limit]}).call
@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
interactor = Gitea::CreateFileInteractor.call(current_user.gitea_token, @project.owner.login, content_params)
interactor = Gitea::CreateFileInteractor.call(current_user.gitea_token, @owner.login, content_params)
if interactor.success?
@file = interactor.result
create_new_pr(params)
# create_new_pr(params)
#如果是更新流水线文件
if params[:pipeline_id]
update_pipeline(params[:pipeline_id])
end
else
render_error(interactor.error)
end
end
def update_pipeline(pipeline_id)
pipeline = Ci::Pipeline.find(pipeline_id)
if pipeline
pipeline.update!(sync: 1)
end
end
def update_file
interactor = Gitea::UpdateFileInteractor.call(current_user.gitea_token, @project.owner.login, params.merge(identifier: @project.identifier))
interactor = Gitea::UpdateFileInteractor.call(current_user.gitea_token, @owner.login, params.merge(identifier: @project.identifier))
if interactor.success?
@file = interactor.result
create_new_pr(params)
# TODO: 是否创建pr
# create_new_pr(params)
render_result(1, "更新成功")
else
render_error(interactor.error)
@ -89,7 +149,7 @@ class RepositoriesController < ApplicationController
end
def delete_file
interactor = Gitea::DeleteFileInteractor.call(current_user.gitea_token, @project.owner.login, params.merge(identifier: @project.identifier))
interactor = Gitea::DeleteFileInteractor.call(current_user.gitea_token, @owner.login, params.merge(identifier: @project.identifier))
if interactor.success?
@file = interactor.result
render_result(1, "文件删除成功")
@ -110,6 +170,17 @@ class RepositoriesController < ApplicationController
render_ok
end
def readme
result = Gitea::Repository::Readme::GetService.call(@owner.login, @repository.identifier, params[:ref], current_user&.gitea_token)
@readme = result[:status] === :success ? result[:body] : nil
render json: @readme
end
def languages
render json: languages_precentagable
end
private
def find_project
@ -135,18 +206,18 @@ class RepositoriesController < ApplicationController
end
def get_statistics
@branches_count = Gitea::Repository::Branches::ListService.new(@project.owner, @project.identifier).call&.size
@tags_count = Gitea::Repository::Tags::ListService.new(current_user&.gitea_token, @project.owner.login, @project.identifier).call&.size
@branches_count = @project.educoder? ? 0 : Gitea::Repository::Branches::ListService.new(@project.owner, @project.identifier).call&.size
@tags_count = @project.educoder? ? 0 : Gitea::Repository::Tags::ListService.new(current_user&.gitea_token, @project.owner.login, @project.identifier).call&.size
end
def get_ref
@ref = params[:ref] || "master"
@ref = params[:ref] || @project.default_branch
end
def get_latest_commit
latest_commit = project_commits
@latest_commit = latest_commit[:body][0] if latest_commit.present?
@commits_count = latest_commit[:total_count] if latest_commit.present?
latest_commit = @project.educoder? ? nil : project_commits
@latest_commit = latest_commit.present? ? latest_commit[:body][0] : nil
@commits_count = latest_commit.present? ? latest_commit[:total_count] : 0
end
def content_params
@ -214,14 +285,14 @@ class RepositoriesController < ApplicationController
issue_type: "1",
tracker_id: 2,
status_id: 1,
priority_id: 1
priority_id: params[:priority_id] || "2"
}
@pull_issue = Issue.new(issue_params)
if @pull_issue.save!
local_requests = PullRequest.new(local_params.merge(user_id: current_user.try(:id), project_id: @project.id, issue_id: @pull_issue.id))
if local_requests.save
gitea_request = Gitea::PullRequest::CreateService.new(current_user.try(:gitea_token), @project.owner, @project.try(:identifier), requests_params).call
if gitea_request && local_requests.update_attributes(gpid: gitea_request["number"])
gitea_request = Gitea::PullRequest::CreateService.new(current_user.try(:gitea_token), @owner.login, @project.try(:identifier), requests_params).call
if gitea_request[:status] == :success && local_requests.update_attributes(gpid: gitea_request["body"]["number"])
local_requests.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
end
end

View File

@ -0,0 +1,25 @@
class StatisticController < ApplicationController
# 平台概况
def platform_profile
@platform_user_query = Statistic::PlatformUserQuery.new(params).call
@platform_project_query = Statistic::PlatformProjectQuery.new(params).call
@platform_course_query = Statistic::PlatformCourseQuery.new(params).call
end
# 平台代码提交数据
def platform_code
@platform_pull_request_query = Statistic::PlatformPullRequestQuery.new(params).call
@platform_commit_query = Statistic::PlatformCommitQuery.new(params,current_user).call
end
# 项目案例活跃度排行榜
def active_project_rank
@active_project_rank_query = Statistic::ActiveProjectRankQuery.new(params, current_user).call
end
# 开发者活跃度排行榜
def active_developer_rank
@active_developer_rank_query = Statistic::ActiveDeveloperRankQuery.new(params, current_user).call
end
end

View File

@ -12,11 +12,11 @@ class SyncForgeController < ApplicationController
end
end
# def create
# def create
# ActiveRecord::Base.transaction do
# params.permit!
# sync_params = params[:sync_params]
# project_user = User.where(login: sync_params[:owner_login])&.first
# project_user = User.where(login: sync_params[:owner_login])&.first
# #以前已同步的项目,那么肯定存在仓库
# SyncLog.sync_log("=================begin_to_sync_forge: project_identifier: #{sync_params[:identifier]}========")
# user_projects = Project.where(user_id: project_user.id)
@ -38,7 +38,7 @@ class SyncForgeController < ApplicationController
# check_sync_project(project, sync_params)
# else #新建项目
# SyncLog.sync_log("=================begin_to_create_new_project========")
# project_params = {
# repository_name: sync_params[:identifier],
# user_id: project_user.id,
@ -53,7 +53,7 @@ class SyncForgeController < ApplicationController
# new_project_score = ProjectScore.create(score_params)
# SyncLog.sync_log("=================new_project_score:#{new_project_score.try(:id)}========")
# end
# SyncRepositoryJob.perform_later(sync_params[:owner_login], sync_params[:identifier], sync_params[:repository], get_sudomain) if sync_params[:repository].present?
# check_new_project(project, sync_params)
# else
@ -115,7 +115,7 @@ class SyncForgeController < ApplicationController
# SyncLog.sync_log("=================sync_user_failed====#{e}")
# end
# private
# private
# def check_sync_project(project,sync_params)
# begin
@ -125,8 +125,8 @@ class SyncForgeController < ApplicationController
# # end
# SyncLog.sync_log("----begin_to_check_sync_project----project_id:#{project.id}---------------")
# change_project_score(project, sync_params[:project_score], sync_params[:repository]) if sync_params[:repository].present? #更新project_score
# change_project_issues(project, sync_params[:issues],project.id, gitea_main)
# change_project_score(project, sync_params[:project_score], sync_params[:repository]) if sync_params[:repository].present? #更新project_score
# change_project_issues(project, sync_params[:issues],project.id, gitea_main)
# change_project_members(project, sync_params[:members],gitea_main)
# change_project_versions(project, sync_params[:project_versions],gitea_main)
# change_project_watchers(project, sync_params[:project_watchers],gitea_main)
@ -134,7 +134,7 @@ class SyncForgeController < ApplicationController
# rescue => e
# SyncLog.sync_log("=========check_sync_project_errors:#{e}===================")
# end
# end
# def check_new_project(project,sync_params)
@ -167,7 +167,7 @@ class SyncForgeController < ApplicationController
# parent_id: project.id
# }
# SyncProjectsJob.perform_later(sync_projects_params,gitea_main)
# SyncLog.sync_log("***6. end_to_sync_parises---------------")
# end
# end
@ -189,7 +189,7 @@ class SyncForgeController < ApplicationController
# end
# end
# pre_project_score.save! if change_num > 0 #如果 project_score有变化则更新
# else
# else
# ProjectScore.create!(project_scores.merge(project_id: project.id))
# end
# SyncLog.sync_log("***1. end_to_sync_project_score---------------")
@ -206,7 +206,7 @@ class SyncForgeController < ApplicationController
# SyncLog.sync_log("***2--01. forge_issue_ids-#{forge_issue_ids.size.to_i}--------------")
# if forge_issue_ids.size.to_i <= old_issues_params[:count].to_i
# diff_issue_ids = old_issues_params[:ids] - forge_issue_ids
# if diff_issue_ids.size == 0 #issue数量一样判断评论是否有增减
# forge_journal_ids = Journal.select([:id, :journalized_id, :journalized_type]).where(journalized_id: forge_issue_ids).pluck(:id)
# diff_journal_ids = old_issues_params[:journals][:ids] - forge_journal_ids
@ -241,10 +241,10 @@ class SyncForgeController < ApplicationController
# # }
# # SyncLog.sync_log("***2--03. sync_projects_params_groups-#{sync_projects_params}--------------")
# # SyncProjectsJob.perform_later(sync_projects_params, gitea_main)
# end
# end
# # SyncProjectsJob.perform_later(sync_projects_params, gitea_main) if sync_projects_params.present?
# SyncLog.sync_log("***2. end_to_syncissues---------------")
# rescue Exception => e
@ -265,7 +265,7 @@ class SyncForgeController < ApplicationController
# parent_id: project.id
# }
# SyncProjectsJob.perform_later(sync_projects_params,gitea_main)
# end
# end
# SyncLog.sync_log("***5. begin_to_sync_watchers---------------")
@ -285,7 +285,7 @@ class SyncForgeController < ApplicationController
# }
# SyncProjectsJob.perform_later(sync_projects_params,gitea_main)
# end
# SyncLog.sync_log("***4. end_to_sync_versions---------------")
# end
# end
@ -304,12 +304,12 @@ class SyncForgeController < ApplicationController
# }
# SyncProjectsJob.perform_later(sync_projects_params,gitea_main)
# end
# SyncLog.sync_log("***3. end_to_sync_members---------------")
# end
# end
# def check_token
# def check_token
# sync_params = params[:sync_params]
# unless sync_params[:token] && sync_params[:token] == get_token
# render json: {message: "token_errors"}
@ -331,4 +331,4 @@ class SyncForgeController < ApplicationController
# return gitea_main
# end
end
end

View File

@ -0,0 +1,25 @@
class Users::OrganizationsController < Users::BaseController
def index
if current_user.logged?
logged_organizations_sql = observed_user.organizations.with_visibility(%w(common limited)).to_sql
privacy_organizations_sql = observed_user.organizations.with_visibility("privacy").joins(:organization_users).where(organization_users: {user_id: current_user.id}).to_sql
@organizations = Organization.from("( #{ logged_organizations_sql } UNION #{ privacy_organizations_sql } ) AS users")
else
@organizations = observed_user.organizations.with_visibility("common")
end
@organizations = @organizations.ransack(login_cont: params[:search]).result if params[:search].present?
@organizations = @organizations.includes(:organization_extension).order("organization_extensions.#{sort_by} #{sort_direction}")
@organizations = kaminari_paginate(@organizations)
end
private
def sort_by
params.fetch(:sort_by, "created_at")
end
def sort_direction
params.fetch(:sort_direction, "desc")
end
end

View File

@ -1,10 +1,24 @@
class UsersController < ApplicationController
include ApplicationHelper
include Ci::DbConnectable
before_action :load_user, only: [:show, :homepage_info, :sync_token, :sync_gitea_pwd, :projects, :watch_users, :fan_users]
before_action :check_user_exist, only: [:show, :homepage_info,:projects, :watch_users, :fan_users]
before_action :require_login, only: %i[me list]
before_action :connect_to_ci_db, only: [:get_user_info]
skip_before_action :check_sign, only: [:attachment_show]
def connect_to_ci_db(options={})
if !(current_user && !current_user.is_a?(AnonymousUser) && current_user.devops_certification?)
return
end
if current_user.ci_cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_TRUSTIE
connect_to_trustie_ci_database(options)
else
connect_to_ci_database(options)
end
end
def list
scope = User.active.recent.like(params[:search]).includes(:user_extension)
@total_count = scope.size
@ -17,6 +31,7 @@ class UsersController < ApplicationController
#用户的组织数量
# @user_composes_count = @user.composes.size
@user_composes_count = 0
@user_org_count = User.current.logged? ? @user.organizations.with_visibility(%w(common limited)).size + @user.organizations.with_visibility("privacy").joins(:organization_users).where(organization_users: {user_id: current_user.id}).size : @user.organizations.with_visibility("common").size
user_projects = User.current.logged? && (User.current.admin? || User.current.login == @user.login) ? @user.projects : @user.projects.visible
@projects_common_count = user_projects.common.size
@projects_mirrior_count = user_projects.mirror.size
@ -66,7 +81,7 @@ class UsersController < ApplicationController
def attachment_show
file_name = params[:file_name]
path = params[:path] || edu_setting('attachment_folder')
path = params[:path] || file_storage_directory
send_file "#{path}/#{file_name}", :filename => "#{file_name}",
:type => 'game',
:disposition => 'attachment' #inline can open in browser

View File

@ -124,7 +124,7 @@ class VersionReleasesController < ApplicationController
private
def set_user
@user = @repository.user
@user = @repository.owner
end
def find_version

View File

@ -5,6 +5,7 @@ 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

@ -0,0 +1,2 @@
build/
.github/

View File

@ -0,0 +1,18 @@
# EditorConfig is awesome: https://EditorConfig.org
# Top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
[*.rb]
charset = utf-8
[*.md]
trim_trailing_whitespace = false

1
app/docs/slate/.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
source/javascripts/lib/* linguist-vendored

View File

@ -0,0 +1,22 @@
---
name: Report a Bug
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Bug Description**
A clear and concise description of what the bug is and how to reproduce it.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Browser (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Last upstream Slate commit (run `git log --author="Robert Lord" | head -n 1`):**
Put the commit hash here

View File

@ -0,0 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Questions, Ideas, Discussions
url: https://github.com/slatedocs/slate/discussions
about: Ask and answer questions, and propose new features.

View File

@ -0,0 +1,5 @@
<!--
⚠️ 🚨 ⚠️ STOP AND READ THIS ⚠️ 🚨 ⚠️
👆👆 see that 'base fork' dropdown above? You should change it! The default value of "slatedocs/slate" submits your change to ALL USERS OF SLATE, not just your company. This is PROBABLY NOT WHAT YOU WANT.
-->

View File

@ -0,0 +1,42 @@
name: Build
on:
push:
branches: [ '*' ]
pull_request:
branches: [ '*' ]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
ruby-version: [2.3, 2.4, 2.5, 2.6, 2.7]
steps:
- uses: actions/checkout@v2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby-version }}
- uses: actions/cache@v2
with:
path: vendor/bundle
key: gems-${{ runner.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }}
restore-keys: |
gems-${{ runner.os }}-${{ matrix.ruby-version }}-
gems-${{ runner.os }}-
# necessary to get ruby 2.3 to work nicely with bundler vendor/bundle cache
# can remove once ruby 2.3 is no longer supported
- run: gem update --system
- run: bundle config set deployment 'true'
- name: bundle install
run: |
bundle config path vendor/bundle
bundle install --jobs 4 --retry 3
- run: bundle exec middleman build

View File

@ -0,0 +1,41 @@
name: Deploy
on:
push:
branches: [ 'main' ]
jobs:
deploy:
runs-on: ubuntu-latest
env:
ruby-version: 2.5
steps:
- uses: actions/checkout@v2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ env.ruby-version }}
- uses: actions/cache@v2
with:
path: vendor/bundle
key: gems-${{ runner.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }}
restore-keys: |
gems-${{ runner.os }}-${{ matrix.ruby-version }}-
gems-${{ runner.os }}-
- run: bundle config set deployment 'true'
- name: bundle install
run: |
bundle config path vendor/bundle
bundle install --jobs 4 --retry 3
- run: bundle exec middleman build
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./build
keep_files: true

View File

@ -0,0 +1,50 @@
name: Dev Deploy
on:
push:
branches: [ 'dev' ]
jobs:
deploy:
runs-on: ubuntu-latest
env:
ruby-version: 2.5
steps:
- uses: actions/checkout@v2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ env.ruby-version }}
- uses: actions/cache@v2
with:
path: vendor/bundle
key: gems-${{ runner.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }}
restore-keys: |
gems-${{ runner.os }}-${{ matrix.ruby-version }}-
gems-${{ runner.os }}-
- run: bundle config set deployment 'true'
- name: bundle install
run: |
bundle config path vendor/bundle
bundle install --jobs 4 --retry 3
- run: bundle exec middleman build
- name: Push to Docker Hub
uses: docker/build-push-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_ACCESS_KEY }}
repository: slatedocs/slate
tag_with_ref: true
- name: Deploy
uses: peaceiris/actions-gh-pages@v3.7.0-8
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
destination_dir: dev
publish_dir: ./build
keep_files: true

View File

@ -0,0 +1,22 @@
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Push to Docker Hub
uses: docker/build-push-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_ACCESS_KEY }}
repository: slatedocs/slate
tag_with_ref: true
tags: latest

27
app/docs/slate/.gitignore vendored Normal file
View File

@ -0,0 +1,27 @@
*.gem
*.rbc
.bundle
.config
coverage
InstalledFiles
lib/bundler/man
pkg
rdoc
spec/reports
test/tmp
test/version_tmp
tmp
*.DS_STORE
build/
.cache
.vagrant
.sass-cache
# YARD artifacts
.yardoc
_yardoc
doc/
.idea/
# Vagrant artifacts
ubuntu-*-console.log

254
app/docs/slate/CHANGELOG.md Normal file
View File

@ -0,0 +1,254 @@
# Changelog
## Version 2.8.0
*October 27, 2020*
* Remove last trailing newline when using the copy code button
* Rework docker image and make available at slatedocs/slate
* Improve Dockerfile layout to improve caching (thanks @micvbang)
* Bump rouge from 3.20 to 3.24
* Bump nokogiri from 1.10.9 to 1.10.10
* Bump middleman from 4.3.8 to 4.3.11
* Bump lunr.js from 2.3.8 to 2.3.9
## Version 2.7.1
*August 13, 2020*
* __[security]__ Bumped middleman from 4.3.7 to 4.3.8
_Note_: Slate uses redcarpet, not kramdown, for rendering markdown to HTML, and so was unaffected by the security vulnerability in middleman.
If you have changed slate to use kramdown, and with GFM, you may need to install the `kramdown-parser-gfm` gem.
## Version 2.7.0
*June 21, 2020*
* __[security]__ Bumped rack in Gemfile.lock from 2.2.2 to 2.2.3
* Bumped bundled jQuery from 3.2.1 to 3.5.1
* Bumped bundled lunr from 0.5.7 to 2.3.8
* Bumped imagesloaded from 3.1.8 to 4.1.4
* Bumped rouge from 3.17.0 to 3.20.0
* Bumped redcarpet from 3.4.0 to 3.5.0
* Fix color of highlighted code being unreadable when printing page
* Add clipboard icon for "Copy to Clipboard" functionality to code boxes (see note below)
* Fix handling of ToC selectors that contain punctutation (thanks @gruis)
* Fix language bar truncating languages that overflow screen width
* Strip HTML tags from ToC title before displaying it in title bar in JS (backup to stripping done in Ruby code) (thanks @atic)
To enable the new clipboard icon, you need to add `code_clipboard: true` to the frontmatter of source/index.html.md.
See [this line](https://github.com/slatedocs/slate/blame/main/source/index.html.md#L19) for an example of usage.
## Version 2.6.1
*May 30, 2020*
* __[security]__ update child dependency activesupport in Gemfile.lock to 5.4.2.3
* Update Middleman in Gemfile.lock to 4.3.7
* Replace Travis-CI with GitHub actions for continuous integration
* Replace Spectrum with GitHub discussions
## Version 2.6.0
*May 18, 2020*
__Note__: 2.5.0 was "pulled" due to a breaking bug discovered after release. It is recommended to skip it, and move straight to 2.6.0.
* Fix large whitespace gap in middle column for sections with codeblocks
* Fix highlighted code elements having a different background than rest of code block
* Change JSON keys to have a different font color than their values
* Disable asset hashing for woff and woff2 elements due to middleman bug breaking woff2 asset hashing in general
* Move Dockerfile to Debian from Alpine
* Converted repo to a [GitHub template](https://help.github.com/en/github/creating-cloning-and-archiving-repositories/creating-a-template-repository)
* Update sassc to 2.3.0 in Gemfile.lock
## Version 2.5.0
*May 8, 2020*
* __[security]__ update nokogiri to ~> 1.10.8
* Update links in example docs to https://github.com/slatedocs/slate from https://github.com/lord/slate
* Update LICENSE to include full Apache 2.0 text
* Test slate against Ruby 2.5 and 2.6 on Travis-CI
* Update Vagrantfile to use Ubuntu 18.04 (thanks @bradthurber)
* Parse arguments and flags for deploy.sh on script start, instead of potentially after building source files
* Install nodejs inside Vagrantfile (thanks @fernandoaguilar)
* Add Dockerfile for running slate (thanks @redhatxl)
* update middleman-syntax and rouge to ~>3.2
* update middleman to 4.3.6
## Version 2.4.0
*October 19, 2019*
- Move repository from lord/slate to slatedocs/slate
- Fix documentation to point at new repo link, thanks to [Arun](https://github.com/slash-arun), [Gustavo Gawryszewski](https://github.com/gawry), and [Daniel Korbit](https://github.com/danielkorbit)
- Update `nokogiri` to 1.10.4
- Update `ffi` in `Gemfile.lock` to fix security warnings, thanks to [Grey Baker](https://github.com/greysteil) and [jakemack](https://github.com/jakemack)
- Update `rack` to 2.0.7 in `Gemfile.lock` to fix security warnings, thanks to [Grey Baker](https://github.com/greysteil) and [jakemack](https://github.com/jakemack)
- Update middleman to `4.3` and relax constraints on middleman related gems, thanks to [jakemack](https://github.com/jakemack)
- Add sass gem, thanks to [jakemack](https://github.com/jakemack)
- Activate `asset_cache` in middleman to improve cacheability of static files, thanks to [Sam Gilman](https://github.com/thenengah)
- Update to using bundler 2 for `Gemfile.lock`, thanks to [jakemack](https://github.com/jakemack)
## Version 2.3.1
*July 5, 2018*
- Update `sprockets` in `Gemfile.lock` to fix security warnings
## Version 2.3
*July 5, 2018*
- Allows strikethrough in markdown by default.
- Upgrades jQuery to 3.2.1, thanks to [Tomi Takussaari](https://github.com/TomiTakussaari)
- Fixes invalid HTML in `layout.erb`, thanks to [Eric Scouten](https://github.com/scouten) for pointing out
- Hopefully fixes Vagrant memory issues, thanks to [Petter Blomberg](https://github.com/p-blomberg) for the suggestion
- Cleans HTML in headers before setting `document.title`, thanks to [Dan Levy](https://github.com/justsml)
- Allows trailing whitespace in markdown files, thanks to [Samuel Cousin](https://github.com/kuzyn)
- Fixes pushState/replaceState problems with scrolling not changing the document hash, thanks to [Andrey Fedorov](https://github.com/anfedorov)
- Removes some outdated examples, thanks [@al-tr](https://github.com/al-tr), [Jerome Dahdah](https://github.com/jdahdah), and [Ricardo Castro](https://github.com/mccricardo)
- Fixes `nav-padding` bug, thanks [Jerome Dahdah](https://github.com/jdahdah)
- Code style fixes thanks to [Sebastian Zaremba](https://github.com/vassyz)
- Nokogiri version bump thanks to [Grey Baker](https://github.com/greysteil)
- Fix to default `index.md` text thanks to [Nick Busey](https://github.com/NickBusey)
Thanks to everyone who contributed to this release!
## Version 2.2
*January 19, 2018*
- Fixes bugs with some non-roman languages not generating unique headers
- Adds editorconfig, thanks to [Jay Thomas](https://github.com/jaythomas)
- Adds optional `NestingUniqueHeadCounter`, thanks to [Vladimir Morozov](https://github.com/greenhost87)
- Small fixes to typos and language, thx [Emir Ribić](https://github.com/ribice), [Gregor Martynus](https://github.com/gr2m), and [Martius](https://github.com/martiuslim)!
- Adds links to Spectrum chat for questions in README and ISSUE_TEMPLATE
## Version 2.1
*October 30, 2017*
- Right-to-left text stylesheet option, thanks to [Mohammad Hossein Rabiee](https://github.com/mhrabiee)
- Fix for HTML5 history state bug, thanks to [Zach Toolson](https://github.com/ztoolson)
- Small styling changes, typo fixes, small bug fixes from [Marian Friedmann](https://github.com/rnarian), [Ben Wilhelm](https://github.com/benwilhelm), [Fouad Matin](https://github.com/fouad), [Nicolas Bonduel](https://github.com/NicolasBonduel), [Christian Oliff](https://github.com/coliff)
Thanks to everyone who submitted PRs for this version!
## Version 2.0
*July 17, 2017*
- All-new statically generated table of contents
- Should be much faster loading and scrolling for large pages
- Smaller Javascript file sizes
- Avoids the problem with the last link in the ToC not ever highlighting if the section was shorter than the page
- Fixes control-click not opening in a new page
- Automatically updates the HTML title as you scroll
- Updated design
- New default colors!
- New spacings and sizes!
- System-default typefaces, just like GitHub
- Added search input delay on large corpuses to reduce lag
- We even bumped the major version cause hey, why not?
- Various small bug fixes
Thanks to everyone who helped debug or wrote code for this version! It was a serious community effort, and I couldn't have done it alone.
## Version 1.5
*February 23, 2017*
- Add [multiple tabs per programming language](https://github.com/lord/slate/wiki/Multiple-language-tabs-per-programming-language) feature
- Upgrade Middleman to add Ruby 1.4.0 compatibility
- Switch default code highlighting color scheme to better highlight JSON
- Various small typo and bug fixes
## Version 1.4
*November 24, 2016*
- Upgrade Middleman and Rouge gems, should hopefully solve a number of bugs
- Update some links in README
- Fix broken Vagrant startup script
- Fix some problems with deploy.sh help message
- Fix bug with language tabs not hiding properly if no error
- Add `!default` to SASS variables
- Fix bug with logo margin
- Bump tested Ruby versions in .travis.yml
## Version 1.3.3
*June 11, 2016*
Documentation and example changes.
## Version 1.3.2
*February 3, 2016*
A small bugfix for slightly incorrect background colors on code samples in some cases.
## Version 1.3.1
*January 31, 2016*
A small bugfix for incorrect whitespace in code blocks.
## Version 1.3
*January 27, 2016*
We've upgraded Middleman and a number of other dependencies, which should fix quite a few bugs.
Instead of `rake build` and `rake deploy`, you should now run `bundle exec middleman build --clean` to build your server, and `./deploy.sh` to deploy it to Github Pages.
## Version 1.2
*June 20, 2015*
**Fixes:**
- Remove crash on invalid languages
- Update Tocify to scroll to the highlighted header in the Table of Contents
- Fix variable leak and update search algorithms
- Update Python examples to be valid Python
- Update gems
- More misc. bugfixes of Javascript errors
- Add Dockerfile
- Remove unused gems
- Optimize images, fonts, and generated asset files
- Add chinese font support
- Remove RedCarpet header ID patch
- Update language tabs to not disturb existing query strings
## Version 1.1
*July 27, 2014*
**Fixes:**
- Finally, a fix for the redcarpet upgrade bug
## Version 1.0
*July 2, 2014*
[View Issues](https://github.com/tripit/slate/issues?milestone=1&state=closed)
**Features:**
- Responsive designs for phones and tablets
- Started tagging versions
**Fixes:**
- Fixed 'unrecognized expression' error
- Fixed #undefined hash bug
- Fixed bug where the current language tab would be unselected
- Fixed bug where tocify wouldn't highlight the current section while searching
- Fixed bug where ids of header tags would have special characters that caused problems
- Updated layout so that pages with disabled search wouldn't load search.js
- Cleaned up Javascript

View File

@ -0,0 +1,46 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at hello@lord.io. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

12
app/docs/slate/Gemfile Normal file
View File

@ -0,0 +1,12 @@
ruby '>=2.3.1'
source 'https://gems.ruby-china.com'
# Middleman
gem 'middleman', '~>4.3'
gem 'middleman-syntax', '~> 3.2'
gem 'middleman-autoprefixer', '~> 2.7'
gem 'middleman-sprockets', '~> 4.1'
gem 'rouge', '~> 3.21'
gem 'redcarpet', '~> 3.5.0'
gem 'nokogiri', '~> 1.10.8'
gem 'sass'

136
app/docs/slate/Gemfile.lock Normal file
View File

@ -0,0 +1,136 @@
GEM
remote: https://gems.ruby-china.com/
specs:
activesupport (5.2.4.4)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
addressable (2.7.0)
public_suffix (>= 2.0.2, < 5.0)
autoprefixer-rails (9.5.1.1)
execjs
backports (3.18.2)
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.12.2)
concurrent-ruby (1.1.7)
contracts (0.13.0)
dotenv (2.7.6)
erubis (2.7.0)
execjs (2.7.0)
fast_blank (1.0.0)
fastimage (2.2.0)
ffi (1.13.1)
haml (5.1.2)
temple (>= 0.8.0)
tilt
hamster (3.0.0)
concurrent-ruby (~> 1.0)
hashie (3.6.0)
i18n (0.9.5)
concurrent-ruby (~> 1.0)
kramdown (2.3.0)
rexml
listen (3.0.8)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
memoist (0.16.2)
middleman (4.3.11)
coffee-script (~> 2.2)
haml (>= 4.0.5)
kramdown (>= 2.3.0)
middleman-cli (= 4.3.11)
middleman-core (= 4.3.11)
middleman-autoprefixer (2.10.1)
autoprefixer-rails (~> 9.1)
middleman-core (>= 3.3.3)
middleman-cli (4.3.11)
thor (>= 0.17.0, < 2.0)
middleman-core (4.3.11)
activesupport (>= 4.2, < 6.0)
addressable (~> 2.3)
backports (~> 3.6)
bundler
contracts (~> 0.13.0)
dotenv
erubis
execjs (~> 2.0)
fast_blank
fastimage (~> 2.0)
hamster (~> 3.0)
hashie (~> 3.4)
i18n (~> 0.9.0)
listen (~> 3.0.0)
memoist (~> 0.14)
padrino-helpers (~> 0.13.0)
parallel
rack (>= 1.4.5, < 3)
sassc (~> 2.0)
servolux
tilt (~> 2.0.9)
uglifier (~> 3.0)
middleman-sprockets (4.1.1)
middleman-core (~> 4.0)
sprockets (>= 3.0)
middleman-syntax (3.2.0)
middleman-core (>= 3.2)
rouge (~> 3.2)
mini_portile2 (2.4.0)
minitest (5.14.2)
nokogiri (1.10.10)
mini_portile2 (~> 2.4.0)
padrino-helpers (0.13.3.4)
i18n (~> 0.6, >= 0.6.7)
padrino-support (= 0.13.3.4)
tilt (>= 1.4.1, < 3)
padrino-support (0.13.3.4)
activesupport (>= 3.1)
parallel (1.19.2)
public_suffix (4.0.6)
rack (2.2.3)
rb-fsevent (0.10.4)
rb-inotify (0.10.1)
ffi (~> 1.0)
redcarpet (3.5.0)
rexml (3.2.4)
rouge (3.24.0)
sass (3.7.4)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
sassc (2.4.0)
ffi (~> 1.9)
servolux (0.13.0)
sprockets (3.7.2)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
temple (0.8.2)
thor (1.0.1)
thread_safe (0.3.6)
tilt (2.0.10)
tzinfo (1.2.7)
thread_safe (~> 0.1)
uglifier (3.2.0)
execjs (>= 0.3.0, < 3)
PLATFORMS
ruby
DEPENDENCIES
middleman (~> 4.3)
middleman-autoprefixer (~> 2.7)
middleman-sprockets (~> 4.1)
middleman-syntax (~> 3.2)
nokogiri (~> 1.10.8)
redcarpet (~> 3.5.0)
rouge (~> 3.21)
sass
RUBY VERSION
ruby 2.3.3p222
BUNDLED WITH
2.1.4

201
app/docs/slate/LICENSE Normal file
View File

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

81
app/docs/slate/README.md Normal file
View File

@ -0,0 +1,81 @@
<p align="center">
<img src="https://raw.githubusercontent.com/slatedocs/img/main/logo-slate.png" alt="Slate: API Documentation Generator" width="226">
<br>
<a href="https://github.com/slatedocs/slate/actions?query=workflow%3ABuild+branch%3Amain"><img src="https://github.com/slatedocs/slate/workflows/Build/badge.svg?branch=main" alt="Build Status"></a>
</p>
<p align="center">Slate helps you create beautiful, intelligent, responsive API documentation.</p>
<p align="center"><img src="https://raw.githubusercontent.com/slatedocs/img/main/screenshot-slate.png" width=700 alt="Screenshot of Example Documentation created with Slate"></p>
<p align="center"><em>The example above was created with Slate. Check it out at <a href="https://slatedocs.github.io/slate">slatedocs.github.io/slate</a>.</em></p>
Features
------------
* **Clean, intuitive design** — With Slate, the description of your API is on the left side of your documentation, and all the code examples are on the right side. Inspired by [Stripe's](https://stripe.com/docs/api) and [PayPal's](https://developer.paypal.com/webapps/developer/docs/api/) API docs. Slate is responsive, so it looks great on tablets, phones, and even in print.
* **Everything on a single page** — Gone are the days when your users had to search through a million pages to find what they wanted. Slate puts the entire documentation on a single page. We haven't sacrificed linkability, though. As you scroll, your browser's hash will update to the nearest header, so linking to a particular point in the documentation is still natural and easy.
* **Slate is just Markdown** — When you write docs with Slate, you're just writing Markdown, which makes it simple to edit and understand. Everything is written in Markdown — even the code samples are just Markdown code blocks.
* **Write code samples in multiple languages** — If your API has bindings in multiple programming languages, you can easily put in tabs to switch between them. In your document, you'll distinguish different languages by specifying the language name at the top of each code block, just like with GitHub Flavored Markdown.
* **Out-of-the-box syntax highlighting** for [over 100 languages](https://github.com/jneen/rouge/wiki/List-of-supported-languages-and-lexers), no configuration required.
* **Automatic, smoothly scrolling table of contents** on the far left of the page. As you scroll, it displays your current position in the document. It's fast, too. We're using Slate at TripIt to build documentation for our new API, where our table of contents has over 180 entries. We've made sure that the performance remains excellent, even for larger documents.
* **Let your users update your documentation for you** — By default, your Slate-generated documentation is hosted in a public GitHub repository. Not only does this mean you get free hosting for your docs with GitHub Pages, but it also makes it simple for other developers to make pull requests to your docs if they find typos or other problems. Of course, if you don't want to use GitHub, you're also welcome to host your docs elsewhere.
* **RTL Support** Full right-to-left layout for RTL languages such as Arabic, Persian (Farsi), Hebrew etc.
Getting started with Slate is super easy! Simply press the green "use this template" button above and follow the instructions below. Or, if you'd like to check out what Slate is capable of, take a look at the [sample docs](https://slatedocs.github.io/slate/).
Getting Started with Slate
------------------------------
To get started with Slate, please check out the [Getting Started](https://github.com/slatedocs/slate/wiki#getting-started)
section in our [wiki](https://github.com/slatedocs/slate/wiki).
We support running Slate in three different ways:
* [Natively](https://github.com/slatedocs/slate/wiki/Using-Slate-Natively)
* [Using Vagrant](https://github.com/slatedocs/slate/wiki/Using-Slate-in-Vagrant)
* [Using Docker](https://github.com/slatedocs/slate/wiki/Using-Slate-in-Docker)
Companies Using Slate
---------------------------------
* [NASA](https://api.nasa.gov)
* [Sony](http://developers.cimediacloud.com)
* [Best Buy](https://bestbuyapis.github.io/api-documentation/)
* [Travis-CI](https://docs.travis-ci.com/api/)
* [Greenhouse](https://developers.greenhouse.io/harvest.html)
* [WooCommerce](http://woocommerce.github.io/woocommerce-rest-api-docs/)
* [Dwolla](https://docs.dwolla.com/)
* [Clearbit](https://clearbit.com/docs)
* [Coinbase](https://developers.coinbase.com/api)
* [Parrot Drones](http://developer.parrot.com/docs/bebop/)
* [Scale](https://docs.scaleapi.com/)
You can view more in [the list on the wiki](https://github.com/slatedocs/slate/wiki/Slate-in-the-Wild).
Questions? Need Help? Found a bug?
--------------------
If you've got questions about setup, deploying, special feature implementation in your fork, or just want to chat with the developer, please feel free to [start a thread in our Discussions tab](https://github.com/slatedocs/slate/discussions)!
Found a bug with upstream Slate? Go ahead and [submit an issue](https://github.com/slatedocs/slate/issues). And, of course, feel free to submit pull requests with bug fixes or changes to the `dev` branch.
Contributors
--------------------
Slate was built by [Robert Lord](https://lord.io) while at [TripIt](https://www.tripit.com/). The project is now maintained by [Matthew Peveler](https://github.com/MasterOdin) and [Mike Ralphson](https://github.com/MikeRalphson).
Thanks to the following people who have submitted major pull requests:
- [@chrissrogers](https://github.com/chrissrogers)
- [@bootstraponline](https://github.com/bootstraponline)
- [@realityking](https://github.com/realityking)
- [@cvkef](https://github.com/cvkef)
Also, thanks to [Sauce Labs](http://saucelabs.com) for sponsoring the development of the responsive styles.

46
app/docs/slate/Vagrantfile vendored Normal file
View File

@ -0,0 +1,46 @@
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu/bionic64"
config.vm.network :forwarded_port, guest: 4567, host: 4567
config.vm.provider "virtualbox" do |vb|
vb.memory = "2048"
end
config.vm.provision "bootstrap",
type: "shell",
inline: <<-SHELL
# add nodejs v12 repository
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get update
sudo apt-get install -yq ruby ruby-dev
sudo apt-get install -yq pkg-config build-essential nodejs git libxml2-dev libxslt-dev
sudo apt-get autoremove -yq
gem install --no-ri --no-rdoc bundler
SHELL
# add the local user git config to the vm
config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig"
config.vm.provision "install",
type: "shell",
privileged: false,
inline: <<-SHELL
echo "=============================================="
echo "Installing app dependencies"
cd /vagrant
bundle config build.nokogiri --use-system-libraries
bundle install
SHELL
config.vm.provision "run",
type: "shell",
privileged: false,
run: "always",
inline: <<-SHELL
echo "=============================================="
echo "Starting up middleman at http://localhost:4567"
echo "If it does not come up, check the ~/middleman.log file for any error messages"
cd /vagrant
bundle exec middleman server --watcher-force-polling --watcher-latency=1 &> ~/middleman.log &
SHELL
end

65
app/docs/slate/config.rb Normal file
View File

@ -0,0 +1,65 @@
set :build_dir, '../../../public/docs/'
# Unique header generation
require './lib/unique_head.rb'
# Markdown
set :markdown_engine, :redcarpet
set :markdown,
fenced_code_blocks: true,
smartypants: true,
disable_indented_code_blocks: true,
prettify: true,
strikethrough: true,
tables: true,
with_toc_data: true,
no_intra_emphasis: true,
renderer: UniqueHeadCounter
# Assets
set :css_dir, 'stylesheets'
set :js_dir, 'javascripts'
set :images_dir, 'images'
set :fonts_dir, 'fonts'
# Activate the syntax highlighter
activate :syntax
ready do
require './lib/monokai_sublime_slate.rb'
require './lib/multilang.rb'
end
activate :sprockets
activate :autoprefixer do |config|
config.browsers = ['last 2 version', 'Firefox ESR']
config.cascade = false
config.inline = true
end
# Github pages require relative links
activate :relative_assets
set :relative_links, true
# Build Configuration
configure :build do
# We do want to hash woff and woff2 as there's a bug where woff2 will use
# woff asset hash which breaks things. Trying to use a combination of ignore and
# rewrite_ignore does not work as it conflicts weirdly with relative_assets. Disabling
# the .woff2 extension only does not work as .woff will still activate it so have to
# have both. See https://github.com/slatedocs/slate/issues/1171 for more details.
activate :asset_hash, :exts => app.config[:asset_extensions] - %w[.woff .woff2]
# If you're having trouble with Middleman hanging, commenting
# out the following two lines has been known to help
activate :minify_css
activate :minify_javascript
# activate :gzip
end
# Deploy Configuration
# If you want Middleman to listen on a different port, you can set that below
set :port, 4567
helpers do
require './lib/toc_data.rb'
end

226
app/docs/slate/deploy.sh Executable file
View File

@ -0,0 +1,226 @@
#!/usr/bin/env bash
set -o errexit #abort if any command fails
me=$(basename "$0")
help_message="\
Usage: $me [-c FILE] [<options>]
Deploy generated files to a git branch.
Options:
-h, --help Show this help information.
-v, --verbose Increase verbosity. Useful for debugging.
-e, --allow-empty Allow deployment of an empty directory.
-m, --message MESSAGE Specify the message used when committing on the
deploy branch.
-n, --no-hash Don't append the source commit's hash to the deploy
commit's message.
--source-only Only build but not push
--push-only Only push but not build
"
run_build() {
bundle exec middleman build --clean
}
parse_args() {
# Set args from a local environment file.
if [ -e ".env" ]; then
source .env
fi
# Parse arg flags
# If something is exposed as an environment variable, set/overwrite it
# here. Otherwise, set/overwrite the internal variable instead.
while : ; do
if [[ $1 = "-h" || $1 = "--help" ]]; then
echo "$help_message"
exit 0
elif [[ $1 = "-v" || $1 = "--verbose" ]]; then
verbose=true
shift
elif [[ $1 = "-e" || $1 = "--allow-empty" ]]; then
allow_empty=true
shift
elif [[ ( $1 = "-m" || $1 = "--message" ) && -n $2 ]]; then
commit_message=$2
shift 2
elif [[ $1 = "-n" || $1 = "--no-hash" ]]; then
GIT_DEPLOY_APPEND_HASH=false
shift
elif [[ $1 = "--source-only" ]]; then
source_only=true
shift
elif [[ $1 = "--push-only" ]]; then
push_only=true
shift
else
break
fi
done
if [ ${source_only} ] && [ ${push_only} ]; then
>&2 echo "You can only specify one of --source-only or --push-only"
exit 1
fi
# Set internal option vars from the environment and arg flags. All internal
# vars should be declared here, with sane defaults if applicable.
# Source directory & target branch.
deploy_directory=build
deploy_branch=gh-pages
#if no user identity is already set in the current git environment, use this:
default_username=${GIT_DEPLOY_USERNAME:-deploy.sh}
default_email=${GIT_DEPLOY_EMAIL:-}
#repository to deploy to. must be readable and writable.
repo=origin
#append commit hash to the end of message by default
append_hash=${GIT_DEPLOY_APPEND_HASH:-true}
}
main() {
enable_expanded_output
if ! git diff --exit-code --quiet --cached; then
echo Aborting due to uncommitted changes in the index >&2
return 1
fi
commit_title=`git log -n 1 --format="%s" HEAD`
commit_hash=` git log -n 1 --format="%H" HEAD`
#default commit message uses last title if a custom one is not supplied
if [[ -z $commit_message ]]; then
commit_message="publish: $commit_title"
fi
#append hash to commit message unless no hash flag was found
if [ $append_hash = true ]; then
commit_message="$commit_message"$'\n\n'"generated from commit $commit_hash"
fi
previous_branch=`git rev-parse --abbrev-ref HEAD`
if [ ! -d "$deploy_directory" ]; then
echo "Deploy directory '$deploy_directory' does not exist. Aborting." >&2
return 1
fi
# must use short form of flag in ls for compatibility with macOS and BSD
if [[ -z `ls -A "$deploy_directory" 2> /dev/null` && -z $allow_empty ]]; then
echo "Deploy directory '$deploy_directory' is empty. Aborting. If you're sure you want to deploy an empty tree, use the --allow-empty / -e flag." >&2
return 1
fi
if git ls-remote --exit-code $repo "refs/heads/$deploy_branch" ; then
# deploy_branch exists in $repo; make sure we have the latest version
disable_expanded_output
git fetch --force $repo $deploy_branch:$deploy_branch
enable_expanded_output
fi
# check if deploy_branch exists locally
if git show-ref --verify --quiet "refs/heads/$deploy_branch"
then incremental_deploy
else initial_deploy
fi
restore_head
}
initial_deploy() {
git --work-tree "$deploy_directory" checkout --orphan $deploy_branch
git --work-tree "$deploy_directory" add --all
commit+push
}
incremental_deploy() {
#make deploy_branch the current branch
git symbolic-ref HEAD refs/heads/$deploy_branch
#put the previously committed contents of deploy_branch into the index
git --work-tree "$deploy_directory" reset --mixed --quiet
git --work-tree "$deploy_directory" add --all
set +o errexit
diff=$(git --work-tree "$deploy_directory" diff --exit-code --quiet HEAD --)$?
set -o errexit
case $diff in
0) echo No changes to files in $deploy_directory. Skipping commit.;;
1) commit+push;;
*)
echo git diff exited with code $diff. Aborting. Staying on branch $deploy_branch so you can debug. To switch back to main, use: git symbolic-ref HEAD refs/heads/main && git reset --mixed >&2
return $diff
;;
esac
}
commit+push() {
set_user_id
git --work-tree "$deploy_directory" commit -m "$commit_message"
disable_expanded_output
#--quiet is important here to avoid outputting the repo URL, which may contain a secret token
git push --quiet $repo $deploy_branch
enable_expanded_output
}
#echo expanded commands as they are executed (for debugging)
enable_expanded_output() {
if [ $verbose ]; then
set -o xtrace
set +o verbose
fi
}
#this is used to avoid outputting the repo URL, which may contain a secret token
disable_expanded_output() {
if [ $verbose ]; then
set +o xtrace
set -o verbose
fi
}
set_user_id() {
if [[ -z `git config user.name` ]]; then
git config user.name "$default_username"
fi
if [[ -z `git config user.email` ]]; then
git config user.email "$default_email"
fi
}
restore_head() {
if [[ $previous_branch = "HEAD" ]]; then
#we weren't on any branch before, so just set HEAD back to the commit it was on
git update-ref --no-deref HEAD $commit_hash $deploy_branch
else
git symbolic-ref HEAD refs/heads/$previous_branch
fi
git reset --mixed
}
filter() {
sed -e "s|$repo|\$repo|g"
}
sanitize() {
"$@" 2> >(filter 1>&2) | filter
}
parse_args "$@"
if [[ ${source_only} ]]; then
run_build
elif [[ ${push_only} ]]; then
main "$@"
else
run_build
main "$@"
fi

View File

@ -0,0 +1,148 @@
{
"IcoMoonType": "selection",
"icons": [
{
"icon": {
"paths": [
"M438.857 73.143q119.429 0 220.286 58.857t159.714 159.714 58.857 220.286-58.857 220.286-159.714 159.714-220.286 58.857-220.286-58.857-159.714-159.714-58.857-220.286 58.857-220.286 159.714-159.714 220.286-58.857zM512 785.714v-108.571q0-8-5.143-13.429t-12.571-5.429h-109.714q-7.429 0-13.143 5.714t-5.714 13.143v108.571q0 7.429 5.714 13.143t13.143 5.714h109.714q7.429 0 12.571-5.429t5.143-13.429zM510.857 589.143l10.286-354.857q0-6.857-5.714-10.286-5.714-4.571-13.714-4.571h-125.714q-8 0-13.714 4.571-5.714 3.429-5.714 10.286l9.714 354.857q0 5.714 5.714 10t13.714 4.286h105.714q8 0 13.429-4.286t6-10z"
],
"attrs": [],
"isMulticolor": false,
"tags": [
"exclamation-circle"
],
"defaultCode": 61546,
"grid": 14
},
"attrs": [],
"properties": {
"id": 100,
"order": 4,
"prevSize": 28,
"code": 58880,
"name": "exclamation-sign",
"ligatures": ""
},
"setIdx": 0,
"iconIdx": 0
},
{
"icon": {
"paths": [
"M585.143 786.286v-91.429q0-8-5.143-13.143t-13.143-5.143h-54.857v-292.571q0-8-5.143-13.143t-13.143-5.143h-182.857q-8 0-13.143 5.143t-5.143 13.143v91.429q0 8 5.143 13.143t13.143 5.143h54.857v182.857h-54.857q-8 0-13.143 5.143t-5.143 13.143v91.429q0 8 5.143 13.143t13.143 5.143h256q8 0 13.143-5.143t5.143-13.143zM512 274.286v-91.429q0-8-5.143-13.143t-13.143-5.143h-109.714q-8 0-13.143 5.143t-5.143 13.143v91.429q0 8 5.143 13.143t13.143 5.143h109.714q8 0 13.143-5.143t5.143-13.143zM877.714 512q0 119.429-58.857 220.286t-159.714 159.714-220.286 58.857-220.286-58.857-159.714-159.714-58.857-220.286 58.857-220.286 159.714-159.714 220.286-58.857 220.286 58.857 159.714 159.714 58.857 220.286z"
],
"attrs": [],
"isMulticolor": false,
"tags": [
"info-circle"
],
"defaultCode": 61530,
"grid": 14
},
"attrs": [],
"properties": {
"id": 85,
"order": 3,
"name": "info-sign",
"prevSize": 28,
"code": 58882
},
"setIdx": 0,
"iconIdx": 2
},
{
"icon": {
"paths": [
"M733.714 419.429q0-16-10.286-26.286l-52-51.429q-10.857-10.857-25.714-10.857t-25.714 10.857l-233.143 232.571-129.143-129.143q-10.857-10.857-25.714-10.857t-25.714 10.857l-52 51.429q-10.286 10.286-10.286 26.286 0 15.429 10.286 25.714l206.857 206.857q10.857 10.857 25.714 10.857 15.429 0 26.286-10.857l310.286-310.286q10.286-10.286 10.286-25.714zM877.714 512q0 119.429-58.857 220.286t-159.714 159.714-220.286 58.857-220.286-58.857-159.714-159.714-58.857-220.286 58.857-220.286 159.714-159.714 220.286-58.857 220.286 58.857 159.714 159.714 58.857 220.286z"
],
"attrs": [],
"isMulticolor": false,
"tags": [
"check-circle"
],
"defaultCode": 61528,
"grid": 14
},
"attrs": [],
"properties": {
"id": 83,
"order": 9,
"prevSize": 28,
"code": 58886,
"name": "ok-sign"
},
"setIdx": 0,
"iconIdx": 6
},
{
"icon": {
"paths": [
"M658.286 475.429q0-105.714-75.143-180.857t-180.857-75.143-180.857 75.143-75.143 180.857 75.143 180.857 180.857 75.143 180.857-75.143 75.143-180.857zM950.857 950.857q0 29.714-21.714 51.429t-51.429 21.714q-30.857 0-51.429-21.714l-196-195.429q-102.286 70.857-228 70.857-81.714 0-156.286-31.714t-128.571-85.714-85.714-128.571-31.714-156.286 31.714-156.286 85.714-128.571 128.571-85.714 156.286-31.714 156.286 31.714 128.571 85.714 85.714 128.571 31.714 156.286q0 125.714-70.857 228l196 196q21.143 21.143 21.143 51.429z"
],
"width": 951,
"attrs": [],
"isMulticolor": false,
"tags": [
"search"
],
"defaultCode": 61442,
"grid": 14
},
"attrs": [],
"properties": {
"id": 2,
"order": 1,
"prevSize": 28,
"code": 58887,
"name": "icon-search"
},
"setIdx": 0,
"iconIdx": 7
}
],
"height": 1024,
"metadata": {
"name": "slate",
"license": "SIL OFL 1.1"
},
"preferences": {
"showGlyphs": true,
"showQuickUse": true,
"showQuickUse2": true,
"showSVGs": true,
"fontPref": {
"prefix": "icon-",
"metadata": {
"fontFamily": "slate",
"majorVersion": 1,
"minorVersion": 0,
"description": "Based on FontAwesome",
"license": "SIL OFL 1.1"
},
"metrics": {
"emSize": 1024,
"baseline": 6.25,
"whitespace": 50
},
"resetPoint": 58880,
"showSelector": false,
"selector": "class",
"classSelector": ".icon",
"showMetrics": false,
"showMetadata": true,
"showVersion": true,
"ie7": false
},
"imagePref": {
"prefix": "icon-",
"png": true,
"useClassSelector": true,
"color": 4473924,
"bgColor": 16777215
},
"historySize": 100,
"showCodes": true,
"gridSize": 16,
"showLiga": false
}
}

View File

@ -0,0 +1,95 @@
# -*- coding: utf-8 -*- #
# frozen_string_literal: true
# this is based on https://github.com/rouge-ruby/rouge/blob/master/lib/rouge/themes/monokai_sublime.rb
# but without the added background, and changed styling for JSON keys to be soft_yellow instead of white
module Rouge
module Themes
class MonokaiSublimeSlate < CSSTheme
name 'monokai.sublime.slate'
palette :black => '#000000'
palette :bright_green => '#a6e22e'
palette :bright_pink => '#f92672'
palette :carmine => '#960050'
palette :dark => '#49483e'
palette :dark_grey => '#888888'
palette :dark_red => '#aa0000'
palette :dimgrey => '#75715e'
palette :emperor => '#555555'
palette :grey => '#999999'
palette :light_grey => '#aaaaaa'
palette :light_violet => '#ae81ff'
palette :soft_cyan => '#66d9ef'
palette :soft_yellow => '#e6db74'
palette :very_dark => '#1e0010'
palette :whitish => '#f8f8f2'
palette :orange => '#f6aa11'
palette :white => '#ffffff'
style Generic::Heading, :fg => :grey
style Literal::String::Regex, :fg => :orange
style Generic::Output, :fg => :dark_grey
style Generic::Prompt, :fg => :emperor
style Generic::Strong, :bold => false
style Generic::Subheading, :fg => :light_grey
style Name::Builtin, :fg => :orange
style Comment::Multiline,
Comment::Preproc,
Comment::Single,
Comment::Special,
Comment, :fg => :dimgrey
style Error,
Generic::Error,
Generic::Traceback, :fg => :carmine
style Generic::Deleted,
Generic::Inserted,
Generic::Emph, :fg => :dark
style Keyword::Constant,
Keyword::Declaration,
Keyword::Reserved,
Name::Constant,
Keyword::Type, :fg => :soft_cyan
style Literal::Number::Float,
Literal::Number::Hex,
Literal::Number::Integer::Long,
Literal::Number::Integer,
Literal::Number::Oct,
Literal::Number,
Literal::String::Char,
Literal::String::Escape,
Literal::String::Symbol, :fg => :light_violet
style Literal::String::Doc,
Literal::String::Double,
Literal::String::Backtick,
Literal::String::Heredoc,
Literal::String::Interpol,
Literal::String::Other,
Literal::String::Single,
Literal::String, :fg => :soft_yellow
style Name::Attribute,
Name::Class,
Name::Decorator,
Name::Exception,
Name::Function, :fg => :bright_green
style Name::Variable::Class,
Name::Namespace,
Name::Entity,
Name::Builtin::Pseudo,
Name::Variable::Global,
Name::Variable::Instance,
Name::Variable,
Text::Whitespace,
Text,
Name, :fg => :white
style Name::Label, :fg => :bright_pink
style Operator::Word,
Name::Tag,
Keyword,
Keyword::Namespace,
Keyword::Pseudo,
Operator, :fg => :bright_pink
end
end
end

View File

@ -0,0 +1,16 @@
module Multilang
def block_code(code, full_lang_name)
if full_lang_name
parts = full_lang_name.split('--')
rouge_lang_name = (parts) ? parts[0] : "" # just parts[0] here causes null ref exception when no language specified
super(code, rouge_lang_name).sub("highlight #{rouge_lang_name}") do |match|
match + " tab-" + full_lang_name
end
else
super(code, full_lang_name)
end
end
end
require 'middleman-core/renderers/redcarpet'
Middleman::Renderers::MiddlemanRedcarpetHTML.send :include, Multilang

View File

@ -0,0 +1,22 @@
# Nested unique header generation
require 'middleman-core/renderers/redcarpet'
class NestingUniqueHeadCounter < Middleman::Renderers::MiddlemanRedcarpetHTML
def initialize
super
@@headers_history = {} if !defined?(@@headers_history)
end
def header(text, header_level)
friendly_text = text.gsub(/<[^>]*>/,"").parameterize
@@headers_history[header_level] = text.parameterize
if header_level > 1
for i in (header_level - 1).downto(1)
friendly_text.prepend("#{@@headers_history[i]}-") if @@headers_history.key?(i)
end
end
return "<h#{header_level} id='#{friendly_text}'>#{text}</h#{header_level}>"
end
end

View File

@ -0,0 +1,31 @@
require 'nokogiri'
def toc_data(page_content)
html_doc = Nokogiri::HTML::DocumentFragment.parse(page_content)
# get a flat list of headers
headers = []
html_doc.css('h1, h2, h3').each do |header|
headers.push({
id: header.attribute('id').to_s,
content: header.children,
title: header.children.to_s.gsub(/<[^>]*>/, ''),
level: header.name[1].to_i,
children: []
})
end
[3,2].each do |header_level|
header_to_nest = nil
headers = headers.reject do |header|
if header[:level] == header_level
header_to_nest[:children].push header if header_to_nest
true
else
header_to_nest = header if header[:level] < header_level
false
end
end
end
headers
end

View File

@ -0,0 +1,24 @@
# Unique header generation
require 'middleman-core/renderers/redcarpet'
require 'digest'
class UniqueHeadCounter < Middleman::Renderers::MiddlemanRedcarpetHTML
def initialize
super
@head_count = {}
end
def header(text, header_level)
friendly_text = text.gsub(/<[^>]*>/,"").parameterize
if friendly_text.strip.length == 0
# Looks like parameterize removed the whole thing! It removes many unicode
# characters like Chinese and Russian. To get a unique URL, let's just
# URI escape the whole header
friendly_text = Digest::SHA1.hexdigest(text)[0,10]
end
@head_count[friendly_text] ||= 0
@head_count[friendly_text] += 1
if @head_count[friendly_text] > 1
friendly_text += "-#{@head_count[friendly_text]}"
end
return "<h#{header_level} id='#{friendly_text}'>#{text}</h#{header_level}>"
end
end

248
app/docs/slate/slate.sh Executable file
View File

@ -0,0 +1,248 @@
#!/usr/bin/env bash
set -o errexit #abort if any command fails
me=$(basename "$0")
help_message="\
Usage: $me [<options>] <command> [<command-options>]
Run commands related to the slate process.
Commands:
serve Run the middleman server process, useful for
development.
build Run the build process.
deploy Will build and deploy files to branch. Use
--no-build to only deploy.
Global Options:
-h, --help Show this help information.
-v, --verbose Increase verbosity. Useful for debugging.
Deploy options:
-e, --allow-empty Allow deployment of an empty directory.
-m, --message MESSAGE Specify the message used when committing on the
deploy branch.
-n, --no-hash Don't append the source commit's hash to the deploy
commit's message.
--no-build Do not build the source files.
"
run_serve() {
exec bundle exec middleman serve --watcher-force-polling
}
run_build() {
bundle exec middleman build --clean
}
parse_args() {
# Set args from a local environment file.
if [ -e ".env" ]; then
source .env
fi
command=
# Parse arg flags
# If something is exposed as an environment variable, set/overwrite it
# here. Otherwise, set/overwrite the internal variable instead.
while : ; do
if [[ $1 = "-h" || $1 = "--help" ]]; then
echo "$help_message"
exit 0
elif [[ $1 = "-v" || $1 = "--verbose" ]]; then
verbose=true
shift
elif [[ $1 = "-e" || $1 = "--allow-empty" ]]; then
allow_empty=true
shift
elif [[ ( $1 = "-m" || $1 = "--message" ) && -n $2 ]]; then
commit_message=$2
shift 2
elif [[ $1 = "-n" || $1 = "--no-hash" ]]; then
GIT_DEPLOY_APPEND_HASH=false
shift
elif [[ $1 = "--no-build" ]]; then
no_build=true
shift
elif [[ $1 = "serve" || $1 = "build" || $1 = "deploy" ]]; then
if [ ! -z "${command}" ]; then
>&2 echo "You can only specify one command."
exit 1
fi
command=$1
shift
elif [ -z $1 ]; then
break
fi
done
if [ -z "${command}" ]; then
>&2 echo "Command not specified."
exit 1
fi
# Set internal option vars from the environment and arg flags. All internal
# vars should be declared here, with sane defaults if applicable.
# Source directory & target branch.
deploy_directory=build
deploy_branch=gh-pages
#if no user identity is already set in the current git environment, use this:
default_username=${GIT_DEPLOY_USERNAME:-deploy.sh}
default_email=${GIT_DEPLOY_EMAIL:-}
#repository to deploy to. must be readable and writable.
repo=origin
#append commit hash to the end of message by default
append_hash=${GIT_DEPLOY_APPEND_HASH:-true}
}
main() {
enable_expanded_output
if ! git diff --exit-code --quiet --cached; then
echo Aborting due to uncommitted changes in the index >&2
return 1
fi
commit_title=`git log -n 1 --format="%s" HEAD`
commit_hash=` git log -n 1 --format="%H" HEAD`
#default commit message uses last title if a custom one is not supplied
if [[ -z $commit_message ]]; then
commit_message="publish: $commit_title"
fi
#append hash to commit message unless no hash flag was found
if [ $append_hash = true ]; then
commit_message="$commit_message"$'\n\n'"generated from commit $commit_hash"
fi
previous_branch=`git rev-parse --abbrev-ref HEAD`
if [ ! -d "$deploy_directory" ]; then
echo "Deploy directory '$deploy_directory' does not exist. Aborting." >&2
return 1
fi
# must use short form of flag in ls for compatibility with macOS and BSD
if [[ -z `ls -A "$deploy_directory" 2> /dev/null` && -z $allow_empty ]]; then
echo "Deploy directory '$deploy_directory' is empty. Aborting. If you're sure you want to deploy an empty tree, use the --allow-empty / -e flag." >&2
return 1
fi
if git ls-remote --exit-code $repo "refs/heads/$deploy_branch" ; then
# deploy_branch exists in $repo; make sure we have the latest version
disable_expanded_output
git fetch --force $repo $deploy_branch:$deploy_branch
enable_expanded_output
fi
# check if deploy_branch exists locally
if git show-ref --verify --quiet "refs/heads/$deploy_branch"
then incremental_deploy
else initial_deploy
fi
restore_head
}
initial_deploy() {
git --work-tree "$deploy_directory" checkout --orphan $deploy_branch
git --work-tree "$deploy_directory" add --all
commit+push
}
incremental_deploy() {
#make deploy_branch the current branch
git symbolic-ref HEAD refs/heads/$deploy_branch
#put the previously committed contents of deploy_branch into the index
git --work-tree "$deploy_directory" reset --mixed --quiet
git --work-tree "$deploy_directory" add --all
set +o errexit
diff=$(git --work-tree "$deploy_directory" diff --exit-code --quiet HEAD --)$?
set -o errexit
case $diff in
0) echo No changes to files in $deploy_directory. Skipping commit.;;
1) commit+push;;
*)
echo git diff exited with code $diff. Aborting. Staying on branch $deploy_branch so you can debug. To switch back to main, use: git symbolic-ref HEAD refs/heads/main && git reset --mixed >&2
return $diff
;;
esac
}
commit+push() {
set_user_id
git --work-tree "$deploy_directory" commit -m "$commit_message"
disable_expanded_output
#--quiet is important here to avoid outputting the repo URL, which may contain a secret token
git push --quiet $repo $deploy_branch
enable_expanded_output
}
#echo expanded commands as they are executed (for debugging)
enable_expanded_output() {
if [ $verbose ]; then
set -o xtrace
set +o verbose
fi
}
#this is used to avoid outputting the repo URL, which may contain a secret token
disable_expanded_output() {
if [ $verbose ]; then
set +o xtrace
set -o verbose
fi
}
set_user_id() {
if [[ -z `git config user.name` ]]; then
git config user.name "$default_username"
fi
if [[ -z `git config user.email` ]]; then
git config user.email "$default_email"
fi
}
restore_head() {
if [[ $previous_branch = "HEAD" ]]; then
#we weren't on any branch before, so just set HEAD back to the commit it was on
git update-ref --no-deref HEAD $commit_hash $deploy_branch
else
git symbolic-ref HEAD refs/heads/$previous_branch
fi
git reset --mixed
}
filter() {
sed -e "s|$repo|\$repo|g"
}
sanitize() {
"$@" 2> >(filter 1>&2) | filter
}
parse_args "$@"
if [ "${command}" = "serve" ]; then
run_serve
elif [[ "${command}" = "build" ]]; then
run_build
elif [[ ${command} = "deploy" ]]; then
if [[ ${no_build} != true ]]; then
run_build
fi
main "$@"
fi

View File

@ -0,0 +1,36 @@
---
title: Trustie API Reference
language_tabs: # must be one of https://git.io/vQNgJ
- shell: Shell
- javascript: JavaScript
toc_footers:
- <a href='https://www.trustie.net/login?login=false'>Sign Up for a User</a>
- <a href='https://www.trustie.net'>Powered by Trustie</a>
includes:
- licenses
- gitignores
- users
- projects
- repositories
- pulls
- issues
- organizations
- teams
- errors
search: true
code_clipboard: true
---
# Introduction
Welcome to the Trustie API! You can use our API to access Trustie API endpoints, which can get information on projects, repository, and users in our platform.
We have language bindings in Shell,avaScript! You can view code examples in the dark area to the right, and you can switch the programming language of the examples with the tabs in the top right.
This example API documentation page was created with [Trustie](https://www.trustie.net). Feel free to edit it and use it as a base for your own API's documentation.

Binary file not shown.

View File

@ -0,0 +1,14 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
<defs>
<font id="slate" horiz-adv-x="1024">
<font-face units-per-em="1024" ascent="960" descent="-64" />
<missing-glyph horiz-adv-x="1024" />
<glyph unicode="&#x20;" d="" horiz-adv-x="512" />
<glyph unicode="&#xe600;" d="M438.857 877.714q119.429 0 220.286-58.857t159.714-159.714 58.857-220.286-58.857-220.286-159.714-159.714-220.286-58.857-220.286 58.857-159.714 159.714-58.857 220.286 58.857 220.286 159.714 159.714 220.286 58.857zM512 165.143v108.571q0 8-5.143 13.429t-12.571 5.429h-109.714q-7.429 0-13.143-5.714t-5.714-13.143v-108.571q0-7.429 5.714-13.143t13.143-5.714h109.714q7.429 0 12.571 5.429t5.143 13.429zM510.857 361.714l10.286 354.857q0 6.857-5.714 10.286-5.714 4.571-13.714 4.571h-125.714q-8 0-13.714-4.571-5.714-3.429-5.714-10.286l9.714-354.857q0-5.714 5.714-10t13.714-4.286h105.714q8 0 13.429 4.286t6 10z" />
<glyph unicode="&#xe602;" d="M585.143 164.571v91.429q0 8-5.143 13.143t-13.143 5.143h-54.857v292.571q0 8-5.143 13.143t-13.143 5.143h-182.857q-8 0-13.143-5.143t-5.143-13.143v-91.429q0-8 5.143-13.143t13.143-5.143h54.857v-182.857h-54.857q-8 0-13.143-5.143t-5.143-13.143v-91.429q0-8 5.143-13.143t13.143-5.143h256q8 0 13.143 5.143t5.143 13.143zM512 676.571v91.429q0 8-5.143 13.143t-13.143 5.143h-109.714q-8 0-13.143-5.143t-5.143-13.143v-91.429q0-8 5.143-13.143t13.143-5.143h109.714q8 0 13.143 5.143t5.143 13.143zM877.714 438.857q0-119.429-58.857-220.286t-159.714-159.714-220.286-58.857-220.286 58.857-159.714 159.714-58.857 220.286 58.857 220.286 159.714 159.714 220.286 58.857 220.286-58.857 159.714-159.714 58.857-220.286z" />
<glyph unicode="&#xe606;" d="M733.714 531.428q0 16-10.286 26.286l-52 51.429q-10.857 10.857-25.714 10.857t-25.714-10.857l-233.143-232.571-129.143 129.143q-10.857 10.857-25.714 10.857t-25.714-10.857l-52-51.429q-10.286-10.286-10.286-26.286 0-15.429 10.286-25.714l206.857-206.857q10.857-10.857 25.714-10.857 15.429 0 26.286 10.857l310.286 310.286q10.286 10.286 10.286 25.714zM877.714 438.857q0-119.429-58.857-220.286t-159.714-159.714-220.286-58.857-220.286 58.857-159.714 159.714-58.857 220.286 58.857 220.286 159.714 159.714 220.286 58.857 220.286-58.857 159.714-159.714 58.857-220.286z" />
<glyph unicode="&#xe607;" d="M658.286 475.428q0 105.714-75.143 180.857t-180.857 75.143-180.857-75.143-75.143-180.857 75.143-180.857 180.857-75.143 180.857 75.143 75.143 180.857zM950.857 0q0-29.714-21.714-51.429t-51.429-21.714q-30.857 0-51.429 21.714l-196 195.429q-102.286-70.857-228-70.857-81.714 0-156.286 31.714t-128.571 85.714-85.714 128.571-31.714 156.286 31.714 156.286 85.714 128.571 128.571 85.714 156.286 31.714 156.286-31.714 128.571-85.714 85.714-128.571 31.714-156.286q0-125.714-70.857-228l196-196q21.143-21.143 21.143-51.429z" horiz-adv-x="951" />
</font></defs></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 B

View File

@ -0,0 +1,39 @@
# Authentication
> To authorize, use this code:
```ruby
require 'kittn'
api = Kittn::APIClient.authorize!('meowmeowmeow')
```
```python
import kittn
api = kittn.authorize('meowmeowmeow')
```
```shell
# With shell, you can just pass the correct header with each request
curl "api_endpoint_here" \
-H "Authorization: meowmeowmeow"
```
```javascript
const kittn = require('kittn');
let api = kittn.authorize('meowmeowmeow');
```
> Make sure to replace `meowmeowmeow` with your API key.
Kittn uses API keys to allow access to the API. You can register a new Kittn API key at our [developer portal](http://example.com/developers).
Kittn expects for the API key to be included in all API requests to the server in a header that looks like the following:
`Authorization: meowmeowmeow`
<aside class="notice">
You must replace <code>meowmeowmeow</code> with your personal API key.
</aside>

View File

@ -0,0 +1,22 @@
# Errors
<aside class="notice">
This error section is stored in a separate file in <code>includes/_errors.md</code>. Slate allows you to optionally separate out your docs into many files...just save them to the <code>includes</code> folder and add them to the top of your <code>index.md</code>'s frontmatter. Files are included in the order listed.
</aside>
The Kittn API uses the following error codes:
Error Code | Meaning
---------- | -------
400 | Bad Request -- Your request is invalid.
401 | Unauthorized -- Your API key is wrong.
403 | Forbidden -- The kitten requested is hidden for administrators only.
404 | Not Found -- The specified kitten could not be found.
405 | Method Not Allowed -- You tried to access a kitten with an invalid method.
406 | Not Acceptable -- You requested a format that isn't json.
410 | Gone -- The kitten requested has been removed from our servers.
418 | I'm a teapot.
429 | Too Many Requests -- You're requesting too many kittens! Slow down!
500 | Internal Server Error -- We had a problem with our server. Try again later.
503 | Service Unavailable -- We're temporarily offline for maintenance. Please try again later.

View File

@ -0,0 +1,47 @@
# Gitignores
## gitignore模板列表
获取gitignore模板列表, 支持名称搜索过滤
> 示例:
```shell
curl -X GET \
-d "name=Ada" \
http://localhost:3000/api/ignores.json
```
```javascript
await octokit.request('GET /api/ignores.json')
```
### HTTP 请求
`GET api/ignores.json`
### 请求参数
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
name |否| 否 ||string |gitignore名称
### 返回字段说明
参数 | 类型 | 字段说明
--------- | ----------- | -----------
id |int |id |
name |string|gitignore名称|
> 返回的JSON示例:
```json
{
"ignores": [
{
"id": 1,
"name": "Ada"
}
]
}
```
<aside class="success">
Success — a happy kitten is an authenticated kitten!
</aside>

View File

@ -0,0 +1 @@
# Issues

View File

@ -0,0 +1,57 @@
# Licenses
## Get All Licenses
The Licenses API returns metadata about popular open source licenses and information about a particular project's license file.
> 示例:
```shell
curl -X GET \
-d "name=AFL" \
http://localhost:3000/api/licenses
```
```javascript
await octokit.request('GET /api/licenses')
```
### HTTP Request
`GET https://forgeplus.trustie.net/api/licenses.json`
### 请求参数
Name | Required | Type | Description
----- | ---- | ----- | -----
name |false|string |name of the license
> 返回字段说明:
```json
{
"licenses": [
{
"id": 57,
"name": "AFL-1.2"
},
{
"id": 76,
"name": "AFL-3.0"
},
{
"id": 214,
"name": "AFL-1.1"
},
{
"id": 326,
"name": "AFL-2.1"
},
{
"id": 350,
"name": "AFL-2.0"
}
]
}
```

View File

@ -0,0 +1 @@
# Organizations

View File

@ -0,0 +1,528 @@
# Projects
## 获取项目列表
获取项目列表,也可以更加相关条件过滤搜素
> 示例:
```shell
curl -X GET \
-d "page=1" \
-d "limit=5" \
http://localhost:3000/api/projects | jq
```
```javascript
await octokit.request('GET /api/projects')
```
### HTTP 请求
`GET api/projects`
### 请求参数
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
page | false | 1 | string | 页数,第几页
limit | false | 15 | string | 每页多少条数据默认15条
sort_by | false | | string | 排序类型, 取值updated_on、created_on、forked_count、praises_count; updated_on: 更新时间排序created_on: 创建时间排序forked_count: fork数据排序praises_count: 点赞数量排序默认为updated_on更新时间排序
sort_direction| false | | string | 排序方式,取值为: desc、asc; desc: 降序排序, asc: 升序排序, 默认为desc
search | false | | string | 按照项目名称搜索
category_id | false | | int | 项目类别id
language_id | false | | int | 项目语言id
project_type | false | | string | 项目类型, 取值为common、mirror; common:开源托管项目, mirror:开源镜像项目
### 返回字段说明
参数 | 类型 | 字段说明
--------- | ----------- | -----------
total_count | int | 项目总条数
id | string | 项目id
name | string | 项目名称
description | string | 项目简介
visits | int | 流量数
forked_count | int | 被fork的数量
praises_count | int | star数量
is_public | boolean | 是否公开, true:公开false:未公开
mirror_url | string | 镜像url
last_update_time| int | 最后更新时间为UNIX格式的时间戳
author | object | 项目创建者
-- name | string | 用户名,也是用户标识
category | object | 项目类别
-- id | int | 项目类型id
-- name | string | 项目类型名称
language | object | 项目语言
-- id | int | 项目语言id
-- name | string | 项目语言名称
> 返回的JSON示例:
```json
{
"total_count": 3096,
"projects": [
{
"id": 1400794,
"repo_id": 1402452,
"identifier": "cscw_2021_sponsor",
"name": "Sponsor机制下的开源贡献",
"description": "CSCW 2021 sponsor机制研究",
"visits": 5,
"praises_count": 0,
"forked_count": 0,
"is_public": true,
"mirror_url": null,
"type": 0,
"last_update_time": 1611971671,
"time_ago": "2天前",
"forked_from_project_id": null,
"open_devops": false,
"platform": "forge",
"author": {
"name": "张迅晖",
"login": "Nigel",
"image_url": "images/avatars/User/3675?t=1611832880"
},
"category": {
"id": 13,
"name": "云计算和大数据"
},
"language": {
"id": 34,
"name": "Python3.6"
}
}
]
}
```
<aside class="success">
Remember — a happy kitten is an authenticated kitten!
</aside>
## 推荐项目
获取推荐项目列表
> 示例:
```shell
curl -X GET \
http://localhost:3000/api/projects/recommend | jq
```
```javascript
await octokit.request('GET /api/projects/recommend.json')
```
### HTTP 请求
`GET api/projects/recommend`
### 返回字段说明
参数 | 类型 | 字段说明
--------- | ----------- | -----------
total_count |int |项目总条数
id |string |项目id
name |string|项目名称
description |string|项目简介
visits |int|流量数
forked_count |int|被fork的数量
praises_count |int|star数量
is_public |boolean|是否公开, true:公开false:未公开
mirror_url |string|镜像url
last_update_time|int|最后更新时间为UNIX格式的时间戳
author |object|项目创建者
-- name |string|用户名,也是用户标识
category |object|项目类别
-- id |int|项目类型id
-- name |string|项目类型名称
language |object|项目语言
-- id |int|项目语言id
-- name |string|项目语言名称
> 返回的JSON示例:
```json
[
{
"id": 20,
"repo_id": 2,
"identifier": "PNAekinmH",
"name": "FNILL",
"visits": 13567,
"author": {
"name": "王一达",
"login": "wangyida",
"image_url": "avatars/User/b"
},
"category": {
"id": 8,
"name": "其他"
}
}
]
```
<aside class="success">
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"
}
]
```
## 项目主页
获取项目主页信息
> 示例:
```shell
curl -X GET \
http://localhost:3000/api/jasder/forgeplus/about | jq
```
```javascript
await octokit.request('GET /api/jasder/forgeplus/about')
```
### HTTP 请求
`GET api/:owner/:repo/about`
### 请求参数
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
owner |是| |string |用户登录名
repo |是| |string |项目标识identifier
### 返回字段说明
参数 | 类型 | 字段说明
--------- | ----------- | -----------
identifier |string|project's identifier
content |string|主页内容
attachments |array|附件
> 返回的JSON示例:
```json
{
"content": "",
"identifier": "forgeplus",
attachments: []
}
```
<aside class="success">
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"
}
```
## 创建项目
创建项目
> 示例:
```shell
curl -X POST \
-d "user_id=36401" \
-d "name=hnfl_demo" \
-d "description=my first project" \
-d "repository_name=hnfl_demo" \
-d "project_category_id=1" \
-d "project_language_id=2" \
-d "ignore_id=2" \
-d "license_id=1" \
http://localhost:3000/api/projects.json
```
```javascript
await octokit.request('GET /api/projects.json')
```
### HTTP 请求
`POST api/projects`
### 请求参数
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|user_id |是| |int |用户id或者组织id |
|name |是| |string |项目名称 |
|description |是| |string |项目描述 |
|repository_name |是| |string |仓库名称, 只含有数字、字母、下划线不能以下划线开头和结尾,且唯一 |
|project_category_id|是| |int |项目类别id |
|project_language_id|是| |int |项目语言id |
|ignore_id |否| |int |gitignore相关id |
|license_id |否| |int |开源许可证id |
|private |否| |boolean|项目是否私有, true为私有false: 公开,默认为公开 |
### 返回字段说明
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|id |int |id |
|name |string|项目名称|
> 返回的JSON示例:
```json
{
"id": 3240,
"name": "好项目"
}
```
## 创建镜像项目
创建镜像项目
> 示例:
```shell
curl -X POST \
-d "user_id=36408" \
-d "clone_addr=https://gitea.com/mx8090alex/golden.git" \
-d "name=golden_mirror1" \
-d "description=golden_mirror" \
-d "project_category_id=1" \
-d "project_language_id=2" \
http://localhost:3000/api/projects/migrate.json
```
```javascript
await octokit.request('GET /api/projects/migrate.json')
```
### HTTP 请求
`POST api/projects/migrate.json`
### 请求参数
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|user_id |是| |int |用户id或者组织id |
|name |是| |string |项目名称 |
|clone_addr |是| |string |镜像项目clone地址 |
|description |否| |string |项目描述 |
|repository_name |是| |string |仓库名称, 只含有数字、字母、下划线不能以下划线开头和结尾,且唯一 |
|project_category_id|是| |int |项目类别id |
|project_language_id|是| |int |项目语言id |
|is_mirror |否| |boolean|是否设置为镜像, true false默认为否 |
|auth_username |否| |string|镜像源仓库的登录用户名 |
|auth_password |否| |string|镜像源仓库的登录秘密 |
|private |否| |boolean|项目是否私有, true为私有false: 非私有,默认为公开 |
### 返回字段说明
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|id |int |id |
|name |string|项目名称|
> 返回的JSON示例:
```json
{
"id": 3241,
"name": "这是一个镜像项目"
}
```
## 同步镜像
手动同步镜像
> 示例:
```shell
curl -X POST http://localhost:3000/api/repositories/1244/sync_mirror.json
```
```javascript
await octokit.request('POST /api/repositories/1244/sync_mirror.json')
```
### HTTP 请求
`POST api/repositories/:id/sync_mirror.json`
### 请求参数
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|id |是| |int |仓库id |
### 返回字段说明
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|status |int |状态码, 0:标识请求成功 |
|message |string|服务端返回的信息说明|
> 返回的JSON示例:
```json
{
"status": 0,
"message": "success"
}
```
## Fork项目
fork项目
> 示例:
```shell
curl -X POST http://localhost:3000/api/jasder/forgeplus/forks.json
```
```javascript
await octokit.request('POST /api/jaser/jasder_test/forks.json')
```
### HTTP 请求
`POST api/:owner/:repo/forks.json`
### 请求参数
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|owner |是| |string |用户登录名 |
|repo |是| |string |项目标识identifier |
### 返回字段说明
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|id |int |项目id |
|identifier |string|项目标识|
> 返回的JSON示例:
```json
{
"id": 3290,
"identifier": "newadm"
}
```

View File

@ -0,0 +1 @@
# Pulls

View File

@ -0,0 +1,869 @@
# Repositories
## 仓库详情
仓库详情
> 示例:
```shell
curl -X GET http://localhost:3000/api/jasder/jasder_test.json
```
```javascript
await octokit.request('GET /api/jasder/jasder_test.json')
```
### HTTP 请求
`GET /api/:owner/:repo`
### 请求参数:
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|owner |是| |string |用户登录名 |
|repo |是| |string |项目标识identifier |
### 返回字段说明:
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|id |int |id |
|name |string|项目名称|
|identifier |string|项目标识|
|is_public |boolean|项目是否公开, true:公开false:私有|
|description |string|项目简介|
|repo_id |int|仓库id|
|repo_identifier|string|仓库标识|
> 返回的JSON示例:
```json
{
"name": "ni项目",
"identifier": "mirror_demo",
"is_public": true,
"description": "my first project mirror_demo",
"repo_id": 75073,
"repo_identifier": "mirror_demo"
}
```
## 仓库详情(简版)
仓库详情
> 示例:
```shell
curl -X GET http://localhost:3000/api/jasder/jasder_test/simple.json
```
```javascript
await octokit.request('GET /api/jasder/jasder_test/simple.json')
```
### HTTP 请求
`GET /api/:owner/:repo/simple`
### 请求参数:
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|owner |是| |string |用户登录名 |
|repo |是| |string |项目标识identifier |
### 返回字段说明:
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|id |int |id |
|name |string|项目名称|
|identifier |string|项目标识|
|is_public |boolean|项目是否公开, true:公开false:私有|
|description |string|项目简介|
|repo_id |int|仓库id|
|repo_identifier|string|仓库标识|
> 返回的JSON示例:
```json
{
"name": "ni项目",
"identifier": "mirror_demo",
"is_public": true,
"description": "my first project mirror_demo",
"repo_id": 75073,
"repo_identifier": "mirror_demo"
}
```
## 仓库详情(新版)
仓库详情
> 示例:
```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%"
}
}
```
## 编辑仓库信息
编辑仓库信息
> 示例:
```shell
curl -X GET http://localhost:3000/api/jasder/jasder_test/edit.json
```
```javascript
await octokit.request('GET /api/jasder/jasder_test/edit.json')
```
### HTTP 请求
`GET /api/:owner/:repo/edit.json`
### 请求参数:
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|owner |是| |string |用户登录名 |
|repo |是| |string |项目标识identifier |
### 返回字段说明:
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|identifier |string |仓库标识 |
|project_id |int|项目id|
|project_name |string|项目名称|
|project_identifier |string|项目标识|
|project_description |string|项目简介|
|project_category_id |int|项目类别id|
|project_language_id |int|项目语言id|
|private |boolean|项目是否私有, true为私有false: 公开 |
> 返回的JSON示例:
```json
{
"identifier": "project",
"project_id": 3263,
"project_name": "项目",
"project_identifier": "project identifier",
"project_description": "project description",
"project_category_id": 1,
"project_language_id": 2,
"private": false
}
```
## 修改仓库信息
修改仓库信息
> 示例:
```shell
curl -X PATCH \
-d "name=hnfl_demo" \
-d "description=my first project" \
-d "project_category_id=1" \
-d "project_language_id=2" \
-d "private=true" \
http://localhost:3000/api/jasder/jasder_test.json
```
```javascript
await octokit.request('PATCH /api/jasder/jasder_test.json')
```
### HTTP 请求
`PATCH /api/:owner/:repo`
### 请求参数:
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|id |是 | |int |项目id |
|name |否 | |string |项目名称 |
|description |否 | |string |项目描述 |
|project_category_id|否 | |int |项目类别id |
|project_language_id|否 | |int |项目语言id |
|default_branch |否 | |string |默认分支名称 |
|private |否 | |boolean|项目是否私有, true为私有false: 公开,默认为公开 |
### 返回字段说明:
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|id |int|id |
|identifier |string|项目标识|
|name |string|项目名称|
|description |string|项目简介|
|project_category_id|int|项目类别id|
|project_language_id|int|项目语言id|
|private |否|boolean|项目是否私有, true为私有false: 公开,默认为公开 |
> 返回的JSON示例:
```json
{
"id": 3263,
"identifier": "project identifier",
"name": "project name",
"description": "project description",
"project_category_id": 1,
"project_language_id": 2,
"is_public": true
}
```
## 删除仓库
删除仓库
> 示例:
```shell
curl -X DELETE http://localhost:3000/api/jasder/jasder_test.json
```
```javascript
await octokit.request('DELETE /api/jasder/jasder_test.json')
```
### HTTP 请求
`PATCH /api/:owner/:repo`
### 请求参数:
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|owner |是| |string |用户登录名 |
|repo |是| |string |项目标识identifier |
### 返回字段说明:
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|status |int|返回状态, 0: 表示操作成功 |
|message |string|返回信息说明|
> 返回的JSON示例:
```json
{
"status": 0,
"message": "success"
}
```
<aside class="warning">
只有平台管理员和项目管理员才能删除仓库.
</aside>
## 添加仓库成员
仓库中添加成员操作
> 示例:
```shell
curl -X POST \
-d "user_id=12" \
http://localhost:3000/api/jasder/jasder_test/collaborators.json
```
```javascript
await octokit.request('POST /api/jasder/jasder_test/collaborators.json')
```
### HTTP 请求
`POST /api/:owner/:repo/collaborators.json`
### 请求参数:
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|owner |是| |string |用户登录名 |
|repo |是| |string |项目标识identifier |
|user_id |是|int | |用户id |
### 返回字段说明:
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|status |int|返回状态, 0: 表示操作成功 |
|message |string|返回信息说明|
> 返回的JSON示例:
```json
{
"status": 0,
"message": "success"
}
```
<aside class="warning">
只有平台管理员和项目管理员才能添加仓库成员.
</aside>
## 删除仓库成员
仓库中删除成员操作
> 示例:
```shell
curl -X DELETE \
-d "user_id=12" \
http://localhost:3000/api/jasder/jasder_test/collaborators.json
```
```javascript
await octokit.request('DELETE /api/jasder/jasder_test/collaborators.json')
```
### HTTP 请求
`DELETE /api/:owner/:repo/collaborators.json`
### 请求参数:
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|owner |是| |string |用户登录名 |
|repo |是| |string |项目标识identifier |
|user_id |是|int | |用户id |
### 返回字段说明:
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|status |int|返回状态, 0: 表示操作成功 |
|message |string|返回信息说明|
> 返回的JSON示例:
```json
{
"status": 0,
"message": "success"
}
```
<aside class="warning">
只有平台管理员和项目管理员才能删除仓库成员.
</aside>
## 更改仓库成员角色(权限)
更改仓库成员角色
> 示例:
```shell
curl -X PUT \
-d "user_id=12" \
-d "role=Developer" \
http://localhost:3000/api/jasder/jasder_test/change_role.json
```
```javascript
await octokit.request('PUT /api/jasder/jasder_test/change_role.json')
```
### HTTP 请求
`PUT /api/:owner/:repo/change_role.json`
### 请求参数:
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|owner |是| |string |用户登录名 |
|repo |是| |string |项目标识identifier |
|user_id |是|int | |用户id |
|role |是|string | |取值范围:"Manager", "Developer", "Reporter";分别为项目管理人员(拥有所有操作权限)、项目开发人员(只拥有读写权限)、项目报告人员(只拥有读权限) |
### 返回字段说明:
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|status |int|返回状态, 0: 表示操作成功 |
|message |string|返回信息说明|
> 返回的JSON示例:
```json
{
"status": 0,
"message": "success"
}
```
<aside class="warning">
只有平台管理员和项目管理员才能更改仓库成员角色.
</aside>
## 获取仓库成员列表
获取仓库成员列表
> 示例:
```shell
curl -X GET \
-d "page=1" \
-d "limit=5" \
http://localhost:3000/api/jasder/jasder_test/collaborators.json
```
```javascript
await octokit.request('GET /api/jasder/jasder_test/collaborators.json')
```
### HTTP 请求
`GET /api/:owner/:repo/collaborators.json`
### 请求参数:
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|owner |是| |string |用户登录名 |
|repo |是| |string |项目标识identifier |
|page |否| |string |页数,第几页 |
|limit |否| |string |每页多少条数据默认15条 |
### 返回字段说明:
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|total_count |int |返回记录总条数 |
|members |array|项目成员信息|
|-- id |int|用户id|
|-- name |string|用户名称|
|-- login |string|用户登录名/标识|
|-- image_url |string|用户头像|
|-- is_owner |boolean|是否是项目的拥有者true:是, false:不是|
|-- role |string|该用户在项目中的角色, Manager: 管理员(拥有操作权限); Developer:开发人员(只拥有读写权限) Reporter:报告人员(只拥有读权限)|
> 返回的JSON示例:
```json
{
"total_count": 2,
"members": [
{
"id": 36401,
"name": "name",
"login": "login",
"image_url": "avatars/User/b",
"is_owner": true,
"role": "Manager"
},
{
"id": 36399,
"name": "name",
"login": "login",
"image_url": "avatars/User/b",
"is_owner": false,
"role": "Developer"
}
]
}
```
<aside class="success">
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"
}
]
```
## 获取仓库代码目录
获取仓库代码目录
> 示例:
```shell
curl -X GET \
-d "ref=develop" \
http://localhost:3000//api/jasder/jasder_test/entries.json
```
```javascript
await octokit.request('GET /api/jasder/jasder_test/entries.json')
```
### HTTP 请求
`GET /api/:owner/:repo/entries.json`
### 请求参数:
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|owner |是| |string |用户登录名 |
|repo |是| |string |项目标识identifier |
|ref |否| | string |分支名称、tag名称或是提交记录id默认为master分支 |
### 返回字段说明:
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|last_commit |object |
|-- commit |object |
|id |int |id |
|name |string|文件夹或文件名称|
|path |string|文件夹或文件相对路径|
|type |string|文件类型, file:文件dir文件目录
|size |int|文件夹或文件大小 单位B
|content |string|文件内容
|target |string|标签
> 返回的JSON示例:
```json
{
"last_commit": {
"commit": {
"sha": "3f2de4f78d2d7050486535082cd11cdfc9f3679e",
"url": "http://localhost:3003//api/repositories/api-cloud-platform/commits/3f2de4f78d2d7050486535082cd11cdfc9f3679e",
"message": "update README.md.",
"author": {
"name": "Gitee",
"email": "noreply@gitee.com",
"date": "2020-03-02T20:23:18+08:00"
},
"committer": {
"name": "Gitee",
"email": "noreply@gitee.com",
"date": "2020-03-02T20:23:18+08:00"
},
"timestamp": 1583151798,
"time_from_now": "3个月前"
},
"author": null,
"committer": null
},
"entries": [
{
"name": "ace-gate",
"path": "ace-gate",
"sha": "c83f85fc63b14edcd6fc502eee9996f5a9993eca",
"type": "dir",
"size": 0,
"content": null,
"target": null,
"commit": {
"message": "v2.9 升级alibaba组件release版本\n",
"sha": "6117eaab86f71115f42f2a46ff1683015cda798d",
"created_at": "1970-01-01 08:00",
"time_from_now": "1年前",
"created_at_unix": null
}
}
]
}
```
<aside class="success">
Success Data.
</aside>
## 获取仓库代码子目录或者文件
获取仓库代码子目录或者文件
> 示例:
```shell
curl -X GET \
-d "ref=master" \
-d "filepath=file" \
http://localhost:3000//api/jasder/jasder_test/sub_entries.json
```
```javascript
await octokit.request('GET /api/jasder/jasder_test/sub_entries.json')
```
### HTTP 请求
`GET /api/:owner/:repo/sub_entries.json`
### 请求参数:
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|owner |是| |string |用户登录名 |
|repo |是| |string |项目标识identifier |
|filepath |是|string |文件夹、文件的相对路径 |
|ref |否| | string |分支名称、tag名称或是提交记录id默认为master分支 |
### 返回字段说明:
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|id |int |id |
|name |string|文件夹或文件名称|
|path |string|文件夹或文件相对路径|
|type |string|文件类型, file:文件dir文件目录|
|size |int|文件夹或文件大小 单位KB|
|content |string|文件内容,|
|target |string|标签|
|url |string|文件访问链接,带分支|
|html_url |string|文件访问链接,未标识分支|
|git_url |string|文件夹或文件的git仓库访问链接|
|download_url |string|文件下载、文件内容访问链接|
> 返回的JSON示例:
```json
[
{
"name": "build.rc",
"path": "lib/build.rc",
"type": "",
"size": 1268,
"content": null,
"target": null,
"url": "http://localhost:3003/api/v1/repos/18816895620/mirror_demo/contents/lib/build.rc?ref=master",
"html_url": "http://localhost:3003/18816895620/mirror_demo/src/branch/master/lib/build.rc",
"git_url": "http://localhost:3003/api/v1/repos/18816895620/mirror_demo/git/blobs/191fcf1a63b3777e2977fcede7dd5309efdd70fe",
"download_url": null
}
]
```
<aside class="success">
Success Data.
</aside>

View File

@ -0,0 +1 @@
# Teams

View File

@ -0,0 +1,42 @@
# Users
## 获取当前登陆用户信息
获取当前登陆用户信息
> 示例:
```shell
curl -X GET http://localhost:3000/api/users/me.json
```
```javascript
await octokit.request('GET /api/users/me.json')
```
### HTTP 请求
`GET api/users/me.json`
### 返回字段说明:
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|user_id |int |用户id |
|username |string|用户名称|
|admin |boolean|是否为管理用户|
|login |string|登录名|
|image_url |string|用户头像|
> 返回的JSON示例:
```json
{
"username": "username",
"login": "login",
"user_id": 100000,
"image_url": "avatars/User/b",
"admin": false
}
```
<aside class="success">
Success Data.
</aside>

View File

@ -0,0 +1,2 @@
//= require ./all_nosearch
//= require ./app/_search

Some files were not shown because too many files have changed in this diff Show More