From 11471b15209df6a8886b1609d3e32107cda2bb78 Mon Sep 17 00:00:00 2001 From: Gitea Date: Sun, 21 Feb 2021 10:02:47 +0800 Subject: [PATCH 1/7] [FIX]transfer need to save clone_url --- app/services/projects/transfer_service.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb index f9b5c5700..b32b24817 100644 --- a/app/services/projects/transfer_service.rb +++ b/app/services/projects/transfer_service.rb @@ -1,5 +1,5 @@ class Projects::TransferService < ApplicationService - attr_accessor :project, :owner, :new_owner + attr_accessor :project, :owner, :new_owner, :gitea_repo def initialize(project, new_owner) @project = project @@ -12,6 +12,7 @@ class Projects::TransferService < ApplicationService ActiveRecord::Base.transaction do gitea_update_owner update_owner + update_repo_url update_visit_teams end @@ -25,6 +26,10 @@ class Projects::TransferService < ApplicationService project.update!(user_id: new_owner.id) end + def update_repo_url + project.repository.update!(url: @gitea_repo["clone_url"]) + end + def update_visit_teams if new_owner.is_a?(Organization) new_owner.teams.where(includes_all_project: true).each do |team| @@ -37,7 +42,7 @@ class Projects::TransferService < ApplicationService def gitea_update_owner begin - Gitea::Repository::TransferService.call(owner&.gitea_token, owner&.login, project.identifier, new_owner&.login) + @gitea_repo = Gitea::Repository::TransferService.call(owner&.gitea_token, owner&.login, project.identifier, new_owner&.login) rescue Exception => e Rails.logger.info("##### Project transfer_service, gitea transfer error #{e}") end From f7b7122d607db4056290e04578614d5c390a0f8b Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Sun, 21 Feb 2021 15:20:04 +0800 Subject: [PATCH 2/7] [FIX]join projects add org projects and update project private bug --- app/controllers/projects_controller.rb | 2 +- app/queries/projects/list_my_query.rb | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 2939e7fb8..c8f3027de 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -76,7 +76,7 @@ class ProjectsController < ApplicationController default_branch: params[:default_branch] } if [true, false].include? private - new_project_params = project_params.merge(is_public: !private) + new_project_params = project_params.except(:private).merge(is_public: !private) Gitea::Repository::UpdateService.call(@owner, @project.identifier, gitea_params) @project.repository.update_column(:hidden, private) end diff --git a/app/queries/projects/list_my_query.rb b/app/queries/projects/list_my_query.rb index ba521e906..8ad0d0b0a 100644 --- a/app/queries/projects/list_my_query.rb +++ b/app/queries/projects/list_my_query.rb @@ -17,15 +17,12 @@ class Projects::ListMyQuery < ApplicationQuery projects = Project.visible end - if params[:is_public].present? - projects = projects.is_private.members_projects(user.id) if params[:is_public].to_s == "private" - projects = projects.visible.members_projects(user.id) if params[:is_public].to_s == "public" - end - if params[:category].blank? projects = projects.members_projects(user.id) elsif params[:category].to_s == "join" - projects = projects.where.not(user_id: user.id).members_projects(user.id) + normal_projects = projects.where.not(user_id: user.id).members_projects(user.id).to_sql + org_projects = projects.joins(team_projects: [team: :team_users]).where(team_users: {user_id: user.id}).to_sql + projects = Project.from("( #{ normal_projects} UNION #{ org_projects } ) AS projects").distinct elsif params[:category].to_s == "manage" projects = projects.where(user_id: user.id) elsif params[:category].to_s == "watched" #我关注的 @@ -39,6 +36,11 @@ class Projects::ListMyQuery < ApplicationQuery # projects = projects.is_private.joins(:members).where(members: { user_id: user.id }) end + if params[:is_public].present? + projects = projects.is_private if params[:is_public].to_s == "private" + projects = projects.visible if params[:is_public].to_s == "public" + end + if params[:project_type].to_s === "common" projects = projects.common elsif params[:project_type].to_s === "mirror" From 9681a1a49191fd5e312477c39fc6ca013d9e71e3 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Sun, 21 Feb 2021 17:14:51 +0800 Subject: [PATCH 3/7] [FIX]sync mirror project --- app/forms/projects/migrate_form.rb | 14 +++++++++++++- app/services/projects/migrate_service.rb | 2 +- app/services/repositories/migrate_service.rb | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/forms/projects/migrate_form.rb b/app/forms/projects/migrate_form.rb index f17b75a5a..51116b2b5 100644 --- a/app/forms/projects/migrate_form.rb +++ b/app/forms/projects/migrate_form.rb @@ -2,7 +2,7 @@ class Projects::MigrateForm < BaseForm REPOSITORY_NAME_REGEX = /^(?!_)(?!.*?_$)[a-zA-Z0-9_-]+$/ #只含有数字、字母、下划线不能以下划线开头和结尾 URL_REGEX = /\A(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?\z/i - attr_accessor :user_id, :name, :description, :repository_name, :project_category_id, :project_language_id, :clone_addr, :private, :is_mirror, :auth_username, :auth_password + attr_accessor :user_id, :name, :description, :repository_name, :project_category_id, :project_language_id, :clone_addr, :private, :is_mirror, :auth_username, :auth_password, :owner validates :user_id, :name, :description,:repository_name, :project_category_id, :project_language_id, presence: true validates :repository_name, format: { with: REPOSITORY_NAME_REGEX, multiline: true, message: "只能含有数字、字母、下划线且不能以下划线开头和结尾" } @@ -12,6 +12,18 @@ class Projects::MigrateForm < BaseForm check_repository_name(user_id, repository_name) unless repository_name.blank? check_project_category(project_category_id) check_project_language(project_language_id) + check_owner + check_max_repo_creation end + def check_owner + @owner = Owner.find_by(id: user_id) + raise "user_id值无效." if user_id && owner.blank? + end + + def check_max_repo_creation + return unless owner.is_a?(Organization) + return if owner.max_repo_creation <= -1 + raise "已超过组织设置最大仓库数" if owner.max_repo_creation == owner.num_projects + end end diff --git a/app/services/projects/migrate_service.rb b/app/services/projects/migrate_service.rb index ff0c0643d..2f7725db6 100644 --- a/app/services/projects/migrate_service.rb +++ b/app/services/projects/migrate_service.rb @@ -44,7 +44,7 @@ class Projects::MigrateService < ApplicationService hidden: project_secretion[:hidden], identifier: params[:repository_name], mirror_url: params[:clone_addr], - user_id: user.id, + user_id: params[:user_id], login: params[:auth_username], password: params[:auth_password], is_mirror: params[:is_mirror] diff --git a/app/services/repositories/migrate_service.rb b/app/services/repositories/migrate_service.rb index e2f520aeb..156777cc3 100644 --- a/app/services/repositories/migrate_service.rb +++ b/app/services/repositories/migrate_service.rb @@ -28,7 +28,7 @@ class Repositories::MigrateService < ApplicationService { clone_addr: params[:mirror_url], repo_name: params[:identifier], - uid: user.gitea_uid, + uid: project&.owner&.gitea_uid, private: params[:hidden], mirror: wrapper_mirror || false, auth_username: params[:login], From ef0c44f29cbb9b38c40ba7a0765cd59310a4aca0 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Mon, 22 Feb 2021 10:10:22 +0800 Subject: [PATCH 4/7] [ADD]fix error script --- .../gitea/organization/get_service.rb | 22 ++++++++++ lib/tasks/sync_org_mirror_repo.rake | 44 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 app/services/gitea/organization/get_service.rb create mode 100644 lib/tasks/sync_org_mirror_repo.rake diff --git a/app/services/gitea/organization/get_service.rb b/app/services/gitea/organization/get_service.rb new file mode 100644 index 000000000..0b58239f9 --- /dev/null +++ b/app/services/gitea/organization/get_service.rb @@ -0,0 +1,22 @@ +class Gitea::Organization::GetService < Gitea::ClientService + attr_reader :user, :org_name + + def initialize(user, org_name) + @user = user + @org_name = org_name + end + + def call + response = get(url, params) + render_status(response) + end + + private + def params + Hash.new.merge(token: user.gitea_token) + end + + def url + "/orgs/#{org_name}".freeze + end +end \ No newline at end of file diff --git a/lib/tasks/sync_org_mirror_repo.rake b/lib/tasks/sync_org_mirror_repo.rake new file mode 100644 index 000000000..a62230369 --- /dev/null +++ b/lib/tasks/sync_org_mirror_repo.rake @@ -0,0 +1,44 @@ +# 执行示例 bundle exec rake sync_org_mirror_repo:init_org_gitea_uid +# RAILS_ENV=production bundle exec rake sync_org_mirror_repo:init_org_gitea_uid +# + +namespace :sync_org_mirror_repo do + desc "更新组织gitea_uid" + task init_org_gitea_uid: :environment do + puts "=========begin to init organization gitea_uid==========" + need_init_orgs = Organization.where(gitea_uid: nil) + puts "=========need init count is [#{need_init_orgs.size}]==========" + need_init_orgs.find_each do |org| + puts "=== fix org name is [#{org.name}] ===" + user = User.first + gitea_org = Gitea::Organization::GetService.call(user, org.name) + org.update(gitea_uid: gitea_org["id"]) + end + puts "========end to init organization gitea_uid===========" + end + + desc "同步组织创建失败的镜像项目" + task fix_mirror_repo: :environment do + puts "========begin to fix mirror repository =========" + need_fix_repos = Repository.joins(:mirror, project: :owner) + .where.not(mirrors: {id: nil}) + .where(users: {type: 'Organization'}) + need_fix_repos.find_each do |repo| + puts "=== fix repository owner is [#{repo&.project&.owner&.login}] ===" + puts "=== fix repository identifier is [#{repo.identifier}] ===" + Gitea::Repository::DeleteService.call(repo.project.owner, repo.identifier) + gitea_repository_params = { + clone_addr: repo.mirror_url, + repo_name: repo.identifier, + uid: repo.project.owner.gitea_uid, + private: repo.hidden, + mirror: ActiveModel::Type::Boolean.new.cast(repo.is_mirror) || false, + auth_username: repo.login, + auth_password: repo.password + } + MigrateRemoteRepositoryJob.perform_later(repo.id, repo.project&.owner&.gitea_token, gitea_repository_params) + repo.update_columns(user_id: repo.project&.user_id) + end + puts "========end to fix mirror repository =========" + end +end \ No newline at end of file From 93fa02bd7b84af495bcde1a8d4dd6bcb39b174e7 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Mon, 22 Feb 2021 10:29:39 +0800 Subject: [PATCH 5/7] [FIX] [FIX] [FIX] --- app/services/gitea/organization/get_service.rb | 11 +++++------ lib/tasks/sync_org_mirror_repo.rake | 8 ++++++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/app/services/gitea/organization/get_service.rb b/app/services/gitea/organization/get_service.rb index 0b58239f9..c193bafb1 100644 --- a/app/services/gitea/organization/get_service.rb +++ b/app/services/gitea/organization/get_service.rb @@ -1,9 +1,8 @@ class Gitea::Organization::GetService < Gitea::ClientService - attr_reader :user, :org_name + attr_reader :org - def initialize(user, org_name) - @user = user - @org_name = org_name + def initialize(org) + @org = org end def call @@ -13,10 +12,10 @@ class Gitea::Organization::GetService < Gitea::ClientService private def params - Hash.new.merge(token: user.gitea_token) + Hash.new.merge(token: org.gitea_token) end def url - "/orgs/#{org_name}".freeze + "/orgs/#{org.login}".freeze end end \ No newline at end of file diff --git a/lib/tasks/sync_org_mirror_repo.rake b/lib/tasks/sync_org_mirror_repo.rake index a62230369..547b09d8b 100644 --- a/lib/tasks/sync_org_mirror_repo.rake +++ b/lib/tasks/sync_org_mirror_repo.rake @@ -10,8 +10,11 @@ namespace :sync_org_mirror_repo do puts "=========need init count is [#{need_init_orgs.size}]==========" need_init_orgs.find_each do |org| puts "=== fix org name is [#{org.name}] ===" - user = User.first - gitea_org = Gitea::Organization::GetService.call(user, org.name) + gitea_org = Gitea::Organization::GetService.call(org) + if gitea_org[:status] == 404 + org.destroy + next + end org.update(gitea_uid: gitea_org["id"]) end puts "========end to init organization gitea_uid===========" @@ -24,6 +27,7 @@ namespace :sync_org_mirror_repo do .where.not(mirrors: {id: nil}) .where(users: {type: 'Organization'}) need_fix_repos.find_each do |repo| + next if repo.user_id == repo.project&.user_id puts "=== fix repository owner is [#{repo&.project&.owner&.login}] ===" puts "=== fix repository identifier is [#{repo.identifier}] ===" Gitea::Repository::DeleteService.call(repo.project.owner, repo.identifier) From 70922b81db53eadcd4cb2d90af1f22dad83fd301 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Thu, 25 Feb 2021 11:52:24 +0800 Subject: [PATCH 6/7] [FIX]watcher type error --- app/models/owner.rb | 1 + app/models/user.rb | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/owner.rb b/app/models/owner.rb index d4194c32c..1d537a1e0 100644 --- a/app/models/owner.rb +++ b/app/models/owner.rb @@ -59,6 +59,7 @@ # class Owner < ApplicationRecord + self.abstract_class = true self.table_name = "users" include ProjectAbility diff --git a/app/models/user.rb b/app/models/user.rb index 1cb6670c6..5bfe3b6e6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -137,7 +137,6 @@ class User < Owner # 关注 # has_many :be_watchers, foreign_key: :user_id, dependent: :destroy # 我的关注 # has_many :be_watcher_users, through: :be_watchers, dependent: :destroy # 我关注的用户 - has_many :watchers, as: :watchable, dependent: :destroy has_one :ci_cloud_account, class_name: 'Ci::CloudAccount', dependent: :destroy From c299c9fa69aa8b230f13c752b5c09df2a5eeadc1 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Fri, 26 Feb 2021 13:49:29 +0800 Subject: [PATCH 7/7] [FIX]repository setting entry error --- app/controllers/repositories_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 519a63bd9..6683dde4e 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -88,7 +88,7 @@ class RepositoriesController < ApplicationController end def edit - return render_forbidden if !@project.manager?(current_user) + return render_forbidden if !@project.manager?(current_user) && !current_user.admin? end def create_file