From 855c51a470d91594224db6aa21a5845245c0abc7 Mon Sep 17 00:00:00 2001 From: jasder Date: Fri, 18 Jun 2021 16:20:50 +0800 Subject: [PATCH 1/3] =?UTF-8?q?FIX=20=E8=A7=A3=E5=86=B3=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E6=96=87=E4=BB=B6=E9=94=99=E8=AF=AF=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E4=BF=A1=E6=81=AF=E4=B8=8D=E5=87=86=E7=A1=AE=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitea/create_file_interactor.rb | 10 ++++++++-- app/services/gitea/client_service.rb | 8 ++++++++ .../repository/entries/create_service.rb | 20 +++++++++++++++++-- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/app/interactors/gitea/create_file_interactor.rb b/app/interactors/gitea/create_file_interactor.rb index acceeaa97..0da781b64 100644 --- a/app/interactors/gitea/create_file_interactor.rb +++ b/app/interactors/gitea/create_file_interactor.rb @@ -24,8 +24,14 @@ module Gitea def run Contents::CreateForm.new(valid_params).validate! - response = Gitea::Repository::Entries::CreateService.new(token, owner, @params[:identifier], @params[:filepath], file_params).call - render_result(response) + result = Gitea::Repository::Entries::CreateService.call(token, + owner, @params[:identifier], @params[:filepath], file_params) + + if result[:status] == :success + @result = result[:body] + else + fail!(result[:message]) + end rescue Exception => exception Rails.logger.info "Exception ===========> #{exception.message}" fail!(exception.message) diff --git a/app/services/gitea/client_service.rb b/app/services/gitea/client_service.rb index 0ef041997..b88d8382a 100644 --- a/app/services/gitea/client_service.rb +++ b/app/services/gitea/client_service.rb @@ -214,6 +214,14 @@ class Gitea::ClientService < ApplicationService [body, message] end + def json_parse!(body) + return nil unless body.present? + + body = JSON.parse(body) + body, message = fix_body(body) + body + end + def log_error(status, body) puts "[gitea] status: #{status}" puts "[gitea] body: #{body&.force_encoding('UTF-8')}" diff --git a/app/services/gitea/repository/entries/create_service.rb b/app/services/gitea/repository/entries/create_service.rb index 9f5abad2a..5e1a4c4b3 100644 --- a/app/services/gitea/repository/entries/create_service.rb +++ b/app/services/gitea/repository/entries/create_service.rb @@ -30,8 +30,7 @@ class Gitea::Repository::Entries::CreateService < Gitea::ClientService def call response = post(url, params) - - render_201_response(response) + response_payload(response) end private @@ -43,4 +42,21 @@ class Gitea::Repository::Entries::CreateService < Gitea::ClientService "/repos/#{owner}/#{repo_name}/contents/#{filepath}".freeze end + def response_payload(response) + status = response.status + body = response&.body + + log_error(status, body) + status_payload(status, body) + end + + def status_payload(status, body) + case status + when 201 then success(json_parse!(body)) + when 403 then error("你没有权限操作!") + when 404 then error("你操作的链接不存在!") + when 422 then error("#{filepath}文件已存在,不能重复创建!") + else error("系统错误!") + end + end end From 91e142ba828fe1405b340d8775737e5980a2ba4f Mon Sep 17 00:00:00 2001 From: jasder Date: Fri, 18 Jun 2021 16:44:37 +0800 Subject: [PATCH 2/3] FIX code bug --- app/interactors/gitea/create_file_interactor.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/interactors/gitea/create_file_interactor.rb b/app/interactors/gitea/create_file_interactor.rb index 0da781b64..389813520 100644 --- a/app/interactors/gitea/create_file_interactor.rb +++ b/app/interactors/gitea/create_file_interactor.rb @@ -62,7 +62,7 @@ module Gitea file_params = {} file_params = file_params.merge(branch: @params[:branch]) unless @params[:branch].blank? file_params = file_params.merge(new_branch: @params[:new_branch]) unless @params[:new_branch].blank? - file_params = file_params.merge(content: Base64.encode64(@params[:content])) + file_params = file_params.merge(content: Base64.encode64(@params[:content] || "")) file_params = file_params.merge(message: @params[:message]) unless @params[:message].blank? file_params = file_params.merge(committer: @params[:committer]) file_params From fff21a1bc8280d7e0620581c271815d47a9ff367 Mon Sep 17 00:00:00 2001 From: jasder Date: Tue, 22 Jun 2021 09:39:44 +0800 Subject: [PATCH 3/3] =?UTF-8?q?FIX=20=E5=A4=84=E7=90=86=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=BA=93zip=E3=80=81gzip=E5=8C=85=E9=93=BE=E6=8E=A5=E4=B8=BA?= =?UTF-8?q?=E6=97=A0=E6=95=88=E7=9A=84=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 | 2 +- app/controllers/repositories_controller.rb | 19 +++++++-- app/helpers/projects_helper.rb | 8 ++-- .../gitea/repository/archive_service.rb | 40 +++++++++++++++++++ app/views/projects/branches.json.jbuilder | 4 +- app/views/repositories/entries.json.jbuilder | 5 ++- config/routes.rb | 2 +- 7 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 app/services/gitea/repository/archive_service.rb diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 3e40619c5..c9e1a3a14 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -5,7 +5,7 @@ class ProjectsController < ApplicationController include Acceleratorable before_action :require_login, except: %i[index branches group_type_list simple show fork_users praise_users watch_users recommend about menu_list] - before_action :load_project, except: %i[index group_type_list migrate create recommend] + before_action :load_repository, except: %i[index group_type_list migrate create recommend] before_action :authorizate_user_can_edit_project!, only: %i[update] before_action :project_public?, only: %i[fork_users praise_users watch_users] diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 93ba02a92..062a8f046 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -5,9 +5,9 @@ class RepositoriesController < ApplicationController before_action :require_login, only: %i[edit update create_file update_file delete_file sync_mirror] before_action :load_repository - before_action :authorizate!, except: [:sync_mirror, :tags, :commit] + before_action :authorizate!, except: [:sync_mirror, :tags, :commit, :archive] before_action :authorizate_user_can_edit_repo!, only: %i[sync_mirror] - before_action :get_ref, only: %i[entries sub_entries top_counts file] + before_action :get_ref, only: %i[entries sub_entries top_counts file archive] before_action :get_latest_commit, only: %i[entries sub_entries top_counts] before_action :get_statistics, only: %i[top_counts] @@ -192,6 +192,19 @@ class RepositoriesController < ApplicationController render json: languages_precentagable end + def archive + domain = Gitea.gitea_config[:domain] + api_url = Gitea.gitea_config[:base_url] + archive_url = "/repos/#{@owner.login}/#{@repository.identifier}/archive/#{params[:archive]}" + + file_path = [domain, api_url, archive_url].join + file_path = [file_path, "access_token=#{current_user&.gitea_token}"].join("?") if @repository.hidden? + + return render_not_found if !request.format.zip? && !request.format.gzip? + + redirect_to file_path + end + private def find_project @@ -266,7 +279,7 @@ class RepositoriesController < ApplicationController # uploadPushInfo end - + def create_new_pr(params) if params[:new_branch].present? && params[:new_branch] != params[:branch] local_params = { diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 226096c24..12a0097bd 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -13,12 +13,12 @@ module ProjectsHelper end end - def render_zip_url(project, archive_name) - [gitea_domain, project.owner.login, project.identifier, "archive", "#{archive_name}.zip"].join('/') + def render_zip_url(owner, repository, archive) + [base_url, archive_repositories_path(owner&.login, repository, "#{archive}.zip")].join end - def render_tar_url(project, archive_name) - [gitea_domain, project.owner.login, project.identifier, "archive", "#{archive_name}.tar.gz"].join('/') + def render_tar_url(owner, repository, archive) + [base_url, archive_repositories_path(owner&.login, repository, "#{archive}.tar.gz")].join end def render_http_url(project) diff --git a/app/services/gitea/repository/archive_service.rb b/app/services/gitea/repository/archive_service.rb new file mode 100644 index 000000000..1b5e1e2a3 --- /dev/null +++ b/app/services/gitea/repository/archive_service.rb @@ -0,0 +1,40 @@ +class Gitea::Repository::ArchiveService < Gitea::ClientService + attr_reader :owner, :repo, :archive, :token + + def initialize(owner, repo, archive, token=nil) + @owner = owner + @repo = repo + @archive = archive + @token = token + end + + def call + response = get(url, params) + response_payload(response) + end + + private + def params + Hash.new.merge(token: token) + end + + def url + "/repos/#{owner}/#{repo}/archive/#{archive}".freeze + end + + def response_payload(response) + status = response.status + body = response&.body + + log_error(status, body) + status_payload(status, body) + end + + def status_payload(status, body) + case status + when 200 then success + when 404 then error("你操作的链接不存在!") + else error("系统错误!") + end + end +end diff --git a/app/views/projects/branches.json.jbuilder b/app/views/projects/branches.json.jbuilder index d6f451373..dd722c9d9 100644 --- a/app/views/projects/branches.json.jbuilder +++ b/app/views/projects/branches.json.jbuilder @@ -4,8 +4,8 @@ json.array! @branches do |branch| json.user_can_merge branch['user_can_merge'] json.protected branch['protected'] json.http_url render_http_url(@project) - json.zip_url render_zip_url(@project, branch['name']) - json.tar_url render_tar_url(@project, branch['name']) + json.zip_url render_zip_url(@owner, @repository, branch['name']) + json.tar_url render_tar_url(@owner, @repository, branch['name']) json.last_commit do json.sha branch['commit']['id'] json.message branch['commit']['message'] diff --git a/app/views/repositories/entries.json.jbuilder b/app/views/repositories/entries.json.jbuilder index a12c088b0..8c028e6a2 100644 --- a/app/views/repositories/entries.json.jbuilder +++ b/app/views/repositories/entries.json.jbuilder @@ -42,8 +42,9 @@ if @project.forge? #json.tags_count @tags_count #json.branches_count @branches_count json.commits_count @commits_count - json.zip_url render_zip_url(@project, @ref) - json.tar_url render_tar_url(@project, @ref) + # json.zip_url archive_repositories_path(@owner&.login, @repository, @ref) + json.zip_url render_zip_url(@owner, @repository, @ref) + json.tar_url render_tar_url(@owner, @repository, @ref) json.entries do json.array! @entries do |entry| json.name entry['name'] diff --git a/config/routes.rb b/config/routes.rb index 5a883fcb1..de2206fdc 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -416,7 +416,6 @@ Rails.application.routes.draw do member do get :files get :detail - get :archive get :entries match :sub_entries, :via => [:get, :put] get :commits @@ -431,6 +430,7 @@ Rails.application.routes.draw do get 'commits/:sha', to: 'repositories#commit', as: 'commit' get 'readme' get 'languages' + get 'archive/:archive', to: 'repositories#archive', as: "archive", constraints: { archive: /.+/, format: /(zip|gzip)/ } end end