From 299978833da731f4d371de0d971a891177353b24 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Thu, 25 Jan 2024 16:09:52 +0800
Subject: [PATCH 01/47] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E9=87=8C?=
=?UTF-8?q?=E7=A8=8B=E7=A2=91=E8=BF=87=E6=9C=9F=E7=9B=B8=E5=85=B3=E7=B3=BB?=
=?UTF-8?q?=E7=BB=9F=E9=80=9A=E7=9F=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../delay_expired_issue_and_milestone_job.rb | 16 +++++
app/jobs/delay_expired_issue_job.rb | 10 ---
app/jobs/send_template_message_job.rb | 14 ++++
app/models/message_template.rb | 2 +
.../project_milestone_early_expired.rb | 70 +++++++++++++++++++
.../project_milestone_expired.rb | 70 +++++++++++++++++++
app/models/user_template_message_setting.rb | 4 ++
app/models/version.rb | 2 +
config/sidekiq_cron.yml | 2 +-
9 files changed, 179 insertions(+), 11 deletions(-)
create mode 100644 app/jobs/delay_expired_issue_and_milestone_job.rb
delete mode 100644 app/jobs/delay_expired_issue_job.rb
create mode 100644 app/models/message_template/project_milestone_early_expired.rb
create mode 100644 app/models/message_template/project_milestone_expired.rb
diff --git a/app/jobs/delay_expired_issue_and_milestone_job.rb b/app/jobs/delay_expired_issue_and_milestone_job.rb
new file mode 100644
index 000000000..4bba7aaf1
--- /dev/null
+++ b/app/jobs/delay_expired_issue_and_milestone_job.rb
@@ -0,0 +1,16 @@
+class DelayExpiredIssueAndMilestoneJob < ApplicationJob
+ queue_as :message
+
+ def perform
+ Issue.where(due_date: Date.today + 1.days).find_each do |issue|
+ SendTemplateMessageJob.perform_later('IssueExpire', issue.id) if Site.has_notice_menu?
+ end
+ Version.where(effective_date: Date.today + 1.days).find_each do |version|
+ SendTemplateMessageJob.perform_later('ProjectMilestoneEarlyExpired', version.id) if Site.has_notice_menu?
+ end
+ Version.where(effective_date: Date.today - 1.days).find_each do |version|
+ SendTemplateMessageJob.perform_later('ProjectMilestoneExpired', version.id) if Site.has_notice_menu?
+ end
+ end
+
+end
\ No newline at end of file
diff --git a/app/jobs/delay_expired_issue_job.rb b/app/jobs/delay_expired_issue_job.rb
deleted file mode 100644
index ed390e15b..000000000
--- a/app/jobs/delay_expired_issue_job.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-class DelayExpiredIssueJob < ApplicationJob
- queue_as :message
-
- def perform
- Issue.where(due_date: Date.today + 1.days).find_each do |issue|
- SendTemplateMessageJob.perform_later('IssueExpire', issue.id) if Site.has_notice_menu?
- end
- end
-
-end
\ No newline at end of file
diff --git a/app/jobs/send_template_message_job.rb b/app/jobs/send_template_message_job.rb
index 05572d451..82f41cad2 100644
--- a/app/jobs/send_template_message_job.rb
+++ b/app/jobs/send_template_message_job.rb
@@ -221,6 +221,20 @@ class SendTemplateMessageJob < ApplicationJob
receivers_email_string, email_title, email_content = MessageTemplate::ProjectMilestone.get_email_message_content(receiver, operator, milestone)
Notice::Write::EmailCreateService.call(receivers_email_string, email_title, email_content)
end
+ when 'ProjectMilestoneExpired'
+ milestone_id = args[0]
+ milestone = Version.find_by_id(milestone_id)
+ return unless milestone.present? && milestone&.project.present?
+ receivers = User.where(id: milestone.user_id)
+ receivers_string, content, notification_url = MessageTemplate::ProjectMilestoneExpired.get_message_content(receivers, milestone)
+ Notice::Write::CreateService.call(receivers_string, content, notification_url, source, {milestone_id: milestone_id, operator_id: operator_id})
+ when 'ProjectMilestoneEarlyExpired'
+ milestone_id = args[0]
+ milestone = Version.find_by_id(milestone_id)
+ return unless milestone.present? && milestone&.project.present?
+ receivers = User.where(id: milestone.user_id)
+ receivers_string, content, notification_url = MessageTemplate::ProjectMilestoneEarlyExpired.get_message_content(receivers, milestone)
+ Notice::Write::CreateService.call(receivers_string, content, notification_url, source, {milestone_id: milestone_id, operator_id: operator_id})
when 'ProjectPraised'
operator_id, project_id = args[0], args[1]
operator = User.find_by_id(operator_id)
diff --git a/app/models/message_template.rb b/app/models/message_template.rb
index 7ab7fdad8..75d64fa95 100644
--- a/app/models/message_template.rb
+++ b/app/models/message_template.rb
@@ -52,6 +52,8 @@ class MessageTemplate < ApplicationRecord
self.create(type: 'MessageTemplate::ProjectMilestone', sys_notice: '{nickname1}在 {nickname2}/{repository} 创建了一个里程碑:{name}', notification_url: '{baseurl}/{owner}/{identifier}/milestones/{id}', email: email_html, email_title: "#{PLATFORM}: {nickname1} 在 {nickname2}/{repository} 新建了一个里程碑")
email_html = File.read("#{email_template_html_dir}/project_milestone_completed.html")
self.create(type: 'MessageTemplate::ProjectMilestoneCompleted', sys_notice: '在 {nickname}/{repository} 仓库,里程碑 {name} 的完成度已达到100%', notification_url: '{baseurl}/{owner}/{identifier}/milestones/{id}', email: email_html, email_title: "#{PLATFORM}: 仓库 {nickname}/{repository} 有里程碑已完成")
+ self.create(type: 'MessageTemplate::ProjectMilestoneEarlyExpired', sys_notice: '您创建的里程碑 {name} 已临近截止日期,请尽快处理.', notification_url: '{baseurl}/{owner}/{identifier}/milestones/{id}')
+ self.create(type: 'MessageTemplate::ProjectMilestoneExpired', sys_notice: '您创建的里程碑 {name} 已逾期,请及时更新进度或联系项目团队.', notification_url: '{baseurl}/{owner}/{identifier}/milestones/{id}')
self.create(type: 'MessageTemplate::ProjectPraised', sys_notice: '{nickname1} 点赞了你管理的仓库 {nickname2}/{repository}', notification_url: '{baseurl}/{login}')
self.create(type: 'MessageTemplate::ProjectOpenDevOps', sys_notice: '您的仓库 {repository} 已成功开通引擎服务,可通过简单的节点编排完成自动化集成与部署。欢迎体验!', notification_url: '{baseurl}/{owner}/{identifier}/devops')
email_html = File.read("#{email_template_html_dir}/project_pull_request.html")
diff --git a/app/models/message_template/project_milestone_early_expired.rb b/app/models/message_template/project_milestone_early_expired.rb
new file mode 100644
index 000000000..5539fc362
--- /dev/null
+++ b/app/models/message_template/project_milestone_early_expired.rb
@@ -0,0 +1,70 @@
+# == Schema Information
+#
+# Table name: message_templates
+#
+# id :integer not null, primary key
+# type :string(255)
+# sys_notice :text(65535)
+# email :text(65535)
+# created_at :datetime not null
+# updated_at :datetime not null
+# notification_url :string(255)
+# email_title :string(255)
+#
+
+# 我管理的仓库有里程碑完成
+class MessageTemplate::ProjectMilestoneEarlyExpired < MessageTemplate
+
+ # MessageTemplate::ProjectMilestoneEarlyExpired.get_message_content(User.where(login: 'yystopf'), Version.find(7))
+ def self.get_message_content(receivers, milestone)
+ receivers.each do |receiver|
+ if receiver.user_template_message_setting.present?
+ send_setting = receiver.user_template_message_setting.notification_body["ManageProject::MilestoneEarlyExpired"]
+ send_setting = send_setting.nil? ? UserTemplateMessageSetting.init_notification_body["ManageProject::MilestoneEarlyExpired"] : send_setting
+ receivers = receivers.where.not(id: receiver.id) unless send_setting
+ end
+ end
+ return '', '', '' if receivers.blank?
+ project = milestone&.project
+ owner = project&.owner
+ content = sys_notice.gsub('{nickname}', owner&.real_name).gsub('{repository}', project&.name).gsub('{name}', milestone&.name)
+ url = notification_url.gsub('{owner}', owner&.login).gsub('{identifier}', project&.identifier).gsub('{id}', milestone&.id.to_s)
+
+ return receivers_string(receivers), content, url
+ rescue => e
+ Rails.logger.info("MessageTemplate::MilestoneEarlyExpired.get_message_content [ERROR] #{e}")
+ return '', '', ''
+ end
+
+ def self.get_email_message_content(receiver, milestone)
+ if receiver.user_template_message_setting.present?
+ send_setting = receiver.user_template_message_setting.email_body["ManageProject::MilestoneEarlyExpired"]
+ send_setting = send_setting.nil? ? UserTemplateMessageSetting.init_email_body["ManageProject::MilestoneEarlyExpired"] : send_setting
+ return '', '', '' unless send_setting
+ project = milestone&.project
+ owner = project&.owner
+ title = email_title
+ title.gsub!('{nickname}', owner&.real_name)
+ title.gsub!('{repository}', project&.name)
+
+ content = email
+ content.gsub!('{receiver}', receiver&.real_name)
+ content.gsub!('{baseurl}', base_url)
+ content.gsub!('{nickname}', owner&.real_name)
+ content.gsub!('{repository}', project&.name)
+ content.gsub!('{login}', owner&.login)
+ content.gsub!('{identifier}', project&.identifier)
+ content.gsub!('{id}', milestone&.id.to_s)
+ content.gsub!('{name}', milestone&.name)
+ content.gsub!('{platform}', PLATFORM)
+
+ return receiver&.mail, title, content
+ else
+ return '', '', ''
+ end
+
+ rescue => e
+ Rails.logger.info("MessageTemplate::MilestoneEarlyExpired.get_email_message_content [ERROR] #{e}")
+ return '', '', ''
+ end
+end
diff --git a/app/models/message_template/project_milestone_expired.rb b/app/models/message_template/project_milestone_expired.rb
new file mode 100644
index 000000000..de6b8c10c
--- /dev/null
+++ b/app/models/message_template/project_milestone_expired.rb
@@ -0,0 +1,70 @@
+# == Schema Information
+#
+# Table name: message_templates
+#
+# id :integer not null, primary key
+# type :string(255)
+# sys_notice :text(65535)
+# email :text(65535)
+# created_at :datetime not null
+# updated_at :datetime not null
+# notification_url :string(255)
+# email_title :string(255)
+#
+
+# 我管理的仓库有里程碑完成
+class MessageTemplate::ProjectMilestoneExpired < MessageTemplate
+
+ # MessageTemplate::ProjectMilestoneExpired.get_message_content(User.where(login: 'yystopf'), Version.find(7))
+ def self.get_message_content(receivers, milestone)
+ receivers.each do |receiver|
+ if receiver.user_template_message_setting.present?
+ send_setting = receiver.user_template_message_setting.notification_body["ManageProject::MilestoneExpired"]
+ send_setting = send_setting.nil? ? UserTemplateMessageSetting.init_notification_body["ManageProject::MilestoneExpired"] : send_setting
+ receivers = receivers.where.not(id: receiver.id) unless send_setting
+ end
+ end
+ return '', '', '' if receivers.blank?
+ project = milestone&.project
+ owner = project&.owner
+ content = sys_notice.gsub('{nickname}', owner&.real_name).gsub('{repository}', project&.name).gsub('{name}', milestone&.name)
+ url = notification_url.gsub('{owner}', owner&.login).gsub('{identifier}', project&.identifier).gsub('{id}', milestone&.id.to_s)
+
+ return receivers_string(receivers), content, url
+ rescue => e
+ Rails.logger.info("MessageTemplate::ProjectMilestoneExpired.get_message_content [ERROR] #{e}")
+ return '', '', ''
+ end
+
+ def self.get_email_message_content(receiver, milestone)
+ if receiver.user_template_message_setting.present?
+ send_setting = receiver.user_template_message_setting.email_body["ManageProject::MilestoneExpired"]
+ send_setting = send_setting.nil? ? UserTemplateMessageSetting.init_email_body["ManageProject::MilestoneExpired"] : send_setting
+ return '', '', '' unless send_setting
+ project = milestone&.project
+ owner = project&.owner
+ title = email_title
+ title.gsub!('{nickname}', owner&.real_name)
+ title.gsub!('{repository}', project&.name)
+
+ content = email
+ content.gsub!('{receiver}', receiver&.real_name)
+ content.gsub!('{baseurl}', base_url)
+ content.gsub!('{nickname}', owner&.real_name)
+ content.gsub!('{repository}', project&.name)
+ content.gsub!('{login}', owner&.login)
+ content.gsub!('{identifier}', project&.identifier)
+ content.gsub!('{id}', milestone&.id.to_s)
+ content.gsub!('{name}', milestone&.name)
+ content.gsub!('{platform}', PLATFORM)
+
+ return receiver&.mail, title, content
+ else
+ return '', '', ''
+ end
+
+ rescue => e
+ Rails.logger.info("MessageTemplate::ProjectMilestoneExpired.get_email_message_content [ERROR] #{e}")
+ return '', '', ''
+ end
+end
diff --git a/app/models/user_template_message_setting.rb b/app/models/user_template_message_setting.rb
index 49db51d4d..7e855b768 100644
--- a/app/models/user_template_message_setting.rb
+++ b/app/models/user_template_message_setting.rb
@@ -44,6 +44,8 @@ class UserTemplateMessageSetting < ApplicationRecord
"ManageProject::Forked": true,
"ManageProject::Milestone": true,
"ManageProject::MilestoneCompleted": true,
+ "ManageProject::MilestoneExpired": true,
+ "ManageProject::MilestoneEarlyExpired": true,
}.stringify_keys!
end
@@ -65,6 +67,8 @@ class UserTemplateMessageSetting < ApplicationRecord
"ManageProject::Forked": false,
"ManageProject::Milestone": false,
"ManageProject::MilestoneCompleted": false,
+ "ManageProject::MilestoneExpired": false,
+ "ManageProject::MilestoneEarlyExpired": false,
}.stringify_keys!
end
diff --git a/app/models/version.rb b/app/models/version.rb
index 82474f55e..5787116db 100644
--- a/app/models/version.rb
+++ b/app/models/version.rb
@@ -68,5 +68,7 @@ class Version < ApplicationRecord
def send_update_message_to_notice_system
SendTemplateMessageJob.perform_later('ProjectMilestoneCompleted', self.id) if Site.has_notice_menu? && self.issue_percent == 1.0
+ SendTemplateMessageJob.perform_later('ProjectMilestoneEarlyExpired', self.id) if Site.has_notice_menu? && self.effective_date == Date.today + 1.days
+ SendTemplateMessageJob.perform_later('ProjectMilestoneExpired', self.id) if Site.has_notice_menu? && self.effective_date == Date.today - 1.days
end
end
diff --git a/config/sidekiq_cron.yml b/config/sidekiq_cron.yml
index 448e9c945..c31ce2575 100644
--- a/config/sidekiq_cron.yml
+++ b/config/sidekiq_cron.yml
@@ -5,5 +5,5 @@ sync_gitea_repo_update_time:
delay_expired_issue:
cron: "0 0 * * *"
- class: "DelayExpiredIssueJob"
+ class: "DelayExpiredIssueAndMilestoneJob"
queue: message
From df0ef313f6c9e19373512d3a734f8b96fb4d3af9 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Fri, 26 Jan 2024 16:15:14 +0800
Subject: [PATCH 02/47] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E4=BB=93?=
=?UTF-8?q?=E5=BA=93=E6=97=A0=E6=96=87=E4=BB=B6=E8=B7=B3=E8=BD=AC404?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/repositories_controller.rb | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb
index f80e00b6f..c13d784e1 100644
--- a/app/controllers/repositories_controller.rb
+++ b/app/controllers/repositories_controller.rb
@@ -61,6 +61,7 @@ class RepositoriesController < ApplicationController
@entries = @entries.present? ? @entries.sort_by{ |hash| hash['type'] } : []
@path = GiteaService.gitea_config[:domain]+"/#{@project.owner.login}/#{@project.identifier}/raw/branch/#{@ref}/"
end
+ return render_not_found if @entries.blank?
end
def top_counts
From d2663eb7b7e1a7c1422407ba1441a171ccc03cb8 Mon Sep 17 00:00:00 2001
From: xxq250
Date: Mon, 29 Jan 2024 16:05:04 +0800
Subject: [PATCH 03/47] =?UTF-8?q?fixed=20=E7=BB=84=E7=BB=87=E6=88=90?=
=?UTF-8?q?=E5=91=98=E6=95=B0=E5=8F=96=E7=BB=84=E7=BB=87=E5=86=85=E6=88=90?=
=?UTF-8?q?=E5=91=98=E5=92=8C=E7=BB=84=E7=BB=87=E6=89=80=E6=9C=89=E4=BB=93?=
=?UTF-8?q?=E5=BA=93=E6=88=90=E5=91=98=E7=BB=84=E5=90=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../organization_users_controller.rb | 23 +++++++++++++++----
.../organization_users/_detail.json.jbuilder | 8 +++----
.../organization_users/index.json.jbuilder | 8 +++----
3 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/app/controllers/organizations/organization_users_controller.rb b/app/controllers/organizations/organization_users_controller.rb
index d9035dc14..98f2e1656 100644
--- a/app/controllers/organizations/organization_users_controller.rb
+++ b/app/controllers/organizations/organization_users_controller.rb
@@ -4,17 +4,30 @@ class Organizations::OrganizationUsersController < Organizations::BaseController
before_action :check_user_can_edit_org, only: [:destroy]
def index
- @organization_users = @organization.organization_users.includes(:user)
+ # @organization_users = @organization.organization_users.includes(:user)
+ # if params[:search].present?
+ # search = params[:search].to_s.downcase
+ # user_condition_users = User.like(search).to_sql
+ # team_condition_teams = User.joins(:teams).merge(@organization.teams.like(search)).to_sql
+ # users = User.from("( #{user_condition_users} UNION #{team_condition_teams }) AS users")
+ #
+ # @organization_users = @organization_users.where(user_id: users).distinct
+ # end
+ #
+ # @organization_users = kaminari_paginate(@organization_users)
+
+ organization_user_ids = @organization.organization_users.pluck(:user_id).uniq
+ project_member_user_ids = @organization.projects.joins(:members).pluck("members.user_id").uniq
+ users = User.where(id: organization_user_ids + project_member_user_ids)
if params[:search].present?
search = params[:search].to_s.downcase
user_condition_users = User.like(search).to_sql
team_condition_teams = User.joins(:teams).merge(@organization.teams.like(search)).to_sql
- users = User.from("( #{user_condition_users} UNION #{team_condition_teams }) AS users")
+ user_ids = User.from("( #{user_condition_users} UNION #{team_condition_teams }) AS users").pluck(:id)
- @organization_users = @organization_users.where(user_id: users).distinct
+ users = users.where(id: user_ids)
end
-
- @organization_users = kaminari_paginate(@organization_users)
+ @users = kaminari_paginate(users)
end
def pm_check_user
diff --git a/app/views/organizations/organization_users/_detail.json.jbuilder b/app/views/organizations/organization_users/_detail.json.jbuilder
index c7572971b..b456b35cd 100644
--- a/app/views/organizations/organization_users/_detail.json.jbuilder
+++ b/app/views/organizations/organization_users/_detail.json.jbuilder
@@ -1,7 +1,7 @@
-json.id org_user.id
+json.id user&.id
json.user do
- json.partial! "organizations/user_detail", user: org_user.user
+ json.partial! "organizations/user_detail", user: user
end
-json.team_names org_user.teams.pluck(:nickname)
-json.created_at org_user.created_at.strftime("%Y-%m-%d")
+json.team_names user.teams.where("teams.organization_id=?", organization.id).pluck(:nickname)
+json.created_at user.created_on.strftime("%Y-%m-%d")
diff --git a/app/views/organizations/organization_users/index.json.jbuilder b/app/views/organizations/organization_users/index.json.jbuilder
index 9f1f278bc..9241af184 100644
--- a/app/views/organizations/organization_users/index.json.jbuilder
+++ b/app/views/organizations/organization_users/index.json.jbuilder
@@ -1,5 +1,5 @@
-json.total_count @organization_users.total_count
-json.organization_users @organization_users do |org_user|
- next if org_user.user.blank?
- json.partial! "detail", org_user: org_user, organization: @organization
+json.total_count @users.total_count
+json.organization_users @users do |user|
+ next if user.blank?
+ json.partial! "detail", user: user, organization: @organization
end
From 6ff89d7929775775ada9f560116ba6cc2e86175a Mon Sep 17 00:00:00 2001
From: xxq250
Date: Mon, 29 Jan 2024 16:05:22 +0800
Subject: [PATCH 04/47] =?UTF-8?q?fixed=20=E5=8F=96=E6=B6=88=E4=BB=93?=
=?UTF-8?q?=E5=BA=93=E5=A2=9E=E5=8A=A0=E6=88=90=E5=91=98=E6=97=B6=E5=90=8C?=
=?UTF-8?q?=E6=97=B6=E5=8A=A0=E8=BF=9B=E7=BB=84=E7=BB=87=E6=93=8D=E4=BD=9C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/models/concerns/project_operable.rb | 252 ++++++++++++------------
1 file changed, 126 insertions(+), 126 deletions(-)
diff --git a/app/models/concerns/project_operable.rb b/app/models/concerns/project_operable.rb
index 9a5efd129..dbe78a1b1 100644
--- a/app/models/concerns/project_operable.rb
+++ b/app/models/concerns/project_operable.rb
@@ -21,67 +21,67 @@ module ProjectOperable
end
def add_member!(user_id, role_name='Developer')
- if self.owner.is_a?(Organization)
- case role_name
- when 'Manager'
- # 构建相应的团队
- team = self.owner.teams.admin.take
- if team.nil?
- team = Team.build(self.user_id, 'admin', '管理员', '', 'admin', false, false)
- gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
- team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
- end
-
- # 设置项目在团队中的访问权限
- team_project = TeamProject.build(self.user_id, team.id, self.id)
- tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
-
- # 新增对应的团队成员
- team_user = TeamUser.build(self.user_id, user_id, team.id)
- $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
-
- # 确保组织成员中有该用户
- OrganizationUser.build(self.user_id, user_id)
- when 'Developer'
- # 构建相应的团队
- team = self.owner.teams.write.take
- if team.nil?
- team = Team.build(self.user_id, 'developer', '开发者', '', 'write', false, false)
- gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
- team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
- end
-
- # 设置项目在团队中的访问权限
- team_project = TeamProject.build(self.user_id, team.id, self.id)
- tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
-
- # 新增对应的团队成员
- team_user = TeamUser.build(self.user_id, user_id, team.id)
- $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
-
- # 确保组织成员中有该用户
- OrganizationUser.build(self.user_id, user_id)
- when 'Reporter'
- # 构建相应的团队
- team = self.owner.teams.read.take
- if team.nil?
- team = Team.build(self.user_id, 'reporter', '报告者', '', 'read', false, false)
- gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
- team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
- end
-
- # 设置项目在团队中的访问权限
- team_project = TeamProject.build(self.user_id, team.id, self.id)
- tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
-
- # 新增对应的团队成员
- team_user = TeamUser.build(self.user_id, user_id, team.id)
- $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
-
- # 确保组织成员中有该用户
- OrganizationUser.build(self.user_id, user_id)
- end
- end
+ # if self.owner.is_a?(Organization)
+ # case role_name
+ # when 'Manager'
+ # # 构建相应的团队
+ # team = self.owner.teams.admin.take
+ # if team.nil?
+ # team = Team.build(self.user_id, 'admin', '管理员', '', 'admin', false, false)
+ # gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
+ # team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
+ # end
+ #
+ # # 设置项目在团队中的访问权限
+ # team_project = TeamProject.build(self.user_id, team.id, self.id)
+ # tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
+ #
+ # # 新增对应的团队成员
+ # team_user = TeamUser.build(self.user_id, user_id, team.id)
+ # $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
+ #
+ # # 确保组织成员中有该用户
+ # OrganizationUser.build(self.user_id, user_id)
+ # when 'Developer'
+ # # 构建相应的团队
+ # team = self.owner.teams.write.take
+ # if team.nil?
+ # team = Team.build(self.user_id, 'developer', '开发者', '', 'write', false, false)
+ # gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
+ # team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
+ # end
+ #
+ # # 设置项目在团队中的访问权限
+ # team_project = TeamProject.build(self.user_id, team.id, self.id)
+ # tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
+ #
+ # # 新增对应的团队成员
+ # team_user = TeamUser.build(self.user_id, user_id, team.id)
+ # $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
+ #
+ # # 确保组织成员中有该用户
+ # OrganizationUser.build(self.user_id, user_id)
+ # when 'Reporter'
+ # # 构建相应的团队
+ # team = self.owner.teams.read.take
+ # if team.nil?
+ # team = Team.build(self.user_id, 'reporter', '报告者', '', 'read', false, false)
+ # gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
+ # team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
+ # end
+ #
+ # # 设置项目在团队中的访问权限
+ # team_project = TeamProject.build(self.user_id, team.id, self.id)
+ # tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
+ #
+ # # 新增对应的团队成员
+ # team_user = TeamUser.build(self.user_id, user_id, team.id)
+ # $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
+ #
+ # # 确保组织成员中有该用户
+ # OrganizationUser.build(self.user_id, user_id)
+ # end
+ # end
member = members.create!(user_id: user_id, team_user_id: team_user&.id)
set_developer_role(member, role_name)
end
@@ -116,71 +116,71 @@ module ProjectOperable
def change_member_role!(user_id, role)
member = self.member(user_id)
# 所有者为组织,并且该用户属于组织成员
- if self.owner.is_a?(Organization) && member.team_user.present?
- case role&.name
- when 'Manager'
- # 构建相应的团队
- team = self.owner.teams.admin.take
- if team.nil?
- team = Team.build(self.user_id, 'admin', '管理员', '', 'admin', false, false)
- gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
- team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
- end
-
- # 设置项目在团队中的访问权限
- team_project = TeamProject.build(self.user_id, team.id, self.id)
- tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
-
- # 更改对应的团队成员
- team_user = member.team_user
- $gitea_client.delete_teams_members_by_id_username(team_user.team.gtid, team_user.user&.login) rescue nil # 移除旧的
- $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
- team_user.update_attributes!({team_id: team.id}) unless team.team_users.exists?(user_id: member.user_id)
-
- # 确保组织成员中有该用户
- OrganizationUser.build(self.user_id, user_id)
- when 'Developer'
- # 构建相应的团队
- team = self.owner.teams.write.take
- if team.nil?
- team = Team.build(self.user_id, 'developer', '开发者', '', 'write', false, false)
- gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
- team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
- end
- # 设置项目在团队中的访问权限
- team_project = TeamProject.build(self.user_id, team.id, self.id)
- $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
-
- # 更改对应的团队成员
- team_user = member.team_user
- $gitea_client.delete_teams_members_by_id_username(team_user.team.gtid, team_user.user&.login) rescue nil # 移除旧的
- $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
- team_user.update_attributes!({team_id: team.id}) unless team.team_users.exists?(user_id: member.user_id)
-
- OrganizationUser.build(self.user_id, user_id)
- when 'Reporter'
- # 构建相应的团队
- team = self.owner.teams.read.take
- if team.nil?
- team = Team.build(self.user_id, 'reporter', '报告者', '', 'read', false, false)
- gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
- team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
- end
-
- # 设置项目在团队中的访问权限
- team_project = TeamProject.build(self.user_id, team.id, self.id)
- tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
-
- # 更改对应的团队成员
- team_user = member.team_user
- $gitea_client.delete_teams_members_by_id_username(team_user.team.gtid, team_user.user&.login) rescue nil # 移除旧的
- $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
- team_user.update_attributes!({team_id: team.id}) unless team.team_users.exists?(user_id: member.user_id)
-
- # 确保组织成员中有该用户
- OrganizationUser.build(self.user_id, user_id)
- end
- end
+ # if self.owner.is_a?(Organization) && member.team_user.present?
+ # case role&.name
+ # when 'Manager'
+ # # 构建相应的团队
+ # team = self.owner.teams.admin.take
+ # if team.nil?
+ # team = Team.build(self.user_id, 'admin', '管理员', '', 'admin', false, false)
+ # gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
+ # team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
+ # end
+ #
+ # # 设置项目在团队中的访问权限
+ # team_project = TeamProject.build(self.user_id, team.id, self.id)
+ # tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
+ #
+ # # 更改对应的团队成员
+ # team_user = member.team_user
+ # $gitea_client.delete_teams_members_by_id_username(team_user.team.gtid, team_user.user&.login) rescue nil # 移除旧的
+ # $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
+ # team_user.update_attributes!({team_id: team.id}) unless team.team_users.exists?(user_id: member.user_id)
+ #
+ # # 确保组织成员中有该用户
+ # OrganizationUser.build(self.user_id, user_id)
+ # when 'Developer'
+ # # 构建相应的团队
+ # team = self.owner.teams.write.take
+ # if team.nil?
+ # team = Team.build(self.user_id, 'developer', '开发者', '', 'write', false, false)
+ # gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
+ # team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
+ # end
+ # # 设置项目在团队中的访问权限
+ # team_project = TeamProject.build(self.user_id, team.id, self.id)
+ # $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
+ #
+ # # 更改对应的团队成员
+ # team_user = member.team_user
+ # $gitea_client.delete_teams_members_by_id_username(team_user.team.gtid, team_user.user&.login) rescue nil # 移除旧的
+ # $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
+ # team_user.update_attributes!({team_id: team.id}) unless team.team_users.exists?(user_id: member.user_id)
+ #
+ # OrganizationUser.build(self.user_id, user_id)
+ # when 'Reporter'
+ # # 构建相应的团队
+ # team = self.owner.teams.read.take
+ # if team.nil?
+ # team = Team.build(self.user_id, 'reporter', '报告者', '', 'read', false, false)
+ # gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
+ # team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
+ # end
+ #
+ # # 设置项目在团队中的访问权限
+ # team_project = TeamProject.build(self.user_id, team.id, self.id)
+ # tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
+ #
+ # # 更改对应的团队成员
+ # team_user = member.team_user
+ # $gitea_client.delete_teams_members_by_id_username(team_user.team.gtid, team_user.user&.login) rescue nil # 移除旧的
+ # $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
+ # team_user.update_attributes!({team_id: team.id}) unless team.team_users.exists?(user_id: member.user_id)
+ #
+ # # 确保组织成员中有该用户
+ # OrganizationUser.build(self.user_id, user_id)
+ # end
+ # end
member.member_roles.last.update_attributes!(role: role)
end
From c957617263a53ff92b6796ef06fe0bc582b023d2 Mon Sep 17 00:00:00 2001
From: xxq250
Date: Mon, 29 Jan 2024 16:54:52 +0800
Subject: [PATCH 05/47] =?UTF-8?q?fixed=20=E5=8F=96=E6=B6=88=E4=BB=93?=
=?UTF-8?q?=E5=BA=93=E5=A2=9E=E5=8A=A0=E6=88=90=E5=91=98=E6=97=B6=E5=90=8C?=
=?UTF-8?q?=E6=97=B6=E5=8A=A0=E8=BF=9B=E7=BB=84=E7=BB=87=E6=93=8D=E4=BD=9C?=
=?UTF-8?q?,=E4=BB=85=E5=A2=9E=E5=8A=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/models/concerns/project_operable.rb | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/models/concerns/project_operable.rb b/app/models/concerns/project_operable.rb
index dbe78a1b1..34386aae2 100644
--- a/app/models/concerns/project_operable.rb
+++ b/app/models/concerns/project_operable.rb
@@ -82,7 +82,8 @@ module ProjectOperable
# OrganizationUser.build(self.user_id, user_id)
# end
# end
- member = members.create!(user_id: user_id, team_user_id: team_user&.id)
+ # member = members.create!(user_id: user_id, team_user_id: team_user&.id)
+ member = members.create!(user_id: user_id)
set_developer_role(member, role_name)
end
From 627332e93a4c13f5ad1c7be43cae7c7546eb73af Mon Sep 17 00:00:00 2001
From: xxq250
Date: Mon, 29 Jan 2024 17:32:46 +0800
Subject: [PATCH 06/47] =?UTF-8?q?fixed=20=E7=BB=84=E7=BB=87=E6=88=90?=
=?UTF-8?q?=E5=91=98=E6=95=B0=E5=8F=96=E7=BB=84=E7=BB=87=E5=86=85=E6=88=90?=
=?UTF-8?q?=E5=91=98=E5=92=8C=E7=BB=84=E7=BB=87=E6=89=80=E6=9C=89=E4=BB=93?=
=?UTF-8?q?=E5=BA=93=E6=88=90=E5=91=98=E7=BB=84=E5=90=88,=E5=8A=A0?=
=?UTF-8?q?=E5=85=A5=E6=97=B6=E9=97=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../organization_users/_detail.json.jbuilder | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/app/views/organizations/organization_users/_detail.json.jbuilder b/app/views/organizations/organization_users/_detail.json.jbuilder
index b456b35cd..78040e90e 100644
--- a/app/views/organizations/organization_users/_detail.json.jbuilder
+++ b/app/views/organizations/organization_users/_detail.json.jbuilder
@@ -4,4 +4,11 @@ json.user do
end
json.team_names user.teams.where("teams.organization_id=?", organization.id).pluck(:nickname)
-json.created_at user.created_on.strftime("%Y-%m-%d")
+join_date = if user.organization_users.find_by(:organization_id => organization.id).present?
+ user.organization_users.find_by(:organization_id => organization.id).created_at.strftime("%Y-%m-%d")
+ elsif user.members.joins(:project).find_by(project: organization.projects).present?
+ user.members.joins(:project).find_by(project: organization.projects).created_at.strftime("%Y-%m-%d")
+ else
+ user.created_on.strftime("%Y-%m-%d")
+ end
+json.created_at join_date
From 036acfc43da4115e0b1805ab9e3fe729799b75be Mon Sep 17 00:00:00 2001
From: xxq250
Date: Mon, 29 Jan 2024 17:35:08 +0800
Subject: [PATCH 07/47] =?UTF-8?q?fixed=20=E7=BB=84=E7=BB=87=E6=88=90?=
=?UTF-8?q?=E5=91=98=E6=95=B0=E5=8F=96=E7=BB=84=E7=BB=87=E5=86=85=E6=88=90?=
=?UTF-8?q?=E5=91=98=E5=92=8C=E7=BB=84=E7=BB=87=E6=89=80=E6=9C=89=E4=BB=93?=
=?UTF-8?q?=E5=BA=93=E6=88=90=E5=91=98=E7=BB=84=E5=90=88,=E5=8A=A0?=
=?UTF-8?q?=E5=85=A5=E6=97=B6=E9=97=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../organizations/organization_users/_detail.json.jbuilder | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/views/organizations/organization_users/_detail.json.jbuilder b/app/views/organizations/organization_users/_detail.json.jbuilder
index 78040e90e..7590da02e 100644
--- a/app/views/organizations/organization_users/_detail.json.jbuilder
+++ b/app/views/organizations/organization_users/_detail.json.jbuilder
@@ -7,7 +7,7 @@ json.team_names user.teams.where("teams.organization_id=?", organization.id).plu
join_date = if user.organization_users.find_by(:organization_id => organization.id).present?
user.organization_users.find_by(:organization_id => organization.id).created_at.strftime("%Y-%m-%d")
elsif user.members.joins(:project).find_by(project: organization.projects).present?
- user.members.joins(:project).find_by(project: organization.projects).created_at.strftime("%Y-%m-%d")
+ user.members.joins(:project).find_by(project: organization.projects).created_on.strftime("%Y-%m-%d")
else
user.created_on.strftime("%Y-%m-%d")
end
From 8ca9ced36039e4fa1dd8ed4ec4e8fc84d350c6d0 Mon Sep 17 00:00:00 2001
From: xxq250
Date: Tue, 30 Jan 2024 08:27:49 +0800
Subject: [PATCH 08/47] =?UTF-8?q?fixed=20=E7=BB=84=E7=BB=87=E6=88=90?=
=?UTF-8?q?=E5=91=98=E6=95=B0=E5=8F=96=E7=BB=84=E7=BB=87=E5=86=85=E6=88=90?=
=?UTF-8?q?=E5=91=98=E5=92=8C=E7=BB=84=E7=BB=87=E6=89=80=E6=9C=89=E4=BB=93?=
=?UTF-8?q?=E5=BA=93=E6=88=90=E5=91=98=E7=BB=84=E5=90=88,=E6=8E=92?=
=?UTF-8?q?=E5=BA=8F=E5=8A=A0=E5=85=A5=E6=97=B6=E9=97=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/organizations/organization_users_controller.rb | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/controllers/organizations/organization_users_controller.rb b/app/controllers/organizations/organization_users_controller.rb
index 98f2e1656..171e9dcae 100644
--- a/app/controllers/organizations/organization_users_controller.rb
+++ b/app/controllers/organizations/organization_users_controller.rb
@@ -18,7 +18,8 @@ class Organizations::OrganizationUsersController < Organizations::BaseController
organization_user_ids = @organization.organization_users.pluck(:user_id).uniq
project_member_user_ids = @organization.projects.joins(:members).pluck("members.user_id").uniq
- users = User.where(id: organization_user_ids + project_member_user_ids)
+ ids = organization_user_ids + project_member_user_ids
+ users = User.where(id: ids).reorder(Arel.sql("FIELD(users.id,#{ids.join(',')})"))
if params[:search].present?
search = params[:search].to_s.downcase
user_condition_users = User.like(search).to_sql
From a0265d480887b15ff13d4e6f7a70e5c11a7634be Mon Sep 17 00:00:00 2001
From: yystopf
Date: Thu, 30 Nov 2023 10:36:55 +0800
Subject: [PATCH 09/47] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9Atree=E8=BF=94?=
=?UTF-8?q?=E5=9B=9E=E7=BB=93=E6=9E=84=E4=BD=93=E9=80=82=E9=85=8D=E4=BB=A5?=
=?UTF-8?q?=E5=8F=8A=E7=94=9F=E6=88=90token=E9=9C=80=E6=96=B0=E5=A2=9Escop?=
=?UTF-8?q?es=E5=8F=82=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/services/gitea/user/generate_token_service.rb | 2 +-
app/views/api/v1/projects/git/trees.json.jbuilder | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/app/services/gitea/user/generate_token_service.rb b/app/services/gitea/user/generate_token_service.rb
index 946bd68ce..e2dd6b0f4 100644
--- a/app/services/gitea/user/generate_token_service.rb
+++ b/app/services/gitea/user/generate_token_service.rb
@@ -29,7 +29,7 @@ class Gitea::User::GenerateTokenService < Gitea::ClientService
end
def request_params
- { name: "#{@username}-#{token_name}" }
+ { name: "#{@username}-#{token_name}", scopes: ["all"] }
end
def token_name
diff --git a/app/views/api/v1/projects/git/trees.json.jbuilder b/app/views/api/v1/projects/git/trees.json.jbuilder
index 0eb08f048..b560fff2b 100644
--- a/app/views/api/v1/projects/git/trees.json.jbuilder
+++ b/app/views/api/v1/projects/git/trees.json.jbuilder
@@ -1,6 +1,6 @@
-json.total_count @result_object['total_count']
-json.sha @result_object['sha']
-json.entries @result_object['tree'].each do |entry|
+json.total_count @result_object[:data]['total_count'].to_i
+json.sha @result_object[:data]['sha']
+json.entries @result_object[:data]['tree'].each do |entry|
json.name entry['path']
json.mode entry['mode']
json.type entry['type'] === 'blob' ? 'file' : 'dir'
From 026d58c3474324d7e2aeef8949b44e94e15955e0 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Thu, 30 Nov 2023 17:02:27 +0800
Subject: [PATCH 10/47] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9Acompare?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/services/api/v1/projects/compare_service.rb | 2 +-
app/views/api/v1/projects/compare.json.jbuilder | 6 +++++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/app/services/api/v1/projects/compare_service.rb b/app/services/api/v1/projects/compare_service.rb
index 23a248305..9e646326f 100644
--- a/app/services/api/v1/projects/compare_service.rb
+++ b/app/services/api/v1/projects/compare_service.rb
@@ -29,6 +29,6 @@ class Api::V1::Projects::CompareService < ApplicationService
end
def load_gitea_data
- @gitea_data = $gitea_client.get_repos_compare_by_owner_repo_from_to(owner, repo, from, to, {query: request_params}) rescue nil
+ @gitea_data = $gitea_hat_client.get_repos_compare_by_owner_repo_baseref_headref(owner, repo, to, from, {query: request_params}) rescue nil
end
end
\ No newline at end of file
diff --git a/app/views/api/v1/projects/compare.json.jbuilder b/app/views/api/v1/projects/compare.json.jbuilder
index 2d20c51e0..f45bceb86 100644
--- a/app/views/api/v1/projects/compare.json.jbuilder
+++ b/app/views/api/v1/projects/compare.json.jbuilder
@@ -14,5 +14,9 @@ json.commits @result_object['Commits'] do |commit|
json.parent_shas commit['Sha']['ParentShas']
end
json.diff do
- json.partial! "api/v1/projects/simple_gitea_diff_detail", diff: @result_object['Diff']
+ if @result_object['Diff'].present?
+ json.partial! "api/v1/projects/simple_gitea_diff_detail", diff: @result_object['Diff']
+ else
+ json.nil!
+ end
end
\ No newline at end of file
From 096941ea9eb99077f314b4d7c6651439cc7ec4fb Mon Sep 17 00:00:00 2001
From: yystopf
Date: Tue, 5 Dec 2023 09:51:22 +0800
Subject: [PATCH 11/47] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E9=87=8D?=
=?UTF-8?q?=E7=BD=AEgitea=20token=E8=A7=84=E5=88=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/models/user.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/models/user.rb b/app/models/user.rb
index 70de1fc64..c81b41433 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -457,7 +457,7 @@ class User < Owner
$gitea_client.delete_users_tokens_by_username_token(self.login, e["name"], {query: {sudo: self.login} })
}
end
- new_result = $gitea_client.post_users_tokens_by_username(self.login, { query: {sudo: self.login}, body:{ name: self.login} })
+ new_result = $gitea_client.post_users_tokens_by_username(self.login, { query: {sudo: self.login}, body:{ name: self.login, scopes: ["all"]} })
if new_result["sha1"].present?
update(gitea_token: new_result["sha1"])
end
From c94bffd8449f16daee591f6d76ff32cc154e07cc Mon Sep 17 00:00:00 2001
From: yystopf
Date: Tue, 5 Dec 2023 10:21:08 +0800
Subject: [PATCH 12/47] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E9=87=8D?=
=?UTF-8?q?=E7=BD=AEgitea=20token=E8=A7=84=E5=88=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/models/user.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/models/user.rb b/app/models/user.rb
index c81b41433..957f80a33 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -457,7 +457,7 @@ class User < Owner
$gitea_client.delete_users_tokens_by_username_token(self.login, e["name"], {query: {sudo: self.login} })
}
end
- new_result = $gitea_client.post_users_tokens_by_username(self.login, { query: {sudo: self.login}, body:{ name: self.login, scopes: ["all"]} })
+ new_result = $gitea_client.post_users_tokens_by_username(self.login, { query: {sudo: self.login}, body:{ name: "#{self.login}-#{SecureRandom.hex(6)}", scopes: ["all"]}.to_json })
if new_result["sha1"].present?
update(gitea_token: new_result["sha1"])
end
From d8eeb8f1b75916e1d6b17ad8c16f0cc50623dd2d Mon Sep 17 00:00:00 2001
From: yystopf
Date: Tue, 26 Dec 2023 08:41:39 +0800
Subject: [PATCH 13/47] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E6=81=A2?=
=?UTF-8?q?=E5=A4=8D=E5=88=86=E6=94=AF=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
新增:删除者信息
---
.../api/v1/projects/branches_controller.rb | 11 ++++-
.../api/v1/projects/branches/list_service.rb | 1 -
.../v1/projects/branches/restore_service.rb | 47 +++++++++++++++++++
.../_simple_gitea_detail.json.jbuilder | 12 ++++-
config/routes/api.rb | 1 +
5 files changed, 69 insertions(+), 3 deletions(-)
create mode 100644 app/services/api/v1/projects/branches/restore_service.rb
diff --git a/app/controllers/api/v1/projects/branches_controller.rb b/app/controllers/api/v1/projects/branches_controller.rb
index 40f44fea5..06d426b3f 100644
--- a/app/controllers/api/v1/projects/branches_controller.rb
+++ b/app/controllers/api/v1/projects/branches_controller.rb
@@ -9,7 +9,7 @@ class Api::V1::Projects::BranchesController < Api::V1::BaseController
@result_object = Api::V1::Projects::Branches::AllListService.call(@project, current_user&.gitea_token)
end
- before_action :require_operate_above, only: [:create, :destroy]
+ before_action :require_operate_above, only: [:create, :destroy, :restore]
def create
@result_object = Api::V1::Projects::Branches::CreateService.call(@project, branch_params, current_user&.gitea_token)
@@ -33,6 +33,15 @@ class Api::V1::Projects::BranchesController < Api::V1::BaseController
end
end
+ def restore
+ @result_object = Api::V1::Projects::Branches::RestoreService.call(@project, params[:branch_id], params[:branch_name], current_user&.gitea_token)
+ if @result_object
+ return render_ok
+ else
+ return render_error('恢复分支失败!')
+ end
+ end
+
before_action :require_manager_above, only: [:update_default_branch]
def update_default_branch
diff --git a/app/services/api/v1/projects/branches/list_service.rb b/app/services/api/v1/projects/branches/list_service.rb
index 590c4884f..b049bb2ac 100644
--- a/app/services/api/v1/projects/branches/list_service.rb
+++ b/app/services/api/v1/projects/branches/list_service.rb
@@ -18,7 +18,6 @@ class Api::V1::Projects::Branches::ListService < ApplicationService
load_default_branch
@gitea_data[:default_branch] = @gitea_repo_data["default_branch"]
-
@gitea_data
end
diff --git a/app/services/api/v1/projects/branches/restore_service.rb b/app/services/api/v1/projects/branches/restore_service.rb
new file mode 100644
index 000000000..fbd6220ed
--- /dev/null
+++ b/app/services/api/v1/projects/branches/restore_service.rb
@@ -0,0 +1,47 @@
+class Api::V1::Projects::Branches::RestoreService < ApplicationService
+
+ include ActiveModel::Model
+
+ attr_accessor :project, :token, :owner, :repo, :branch_id, :branch_name
+ attr_accessor :gitea_data
+
+ validates :branch_id, :branch_name, presence: true
+
+ def initialize(project, branch_id, branch_name, token= nil)
+ @project = project
+ @owner = project&.owner&.login
+ @repo = project&.identifier
+ @branch_id = branch_id
+ @branch_name = branch_name
+ @token = token
+ end
+
+ def call
+ raise Error, errors.full_messages.join(",") unless valid?
+ excute_data_to_gitea
+
+ true
+ end
+
+ private
+ def request_params
+ {
+ access_token: token
+ }
+ end
+
+ def request_body
+ {
+ branch_id: branch_id,
+ name: branch_name,
+ }
+ end
+
+ def excute_data_to_gitea
+ begin
+ @gitea_data = $gitea_hat_client.post_repos_branches_restore_by_owner_repo(owner, repo, {query: request_params, body: request_body.to_json})
+ rescue => e
+ raise Error, '恢复分支失败!'
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/views/api/v1/projects/branches/_simple_gitea_detail.json.jbuilder b/app/views/api/v1/projects/branches/_simple_gitea_detail.json.jbuilder
index c9235bdb4..ff0f0618a 100644
--- a/app/views/api/v1/projects/branches/_simple_gitea_detail.json.jbuilder
+++ b/app/views/api/v1/projects/branches/_simple_gitea_detail.json.jbuilder
@@ -23,4 +23,14 @@ json.commit_time branch['commit']['timestamp']
json.default_branch default_branch || nil
json.http_url render_http_url(@project)
json.zip_url render_zip_url(@owner, @project.repository, branch['name'])
-json.tar_url render_tar_url(@owner, @project.repository, branch['name'])
\ No newline at end of file
+json.tar_url render_tar_url(@owner, @project.repository, branch['name'])
+json.branch_id branch['id']
+json.is_deleted branch['is_deleted']
+json.deleted_unix branch['deleted_unix']
+json.deleted_by do
+ if branch['is_deleted']
+ json.partial! 'api/v1/users/commit_user', locals: { user: render_cache_commit_author(branch['deleted_by']), name: branch['deleted_by']['name'] }
+ else
+ json.nil!
+ end
+end
\ No newline at end of file
diff --git a/config/routes/api.rb b/config/routes/api.rb
index f3fa24de8..1133c8b36 100644
--- a/config/routes/api.rb
+++ b/config/routes/api.rb
@@ -80,6 +80,7 @@ defaults format: :json do
resources :branches, param: :name, only:[:index, :create, :destroy] do
collection do
get :all
+ post :restore
patch :update_default_branch
end
end
From a644a6549387a4b59585c5f4bf03bf0fec5de28e Mon Sep 17 00:00:00 2001
From: yystopf
Date: Wed, 3 Jan 2024 16:34:01 +0800
Subject: [PATCH 14/47] =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=9Agitea=20client?=
=?UTF-8?q?=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Gemfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Gemfile b/Gemfile
index 3f165215d..891c636c6 100644
--- a/Gemfile
+++ b/Gemfile
@@ -143,4 +143,4 @@ gem 'doorkeeper'
gem 'doorkeeper-jwt'
-gem 'gitea-client', '~> 1.4.3'
+gem 'gitea-client', '~> 1.4.4'
From feec49d4bd71b6bee552796f33342ea0348ab150 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Fri, 5 Jan 2024 13:56:09 +0800
Subject: [PATCH 15/47] =?UTF-8?q?=E6=96=B0=E5=A2=9E:=20=E6=9F=A5=E8=AF=A2?=
=?UTF-8?q?=E5=88=A0=E9=99=A4=E5=88=86=E6=94=AF=E4=B8=8E=E6=99=AE=E9=80=9A?=
=?UTF-8?q?=E5=88=86=E6=94=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/api/v1/projects/branches_controller.rb | 2 +-
app/services/api/v1/projects/branches/list_service.rb | 6 ++++--
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/app/controllers/api/v1/projects/branches_controller.rb b/app/controllers/api/v1/projects/branches_controller.rb
index 06d426b3f..89ebb5825 100644
--- a/app/controllers/api/v1/projects/branches_controller.rb
+++ b/app/controllers/api/v1/projects/branches_controller.rb
@@ -2,7 +2,7 @@ class Api::V1::Projects::BranchesController < Api::V1::BaseController
before_action :require_public_and_member_above, only: [:index, :all]
def index
- @result_object = Api::V1::Projects::Branches::ListService.call(@project, {name: params[:keyword], page: page, limit: limit}, current_user&.gitea_token)
+ @result_object = Api::V1::Projects::Branches::ListService.call(@project, {name: params[:keyword], state: params[:state], page: page, limit: limit}, current_user&.gitea_token)
end
def all
diff --git a/app/services/api/v1/projects/branches/list_service.rb b/app/services/api/v1/projects/branches/list_service.rb
index b049bb2ac..6980b71ea 100644
--- a/app/services/api/v1/projects/branches/list_service.rb
+++ b/app/services/api/v1/projects/branches/list_service.rb
@@ -1,6 +1,6 @@
class Api::V1::Projects::Branches::ListService < ApplicationService
- attr_accessor :project, :token, :owner, :repo, :name, :page, :limit
+ attr_accessor :project, :token, :owner, :repo, :name, :state, :page, :limit
attr_accessor :gitea_data, :gitea_repo_data
def initialize(project, params, token=nil)
@@ -9,6 +9,7 @@ class Api::V1::Projects::Branches::ListService < ApplicationService
@repo = project&.identifier
@token = token
@name = params[:name]
+ @state = params[:state]
@page = params[:page]
@limit = params[:limit]
end
@@ -29,7 +30,8 @@ class Api::V1::Projects::Branches::ListService < ApplicationService
limit: limit
}
params.merge!({name: name}) if name.present?
-
+ params.merge!({state: state}) if state.present?
+
params
end
From 6a4f63d8ea532640c63978dacbb06013e41aa60e Mon Sep 17 00:00:00 2001
From: yystopf
Date: Tue, 30 Jan 2024 14:49:54 +0800
Subject: [PATCH 16/47] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E6=9C=80?=
=?UTF-8?q?=E6=96=B0=E6=8F=90=E4=BA=A4=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Gemfile | 2 +-
.../api/v1/projects/commits_controller.rb | 6 ++-
.../api/v1/projects/commits/recent_service.rb | 37 +++++++++++++++++++
.../v1/projects/commits/recent.json.jbuilder | 13 +++++++
config/routes/api.rb | 6 ++-
5 files changed, 61 insertions(+), 3 deletions(-)
create mode 100644 app/services/api/v1/projects/commits/recent_service.rb
create mode 100644 app/views/api/v1/projects/commits/recent.json.jbuilder
diff --git a/Gemfile b/Gemfile
index 891c636c6..c73a66428 100644
--- a/Gemfile
+++ b/Gemfile
@@ -143,4 +143,4 @@ gem 'doorkeeper'
gem 'doorkeeper-jwt'
-gem 'gitea-client', '~> 1.4.4'
+gem 'gitea-client', '~> 1.4.5'
diff --git a/app/controllers/api/v1/projects/commits_controller.rb b/app/controllers/api/v1/projects/commits_controller.rb
index a1545ae6f..9fd8de1c2 100644
--- a/app/controllers/api/v1/projects/commits_controller.rb
+++ b/app/controllers/api/v1/projects/commits_controller.rb
@@ -1,5 +1,5 @@
class Api::V1::Projects::CommitsController < Api::V1::BaseController
- before_action :require_public_and_member_above, only: [:index, :diff]
+ before_action :require_public_and_member_above, only: [:index, :diff, :recent]
def index
@result_object = Api::V1::Projects::Commits::ListService.call(@project, {page: page, limit: limit, sha: params[:sha]}, current_user&.gitea_token)
@@ -9,4 +9,8 @@ class Api::V1::Projects::CommitsController < Api::V1::BaseController
def diff
@result_object = Api::V1::Projects::Commits::DiffService.call(@project, params[:sha], current_user&.gitea_token)
end
+
+ def recent
+ @result_object = Api::V1::Projects::Commits::RecentService.call(@project, {page: page, limit: limit}, current_user&.gitea_token)
+ end
end
\ No newline at end of file
diff --git a/app/services/api/v1/projects/commits/recent_service.rb b/app/services/api/v1/projects/commits/recent_service.rb
new file mode 100644
index 000000000..fa4f65b43
--- /dev/null
+++ b/app/services/api/v1/projects/commits/recent_service.rb
@@ -0,0 +1,37 @@
+class Api::V1::Projects::Commits::RecentService < ApplicationService
+
+ attr_reader :project, :page, :limit, :owner, :repo, :token
+ attr_accessor :gitea_data
+
+ def initialize(project, params, token=nil)
+ @project = project
+ @page = params[:page] || 1
+ @limit = params[:limit] || 15
+ @owner = project&.owner&.login
+ @repo = project&.identifier
+ @token = token
+ end
+
+ def call
+ load_gitea_data
+
+ gitea_data
+ end
+
+ private
+ def request_params
+ param = {
+ access_token: token,
+ page: page,
+ limit: limit
+ }
+
+ param
+ end
+
+ def load_gitea_data
+ @gitea_data = $gitea_hat_client.get_repos_recent_commits_by_owner_repo(owner, repo, {query: request_params}) rescue nil
+ raise Error, "获取最近提交列表失败" unless @gitea_data.is_a?(Hash)
+ end
+
+end
\ No newline at end of file
diff --git a/app/views/api/v1/projects/commits/recent.json.jbuilder b/app/views/api/v1/projects/commits/recent.json.jbuilder
new file mode 100644
index 000000000..2834b10d4
--- /dev/null
+++ b/app/views/api/v1/projects/commits/recent.json.jbuilder
@@ -0,0 +1,13 @@
+json.total_count @result_object[:total_data].to_i
+json.commits @result_object[:data].each do |commit|
+ json.sha commit['sha']
+ json.author do
+ json.partial! 'api/v1/users/commit_user', locals: { user: render_cache_commit_author(commit['commit']['author']), name: commit['commit']['author']['name'] }
+ end
+
+ json.committer do
+ json.partial! 'api/v1/users/commit_user', locals: { user: render_cache_commit_author(commit['commit']['committer']), name: commit['commit']['committer']['name'] }
+ end
+ json.commit_message commit['commit']['message']
+ json.parent_shas commit['parents'].map{|x|x['sha']}
+end
\ No newline at end of file
diff --git a/config/routes/api.rb b/config/routes/api.rb
index 1133c8b36..f487f8b44 100644
--- a/config/routes/api.rb
+++ b/config/routes/api.rb
@@ -90,7 +90,11 @@ defaults format: :json do
delete 'tags/*name', to: "tags#destroy", via: :all
get 'tags/*name', to: "tags#show", via: :all
- resources :commits, only: [:index]
+ resources :commits, only: [:index] do
+ collection do
+ get :recent
+ end
+ end
resources :code_stats, only: [:index]
resources :contributors, only: [:index] do
collection do
From 447429a663ecb427c167e873f53c1f3354ed2eef Mon Sep 17 00:00:00 2001
From: yystopf
Date: Wed, 31 Jan 2024 16:47:00 +0800
Subject: [PATCH 17/47] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=88=9B?=
=?UTF-8?q?=E5=BB=BA=E9=A1=B9=E7=9B=AEauto=5Finit=E5=8F=82=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/projects_controller.rb | 2 +-
app/controllers/repositories_controller.rb | 3 ++-
app/forms/projects/create_form.rb | 8 ++++++--
app/services/projects/create_service.rb | 3 ++-
app/services/repositories/create_service.rb | 6 +++---
app/views/repositories/detail.json.jbuilder | 1 +
6 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index ca6b38360..7a69c52ec 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -283,7 +283,7 @@ class ProjectsController < ApplicationController
private
def project_params
params.permit(:user_id, :name, :description, :repository_name, :website, :lesson_url, :default_branch, :identifier,
- :project_category_id, :project_language_id, :license_id, :ignore_id, :private)
+ :project_category_id, :project_language_id, :license_id, :ignore_id, :private, :auto_init)
end
def mirror_params
diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb
index c13d784e1..98ff42a74 100644
--- a/app/controllers/repositories_controller.rb
+++ b/app/controllers/repositories_controller.rb
@@ -60,8 +60,9 @@ class RepositoriesController < ApplicationController
@entries = Gitea::Repository::Entries::ListService.new(@owner, @project.identifier, ref: @ref).call
@entries = @entries.present? ? @entries.sort_by{ |hash| hash['type'] } : []
@path = GiteaService.gitea_config[:domain]+"/#{@project.owner.login}/#{@project.identifier}/raw/branch/#{@ref}/"
+ @repo_detail = $gitea_client.get_repos_by_owner_repo(@owner.login, @project.identifier)
+ return render_not_found if @entries.blank? && !@repo_detail["empty"]
end
- return render_not_found if @entries.blank?
end
def top_counts
diff --git a/app/forms/projects/create_form.rb b/app/forms/projects/create_form.rb
index 6b86362c8..308e0aa62 100644
--- a/app/forms/projects/create_form.rb
+++ b/app/forms/projects/create_form.rb
@@ -1,6 +1,6 @@
class Projects::CreateForm < BaseForm
attr_accessor :user_id, :name, :description, :repository_name, :project_category_id,
- :project_language_id, :ignore_id, :license_id, :private, :owner
+ :project_language_id, :ignore_id, :license_id, :private, :owner, :auto_init
validates :user_id, :name, :repository_name, presence: true
validates :repository_name, format: { with: CustomRegexp::REPOSITORY_NAME_REGEX, multiline: true, message: "项目标识只能包含数字,字母,下划线(_),中划线(-),英文句号(.),必须以数字和字母开头,不能以下划线/中划线/英文句号开头和结尾" }
@@ -9,7 +9,7 @@ class Projects::CreateForm < BaseForm
validates :repository_name, length: { maximum: 100 }
validates :description, length: { maximum: 200 }
- validate :check_ignore, :check_license, :check_owner, :check_max_repo_creation
+ validate :check_ignore, :check_license, :check_auto_init, :check_owner, :check_max_repo_creation
validate do
check_project_category(project_category_id)
check_project_language(project_language_id)
@@ -25,6 +25,10 @@ class Projects::CreateForm < BaseForm
raise "ignore_id值无效." if ignore_id && Ignore.find_by(id: ignore_id).blank?
end
+ def check_auto_init
+ raise "auto_init值无效." if ignore_id && license_id && !auto_init
+ end
+
def check_owner
@project_owner = Owner.find_by(id: user_id)
raise "user_id值无效." if user_id && @project_owner.blank?
diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb
index ff36dfe52..408e6621c 100644
--- a/app/services/projects/create_service.rb
+++ b/app/services/projects/create_service.rb
@@ -61,7 +61,8 @@ class Projects::CreateService < ApplicationService
{
hidden: !repo_is_public,
user_id: params[:user_id],
- identifier: params[:repository_name]
+ identifier: params[:repository_name],
+ auto_init: params[:auto_init]
}
end
diff --git a/app/services/repositories/create_service.rb b/app/services/repositories/create_service.rb
index e7ff8bd1d..9fba6122e 100644
--- a/app/services/repositories/create_service.rb
+++ b/app/services/repositories/create_service.rb
@@ -67,7 +67,7 @@ class Repositories::CreateService < ApplicationService
end
def repository_params
- params.merge(project_id: project.id)
+ params.merge(project_id: project.id).except(:auto_init)
end
def gitea_repository_params
@@ -75,7 +75,7 @@ class Repositories::CreateService < ApplicationService
name: params[:identifier],
private: params[:hidden],
# readme: "ReadMe",
- "auto_init": true,
+ auto_init: params[:auto_init],
# "description": "string",
# "gitignores": "string",
# "issue_labels": "string",
@@ -89,7 +89,7 @@ class Repositories::CreateService < ApplicationService
license = project.license
hash = hash.merge(license: license.name) if license
hash = hash.merge(gitignores: ignore.name) if ignore
- hash = hash.merge(auto_init: true) if ignore || license
+ hash = hash.merge(auto_init: true) if ignore && license
hash
end
end
diff --git a/app/views/repositories/detail.json.jbuilder b/app/views/repositories/detail.json.jbuilder
index 1164f4030..0ef930558 100644
--- a/app/views/repositories/detail.json.jbuilder
+++ b/app/views/repositories/detail.json.jbuilder
@@ -1,3 +1,4 @@
+json.empty @result[:repo]["empty"]
json.content @project.content
json.website @project.website
json.lesson_url @project.lesson_url
From 8760a8234fbf1d688b5fc5ff8bd2d6ba6fb7493e Mon Sep 17 00:00:00 2001
From: yystopf
Date: Fri, 1 Mar 2024 10:36:57 +0800
Subject: [PATCH 18/47] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E8=8E=B7?=
=?UTF-8?q?=E5=8F=96=E4=B8=93=E5=8C=BA=E6=96=87=E7=AB=A0=E4=BD=BF=E7=94=A8?=
=?UTF-8?q?=E7=AE=80=E8=A6=81=E4=BF=A1=E6=81=AF=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/services/getway/cms/get_service.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/services/getway/cms/get_service.rb b/app/services/getway/cms/get_service.rb
index 6b7050e84..76c5f27e8 100644
--- a/app/services/getway/cms/get_service.rb
+++ b/app/services/getway/cms/get_service.rb
@@ -16,6 +16,6 @@ class Getway::Cms::GetService < Getway::ClientService
end
def url
- "/cms/doc/open/#{doc_id}".freeze
+ "/cms/doc/open/baseInfo/#{doc_id}".freeze
end
end
\ No newline at end of file
From 6e41605cbc251f1428dea4f32bb155ff9a776eda Mon Sep 17 00:00:00 2001
From: xxq250
Date: Fri, 1 Mar 2024 15:17:20 +0800
Subject: [PATCH 19/47] =?UTF-8?q?fixed=20=E5=88=A0=E9=99=A4=E6=96=87?=
=?UTF-8?q?=E4=BB=B6=E5=A4=B1=E8=B4=A5=EF=BC=8C=E5=8F=82=E6=95=B0sha?=
=?UTF-8?q?=E4=B8=8D=E5=8C=B9=E9=85=8D=E6=8F=90=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/interactors/gitea/delete_file_interactor.rb | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/interactors/gitea/delete_file_interactor.rb b/app/interactors/gitea/delete_file_interactor.rb
index 03ddf4230..f94b8a205 100644
--- a/app/interactors/gitea/delete_file_interactor.rb
+++ b/app/interactors/gitea/delete_file_interactor.rb
@@ -45,6 +45,7 @@ module Gitea
else
Rails.logger.error("Gitea::Repository::Entries::DeleteService error[#{response.status}]======#{response.body}")
@error = "删除失败,请确认该分支是否是保护分支。"
+ @error = "删除失败,参数sha不匹配。" if response.body.to_s.include?("sha does not match")
end
end
From f35dddbbf7ec4cd93a7fc54cff8041b9a3b9a0c6 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Fri, 1 Mar 2024 17:36:58 +0800
Subject: [PATCH 20/47] fix
---
app/forms/projects/create_form.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/forms/projects/create_form.rb b/app/forms/projects/create_form.rb
index 6ff8b43af..fd0128c3d 100644
--- a/app/forms/projects/create_form.rb
+++ b/app/forms/projects/create_form.rb
@@ -1,6 +1,6 @@
class Projects::CreateForm < BaseForm
attr_accessor :user_id, :name, :description, :repository_name, :project_category_id,
- :project_language_id, :ignore_id, :license_id, :private, :owner, :auto_init
+ :project_language_id, :ignore_id, :license_id, :private, :owner, :auto_init,
:blockchain, :blockchain_token_all, :blockchain_init_token
validates :user_id, :name, :repository_name, presence: true
From 8eefb8ca07ae273680b2f15a3aec415925526b24 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Tue, 5 Mar 2024 09:43:34 +0800
Subject: [PATCH 21/47] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E6=B5=81?=
=?UTF-8?q?=E6=B0=B4=E7=BA=BF=E6=8E=A5=E5=8F=A3=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Gemfile | 2 +-
.../v1/projects/actions/actions_controller.rb | 31 ++++++++++++++
.../v1/projects/actions/base_controller.rb | 4 ++
.../v1/projects/actions/runs_controller.rb | 12 ++++++
.../projects/actions/runs/job_show_service.rb | 42 +++++++++++++++++++
.../v1/projects/actions/runs/list_service.rb | 36 ++++++++++++++++
.../actions/actions/index.json.jbuilder | 4 ++
.../projects/actions/runs/index.json.jbuilder | 19 +++++++++
.../actions/runs/job_show.json.jbuilder | 16 +++++++
config/routes/api.rb | 9 ++++
10 files changed, 174 insertions(+), 1 deletion(-)
create mode 100644 app/controllers/api/v1/projects/actions/actions_controller.rb
create mode 100644 app/controllers/api/v1/projects/actions/base_controller.rb
create mode 100644 app/controllers/api/v1/projects/actions/runs_controller.rb
create mode 100644 app/services/api/v1/projects/actions/runs/job_show_service.rb
create mode 100644 app/services/api/v1/projects/actions/runs/list_service.rb
create mode 100644 app/views/api/v1/projects/actions/actions/index.json.jbuilder
create mode 100644 app/views/api/v1/projects/actions/runs/index.json.jbuilder
create mode 100644 app/views/api/v1/projects/actions/runs/job_show.json.jbuilder
diff --git a/Gemfile b/Gemfile
index c73a66428..dd2bcd982 100644
--- a/Gemfile
+++ b/Gemfile
@@ -143,4 +143,4 @@ gem 'doorkeeper'
gem 'doorkeeper-jwt'
-gem 'gitea-client', '~> 1.4.5'
+gem 'gitea-client', '~> 1.4.6'
diff --git a/app/controllers/api/v1/projects/actions/actions_controller.rb b/app/controllers/api/v1/projects/actions/actions_controller.rb
new file mode 100644
index 000000000..3825b4685
--- /dev/null
+++ b/app/controllers/api/v1/projects/actions/actions_controller.rb
@@ -0,0 +1,31 @@
+class Api::V1::Projects::Actions::ActionsController < Api::V1::Projects::Actions::BaseController
+
+ def index
+ begin
+ gitea_result = $gitea_hat_client.get_repos_actions_by_owner_repo(@project&.owner&.login, @project&.identifier)
+ @data = gitea_result[:data]["Workflows"]
+ rescue
+ @data = []
+ end
+ end
+
+ def disable
+ return render_error("请输入正确的流水线文件!") if params[:workflow].blank?
+ gitea_result = $gitea_hat_client.post_repos_actions_disable(@project&.owner&.login, @project&.identifier, {query: {workflow: params[:workflow]}}) rescue nil
+ if gitea_result
+ render_ok
+ else
+ render_error("禁用流水线失败")
+ end
+ end
+
+ def enable
+ return render_error("请输入正确的流水线文件!") if params[:workflow].blank?
+ gitea_result = $gitea_hat_client.post_repos_actions_enable(@project&.owner&.login, @project&.identifier, {query: {workflow: params[:workflow]}}) rescue nil
+ if gitea_result
+ render_ok
+ else
+ render_error("取消禁用流水线失败")
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/api/v1/projects/actions/base_controller.rb b/app/controllers/api/v1/projects/actions/base_controller.rb
new file mode 100644
index 000000000..d76b446ad
--- /dev/null
+++ b/app/controllers/api/v1/projects/actions/base_controller.rb
@@ -0,0 +1,4 @@
+class Api::V1::Projects::Actions::BaseController < Api::V1::BaseController
+ before_action :require_public_and_member_above
+
+end
\ No newline at end of file
diff --git a/app/controllers/api/v1/projects/actions/runs_controller.rb b/app/controllers/api/v1/projects/actions/runs_controller.rb
new file mode 100644
index 000000000..fbb3e4403
--- /dev/null
+++ b/app/controllers/api/v1/projects/actions/runs_controller.rb
@@ -0,0 +1,12 @@
+class Api::V1::Projects::Actions::RunsController < Api::V1::Projects::Actions::BaseController
+
+ def index
+ @result_object = Api::V1::Projects::Actions::Runs::ListService.call(@project, params[:workflow], current_user&.gitea_token)
+ end
+
+ def job_show
+ @result_object = Api::V1::Projects::Actions::Runs::JobShowService.call(@project, params[:run_id], params[:job], params[:log_cursors], current_user&.gitea_token)
+ puts @result_object
+ end
+
+end
\ No newline at end of file
diff --git a/app/services/api/v1/projects/actions/runs/job_show_service.rb b/app/services/api/v1/projects/actions/runs/job_show_service.rb
new file mode 100644
index 000000000..e80e882be
--- /dev/null
+++ b/app/services/api/v1/projects/actions/runs/job_show_service.rb
@@ -0,0 +1,42 @@
+class Api::V1::Projects::Actions::Runs::JobShowService < ApplicationService
+ include ActiveModel::Model
+
+ attr_reader :project, :token, :owner, :repo, :run, :job, :log_cursors
+ attr_accessor :gitea_data
+
+ validates :run, :job, :log_cursors, presence: true
+
+ def initialize(project, run, job, log_cursors, token = nil)
+ @project = project
+ @owner = project&.owner.login
+ @repo = project&.identifier
+ @run = run
+ @job = job
+ @log_cursors = log_cursors
+ @token = token
+ end
+
+ def call
+ raise Error, errors.full_messages.join(",") unless valid?
+ load_gitea_data
+
+ @gitea_data
+ end
+
+ private
+ def request_params
+ {
+ access_token: token
+ }
+ end
+
+ def request_body
+ {
+ logCursors: log_cursors
+ }
+ end
+
+ def load_gitea_data
+ @gitea_data = $gitea_hat_client.post_repos_actions_runs_jobs_by_owner_repo_run_job(owner, repo, run, job, {query: request_params, body: request_body.to_json})
+ end
+end
\ No newline at end of file
diff --git a/app/services/api/v1/projects/actions/runs/list_service.rb b/app/services/api/v1/projects/actions/runs/list_service.rb
new file mode 100644
index 000000000..62dbc05a0
--- /dev/null
+++ b/app/services/api/v1/projects/actions/runs/list_service.rb
@@ -0,0 +1,36 @@
+class Api::V1::Projects::Actions::Runs::ListService < ApplicationService
+ include ActiveModel::Model
+
+ attr_reader :project, :token, :owner, :repo, :workflow
+ attr_accessor :gitea_data
+
+ validates :workflow, presence: true
+
+ def initialize(project, workflow, token =nil)
+ @project = project
+ @owner = project&.owner.login
+ @repo = project&.identifier
+ @workflow = workflow
+ @token = token
+ end
+
+ def call
+ raise Error, errors.full_messages.join(",") unless valid?
+ load_gitea_data
+
+ @gitea_data
+ end
+
+ private
+ def request_params
+ {
+ access_token: token,
+ workflow: workflow
+ }
+ end
+
+ def load_gitea_data
+ @gitea_data = $gitea_hat_client.get_repos_actions_by_owner_repo(owner, repo, {query: request_params}) rescue nil
+ raise Error, '获取流水线执行记录失败!' unless @gitea_data.is_a?(Hash)
+ end
+end
\ No newline at end of file
diff --git a/app/views/api/v1/projects/actions/actions/index.json.jbuilder b/app/views/api/v1/projects/actions/actions/index.json.jbuilder
new file mode 100644
index 000000000..530cfc6af
--- /dev/null
+++ b/app/views/api/v1/projects/actions/actions/index.json.jbuilder
@@ -0,0 +1,4 @@
+json.total_count @data.size
+json.files @data.each do |file|
+ json.name file["Name"]
+end
\ No newline at end of file
diff --git a/app/views/api/v1/projects/actions/runs/index.json.jbuilder b/app/views/api/v1/projects/actions/runs/index.json.jbuilder
new file mode 100644
index 000000000..e21d86dc3
--- /dev/null
+++ b/app/views/api/v1/projects/actions/runs/index.json.jbuilder
@@ -0,0 +1,19 @@
+json.total_data @result_object[:total_data].to_i
+json.runs @result_object[:data]["Runs"].each do |run|
+ json.workflow run["WorkflowID"]
+ json.index run["Index"]
+ json.title run["Title"]
+ json.trigger_user do
+ json.partial! 'api/v1/users/commit_user', locals: { user: render_cache_commit_author(run['TriggerUser']), name: run['TriggerUser']['Name'] }
+ end
+
+ if run["Ref"].starts_with?("refs/tags")
+ json.ref run["Ref"].gsub!("/refs/tags/", "")
+ else
+ json.ref run["Ref"].gsub!("refs/heads/", "")
+ end
+
+ json.status run["Status"]
+ json.time_ago time_from_now(run["Stopped"])
+ json.holding_time run["Stopped"]-run["Started"]
+end
\ No newline at end of file
diff --git a/app/views/api/v1/projects/actions/runs/job_show.json.jbuilder b/app/views/api/v1/projects/actions/runs/job_show.json.jbuilder
new file mode 100644
index 000000000..bf5ce048a
--- /dev/null
+++ b/app/views/api/v1/projects/actions/runs/job_show.json.jbuilder
@@ -0,0 +1,16 @@
+json.state do
+ json.run do
+ json.title @result_object["state"]["run"]["title"]
+ json.status @result_object["state"]["run"]["status"]
+ json.done @result_object["state"]["run"]["done"]
+ json.jobs @result_object["state"]["run"]["jobs"]
+ json.current_job do
+ json.title @result_object["state"]["currentJob"]["title"]
+ json.detail @result_object["state"]["currentJob"]["detail"]
+ json.steps @result_object["state"]["currentJob"]["steps"]
+ end
+ end
+end
+json.logs do
+ json.steps_log @result_object["logs"]["stepsLog"]
+end
\ No newline at end of file
diff --git a/config/routes/api.rb b/config/routes/api.rb
index f487f8b44..20390a500 100644
--- a/config/routes/api.rb
+++ b/config/routes/api.rb
@@ -60,6 +60,15 @@ defaults format: :json do
# projects文件夹下的
scope module: :projects do
+ resources :actions, module: 'actions' do
+ collection do
+ post :disable
+ post :enable
+ resources :runs, only: [:index] do
+ post '/jobs/:job', to: 'runs#job_show'
+ end
+ end
+ end
resources :pulls, module: 'pulls' do
resources :versions, only: [:index] do
member do
From 2d9b97ee78693feff7a84d0dc587de054d958462 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Tue, 5 Mar 2024 10:26:36 +0800
Subject: [PATCH 22/47] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=88=86?=
=?UTF-8?q?=E9=A1=B5=E5=8F=82=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../api/v1/projects/actions/runs_controller.rb | 2 +-
.../api/v1/projects/actions/runs/list_service.rb | 12 ++++++++----
2 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/app/controllers/api/v1/projects/actions/runs_controller.rb b/app/controllers/api/v1/projects/actions/runs_controller.rb
index fbb3e4403..b9eb9ff06 100644
--- a/app/controllers/api/v1/projects/actions/runs_controller.rb
+++ b/app/controllers/api/v1/projects/actions/runs_controller.rb
@@ -1,7 +1,7 @@
class Api::V1::Projects::Actions::RunsController < Api::V1::Projects::Actions::BaseController
def index
- @result_object = Api::V1::Projects::Actions::Runs::ListService.call(@project, params[:workflow], current_user&.gitea_token)
+ @result_object = Api::V1::Projects::Actions::Runs::ListService.call(@project, {workflow: params[:workflow], page: page, limit: limit}, current_user&.gitea_token)
end
def job_show
diff --git a/app/services/api/v1/projects/actions/runs/list_service.rb b/app/services/api/v1/projects/actions/runs/list_service.rb
index 62dbc05a0..5889518ce 100644
--- a/app/services/api/v1/projects/actions/runs/list_service.rb
+++ b/app/services/api/v1/projects/actions/runs/list_service.rb
@@ -1,16 +1,18 @@
class Api::V1::Projects::Actions::Runs::ListService < ApplicationService
include ActiveModel::Model
- attr_reader :project, :token, :owner, :repo, :workflow
+ attr_reader :project, :token, :owner, :repo, :workflow, :page, :limit
attr_accessor :gitea_data
validates :workflow, presence: true
- def initialize(project, workflow, token =nil)
+ def initialize(project, params, token =nil)
@project = project
@owner = project&.owner.login
@repo = project&.identifier
- @workflow = workflow
+ @workflow = params[:workflow]
+ @page = params[:page] || 1
+ @limit = params[:limit] || 15
@token = token
end
@@ -25,7 +27,9 @@ class Api::V1::Projects::Actions::Runs::ListService < ApplicationService
def request_params
{
access_token: token,
- workflow: workflow
+ workflow: workflow,
+ page: page,
+ limit: limit
}
end
From dd96e1e2da15820c870379eaa509277f6b08aebb Mon Sep 17 00:00:00 2001
From: yystopf
Date: Wed, 6 Mar 2024 10:46:54 +0800
Subject: [PATCH 23/47] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E6=B5=81?=
=?UTF-8?q?=E6=B0=B4=E7=BA=BF=E6=96=87=E4=BB=B6=E4=B8=8D=E5=AD=98=E5=9C=A8?=
=?UTF-8?q?=E6=8A=A5=E9=94=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../v1/projects/actions/runs_controller.rb | 2 +-
.../projects/actions/runs/index.json.jbuilder | 34 +++++++++++--------
2 files changed, 20 insertions(+), 16 deletions(-)
diff --git a/app/controllers/api/v1/projects/actions/runs_controller.rb b/app/controllers/api/v1/projects/actions/runs_controller.rb
index b9eb9ff06..05918dbe2 100644
--- a/app/controllers/api/v1/projects/actions/runs_controller.rb
+++ b/app/controllers/api/v1/projects/actions/runs_controller.rb
@@ -2,11 +2,11 @@ class Api::V1::Projects::Actions::RunsController < Api::V1::Projects::Actions::B
def index
@result_object = Api::V1::Projects::Actions::Runs::ListService.call(@project, {workflow: params[:workflow], page: page, limit: limit}, current_user&.gitea_token)
+ puts @result_object
end
def job_show
@result_object = Api::V1::Projects::Actions::Runs::JobShowService.call(@project, params[:run_id], params[:job], params[:log_cursors], current_user&.gitea_token)
- puts @result_object
end
end
\ No newline at end of file
diff --git a/app/views/api/v1/projects/actions/runs/index.json.jbuilder b/app/views/api/v1/projects/actions/runs/index.json.jbuilder
index e21d86dc3..ae8041ce1 100644
--- a/app/views/api/v1/projects/actions/runs/index.json.jbuilder
+++ b/app/views/api/v1/projects/actions/runs/index.json.jbuilder
@@ -1,19 +1,23 @@
json.total_data @result_object[:total_data].to_i
-json.runs @result_object[:data]["Runs"].each do |run|
- json.workflow run["WorkflowID"]
- json.index run["Index"]
- json.title run["Title"]
- json.trigger_user do
- json.partial! 'api/v1/users/commit_user', locals: { user: render_cache_commit_author(run['TriggerUser']), name: run['TriggerUser']['Name'] }
- end
+if @result_object[:data]["Runs"].present?
+ json.runs @result_object[:data]["Runs"].each do |run|
+ json.workflow run["WorkflowID"]
+ json.index run["Index"]
+ json.title run["Title"]
+ json.trigger_user do
+ json.partial! 'api/v1/users/commit_user', locals: { user: render_cache_commit_author(run['TriggerUser']), name: run['TriggerUser']['Name'] }
+ end
- if run["Ref"].starts_with?("refs/tags")
- json.ref run["Ref"].gsub!("/refs/tags/", "")
- else
- json.ref run["Ref"].gsub!("refs/heads/", "")
- end
+ if run["Ref"].starts_with?("refs/tags")
+ json.ref run["Ref"].gsub!("/refs/tags/", "")
+ else
+ json.ref run["Ref"].gsub!("refs/heads/", "")
+ end
- json.status run["Status"]
- json.time_ago time_from_now(run["Stopped"])
- json.holding_time run["Stopped"]-run["Started"]
+ json.status run["Status"]
+ json.time_ago time_from_now(run["Stopped"])
+ json.holding_time run["Stopped"]-run["Started"]
+ end
+else
+ json.runs []
end
\ No newline at end of file
From 0e31daf9a871a9f44efd6d45e597812a47e41855 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Wed, 6 Mar 2024 16:27:43 +0800
Subject: [PATCH 24/47] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E6=81=A2?=
=?UTF-8?q?=E5=A4=8Dauto=5Finit?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/projects_controller.rb | 2 +-
app/forms/projects/create_form.rb | 4 ++--
app/services/projects/create_service.rb | 3 +--
app/services/repositories/create_service.rb | 4 ++--
4 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 7a69c52ec..ca6b38360 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -283,7 +283,7 @@ class ProjectsController < ApplicationController
private
def project_params
params.permit(:user_id, :name, :description, :repository_name, :website, :lesson_url, :default_branch, :identifier,
- :project_category_id, :project_language_id, :license_id, :ignore_id, :private, :auto_init)
+ :project_category_id, :project_language_id, :license_id, :ignore_id, :private)
end
def mirror_params
diff --git a/app/forms/projects/create_form.rb b/app/forms/projects/create_form.rb
index 308e0aa62..81bb1d79d 100644
--- a/app/forms/projects/create_form.rb
+++ b/app/forms/projects/create_form.rb
@@ -1,6 +1,6 @@
class Projects::CreateForm < BaseForm
attr_accessor :user_id, :name, :description, :repository_name, :project_category_id,
- :project_language_id, :ignore_id, :license_id, :private, :owner, :auto_init
+ :project_language_id, :ignore_id, :license_id, :private, :owner
validates :user_id, :name, :repository_name, presence: true
validates :repository_name, format: { with: CustomRegexp::REPOSITORY_NAME_REGEX, multiline: true, message: "项目标识只能包含数字,字母,下划线(_),中划线(-),英文句号(.),必须以数字和字母开头,不能以下划线/中划线/英文句号开头和结尾" }
@@ -9,7 +9,7 @@ class Projects::CreateForm < BaseForm
validates :repository_name, length: { maximum: 100 }
validates :description, length: { maximum: 200 }
- validate :check_ignore, :check_license, :check_auto_init, :check_owner, :check_max_repo_creation
+ validate :check_ignore, :check_license, :check_owner, :check_max_repo_creation
validate do
check_project_category(project_category_id)
check_project_language(project_language_id)
diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb
index 408e6621c..ff36dfe52 100644
--- a/app/services/projects/create_service.rb
+++ b/app/services/projects/create_service.rb
@@ -61,8 +61,7 @@ class Projects::CreateService < ApplicationService
{
hidden: !repo_is_public,
user_id: params[:user_id],
- identifier: params[:repository_name],
- auto_init: params[:auto_init]
+ identifier: params[:repository_name]
}
end
diff --git a/app/services/repositories/create_service.rb b/app/services/repositories/create_service.rb
index 9fba6122e..4583838f1 100644
--- a/app/services/repositories/create_service.rb
+++ b/app/services/repositories/create_service.rb
@@ -75,7 +75,7 @@ class Repositories::CreateService < ApplicationService
name: params[:identifier],
private: params[:hidden],
# readme: "ReadMe",
- auto_init: params[:auto_init],
+ "auto_init": true,
# "description": "string",
# "gitignores": "string",
# "issue_labels": "string",
@@ -89,7 +89,7 @@ class Repositories::CreateService < ApplicationService
license = project.license
hash = hash.merge(license: license.name) if license
hash = hash.merge(gitignores: ignore.name) if ignore
- hash = hash.merge(auto_init: true) if ignore && license
+ hash = hash.merge(auto_init: true) if ignore || license
hash
end
end
From 847e501dee046d47155be46751b9088644089218 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Thu, 7 Mar 2024 11:18:39 +0800
Subject: [PATCH 25/47] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=BC=80?=
=?UTF-8?q?=E5=90=AF=E6=B5=81=E6=B0=B4=E7=BA=BF=E6=A8=A1=E5=9D=97=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/projects_controller.rb | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index ca6b38360..a944e7c98 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -146,6 +146,11 @@ class ProjectsController < ApplicationController
default_branch: @project.default_branch
}
Gitea::Repository::UpdateService.call(@owner, @project.identifier, gitea_params)
+ elsif project_params.has_key?("has_actions")
+ gitea_params = {
+ has_actions: project_params[:has_actions]
+ }
+ Gitea::Repository::UpdateService.call(@owner, @project.identifier, gitea_params)
else
validate_params = project_params.slice(:name, :description,
:project_category_id, :project_language_id, :private, :identifier)
@@ -283,7 +288,7 @@ class ProjectsController < ApplicationController
private
def project_params
params.permit(:user_id, :name, :description, :repository_name, :website, :lesson_url, :default_branch, :identifier,
- :project_category_id, :project_language_id, :license_id, :ignore_id, :private)
+ :project_category_id, :project_language_id, :license_id, :ignore_id, :private, :has_actions)
end
def mirror_params
From 69754d5c1193c811f3fe8aadc7bb29a4ed724a6b Mon Sep 17 00:00:00 2001
From: yystopf
Date: Thu, 7 Mar 2024 15:40:40 +0800
Subject: [PATCH 26/47] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E6=97=B6?=
=?UTF-8?q?=E9=97=B4=E5=8F=96=E5=80=BC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/views/api/v1/projects/actions/runs/index.json.jbuilder | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/views/api/v1/projects/actions/runs/index.json.jbuilder b/app/views/api/v1/projects/actions/runs/index.json.jbuilder
index ae8041ce1..e108f269d 100644
--- a/app/views/api/v1/projects/actions/runs/index.json.jbuilder
+++ b/app/views/api/v1/projects/actions/runs/index.json.jbuilder
@@ -15,8 +15,8 @@ if @result_object[:data]["Runs"].present?
end
json.status run["Status"]
- json.time_ago time_from_now(run["Stopped"])
- json.holding_time run["Stopped"]-run["Started"]
+ json.time_ago time_from_now(run["Updated"])
+ json.holding_time run["Updated"]-run["Started"]
end
else
json.runs []
From a8997ae160c87fca3cf069c7a59083d1369dfd37 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Thu, 7 Mar 2024 15:49:14 +0800
Subject: [PATCH 27/47] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E6=97=B6?=
=?UTF-8?q?=E9=97=B4=E5=8F=96=E5=80=BC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/views/api/v1/projects/actions/runs/index.json.jbuilder | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/views/api/v1/projects/actions/runs/index.json.jbuilder b/app/views/api/v1/projects/actions/runs/index.json.jbuilder
index e108f269d..69d1b21d5 100644
--- a/app/views/api/v1/projects/actions/runs/index.json.jbuilder
+++ b/app/views/api/v1/projects/actions/runs/index.json.jbuilder
@@ -15,8 +15,8 @@ if @result_object[:data]["Runs"].present?
end
json.status run["Status"]
- json.time_ago time_from_now(run["Updated"])
- json.holding_time run["Updated"]-run["Started"]
+ json.time_ago time_from_now(run["Started"])
+ json.holding_time run["Status"] == 6 ? Time.now.to_i - run["Started"] : run["Stopped"] - run["Started"]
end
else
json.runs []
From 48c5aa732f568fd8709762b20948620e1e4128b5 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Thu, 7 Mar 2024 16:00:09 +0800
Subject: [PATCH 28/47] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E6=97=B6?=
=?UTF-8?q?=E9=97=B4=E5=8F=96=E5=80=BC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/views/api/v1/projects/actions/runs/index.json.jbuilder | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/views/api/v1/projects/actions/runs/index.json.jbuilder b/app/views/api/v1/projects/actions/runs/index.json.jbuilder
index 69d1b21d5..9122ef9cf 100644
--- a/app/views/api/v1/projects/actions/runs/index.json.jbuilder
+++ b/app/views/api/v1/projects/actions/runs/index.json.jbuilder
@@ -15,8 +15,8 @@ if @result_object[:data]["Runs"].present?
end
json.status run["Status"]
- json.time_ago time_from_now(run["Started"])
- json.holding_time run["Status"] == 6 ? Time.now.to_i - run["Started"] : run["Stopped"] - run["Started"]
+ json.time_ago time_from_now(run["Created"])
+ json.holding_time run["Status"] == 6 ? Time.now.to_i - run["Created"] : run["Stopped"] - run["Created"]
end
else
json.runs []
From 1e70d93a8366ee9f90ced19757b7f884499a682e Mon Sep 17 00:00:00 2001
From: xxq250
Date: Mon, 11 Mar 2024 09:22:07 +0800
Subject: [PATCH 29/47] =?UTF-8?q?=E9=87=8D=E6=96=B0=E8=AE=A1=E7=AE=97?=
=?UTF-8?q?=E7=BB=84=E7=BB=87=E6=88=90=E5=91=98=E6=95=B0=E9=87=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/models/organization.rb | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/app/models/organization.rb b/app/models/organization.rb
index 237efbfe9..f978611b1 100644
--- a/app/models/organization.rb
+++ b/app/models/organization.rb
@@ -182,14 +182,6 @@ class Organization < Owner
organization_users.count
end
- def teams_count
- teams.count
- end
-
- def organization_users_count
- organization_users.count
- end
-
def real_name
name = lastname + firstname
name = name.blank? ? (nickname.blank? ? login : nickname) : name
@@ -217,4 +209,11 @@ class Organization < Owner
enabling_cla == true
end
+ def num_users
+ organization_user_ids = self.organization_users.pluck(:user_id).uniq
+ project_member_user_ids = self.projects.joins(:members).pluck("members.user_id").uniq
+ ids = organization_user_ids + project_member_user_ids
+ ids.uniq.size
+ end
+
end
From 780ba6c10354a351436d62f1a41f1a5e88ab8c51 Mon Sep 17 00:00:00 2001
From: xxq250
Date: Mon, 11 Mar 2024 09:39:18 +0800
Subject: [PATCH 30/47] =?UTF-8?q?=E9=87=8D=E6=96=B0=E8=AE=A1=E7=AE=97?=
=?UTF-8?q?=E7=BB=84=E7=BB=87=E6=88=90=E5=91=98=E6=95=B0=E9=87=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/views/template_message_settings/_detail.json.jbuilder | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/views/template_message_settings/_detail.json.jbuilder b/app/views/template_message_settings/_detail.json.jbuilder
index d85a4c4ea..5f6a0bf62 100644
--- a/app/views/template_message_settings/_detail.json.jbuilder
+++ b/app/views/template_message_settings/_detail.json.jbuilder
@@ -3,6 +3,7 @@ json.type_name type.constantize.type_name
json.total_settings_count count
json.settings do
json.array! type.constantize.openning.limit(100).each do |setting|
- json.(setting, :name, :key, :notification_disabled, :email_disabled)
+ json.(setting, :name, :key, :email_disabled)
+ json.notification_disabled false
end
end
\ No newline at end of file
From f3f63e3dd364ea8bb21f2b18933688028048bda8 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Tue, 12 Mar 2024 15:20:56 +0800
Subject: [PATCH 31/47] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E9=87=8C?=
=?UTF-8?q?=E7=A8=8B=E7=A2=91=E6=8F=90=E9=86=92=E9=85=8D=E7=BD=AE=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../message_template/project_milestone_early_expired.rb | 8 ++++----
app/models/template_message_setting/create_or_assign.rb | 1 +
app/models/user_template_message_setting.rb | 2 ++
3 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/app/models/message_template/project_milestone_early_expired.rb b/app/models/message_template/project_milestone_early_expired.rb
index 5539fc362..3db1e1908 100644
--- a/app/models/message_template/project_milestone_early_expired.rb
+++ b/app/models/message_template/project_milestone_early_expired.rb
@@ -19,8 +19,8 @@ class MessageTemplate::ProjectMilestoneEarlyExpired < MessageTemplate
def self.get_message_content(receivers, milestone)
receivers.each do |receiver|
if receiver.user_template_message_setting.present?
- send_setting = receiver.user_template_message_setting.notification_body["ManageProject::MilestoneEarlyExpired"]
- send_setting = send_setting.nil? ? UserTemplateMessageSetting.init_notification_body["ManageProject::MilestoneEarlyExpired"] : send_setting
+ send_setting = receiver.user_template_message_setting.notification_body["ManageProject::MilestoneExpired"]
+ send_setting = send_setting.nil? ? UserTemplateMessageSetting.init_notification_body["ManageProject::MilestoneExpired"] : send_setting
receivers = receivers.where.not(id: receiver.id) unless send_setting
end
end
@@ -38,8 +38,8 @@ class MessageTemplate::ProjectMilestoneEarlyExpired < MessageTemplate
def self.get_email_message_content(receiver, milestone)
if receiver.user_template_message_setting.present?
- send_setting = receiver.user_template_message_setting.email_body["ManageProject::MilestoneEarlyExpired"]
- send_setting = send_setting.nil? ? UserTemplateMessageSetting.init_email_body["ManageProject::MilestoneEarlyExpired"] : send_setting
+ send_setting = receiver.user_template_message_setting.email_body["ManageProject::MilestoneExpired"]
+ send_setting = send_setting.nil? ? UserTemplateMessageSetting.init_email_body["ManageProject::MilestoneExpired"] : send_setting
return '', '', '' unless send_setting
project = milestone&.project
owner = project&.owner
diff --git a/app/models/template_message_setting/create_or_assign.rb b/app/models/template_message_setting/create_or_assign.rb
index 4c392b4b7..2397ce5b6 100644
--- a/app/models/template_message_setting/create_or_assign.rb
+++ b/app/models/template_message_setting/create_or_assign.rb
@@ -28,5 +28,6 @@ class TemplateMessageSetting::CreateOrAssign < TemplateMessageSetting
self.find_or_create_by(name: "疑修状态变更", key: "IssueChanged")
self.find_or_create_by(name: "合并请求状态变更", key: "PullRequestChanged")
self.find_or_create_by(name: "疑修截止日期到达最后一天", key: "IssueExpire", notification_disabled: false)
+ self.find_or_create_by(name: "里程碑逾期提醒", key: "MilestoneExpired", notification_disabled: false, email_disabled: true)
end
end
diff --git a/app/models/user_template_message_setting.rb b/app/models/user_template_message_setting.rb
index 7e855b768..befd2be87 100644
--- a/app/models/user_template_message_setting.rb
+++ b/app/models/user_template_message_setting.rb
@@ -36,6 +36,7 @@ class UserTemplateMessageSetting < ApplicationRecord
"CreateOrAssign::IssueChanged": true,
"CreateOrAssign::PullRequestChanged": true,
"CreateOrAssign::IssueExpire": true,
+ "CreateOrAssign::MilestoneExpired": true,
"ManageProject::Issue": true,
"ManageProject::PullRequest": true,
"ManageProject::Member": true,
@@ -59,6 +60,7 @@ class UserTemplateMessageSetting < ApplicationRecord
"CreateOrAssign::IssueChanged": false,
"CreateOrAssign::PullRequestChanged": false,
"CreateOrAssign::IssueExpire": false,
+ "CreateOrAssign::MilestoneExpired": false,
"ManageProject::Issue": false,
"ManageProject::PullRequest": false,
"ManageProject::Member": false,
From 370a565a7c2ea1f8c3dcbcfae6b186b02d3468ed Mon Sep 17 00:00:00 2001
From: yystopf
Date: Wed, 13 Mar 2024 15:10:05 +0800
Subject: [PATCH 32/47] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9Areadme=20href?=
=?UTF-8?q?=E5=8C=B9=E9=85=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/helpers/repositories_helper.rb | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb
index 0f3f27ac0..abd45cd19 100644
--- a/app/helpers/repositories_helper.rb
+++ b/app/helpers/repositories_helper.rb
@@ -122,20 +122,26 @@ module RepositoriesHelper
s_regex_1 = /\[.*?\]\((.*?)\)/
src_regex = /src=\"(.*?)\"/
src_regex_1 = /src=\'(.*?)\'/
+ href_regex = /href=\"(.*?)\"/
+ href_regex_1 = /href=\'(.*?)\'/
ss_c = content.to_s.scan(s_regex_c)
ss = content.to_s.scan(s_regex)
ss_1 = content.to_s.scan(s_regex_1)
ss_src = content.to_s.scan(src_regex)
ss_src_1 = content.to_s.scan(src_regex_1)
- total_sources = {ss_c: ss_c,ss: ss, ss_1: ss_1, ss_src: ss_src, ss_src_1: ss_src_1}
+ ss_href = content.to_s.scan(href_regex)
+ ss_href_1 = content.to_s.scan(href_regex_1)
+ total_sources = {ss_c: ss_c,ss: ss, ss_1: ss_1, ss_src: ss_src, ss_src_1: ss_src_1, ss_href: ss_href, ss_href_1: ss_href_1}
# total_sources.uniq!
total_sources.except(:ss, :ss_c).each do |k, sources|
sources.each do |s|
begin
s_content = s[0]
+ puts s_content
# 链接直接跳过不做替换
next if s_content.starts_with?('http://') || s_content.starts_with?('https://') || s_content.starts_with?('mailto:') || s_content.blank?
ext = File.extname(s_content)[1..-1]
+ puts ext
if (image_type?(ext) || download_type(ext)) && !ext.blank?
s_content = File.expand_path(s_content, file_path)
s_content = s_content.split("#{Rails.root}/")[1]
@@ -146,6 +152,10 @@ module RepositoriesHelper
content = content.gsub("src=\"#{s[0]}\"", "src=\"#{s_content}\"")
when 'ss_src_1'
content = content.gsub("src=\'#{s[0]}\'", "src=\'#{s_content}\'")
+ when 'ss_href'
+ content = content.gsub("href=\"#{s[0]}\"", "href=\"#{s_content}\"")
+ when 'ss_href_1'
+ content = content.gsub("href=\'#{s[0]}\'", "href=\'#{s_content}\'")
else
content = content.gsub("(#{s[0]})", "(#{s_content})")
end
@@ -158,6 +168,10 @@ module RepositoriesHelper
content = content.gsub("src=\"#{s[0]}\"", "src=\"/#{s_content}\"")
when 'ss_src_1'
content = content.gsub("src=\'#{s[0]}\'", "src=\'/#{s_content}\'")
+ when 'ss_href'
+ content = content.gsub("href=\"#{s[0]}\"", "href=\"#{s_content}\"")
+ when 'ss_href_1'
+ content = content.gsub("href=\'#{s[0]}\'", "href=\'#{s_content}\'")
else
content = content.gsub("(#{s[0]})", "(/#{s_content})")
end
From 7d769ad118bca9f285b1c81ff92ec4c02f6c55dc Mon Sep 17 00:00:00 2001
From: yystopf
Date: Wed, 13 Mar 2024 16:10:43 +0800
Subject: [PATCH 33/47] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9Areadme=20href?=
=?UTF-8?q?=E6=9B=BF=E6=8D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/helpers/repositories_helper.rb | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb
index abd45cd19..24d1555c6 100644
--- a/app/helpers/repositories_helper.rb
+++ b/app/helpers/repositories_helper.rb
@@ -137,11 +137,9 @@ module RepositoriesHelper
sources.each do |s|
begin
s_content = s[0]
- puts s_content
# 链接直接跳过不做替换
next if s_content.starts_with?('http://') || s_content.starts_with?('https://') || s_content.starts_with?('mailto:') || s_content.blank?
ext = File.extname(s_content)[1..-1]
- puts ext
if (image_type?(ext) || download_type(ext)) && !ext.blank?
s_content = File.expand_path(s_content, file_path)
s_content = s_content.split("#{Rails.root}/")[1]
@@ -162,7 +160,7 @@ module RepositoriesHelper
else
path = [owner&.login, repo&.identifier, 'tree', ref, file_path].join("/")
s_content = File.expand_path(s_content, path)
- s_content = s_content.split("#{Rails.root}/")[1]
+ s_content = s_content.split("#{Rails.root}")[1]
case k.to_s
when 'ss_src'
content = content.gsub("src=\"#{s[0]}\"", "src=\"/#{s_content}\"")
From c1fbea8453953a1e3849eea5138959bbe4b56940 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Thu, 14 Mar 2024 14:14:50 +0800
Subject: [PATCH 34/47] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E5=88=A0?=
=?UTF-8?q?=E9=99=A4=E7=89=B9=E6=AE=8A=E7=AC=A6=E5=8F=B7=E5=88=86=E6=94=AF?=
=?UTF-8?q?=E3=80=81=E6=A0=87=E7=AD=BE=E5=A4=B1=E8=B4=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/services/api/v1/projects/branches/delete_service.rb | 2 +-
app/services/api/v1/projects/tags/delete_service.rb | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/services/api/v1/projects/branches/delete_service.rb b/app/services/api/v1/projects/branches/delete_service.rb
index 28836c797..341079273 100644
--- a/app/services/api/v1/projects/branches/delete_service.rb
+++ b/app/services/api/v1/projects/branches/delete_service.rb
@@ -32,7 +32,7 @@ class Api::V1::Projects::Branches::DeleteService < ApplicationService
def excute_data_to_gitea
begin
- @gitea_data = $gitea_client.delete_repos_branches_by_owner_repo_branch(owner, repo, branch_name, {query: request_params})
+ @gitea_data = $gitea_client.delete_repos_branches_by_owner_repo_branch(owner, repo, CGI.escape(branch_name), {query: request_params})
rescue => e
raise Error, '保护分支无法删除!' if e.to_s.include?("branch protected")
raise Error, '删除分支失败!'
diff --git a/app/services/api/v1/projects/tags/delete_service.rb b/app/services/api/v1/projects/tags/delete_service.rb
index d0d317aa8..8f898bf1a 100644
--- a/app/services/api/v1/projects/tags/delete_service.rb
+++ b/app/services/api/v1/projects/tags/delete_service.rb
@@ -32,7 +32,7 @@ class Api::V1::Projects::Tags::DeleteService < ApplicationService
def excute_data_to_gitea
begin
- @gitea_data = $gitea_client.delete_repos_tags_by_owner_repo_tag(owner, repo, tag_name, {query: request_params})
+ @gitea_data = $gitea_client.delete_repos_tags_by_owner_repo_tag(owner, repo, CGI.escape(tag_name), {query: request_params})
rescue => e
raise Error, '请先删除发行版!' if e.to_s.include?("409")
raise Error, '删除标签失败!'
From a0f1679f03e944f91db7229c3ade01adb903da8d Mon Sep 17 00:00:00 2001
From: yystopf
Date: Sat, 16 Mar 2024 16:03:31 +0800
Subject: [PATCH 35/47] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=90=88?=
=?UTF-8?q?=E5=B9=B6=E8=AF=B7=E6=B1=82=E5=90=88=E5=B9=B6=E6=8E=A5=E5=8F=A3?=
=?UTF-8?q?=E5=86=B2=E7=AA=81=E6=96=87=E4=BB=B6=E6=8F=90=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/pull_requests_controller.rb | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb
index f5735d194..40bf61d78 100644
--- a/app/controllers/pull_requests_controller.rb
+++ b/app/controllers/pull_requests_controller.rb
@@ -179,6 +179,7 @@ class PullRequestsController < ApplicationController
def pr_merge
return render_forbidden("你没有权限操作.") unless @project.operator?(current_user)
+ return normal_status(-1, "该分支存在冲突,无法自动合并.") unless @pull_request.conflict_files.blank?
if params[:do].blank?
normal_status(-1, "请选择合并方式")
From c88d0c2712dbf64f03a819c34e96bf872ac7d37a Mon Sep 17 00:00:00 2001
From: yystopf
Date: Mon, 18 Mar 2024 16:31:05 +0800
Subject: [PATCH 36/47] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E6=9C=80?=
=?UTF-8?q?=E8=BF=91=E6=8F=90=E4=BA=A4=E5=88=97=E8=A1=A8=E8=BF=94=E5=9B=9E?=
=?UTF-8?q?=E8=B7=9D=E7=A6=BB=E7=8E=B0=E5=9C=A8=E6=97=B6=E9=97=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/views/api/v1/projects/commits/recent.json.jbuilder | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/views/api/v1/projects/commits/recent.json.jbuilder b/app/views/api/v1/projects/commits/recent.json.jbuilder
index 2834b10d4..2f954aadd 100644
--- a/app/views/api/v1/projects/commits/recent.json.jbuilder
+++ b/app/views/api/v1/projects/commits/recent.json.jbuilder
@@ -9,5 +9,6 @@ json.commits @result_object[:data].each do |commit|
json.partial! 'api/v1/users/commit_user', locals: { user: render_cache_commit_author(commit['commit']['committer']), name: commit['commit']['committer']['name'] }
end
json.commit_message commit['commit']['message']
+ json.time_from_now time_from_now(commit['created'])
json.parent_shas commit['parents'].map{|x|x['sha']}
end
\ No newline at end of file
From 444c57c2379bc4d54e24ee19e710bb6643fb1bc8 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Tue, 19 Mar 2024 10:03:39 +0800
Subject: [PATCH 37/47] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9Amarked.min.js?=
=?UTF-8?q?=E6=96=87=E4=BB=B6=E6=9B=BF=E6=8D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
public/editormd/lib/marked.min.js | 21 ++++-----------------
1 file changed, 4 insertions(+), 17 deletions(-)
diff --git a/public/editormd/lib/marked.min.js b/public/editormd/lib/marked.min.js
index eb14b2545..636c21b01 100644
--- a/public/editormd/lib/marked.min.js
+++ b/public/editormd/lib/marked.min.js
@@ -2,21 +2,8 @@
* marked v0.3.3 - a markdown parser
* Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
* https://github.com/chjj/marked
-
- 备注,这个改动没启用,只是做个记录:
- br不转成br
- 加了个 if (cap[0] != '' && cap[0] != '
') { out+=this.options.sanitize?escape(cap[0]):cap[0]; }
-
- out+=this.renderer.em(this.output(cap[2]||cap[1])) -->
- out+=this.renderer.em(this.output(cap[2]||cap[1]), cap.input)
*/
-// 0.4.0 /^ *(#{1,6}) ——》/^ *(#{1,6}) 去掉了一个空格
-/*if("string"!=typeof e)throw new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");*/
-// 说明:左边 --> 右边 左边被替换成了右边的内容
-// b(i[1].replace(/^ *| *\| *$/g,"")) --> i[1].replace(/^ *| *\| *$/g, "").split(/ *\| */) table没识别的问题
-// header.length===a.align.length --> header.length table没识别的问题
-// 2个table: b(a.cells[p],a.header.length) -> a.cells[p].replace(/^ *\| *| *\| *$/g, "").split(/ *\| */)
-// .replace(/(?: *\| *)?\n$/,"") --> .replace(/\n$/, "")
-// /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/ --> /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/
-!function(e){"use strict";var t={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:d,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ *(#{1,6})*([^\n]+?) *(?:#+ *)?(?:\n+|$)/,nptable:d,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?\\?>\\n*|\\n*|\\n*|?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)|(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,table:d,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,text:/^[^\n]+/};function n(e){this.tokens=[],this.tokens.links={},this.options=e||m.defaults,this.rules=t.normal,this.options.pedantic?this.rules=t.pedantic:this.options.gfm&&(this.options.tables?this.rules=t.tables:this.rules=t.gfm)}t._label=/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,t._title=/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/,t.def=p(t.def).replace("label",t._label).replace("title",t._title).getRegex(),t.bullet=/(?:[*+-]|\d+\.)/,t.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/,t.item=p(t.item,"gm").replace(/bull/g,t.bullet).getRegex(),t.list=p(t.list).replace(/bull/g,t.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+t.def.source+")").getRegex(),t._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",t._comment=//,t.html=p(t.html,"i").replace("comment",t._comment).replace("tag",t._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),t.paragraph=p(t.paragraph).replace("hr",t.hr).replace("heading",t.heading).replace("lheading",t.lheading).replace("tag",t._tag).getRegex(),t.blockquote=p(t.blockquote).replace("paragraph",t.paragraph).getRegex(),t.normal=f({},t),t.gfm=f({},t.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6})+([^\n]+?) *#* *(?:\n+|$)/}),t.gfm.paragraph=p(t.paragraph).replace("(?!","(?!"+t.gfm.fences.source.replace("\\1","\\2")+"|"+t.list.source.replace("\\1","\\3")+"|").getRegex(),t.tables=f({},t.gfm,{nptable:/^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/}),t.pedantic=f({},t.normal,{html:p("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?\\1> *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",t._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/}),n.rules=t,n.lex=function(e,t){return new n(t).lex(e)},n.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},n.prototype.token=function(e,n){var r,s,i,l,o,a,h,p,u,c,g,d,f;for(e=e.replace(/^ +$/gm,"");e;)if((i=this.rules.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&this.tokens.push({type:"space"})),i=this.rules.code.exec(e))e=e.substring(i[0].length),i=i[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",text:this.options.pedantic?i:i.replace(/\n+$/,"")});else if(i=this.rules.fences.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"code",lang:i[2],text:i[3]||""});else if(i=this.rules.heading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:i[1].length,text:i[2]});else if(n&&(i=this.rules.nptable.exec(e))&&(a={type:"table",header:i[1].replace(/^ *| *\| *$/g, "").split(/ *\| */),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3]?i[3].replace(/\n$/,"").split("\n"):[]}).header.length){for(e=e.substring(i[0].length),p=0;p ?/gm,""),this.token(i,n),this.tokens.push({type:"blockquote_end"});else if(i=this.rules.list.exec(e)){for(e=e.substring(i[0].length),g=(l=i[2]).length>1,this.tokens.push({type:"list_start",ordered:g,start:g?+l:""}),r=!1,c=(i=i[0].match(this.rules.item)).length,p=0;p1&&o.length>1||(e=i.slice(p+1).join("\n")+e,p=c-1)),s=r||/\n\n(?!\s*$)/.test(a),p!==c-1&&(r="\n"===a.charAt(a.length-1),s||(s=r)),f=void 0,(d=/^\[[ xX]\] /.test(a))&&(f=" "!==a[1],a=a.replace(/^\[[ xX]\] +/,"")),this.tokens.push({type:s?"loose_item_start":"list_item_start",task:d,checked:f}),this.token(a,!1),this.tokens.push({type:"list_item_end"});this.tokens.push({type:"list_end"})}else if(i=this.rules.html.exec(e))e=e.substring(i[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&("pre"===i[1]||"script"===i[1]||"style"===i[1]),text:i[0]});else if(n&&(i=this.rules.def.exec(e)))e=e.substring(i[0].length),i[3]&&(i[3]=i[3].substring(1,i[3].length-1)),u=i[1].toLowerCase().replace(/\s+/g," "),this.tokens.links[u]||(this.tokens.links[u]={href:i[2],title:i[3]});else if(n&&(i=this.rules.table.exec(e))&&(a={type:"table",header:i[1].replace(/^ *| *\| *$/g, "").split(/ *\| */),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3]?i[3].replace(/\n$/, "").split("\n"):[]}).header.length){for(e=e.substring(i[0].length),p=0;p?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:d,tag:"^comment|^[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,strong:/^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)|^__([^\s])__(?!_)|^\*\*([^\s])\*\*(?!\*)/,em:/^_([^\s][\s\S]*?[^\s_])_(?!_)|^_([^\s_][\s\S]*?[^\s])_(?!_)|^\*([^\s][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*][\s\S]*?[^\s])\*(?!\*)|^_([^\s_])_(?!_)|^\*([^\s*])\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:d,text:/^[\s\S]+?(?=[\\/g,">").replace(/"/g,""").replace(/'/g,"'")}function h(e){return e.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}function p(e,t){return e=e.source||e,t=t||"",{replace:function(t,n){return n=(n=n.source||n).replace(/(^|[^\[])\^/g,"$1"),e=e.replace(t,n),this},getRegex:function(){return new RegExp(e,t)}}}function u(e,t){return c[" "+e]||(/^[^:]+:\/*[^/]*$/.test(e)?c[" "+e]=e+"/":c[" "+e]=e.replace(/[^/]*$/,"")),e=c[" "+e],"//"===t.slice(0,2)?e.replace(/:[\s\S]*/,":")+t:"/"===t.charAt(0)?e.replace(/(:\/*[^/]*)[\s\S]*/,"$1")+t:e+t}r._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,r._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,r._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,r.autolink=p(r.autolink).replace("scheme",r._scheme).replace("email",r._email).getRegex(),r._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,r.tag=p(r.tag).replace("comment",t._comment).replace("attribute",r._attribute).getRegex(),r._label=/(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/,r._href=/\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f()\\]*\)|[^\s\x00-\x1f()\\])*?)/,r._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,r.link=p(r.link).replace("label",r._label).replace("href",r._href).replace("title",r._title).getRegex(),r.reflink=p(r.reflink).replace("label",r._label).getRegex(),r.normal=f({},r),r.pedantic=f({},r.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,link:p(/^!?\[(label)\]\((.*?)\)/).replace("label",r._label).getRegex(),reflink:p(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",r._label).getRegex()}),r.gfm=f({},r.normal,{escape:p(r.escape).replace("])","~|])").getRegex(),url:p(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("email",r._email).getRegex(),_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:p(r.text).replace("]|","~]|").replace("|","|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&'*+/=?^_`{\\|}~-]+@|").getRegex()}),r.breaks=f({},r.gfm,{br:p(r.br).replace("{2,}","*").getRegex(),text:p(r.gfm.text).replace("{2,}","*").getRegex()}),s.rules=r,s.output=function(e,t,n){return new s(t,n).output(e)},s.prototype.output=function(e){for(var t,n,r,i,l,o="";e;)if(l=this.rules.escape.exec(e))e=e.substring(l[0].length),o+=l[1];else if(l=this.rules.autolink.exec(e))e=e.substring(l[0].length),r="@"===l[2]?"mailto:"+(n=a(this.mangle(l[1]))):n=a(l[1]),o+=this.renderer.link(r,null,n);else if(this.inLink||!(l=this.rules.url.exec(e))){if(l=this.rules.tag.exec(e))!this.inLink&&/^/i.test(l[0])&&(this.inLink=!1),e=e.substring(l[0].length),o+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(l[0]):a(l[0]):l[0];else if(l=this.rules.link.exec(e))e=e.substring(l[0].length),this.inLink=!0,r=l[2],this.options.pedantic?(t=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(r))?(r=t[1],i=t[3]):i="":i=l[3]?l[3].slice(1,-1):"",r=r.trim().replace(/^<([\s\S]*)>$/,"$1"),o+=this.outputLink(l,{href:s.escapes(r),title:s.escapes(i)}),this.inLink=!1;else if((l=this.rules.reflink.exec(e))||(l=this.rules.nolink.exec(e))){if(e=e.substring(l[0].length),t=(l[2]||l[1]).replace(/\s+/g," "),!(t=this.links[t.toLowerCase()])||!t.href){o+=l[0].charAt(0),e=l[0].substring(1)+e;continue}this.inLink=!0,o+=this.outputLink(l,t),this.inLink=!1}else if(l=this.rules.strong.exec(e))e=e.substring(l[0].length),o+=this.renderer.strong(this.output(l[4]||l[3]||l[2]||l[1]));else if(l=this.rules.em.exec(e))e=e.substring(l[0].length),o+=this.renderer.em(this.output(l[6]||l[5]||l[4]||l[3]||l[2]||l[1]));else if(l=this.rules.code.exec(e))e=e.substring(l[0].length),o+=this.renderer.codespan(a(l[2].trim(),!0));else if(l=this.rules.br.exec(e))e=e.substring(l[0].length),o+=this.renderer.br();else if(l=this.rules.del.exec(e))e=e.substring(l[0].length),o+=this.renderer.del(this.output(l[1]));else if(l=this.rules.text.exec(e))e=e.substring(l[0].length),o+=this.renderer.text(a(this.smartypants(l[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else l[0]=this.rules._backpedal.exec(l[0])[0],e=e.substring(l[0].length),"@"===l[2]?r="mailto:"+(n=a(l[0])):(n=a(l[0]),r="www."===l[1]?"http://"+n:n),o+=this.renderer.link(r,null,n);return o},s.escapes=function(e){return e?e.replace(s.rules._escapes,"$1"):e},s.prototype.outputLink=function(e,t){var n=t.href,r=t.title?a(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,a(e[1]))},s.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},s.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n="",r=e.length,s=0;s.5&&(t="x"+t.toString(16)),n+=""+t+";";return n},i.prototype.code=function(e,t,n){if(this.options.highlight){var r=this.options.highlight(e,t);null!=r&&r!==e&&(n=!0,e=r)}return t?''+(n?e:a(e,!0))+"
\n":""+(n?e:a(e,!0))+"
"},i.prototype.blockquote=function(e){return"\n"+e+"
\n"},i.prototype.html=function(e){return e},i.prototype.heading=function(e,t,n){return this.options.headerIds?"\n":""+e+"\n"},i.prototype.hr=function(){return this.options.xhtml?"
\n":"
\n"},i.prototype.list=function(e,t,n){var r=t?"ol":"ul";return"<"+r+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+""+r+">\n"},i.prototype.listitem=function(e){return""+e+"\n"},i.prototype.checkbox=function(e){return" "},i.prototype.paragraph=function(e){return""+e+"
\n"},i.prototype.table=function(e,t){return t&&(t=""+t+""),"\n"},i.prototype.tablerow=function(e){return"\n"+e+"
\n"},i.prototype.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+""+n+">\n"},i.prototype.strong=function(e){return""+e+""},i.prototype.em=function(e){return""+e+""},i.prototype.codespan=function(e){return""+e+"
"},i.prototype.br=function(){return this.options.xhtml?"
":"
"},i.prototype.del=function(e){return""+e+""},i.prototype.link=function(e,t,n){if(this.options.sanitize){try{var r=decodeURIComponent(h(e)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return n}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:")||0===r.indexOf("data:"))return n}this.options.baseUrl&&!g.test(e)&&(e=u(this.options.baseUrl,e));try{e=encodeURI(e).replace(/%25/g,"%")}catch(e){return n}var s='"+n+""},i.prototype.image=function(e,t,n){this.options.baseUrl&&!g.test(e)&&(e=u(this.options.baseUrl,e));var r='
":">"},i.prototype.text=function(e){return e},l.prototype.strong=l.prototype.em=l.prototype.codespan=l.prototype.del=l.prototype.text=function(e){return e},l.prototype.link=l.prototype.image=function(e,t,n){return""+n},l.prototype.br=function(){return""},o.parse=function(e,t){return new o(t).parse(e)},o.prototype.parse=function(e){this.inline=new s(e.links,this.options),this.inlineText=new s(e.links,f({},this.options,{renderer:new l})),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},o.prototype.next=function(){return this.token=this.tokens.pop()},o.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},o.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},o.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,h(this.inlineText.output(this.token.text)));case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,s="",i="";for(n="",e=0;et)n.splice(t);else for(;n.lengthAn error occurred:
"+a(e.message+"",!0)+"
";throw e}}d.exec=d,m.options=m.setOptions=function(e){return f(m.defaults,e),m},m.getDefaults=function(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:new i,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tables:!0,xhtml:!1}},m.defaults=m.getDefaults(),m.Parser=o,m.parser=o.parse,m.Renderer=i,m.TextRenderer=l,m.Lexer=n,m.lexer=n.lex,m.InlineLexer=s,m.inlineLexer=s.output,m.parse=m,"undefined"!=typeof module&&"object"==typeof exports?module.exports=m:"function"==typeof define&&define.amd?define(function(){return m}):e.marked=m}(this||("undefined"!=typeof window?window:global));
-
+(function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+block.def.source+")")();block.blockquote=replace(block.blockquote)("def",block.def)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b";block.html=replace(block.html)("comment",//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)("hr",block.hr)("heading",block.heading)("lheading",block.lheading)("blockquote",block.blockquote)("tag","<"+block._tag)("def",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,paragraph:/^/});block.gfm.paragraph=replace(block.paragraph)("(?!","(?!"+block.gfm.fences.source.replace("\\1","\\2")+"|"+block.list.source.replace("\\1","\\3")+"|")();block.tables=merge({},block.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm){if(this.options.tables){this.rules=block.tables}else{this.rules=block.gfm}}}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)};Lexer.prototype.lex=function(src){src=src.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(src,true)};Lexer.prototype.token=function(src,top,bq){var src=src.replace(/^ +$/gm,""),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1){this.tokens.push({type:"space"})}}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm,"");this.tokens.push({type:"code",text:!this.options.pedantic?cap.replace(/\n+$/,""):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"code",lang:cap[2],text:cap[3]});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/\n$/,"").split("\n")};for(i=0;i ?/gm,"");this.token(cap,top,true);this.tokens.push({type:"blockquote_end"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length);bull=cap[2];this.tokens.push({type:"list_start",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i1&&b.length>1)){src=cap.slice(i+1).join("\n")+src;i=l-1}}loose=next||/\n\n(?!\s*$)/.test(item);if(i!==l-1){next=item.charAt(item.length-1)==="\n";if(!loose){loose=next}}this.tokens.push({type:loose?"loose_item_start":"list_item_start"});this.token(item,false,bq);
+this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:cap[1]==="pre"||cap[1]==="script"||cap[1]==="style",text:cap[0]});continue}if((!bq&&top)&&(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(i=0;i])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:noop,tag:/^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:noop,text:/^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/;inline.link=replace(inline.link)("inside",inline._inside)("href",inline._href)();inline.reflink=replace(inline.reflink)("inside",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:replace(inline.text)("]|","~]|")("|","|https?://|")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal;this.renderer=this.options.renderer||new Renderer;this.renderer.options=this.options;if(!this.links){throw new Error("Tokens array requires a `links` property.")}if(this.options.gfm){if(this.options.breaks){this.rules=inline.breaks}else{this.rules=inline.gfm}}else{if(this.options.pedantic){this.rules=inline.pedantic}}}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out="",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length);out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]==="@"){text=cap[1].charAt(6)===":"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle("mailto:")+text}else{text=escape(cap[1]);href=text}out+=this.renderer.link(href,null,text);continue}if(!this.inLink&&(cap=this.rules.url.exec(src))){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+=this.renderer.link(href,null,text);continue}if(cap=this.rules.tag.exec(src)){if(!this.inLink&&/^/i.test(cap[0])){this.inLink=false}}src=src.substring(cap[0].length);out+=this.options.sanitize?escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);this.inLink=true;out+=this.outputLink(cap,{href:cap[2],title:cap[3]});this.inLink=false;continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\s+/g," ");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0].charAt(0);src=cap[0].substring(1)+src;continue}this.inLink=true;out+=this.outputLink(cap,link);this.inLink=false;continue}if(cap=this.rules.strong.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.strong(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.em(this.output(cap[2]||cap[1]));continue
+}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.codespan(escape(cap[2],true));continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.br();continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.del(this.output(cap[1]));continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=escape(this.smartypants(cap[0]));continue}if(src){throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}}return out};InlineLexer.prototype.outputLink=function(cap,link){var href=escape(link.href),title=link.title?escape(link.title):null;return cap[0].charAt(0)!=="!"?this.renderer.link(href,title,this.output(cap[1])):this.renderer.image(href,title,escape(cap[1]))};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants){return text}return text.replace(/--/g,"\u2014").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1\u2018").replace(/'/g,"\u2019").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1\u201c").replace(/"/g,"\u201d").replace(/\.{3}/g,"\u2026")};InlineLexer.prototype.mangle=function(text){var out="",l=text.length,i=0,ch;for(;i0.5){ch="x"+ch.toString(16)}out+=""+ch+";"}return out};function Renderer(options){this.options=options||{}}Renderer.prototype.code=function(code,lang,escaped){if(this.options.highlight){var out=this.options.highlight(code,lang);if(out!=null&&out!==code){escaped=true;code=out}}if(!lang){return""+(escaped?code:escape(code,true))+"\n
"}return''+(escaped?code:escape(code,true))+"\n
\n"};Renderer.prototype.blockquote=function(quote){return"\n"+quote+"
\n"};Renderer.prototype.html=function(html){return html};Renderer.prototype.heading=function(text,level,raw){return"\n"};Renderer.prototype.hr=function(){return this.options.xhtml?"
\n":"
\n"};Renderer.prototype.list=function(body,ordered){var type=ordered?"ol":"ul";return"<"+type+">\n"+body+""+type+">\n"};Renderer.prototype.listitem=function(text){return""+text+"\n"};Renderer.prototype.paragraph=function(text){return""+text+"
\n"};Renderer.prototype.table=function(header,body){return"\n"+"\n"+header+"\n"+"\n"+body+"\n"+"
\n"};Renderer.prototype.tablerow=function(content){return"\n"+content+"
\n"};Renderer.prototype.tablecell=function(content,flags){var type=flags.header?"th":"td";var tag=flags.align?"<"+type+' style="text-align:'+flags.align+'">':"<"+type+">";return tag+content+""+type+">\n"};Renderer.prototype.strong=function(text){return""+text+""};Renderer.prototype.em=function(text){return""+text+""};Renderer.prototype.codespan=function(text){return""+text+"
"};Renderer.prototype.br=function(){return this.options.xhtml?"
":"
"};Renderer.prototype.del=function(text){return""+text+""};Renderer.prototype.link=function(href,title,text){if(this.options.sanitize){try{var prot=decodeURIComponent(unescape(href)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return""}if(prot.indexOf("javascript:")===0||prot.indexOf("vbscript:")===0){return""}}var out='"+text+"";return out};Renderer.prototype.image=function(href,title,text){var out='
":">";return out};function Parser(options){this.tokens=[];this.token=null;this.options=options||marked.defaults;this.options.renderer=this.options.renderer||new Renderer;this.renderer=this.options.renderer;this.renderer.options=this.options}Parser.parse=function(src,options,renderer){var parser=new Parser(options,renderer);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options,this.renderer);this.tokens=src.reverse();var out="";while(this.next()){out+=this.tok()}return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;while(this.peek().type==="text"){body+="\n"+this.next().text}return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var header="",body="",i,row,cell,flags,j;cell="";for(i=0;i/g,">").replace(/"/g,""").replace(/'/g,"'")}function unescape(html){return html.replace(/&([#\w]+);/g,function(_,n){n=n.toLowerCase();if(n==="colon"){return":"}if(n.charAt(0)==="#"){return n.charAt(1)==="x"?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1))}return""})}function replace(regex,opt){regex=regex.source;opt=opt||"";return function self(name,val){if(!name){return new RegExp(regex,opt)}val=val.source||val;val=val.replace(/(^|[^\[])\^/g,"$1");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i=1,target,key;for(;iAn error occured:"+escape(e.message+"",true)+"
"}throw e}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,smartLists:false,silent:false,highlight:null,langPrefix:"lang-",smartypants:false,headerPrefix:"",renderer:new Renderer,xhtml:false};marked.Parser=Parser;marked.parser=Parser.parse;marked.Renderer=Renderer;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;marked.parse=marked;if(typeof module!=="undefined"&&typeof exports==="object"){module.exports=marked}else{if(typeof define==="function"&&define.amd){define(function(){return marked})}else{this.marked=marked}}}).call(function(){return this||(typeof window!=="undefined"?window:global)}());
\ No newline at end of file
From fd6f904f7e5aed21ed4b1bc9dc8dfcd7535eeccc Mon Sep 17 00:00:00 2001
From: yystopf
Date: Wed, 20 Mar 2024 09:13:29 +0800
Subject: [PATCH 38/47] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E6=9C=80?=
=?UTF-8?q?=E8=BF=91=E6=8F=90=E4=BA=A4=E5=88=97=E8=A1=A8message=E6=90=9C?=
=?UTF-8?q?=E7=B4=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/api/v1/projects/commits_controller.rb | 2 +-
app/services/api/v1/projects/commits/recent_service.rb | 4 +++-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/app/controllers/api/v1/projects/commits_controller.rb b/app/controllers/api/v1/projects/commits_controller.rb
index 9fd8de1c2..21987f4fb 100644
--- a/app/controllers/api/v1/projects/commits_controller.rb
+++ b/app/controllers/api/v1/projects/commits_controller.rb
@@ -11,6 +11,6 @@ class Api::V1::Projects::CommitsController < Api::V1::BaseController
end
def recent
- @result_object = Api::V1::Projects::Commits::RecentService.call(@project, {page: page, limit: limit}, current_user&.gitea_token)
+ @result_object = Api::V1::Projects::Commits::RecentService.call(@project, {keyword: params[:keyword], page: page, limit: limit}, current_user&.gitea_token)
end
end
\ No newline at end of file
diff --git a/app/services/api/v1/projects/commits/recent_service.rb b/app/services/api/v1/projects/commits/recent_service.rb
index fa4f65b43..9bc77dfc2 100644
--- a/app/services/api/v1/projects/commits/recent_service.rb
+++ b/app/services/api/v1/projects/commits/recent_service.rb
@@ -1,12 +1,13 @@
class Api::V1::Projects::Commits::RecentService < ApplicationService
- attr_reader :project, :page, :limit, :owner, :repo, :token
+ attr_reader :project, :page, :limit, :keyword, :owner, :repo, :token
attr_accessor :gitea_data
def initialize(project, params, token=nil)
@project = project
@page = params[:page] || 1
@limit = params[:limit] || 15
+ @keyword = params[:keyword]
@owner = project&.owner&.login
@repo = project&.identifier
@token = token
@@ -25,6 +26,7 @@ class Api::V1::Projects::Commits::RecentService < ApplicationService
page: page,
limit: limit
}
+ param.merge!(keyword: keyword) if keyword.present?
param
end
From b8b5828a7c5eb3006a35d71ee4bf986c4690aeac Mon Sep 17 00:00:00 2001
From: yystopf
Date: Wed, 20 Mar 2024 10:47:36 +0800
Subject: [PATCH 39/47] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E6=9B=B4?=
=?UTF-8?q?=E6=96=B0=E9=A1=B9=E7=9B=AEprivate=E5=8F=82=E6=95=B0=E9=BB=98?=
=?UTF-8?q?=E8=AE=A4=E4=B8=BA=E9=A1=B9=E7=9B=AEis=5Fpublic=E7=9A=84?=
=?UTF-8?q?=E5=80=BC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/projects_controller.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index a944e7c98..445c6db7a 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -157,7 +157,7 @@ class ProjectsController < ApplicationController
Projects::UpdateForm.new(validate_params.merge(user_id: @project.user_id, project_identifier: @project.identifier, project_name: @project.name)).validate!
- private = @project.forked_from_project.present? ? !@project.forked_from_project.is_public : params[:private] || false
+ private = @project.forked_from_project.present? ? !@project.forked_from_project.is_public : params[:private] || !@project.is_public
new_project_params = project_params.except(:private).merge(is_public: !private)
@project.update_attributes!(new_project_params)
From e891d52c32a2bede9c2c37afac187c48a6dc95fd Mon Sep 17 00:00:00 2001
From: yystopf
Date: Thu, 21 Mar 2024 10:11:58 +0800
Subject: [PATCH 40/47] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9Aacge=20?=
=?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E7=99=BB=E5=BD=95=E5=9B=9E=E8=B0=83?=
=?UTF-8?q?=E5=9C=B0=E5=9D=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/oauth/acge_controller.rb | 32 ++++++++++++++++++++++++
app/models/open_users/acge.rb | 27 ++++++++++++++++++++
config/routes.rb | 1 +
3 files changed, 60 insertions(+)
create mode 100644 app/controllers/oauth/acge_controller.rb
create mode 100644 app/models/open_users/acge.rb
diff --git a/app/controllers/oauth/acge_controller.rb b/app/controllers/oauth/acge_controller.rb
new file mode 100644
index 000000000..5afc57c6b
--- /dev/null
+++ b/app/controllers/oauth/acge_controller.rb
@@ -0,0 +1,32 @@
+class Oauth::AcgeController < Oauth::BaseController
+ include RegisterHelper
+
+ def create
+ begin
+ code = params['code'].to_s.strip
+ tip_exception("code不能为空") if code.blank?
+ uid = params['uid'].to_s.strip
+ tip_exception("uid不能为空") if uid.blank?
+ redirect_uri = params['redirect_uri'].to_s.strip
+ tip_exception("redirect_uri不能为空") if redirect_uri.blank?
+
+ open_user = OpenUsers::Acge.find_by(uid: uid)
+ if open_user.present? && open_user.user.present?
+ successful_authentication(open_user.user)
+ redirect_to redirect_uri
+ return
+ else
+ if current_user.blank? || !current_user.logged?
+ session[:unionid] = uid
+ else
+ OpenUsers::Acge.create!(user: current_user, uid: uid)
+ end
+ end
+
+ Rails.logger.info("[OAuth2] session[:unionid] -> #{session[:unionid]}")
+ redirect_to "/bindlogin/acge?redirect_uri=#{redirect_uri}"
+ rescue Exception => ex
+ render_error(ex.message)
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/models/open_users/acge.rb b/app/models/open_users/acge.rb
new file mode 100644
index 000000000..59963b91f
--- /dev/null
+++ b/app/models/open_users/acge.rb
@@ -0,0 +1,27 @@
+# == Schema Information
+#
+# Table name: open_users
+#
+# id :integer not null, primary key
+# user_id :integer
+# type :string(255)
+# uid :string(255)
+# created_at :datetime not null
+# updated_at :datetime not null
+# extra :text(65535)
+#
+# Indexes
+#
+# index_open_users_on_type_and_uid (type,uid) UNIQUE
+# index_open_users_on_user_id (user_id)
+#
+
+class OpenUsers::Acge < OpenUser
+ def nickname
+ extra&.[]('nickname')
+ end
+
+ def en_type
+ 'acge'
+ end
+end
diff --git a/config/routes.rb b/config/routes.rb
index a165a3d1e..b5f5c75ca 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -24,6 +24,7 @@ Rails.application.routes.draw do
# get 'auth/qq/callback', to: 'oauth/qq#create'
get 'auth/failure', to: 'oauth/base#auth_failure'
get 'auth/cas/callback', to: 'oauth/cas#create'
+ get 'auth/acge/callback', to: "oauth/acge#create"
get 'auth/:provider/callback', to: 'oauth/callbacks#create'
get 'oauth/bind', to: 'oauth/educoder#bind'
From 7bdab0bc535ccef9b3d0cc5732355e86ce92b1c9 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Thu, 21 Mar 2024 10:16:04 +0800
Subject: [PATCH 41/47] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9Abinduser=20typ?=
=?UTF-8?q?e=E7=B1=BB=E5=9E=8B=E6=96=B0=E5=A2=9Eacge?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/bind_users_controller.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/controllers/bind_users_controller.rb b/app/controllers/bind_users_controller.rb
index f5ed33809..b8c25dd7d 100644
--- a/app/controllers/bind_users_controller.rb
+++ b/app/controllers/bind_users_controller.rb
@@ -8,7 +8,7 @@ class BindUsersController < ApplicationController
bind_user = User.try_to_login(params[:username], params[:password])
tip_exception '用户名或者密码错误' if bind_user.blank?
tip_exception '用户名或者密码错误' unless bind_user.check_password?(params[:password].to_s)
- tip_exception '参数错误' unless ["qq", "wechat", "gitee", "github", "educoder"].include?(params[:type].to_s)
+ tip_exception '参数错误' unless ["qq", "wechat", "gitee", "github", "educoder", "acge"].include?(params[:type].to_s)
tip_exception '该账号已被绑定,请更换其他账号进行绑定' if bind_user.bind_open_user?(params[:type].to_s)
"OpenUsers::#{params[:type].to_s.capitalize}".constantize.create!(user: bind_user, uid: session[:unionid])
From d6acce86a7b57e7bdb88d6d51a2709bab0d4a313 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Thu, 21 Mar 2024 10:28:01 +0800
Subject: [PATCH 42/47] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9Amarked.min.js?=
=?UTF-8?q?=E6=96=87=E4=BB=B6=E6=9B=BF=E6=8D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
public/editormd/lib/marked.min.js | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/public/editormd/lib/marked.min.js b/public/editormd/lib/marked.min.js
index 636c21b01..9fdbc8481 100644
--- a/public/editormd/lib/marked.min.js
+++ b/public/editormd/lib/marked.min.js
@@ -1,9 +1,6 @@
/**
- * marked v0.3.3 - a markdown parser
- * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
- * https://github.com/chjj/marked
+ * marked - a markdown parser
+ * Copyright (c) 2011-2021, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/markedjs/marked
*/
-(function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+block.def.source+")")();block.blockquote=replace(block.blockquote)("def",block.def)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b";block.html=replace(block.html)("comment",//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)("hr",block.hr)("heading",block.heading)("lheading",block.lheading)("blockquote",block.blockquote)("tag","<"+block._tag)("def",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,paragraph:/^/});block.gfm.paragraph=replace(block.paragraph)("(?!","(?!"+block.gfm.fences.source.replace("\\1","\\2")+"|"+block.list.source.replace("\\1","\\3")+"|")();block.tables=merge({},block.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm){if(this.options.tables){this.rules=block.tables}else{this.rules=block.gfm}}}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)};Lexer.prototype.lex=function(src){src=src.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(src,true)};Lexer.prototype.token=function(src,top,bq){var src=src.replace(/^ +$/gm,""),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1){this.tokens.push({type:"space"})}}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm,"");this.tokens.push({type:"code",text:!this.options.pedantic?cap.replace(/\n+$/,""):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"code",lang:cap[2],text:cap[3]});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/\n$/,"").split("\n")};for(i=0;i ?/gm,"");this.token(cap,top,true);this.tokens.push({type:"blockquote_end"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length);bull=cap[2];this.tokens.push({type:"list_start",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i1&&b.length>1)){src=cap.slice(i+1).join("\n")+src;i=l-1}}loose=next||/\n\n(?!\s*$)/.test(item);if(i!==l-1){next=item.charAt(item.length-1)==="\n";if(!loose){loose=next}}this.tokens.push({type:loose?"loose_item_start":"list_item_start"});this.token(item,false,bq);
-this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:cap[1]==="pre"||cap[1]==="script"||cap[1]==="style",text:cap[0]});continue}if((!bq&&top)&&(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(i=0;i])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:noop,tag:/^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:noop,text:/^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/;inline.link=replace(inline.link)("inside",inline._inside)("href",inline._href)();inline.reflink=replace(inline.reflink)("inside",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:replace(inline.text)("]|","~]|")("|","|https?://|")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal;this.renderer=this.options.renderer||new Renderer;this.renderer.options=this.options;if(!this.links){throw new Error("Tokens array requires a `links` property.")}if(this.options.gfm){if(this.options.breaks){this.rules=inline.breaks}else{this.rules=inline.gfm}}else{if(this.options.pedantic){this.rules=inline.pedantic}}}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out="",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length);out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]==="@"){text=cap[1].charAt(6)===":"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle("mailto:")+text}else{text=escape(cap[1]);href=text}out+=this.renderer.link(href,null,text);continue}if(!this.inLink&&(cap=this.rules.url.exec(src))){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+=this.renderer.link(href,null,text);continue}if(cap=this.rules.tag.exec(src)){if(!this.inLink&&/^/i.test(cap[0])){this.inLink=false}}src=src.substring(cap[0].length);out+=this.options.sanitize?escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);this.inLink=true;out+=this.outputLink(cap,{href:cap[2],title:cap[3]});this.inLink=false;continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\s+/g," ");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0].charAt(0);src=cap[0].substring(1)+src;continue}this.inLink=true;out+=this.outputLink(cap,link);this.inLink=false;continue}if(cap=this.rules.strong.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.strong(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.em(this.output(cap[2]||cap[1]));continue
-}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.codespan(escape(cap[2],true));continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.br();continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.del(this.output(cap[1]));continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=escape(this.smartypants(cap[0]));continue}if(src){throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}}return out};InlineLexer.prototype.outputLink=function(cap,link){var href=escape(link.href),title=link.title?escape(link.title):null;return cap[0].charAt(0)!=="!"?this.renderer.link(href,title,this.output(cap[1])):this.renderer.image(href,title,escape(cap[1]))};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants){return text}return text.replace(/--/g,"\u2014").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1\u2018").replace(/'/g,"\u2019").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1\u201c").replace(/"/g,"\u201d").replace(/\.{3}/g,"\u2026")};InlineLexer.prototype.mangle=function(text){var out="",l=text.length,i=0,ch;for(;i0.5){ch="x"+ch.toString(16)}out+=""+ch+";"}return out};function Renderer(options){this.options=options||{}}Renderer.prototype.code=function(code,lang,escaped){if(this.options.highlight){var out=this.options.highlight(code,lang);if(out!=null&&out!==code){escaped=true;code=out}}if(!lang){return""+(escaped?code:escape(code,true))+"\n
"}return''+(escaped?code:escape(code,true))+"\n
\n"};Renderer.prototype.blockquote=function(quote){return"\n"+quote+"
\n"};Renderer.prototype.html=function(html){return html};Renderer.prototype.heading=function(text,level,raw){return"\n"};Renderer.prototype.hr=function(){return this.options.xhtml?"
\n":"
\n"};Renderer.prototype.list=function(body,ordered){var type=ordered?"ol":"ul";return"<"+type+">\n"+body+""+type+">\n"};Renderer.prototype.listitem=function(text){return""+text+"\n"};Renderer.prototype.paragraph=function(text){return""+text+"
\n"};Renderer.prototype.table=function(header,body){return"\n"+"\n"+header+"\n"+"\n"+body+"\n"+"
\n"};Renderer.prototype.tablerow=function(content){return"\n"+content+"
\n"};Renderer.prototype.tablecell=function(content,flags){var type=flags.header?"th":"td";var tag=flags.align?"<"+type+' style="text-align:'+flags.align+'">':"<"+type+">";return tag+content+""+type+">\n"};Renderer.prototype.strong=function(text){return""+text+""};Renderer.prototype.em=function(text){return""+text+""};Renderer.prototype.codespan=function(text){return""+text+"
"};Renderer.prototype.br=function(){return this.options.xhtml?"
":"
"};Renderer.prototype.del=function(text){return""+text+""};Renderer.prototype.link=function(href,title,text){if(this.options.sanitize){try{var prot=decodeURIComponent(unescape(href)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return""}if(prot.indexOf("javascript:")===0||prot.indexOf("vbscript:")===0){return""}}var out='"+text+"";return out};Renderer.prototype.image=function(href,title,text){var out='
":">";return out};function Parser(options){this.tokens=[];this.token=null;this.options=options||marked.defaults;this.options.renderer=this.options.renderer||new Renderer;this.renderer=this.options.renderer;this.renderer.options=this.options}Parser.parse=function(src,options,renderer){var parser=new Parser(options,renderer);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options,this.renderer);this.tokens=src.reverse();var out="";while(this.next()){out+=this.tok()}return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;while(this.peek().type==="text"){body+="\n"+this.next().text}return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var header="",body="",i,row,cell,flags,j;cell="";for(i=0;i/g,">").replace(/"/g,""").replace(/'/g,"'")}function unescape(html){return html.replace(/&([#\w]+);/g,function(_,n){n=n.toLowerCase();if(n==="colon"){return":"}if(n.charAt(0)==="#"){return n.charAt(1)==="x"?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1))}return""})}function replace(regex,opt){regex=regex.source;opt=opt||"";return function self(name,val){if(!name){return new RegExp(regex,opt)}val=val.source||val;val=val.replace(/(^|[^\[])\^/g,"$1");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i=1,target,key;for(;iAn error occured:"+escape(e.message+"",true)+"
"}throw e}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,smartLists:false,silent:false,highlight:null,langPrefix:"lang-",smartypants:false,headerPrefix:"",renderer:new Renderer,xhtml:false};marked.Parser=Parser;marked.parser=Parser.parse;marked.Renderer=Renderer;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;marked.parse=marked;if(typeof module!=="undefined"&&typeof exports==="object"){module.exports=marked}else{if(typeof define==="function"&&define.amd){define(function(){return marked})}else{this.marked=marked}}}).call(function(){return this||(typeof window!=="undefined"?window:global)}());
\ No newline at end of file
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).marked=t()}(this,function(){"use strict";function r(e,t){for(var u=0;ue.length)&&(t=e.length);for(var u=0,n=new Array(t);u=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t={exports:{}};function e(){return{baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}t.exports={defaults:e(),getDefaults:e,changeDefaults:function(e){t.exports.defaults=e}};function u(e){return D[e]}var n=/[&<>"']/,s=/[&<>"']/g,l=/[<>"']|&(?!#?\w+;)/,a=/[<>"']|&(?!#?\w+;)/g,D={"&":"&","<":"<",">":">",'"':""","'":"'"};var c=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function h(e){return e.replace(c,function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}var p=/(^|[^\[])\^/g;var g=/[^\w:]/g,f=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;var F={},A=/^[^:]+:\/*[^/]*$/,d=/^([^:]+:)[\s\S]*$/,C=/^([^:]+:\/*[^/]*)[\s\S]*$/;function k(e,t){F[" "+e]||(A.test(e)?F[" "+e]=e+"/":F[" "+e]=E(e,"/",!0));var u=-1===(e=F[" "+e]).indexOf(":");return"//"===t.substring(0,2)?u?t:e.replace(d,"$1")+t:"/"===t.charAt(0)?u?t:e.replace(C,"$1")+t:e+t}function E(e,t,u){var n=e.length;if(0===n)return"";for(var r=0;rt)u.splice(t);else for(;u.length>=1,e+=e;return u+e},T=t.exports.defaults,I=_,R=y,q=x,Z=z;function O(e,t,u){var n=t.href,r=t.title?q(t.title):null,t=e[1].replace(/\\([\[\]])/g,"$1");return"!"!==e[0].charAt(0)?{type:"link",raw:u,href:n,title:r,text:t}:{type:"image",raw:u,href:n,title:r,text:q(t)}}_=function(){function e(e){this.options=e||T}var t=e.prototype;return t.space=function(e){e=this.rules.block.newline.exec(e);if(e)return 1=u.length?e.slice(u.length):e}).join("\n")}(u,t[3]||"");return{type:"code",raw:u,lang:t[2]&&t[2].trim(),text:e}}},t.heading=function(e){var t=this.rules.block.heading.exec(e);if(t){var u=t[2].trim();return/#$/.test(u)&&(e=I(u,"#"),!this.options.pedantic&&e&&!/ $/.test(e)||(u=e.trim())),{type:"heading",raw:t[0],depth:t[1].length,text:u}}},t.nptable=function(e){e=this.rules.block.nptable.exec(e);if(e){var t={type:"table",header:R(e[1].replace(/^ *| *\| *$/g,"")),align:e[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:e[3]?e[3].replace(/\n$/,"").split("\n"):[],raw:e[0]};if(t.header.length===t.align.length){for(var u=t.align.length,n=0;n ?/gm,"");return{type:"blockquote",raw:t[0],text:e}}},t.list=function(e){e=this.rules.block.list.exec(e);if(e){for(var t,u,n,r,i,s,l=e[0],a=e[2],o=1g[1].length:n[1].length>=g[0].length||3/i.test(e[0])&&(t=!1),!u&&/^<(pre|code|kbd|script)(\s|>)/i.test(e[0])?u=!0:u&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(e[0])&&(u=!1),{type:this.options.sanitize?"text":"html",raw:e[0],inLink:t,inRawBlock:u,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):q(e[0]):e[0]}},t.link=function(e){var t=this.rules.inline.link.exec(e);if(t){var u=t[2].trim();if(!this.options.pedantic&&/^$/.test(u))return;e=I(u.slice(0,-1),"\\");if((u.length-e.length)%2==0)return}else{var n=Z(t[2],"()");-1$/.test(u)?n.slice(1):n.slice(1,-1):n)&&n.replace(this.rules.inline._escapes,"$1"),title:i&&i.replace(this.rules.inline._escapes,"$1")},t[0])}},t.reflink=function(e,t){if((u=this.rules.inline.reflink.exec(e))||(u=this.rules.inline.nolink.exec(e))){e=(u[2]||u[1]).replace(/\s+/g," ");if((e=t[e.toLowerCase()])&&e.href)return O(u,e,u[0]);var u=u[0].charAt(0);return{type:"text",raw:u,text:u}}},t.emStrong=function(e,t,u){void 0===u&&(u="");var n=this.rules.inline.emStrong.lDelim.exec(e);if(n&&(!n[3]||!u.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/))){var r=n[1]||n[2]||"";if(!r||r&&(""===u||this.rules.inline.punctuation.exec(u))){var i,s=n[0].length-1,l=s,a=0,o="*"===n[0][0]?this.rules.inline.emStrong.rDelimAst:this.rules.inline.emStrong.rDelimUnd;for(o.lastIndex=0,t=t.slice(-1*e.length+s);null!=(n=o.exec(t));)if(i=n[1]||n[2]||n[3]||n[4]||n[5]||n[6])if(i=i.length,n[3]||n[4])l+=i;else if(!((n[5]||n[6])&&s%3)||(s+i)%3){if(!(0<(l-=i)))return i=Math.min(i,i+l+a),Math.min(s,i)%2?{type:"em",raw:e.slice(0,s+n.index+i+1),text:e.slice(1,s+n.index+i)}:{type:"strong",raw:e.slice(0,s+n.index+i+1),text:e.slice(2,s+n.index+i-1)}}else a+=i}}},t.codespan=function(e){var t=this.rules.inline.code.exec(e);if(t){var u=t[2].replace(/\n/g," "),n=/[^ ]/.test(u),e=/^ /.test(u)&&/ $/.test(u);return n&&e&&(u=u.substring(1,u.length-1)),u=q(u,!0),{type:"codespan",raw:t[0],text:u}}},t.br=function(e){e=this.rules.inline.br.exec(e);if(e)return{type:"br",raw:e[0]}},t.del=function(e){e=this.rules.inline.del.exec(e);if(e)return{type:"del",raw:e[0],text:e[2]}},t.autolink=function(e,t){e=this.rules.inline.autolink.exec(e);if(e){var u,t="@"===e[2]?"mailto:"+(u=q(this.options.mangle?t(e[1]):e[1])):u=q(e[1]);return{type:"link",raw:e[0],text:u,href:t,tokens:[{type:"text",raw:u,text:u}]}}},t.url=function(e,t){var u,n,r,i;if(u=this.rules.inline.url.exec(e)){if("@"===u[2])r="mailto:"+(n=q(this.options.mangle?t(u[0]):u[0]));else{for(;i=u[0],u[0]=this.rules.inline._backpedal.exec(u[0])[0],i!==u[0];);n=q(u[0]),r="www."===u[1]?"http://"+n:n}return{type:"link",raw:u[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}},t.inlineText=function(e,t,u){e=this.rules.inline.text.exec(e);if(e){u=t?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):q(e[0]):e[0]:q(this.options.smartypants?u(e[0]):e[0]);return{type:"text",raw:e[0],text:u}}},e}(),y=w,z=b,w=v,b={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))",def:/^ {0,3}\[(label)\]: *\n? *([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:y,table:y,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};b.def=z(b.def).replace("label",b._label).replace("title",b._title).getRegex(),b.bullet=/(?:[*+-]|\d{1,9}[.)])/,b.item=/^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/,b.item=z(b.item,"gm").replace(/bull/g,b.bullet).getRegex(),b.listItemStart=z(/^( *)(bull) */).replace("bull",b.bullet).getRegex(),b.list=z(b.list).replace(/bull/g,b.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+b.def.source+")").getRegex(),b._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",b._comment=/|$)/,b.html=z(b.html,"i").replace("comment",b._comment).replace("tag",b._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),b.paragraph=z(b._paragraph).replace("hr",b.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",b._tag).getRegex(),b.blockquote=z(b.blockquote).replace("paragraph",b.paragraph).getRegex(),b.normal=w({},b),b.gfm=w({},b.normal,{nptable:"^ *([^|\\n ].*\\|.*)\\n {0,3}([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",table:"^ *\\|(.+)\\n {0,3}\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),b.gfm.nptable=z(b.gfm.nptable).replace("hr",b.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",b._tag).getRegex(),b.gfm.table=z(b.gfm.table).replace("hr",b.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",b._tag).getRegex(),b.pedantic=w({},b.normal,{html:z("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?\\1> *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",b._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:y,paragraph:z(b.normal._paragraph).replace("hr",b.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",b.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});y={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:y,tag:"^comment|^[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",emStrong:{lDelim:/^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,rDelimAst:/\_\_[^_*]*?\*[^_*]*?\_\_|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,rDelimUnd:/\*\*[^_*]*?\_[^_*]*?\*\*|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:y,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~"};y.punctuation=z(y.punctuation).replace(/punctuation/g,y._punctuation).getRegex(),y.blockSkip=/\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g,y.escapedEmSt=/\\\*|\\_/g,y._comment=z(b._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),y.emStrong.lDelim=z(y.emStrong.lDelim).replace(/punct/g,y._punctuation).getRegex(),y.emStrong.rDelimAst=z(y.emStrong.rDelimAst,"g").replace(/punct/g,y._punctuation).getRegex(),y.emStrong.rDelimUnd=z(y.emStrong.rDelimUnd,"g").replace(/punct/g,y._punctuation).getRegex(),y._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,y._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,y._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,y.autolink=z(y.autolink).replace("scheme",y._scheme).replace("email",y._email).getRegex(),y._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,y.tag=z(y.tag).replace("comment",y._comment).replace("attribute",y._attribute).getRegex(),y._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,y._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,y._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,y.link=z(y.link).replace("label",y._label).replace("href",y._href).replace("title",y._title).getRegex(),y.reflink=z(y.reflink).replace("label",y._label).getRegex(),y.reflinkSearch=z(y.reflinkSearch,"g").replace("reflink",y.reflink).replace("nolink",y.nolink).getRegex(),y.normal=w({},y),y.pedantic=w({},y.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:z(/^!?\[(label)\]\((.*?)\)/).replace("label",y._label).getRegex(),reflink:z(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",y._label).getRegex()}),y.gfm=w({},y.normal,{escape:z(y.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\'+(u?e:H(e,!0))+"
\n":""+(u?e:H(e,!0))+"
\n"},t.blockquote=function(e){return"\n"+e+"
\n"},t.html=function(e){return e},t.heading=function(e,t,u,n){return this.options.headerIds?"\n":""+e+"\n"},t.hr=function(){return this.options.xhtml?"
\n":"
\n"},t.list=function(e,t,u){var n=t?"ol":"ul";return"<"+n+(t&&1!==u?' start="'+u+'"':"")+">\n"+e+""+n+">\n"},t.listitem=function(e){return""+e+"\n"},t.checkbox=function(e){return" "},t.paragraph=function(e){return""+e+"
\n"},t.table=function(e,t){return"\n\n"+e+"\n"+(t=t&&""+t+"")+"
\n"},t.tablerow=function(e){return"\n"+e+"
\n"},t.tablecell=function(e,t){var u=t.header?"th":"td";return(t.align?"<"+u+' align="'+t.align+'">':"<"+u+">")+e+""+u+">\n"},t.strong=function(e){return""+e+""},t.em=function(e){return""+e+""},t.codespan=function(e){return""+e+"
"},t.br=function(){return this.options.xhtml?"
":"
"},t.del=function(e){return""+e+""},t.link=function(e,t,u){if(null===(e=V(this.options.sanitize,this.options.baseUrl,e)))return u;e='"+u+""},t.image=function(e,t,u){if(null===(e=V(this.options.sanitize,this.options.baseUrl,e)))return u;u='
":">"},t.text=function(e){return e},e}(),S=function(){function e(){}var t=e.prototype;return t.strong=function(e){return e},t.em=function(e){return e},t.codespan=function(e){return e},t.del=function(e){return e},t.html=function(e){return e},t.text=function(e){return e},t.link=function(e,t,u){return""+u},t.image=function(e,t,u){return""+u},t.br=function(){return""},e}(),B=function(){function e(){this.seen={}}var t=e.prototype;return t.serialize=function(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},t.getNextSafeSlug=function(e,t){var u=e,n=0;if(this.seen.hasOwnProperty(u))for(n=this.seen[e];u=e+"-"+ ++n,this.seen.hasOwnProperty(u););return t||(this.seen[e]=n,this.seen[u]=0),u},t.slug=function(e,t){void 0===t&&(t={});var u=this.serialize(e);return this.getNextSafeSlug(u,t.dryrun)},e}(),J=b,K=S,Q=B,W=t.exports.defaults,Y=m,ee=y,te=function(){function u(e){this.options=e||W,this.options.renderer=this.options.renderer||new J,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new K,this.slugger=new Q}u.parse=function(e,t){return new u(t).parse(e)},u.parseInline=function(e,t){return new u(t).parseInline(e)};var e=u.prototype;return e.parse=function(e,t){void 0===t&&(t=!0);for(var u,n,r,i,s,l,a,o,D,c,h,p,g,f,F,A,d="",C=e.length,k=0;kAn error occurred:"+se(e.message+"",!0)+"
";throw e}}return ae.options=ae.setOptions=function(e){return re(ae.defaults,e),le(ae.defaults),ae},ae.getDefaults=$,ae.defaults=x,ae.use=function(){for(var u=this,e=arguments.length,t=new Array(e),n=0;nAn error occurred:"+se(e.message+"",!0)+"
";throw e}},ae.Parser=te,ae.parser=te.parse,ae.Renderer=ne,ae.TextRenderer=S,ae.Lexer=ee,ae.lexer=ee.lex,ae.Tokenizer=ue,ae.Slugger=B,ae.parse=ae});
\ No newline at end of file
From bf7289032a342c3075a274918a8589ad87f6d5ef Mon Sep 17 00:00:00 2001
From: yystopf
Date: Thu, 21 Mar 2024 11:25:05 +0800
Subject: [PATCH 43/47] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9Aprivate?=
=?UTF-8?q?=E4=BC=A0=E5=80=BC=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/projects_controller.rb | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 8bb0ed920..a4e369c1f 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -203,8 +203,9 @@ class ProjectsController < ApplicationController
:project_category_id, :project_language_id, :private, :identifier)
Projects::UpdateForm.new(validate_params.merge(user_id: @project.user_id, project_identifier: @project.identifier, project_name: @project.name)).validate!
-
- private = @project.forked_from_project.present? ? !@project.forked_from_project.is_public : params[:private] || !@project.is_public
+
+ private = params[:private].nil? ? !@project.is_public : params[:private]
+ private = @project.forked_from_project.present? ? !@project.forked_from_project.is_public : private
new_project_params = project_params.except(:private).merge(is_public: !private)
@project.update_attributes!(new_project_params)
From 6e2816af758a1eabae843e7272f45deeb8112b62 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Thu, 21 Mar 2024 14:58:35 +0800
Subject: [PATCH 44/47] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=90=8C?=
=?UTF-8?q?=E6=AD=A5acge=E7=94=A8=E6=88=B7=E5=B9=B6=E5=90=8C=E6=97=B6?=
=?UTF-8?q?=E5=88=9B=E5=BB=BA=E5=B9=B3=E5=8F=B0=E8=B4=A6=E5=8F=B7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/oauth/acge_controller.rb | 38 ++++++++++++++++++++++--
app/models/user.rb | 2 +-
public/操作系统大赛用户信息.csv | 2 ++
3 files changed, 38 insertions(+), 4 deletions(-)
create mode 100644 public/操作系统大赛用户信息.csv
diff --git a/app/controllers/oauth/acge_controller.rb b/app/controllers/oauth/acge_controller.rb
index 5afc57c6b..d9db8a895 100644
--- a/app/controllers/oauth/acge_controller.rb
+++ b/app/controllers/oauth/acge_controller.rb
@@ -3,12 +3,16 @@ class Oauth::AcgeController < Oauth::BaseController
def create
begin
- code = params['code'].to_s.strip
- tip_exception("code不能为空") if code.blank?
uid = params['uid'].to_s.strip
tip_exception("uid不能为空") if uid.blank?
redirect_uri = params['redirect_uri'].to_s.strip
tip_exception("redirect_uri不能为空") if redirect_uri.blank?
+ email = params['email'].to_s.strip
+ tip_exception("email不能为空") if email.blank?
+ phone = params['phone'].to_s.strip
+ tip_exception("phone不能为空") if phone.blank?
+ name = params['name'].to_s.strip
+ tip_exception("name不能为空") if name.blank?
open_user = OpenUsers::Acge.find_by(uid: uid)
if open_user.present? && open_user.user.present?
@@ -18,13 +22,41 @@ class Oauth::AcgeController < Oauth::BaseController
else
if current_user.blank? || !current_user.logged?
session[:unionid] = uid
+ user = User.find_by(mail: email) || User.find_by(phone: phone)
+ if user.present?
+ OpenUsers::Acge.create!(user: user, uid: uid)
+ successful_authentication(user)
+ redirect_to redirect_uri
+
+ return
+ else
+ username = uid[0..7]
+ password = SecureRandom.hex(4)
+ reg_result = autologin_register(username, email, password, 'acge', phone, name)
+ CSV.open("public/操作系统大赛用户信息.csv", 'wb') do |csv|
+ csv << [username, email, password, phone, name]
+ end
+ if reg_result[:message].blank?
+ open_user = OpenUsers::Acge.create!(user_id: reg_result[:user][:id], uid: uid)
+ successful_authentication(open_user.user)
+ redirect_to redirect_uri
+
+ return
+ else
+ render_error(reg_result[:message])
+ end
+ end
else
OpenUsers::Acge.create!(user: current_user, uid: uid)
+ successful_authentication(current_user)
+ redirect_to redirect_uri
+
+ return
end
end
Rails.logger.info("[OAuth2] session[:unionid] -> #{session[:unionid]}")
- redirect_to "/bindlogin/acge?redirect_uri=#{redirect_uri}"
+ # redirect_to "/bindlogin/acge?redirect_uri=#{redirect_uri}"
rescue Exception => ex
render_error(ex.message)
end
diff --git a/app/models/user.rb b/app/models/user.rb
index afe817d33..9d623f949 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -115,7 +115,7 @@ class User < Owner
# trustie: 来自Trustie平台
# forge: 平台本身注册的用户
# military: 军科的用户
- enumerize :platform, in: [:forge, :educoder, :trustie, :military, :github, :gitee, :qq, :wechat, :bot], default: :forge, scope: :shallow
+ enumerize :platform, in: [:forge, :educoder, :trustie, :military, :github, :gitee, :qq, :wechat, :bot, :acge], default: :forge, scope: :shallow
belongs_to :laboratory, optional: true
has_one :user_extension, dependent: :destroy
diff --git a/public/操作系统大赛用户信息.csv b/public/操作系统大赛用户信息.csv
new file mode 100644
index 000000000..7365072b2
--- /dev/null
+++ b/public/操作系统大赛用户信息.csv
@@ -0,0 +1,2 @@
+用户名,邮箱,密码,手机号,昵称
+123456789,yystopf1@163.com,9b653a7d,15386415122,何慧
From c999d37f7ebbbdabcd55c20fddbbf6be77f58f9f Mon Sep 17 00:00:00 2001
From: yystopf
Date: Thu, 21 Mar 2024 16:58:27 +0800
Subject: [PATCH 45/47] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=90=8C?=
=?UTF-8?q?=E6=AD=A5acge=E7=94=A8=E6=88=B7=E8=AE=B0=E5=BD=95=E5=9C=A8?=
=?UTF-8?q?=E5=86=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/oauth/acge_controller.rb | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/app/controllers/oauth/acge_controller.rb b/app/controllers/oauth/acge_controller.rb
index d9db8a895..73360cf6c 100644
--- a/app/controllers/oauth/acge_controller.rb
+++ b/app/controllers/oauth/acge_controller.rb
@@ -33,8 +33,11 @@ class Oauth::AcgeController < Oauth::BaseController
username = uid[0..7]
password = SecureRandom.hex(4)
reg_result = autologin_register(username, email, password, 'acge', phone, name)
- CSV.open("public/操作系统大赛用户信息.csv", 'wb') do |csv|
- csv << [username, email, password, phone, name]
+ existing_rows = CSV.read("public/操作系统大赛用户信息.csv")
+ new_row = [username, email, password, phone, name]
+ existing_rows << new_row
+ CSV.open("public/操作系统大赛用户信息.csv", 'w') do |csv|
+ existing_rows.each { |row| csv << row }
end
if reg_result[:message].blank?
open_user = OpenUsers::Acge.create!(user_id: reg_result[:user][:id], uid: uid)
From 68348f1fc31546dca3d97df0d2e6a4b14efc3fbf Mon Sep 17 00:00:00 2001
From: yystopf
Date: Thu, 21 Mar 2024 17:38:57 +0800
Subject: [PATCH 46/47] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9Acsv=E5=86=99?=
=?UTF-8?q?=E5=85=A5=E6=A8=A1=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/oauth/acge_controller.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/controllers/oauth/acge_controller.rb b/app/controllers/oauth/acge_controller.rb
index 73360cf6c..efa5cca08 100644
--- a/app/controllers/oauth/acge_controller.rb
+++ b/app/controllers/oauth/acge_controller.rb
@@ -36,7 +36,7 @@ class Oauth::AcgeController < Oauth::BaseController
existing_rows = CSV.read("public/操作系统大赛用户信息.csv")
new_row = [username, email, password, phone, name]
existing_rows << new_row
- CSV.open("public/操作系统大赛用户信息.csv", 'w') do |csv|
+ CSV.open("public/操作系统大赛用户信息.csv", 'wb') do |csv|
existing_rows.each { |row| csv << row }
end
if reg_result[:message].blank?
From b91358a7fe83c1a3a27086495023f30c69f08b45 Mon Sep 17 00:00:00 2001
From: yystopf
Date: Fri, 22 Mar 2024 08:49:26 +0800
Subject: [PATCH 47/47] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E6=9F=A5?=
=?UTF-8?q?=E8=AF=A2=E7=94=A8=E6=88=B7=E9=9C=80=E4=BC=A0type=E5=80=BC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/application_controller.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 61541d09b..0ce74c5b8 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -715,7 +715,7 @@ class ApplicationController < ActionController::Base
end
def find_user_with_id
- @user = User.find_by_id params[:user_id]
+ @user = User.find_by(type: 'User', id: params[:user_id])
# render_not_found("未找到’#{params[:login]}’相关的用户") unless @user
render_error("未找到相关的用户") unless @user
end