Merge branch 'standalone_develop' of https://gitlink.org.cn/Trustie/forgeplus into standalone_develop

This commit is contained in:
yystopf 2022-03-22 10:45:55 +08:00
commit 4dc3546124
3 changed files with 560 additions and 541 deletions

View File

@ -1,390 +1,390 @@
class RepositoriesController < ApplicationController class RepositoriesController < ApplicationController
include RepositoriesHelper include RepositoriesHelper
include ApplicationHelper include ApplicationHelper
include OperateProjectAbilityAble include OperateProjectAbilityAble
include Repository::LanguagesPercentagable include Repository::LanguagesPercentagable
before_action :require_login, only: %i[edit update create_file update_file delete_file sync_mirror] before_action :require_login, only: %i[edit update create_file update_file delete_file sync_mirror]
before_action :require_profile_completed, only: [:create_file] before_action :require_profile_completed, only: [:create_file]
before_action :load_repository before_action :load_repository
before_action :authorizate!, except: [:sync_mirror, :tags, :commit, :archive] before_action :authorizate!, except: [:sync_mirror, :tags, :commit, :archive]
before_action :authorizate_user_can_edit_repo!, only: %i[sync_mirror] before_action :authorizate_user_can_edit_repo!, only: %i[sync_mirror]
before_action :get_ref, only: %i[entries sub_entries top_counts file archive] 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_latest_commit, only: %i[entries sub_entries top_counts]
before_action :get_statistics, only: %i[top_counts] before_action :get_statistics, only: %i[top_counts]
def files def files
result = @project.educoder? ? nil : Gitea::Repository::Files::GetService.call(@owner, @project.identifier, @ref, params[:search], @owner.gitea_token) result = @project.educoder? ? nil : Gitea::Repository::Files::GetService.call(@owner, @project.identifier, @ref, params[:search], @owner.gitea_token)
render json: result render json: result
end end
# 新版项目详情 # 新版项目详情
def detail def detail
@user = current_user @user = current_user
@result = Repositories::DetailService.call(@owner, @repository, @user) @result = Repositories::DetailService.call(@owner, @repository, @user)
@project_fork_id = @project.try(:forked_from_project_id) @project_fork_id = @project.try(:forked_from_project_id)
if @project_fork_id.present? if @project_fork_id.present?
@fork_project = Project.find_by(id: @project_fork_id) @fork_project = Project.find_by(id: @project_fork_id)
@fork_project_user = @fork_project.owner @fork_project_user = @fork_project.owner
end end
rescue Exception => e rescue Exception => e
uid_logger_error(e.message) uid_logger_error(e.message)
tip_exception(e.message) tip_exception(e.message)
end end
def show def show
@user = current_user @user = current_user
@repo = @project.repository @repo = @project.repository
@result = @project.forge? ? Gitea::Repository::GetService.new(@owner, @project.identifier).call : nil @result = @project.forge? ? Gitea::Repository::GetService.new(@owner, @project.identifier).call : nil
@project_fork_id = @project.try(:forked_from_project_id) @project_fork_id = @project.try(:forked_from_project_id)
if @project_fork_id.present? if @project_fork_id.present?
@fork_project = Project.find_by(id: @project_fork_id) @fork_project = Project.find_by(id: @project_fork_id)
@fork_project_user = @fork_project.owner @fork_project_user = @fork_project.owner
end end
rescue Exception => e rescue Exception => e
uid_logger_error(e.message) uid_logger_error(e.message)
tip_exception(e.message) tip_exception(e.message)
end end
def entries def entries
@project.increment!(:visits) @project.increment!(:visits)
CacheAsyncSetJob.perform_later("project_common_service", {visits: 1}, @project.id) CacheAsyncSetJob.perform_later("project_common_service", {visits: 1}, @project.id)
if @project.educoder? if @project.educoder?
@entries = Educoder::Repository::Entries::ListService.call(@project&.project_educoder.repo_name) @entries = Educoder::Repository::Entries::ListService.call(@project&.project_educoder.repo_name)
else else
@entries = Gitea::Repository::Entries::ListService.new(@owner, @project.identifier, ref: @ref).call @entries = Gitea::Repository::Entries::ListService.new(@owner, @project.identifier, ref: @ref).call
@entries = @entries.present? ? @entries.sort_by{ |hash| hash['type'] } : [] @entries = @entries.present? ? @entries.sort_by{ |hash| hash['type'] } : []
@path = Gitea.gitea_config[:domain]+"/#{@project.owner.login}/#{@project.identifier}/raw/branch/#{@ref}/" @path = Gitea.gitea_config[:domain]+"/#{@project.owner.login}/#{@project.identifier}/raw/branch/#{@ref}/"
end end
end end
def top_counts def top_counts
@result = @project.educoder? ? nil : Gitea::Repository::GetService.new(@project.owner, @project.identifier).call @result = @project.educoder? ? nil : Gitea::Repository::GetService.new(@project.owner, @project.identifier).call
end end
def sub_entries def sub_entries
file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip)) file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip))
if @project.educoder? if @project.educoder?
if params[:type] === 'file' if params[:type] === 'file'
@sub_entries = Educoder::Repository::Entries::GetService.call(@project&.project_educoder&.repo_name, file_path_uri) @sub_entries = Educoder::Repository::Entries::GetService.call(@project&.project_educoder&.repo_name, file_path_uri)
logger.info "######### sub_entries: #{@sub_entries}" logger.info "######### sub_entries: #{@sub_entries}"
return render_error('该文件暂未开放,敬请期待.') if @sub_entries['status'].to_i === -1 return render_error('该文件暂未开放,敬请期待.') if @sub_entries['status'].to_i === -1
tmp_entries = { tmp_entries = {
"content" => @sub_entries['data']['content'], "content" => @sub_entries['data']['content'],
"type" => "blob" "type" => "blob"
} }
@sub_entries = { @sub_entries = {
"trees"=>tmp_entries, "trees"=>tmp_entries,
"commits" => [{}] "commits" => [{}]
} }
else else
begin begin
@sub_entries = Educoder::Repository::Entries::ListService.call(@project&.project_educoder&.repo_name, {path: file_path_uri}) @sub_entries = Educoder::Repository::Entries::ListService.call(@project&.project_educoder&.repo_name, {path: file_path_uri})
if @sub_entries.blank? || @sub_entries['status'].to_i === -1 if @sub_entries.blank? || @sub_entries['status'].to_i === -1
@sub_entries = Educoder::Repository::Entries::GetService.call(@project&.project_educoder&.repo_name, file_path_uri) @sub_entries = Educoder::Repository::Entries::GetService.call(@project&.project_educoder&.repo_name, file_path_uri)
return render_error('该文件暂未开放,敬请期待.') if @sub_entries['status'].to_i === -1 return render_error('该文件暂未开放,敬请期待.') if @sub_entries['status'].to_i === -1
tmp_entries = { tmp_entries = {
"content" => @sub_entries['data']['content'], "content" => @sub_entries['data']['content'],
"type" => "blob" "type" => "blob"
} }
@sub_entries = { @sub_entries = {
"trees"=>tmp_entries, "trees"=>tmp_entries,
"commits" => [{}] "commits" => [{}]
} }
end end
rescue rescue
return render_error('该文件暂未开放,敬请期待.') return render_error('该文件暂未开放,敬请期待.')
end end
end end
else else
@path = Gitea.gitea_config[:domain]+"/#{@project.owner.login}/#{@project.identifier}/raw/branch/#{@ref}/" @path = Gitea.gitea_config[:domain]+"/#{@project.owner.login}/#{@project.identifier}/raw/branch/#{@ref}/"
interactor = Repositories::EntriesInteractor.call(@owner, @project.identifier, file_path_uri, ref: @ref) interactor = Repositories::EntriesInteractor.call(@owner, @project.identifier, file_path_uri, ref: @ref)
if interactor.success? if interactor.success?
result = interactor.result result = interactor.result
@sub_entries = result.is_a?(Array) ? result.sort_by{ |hash| hash['type'] } : result @sub_entries = result.is_a?(Array) ? result.sort_by{ |hash| hash['type'] } : result
else else
render_error(interactor.error) render_error(interactor.error)
end end
end end
end end
def commits def commits
if @project.educoder? if @project.educoder?
@commits = Educoder::Repository::Commits::ListService.call(@project&.project_educoder&.repo_name) @commits = Educoder::Repository::Commits::ListService.call(@project&.project_educoder&.repo_name)
else else
if params[:filepath].present? if params[:filepath].present?
file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip)) file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip))
@hash_commit = Gitea::Repository::Commits::FileListService.new(@owner.login, @project.identifier, file_path_uri, @hash_commit = Gitea::Repository::Commits::FileListService.new(@owner.login, @project.identifier, file_path_uri,
sha: params[:sha], page: params[:page], limit: params[:limit], token: current_user&.gitea_token).call sha: params[:sha], page: params[:page], limit: params[:limit], token: current_user&.gitea_token).call
else else
@hash_commit = Gitea::Repository::Commits::ListService.new(@owner.login, @project.identifier, @hash_commit = Gitea::Repository::Commits::ListService.new(@owner.login, @project.identifier,
sha: params[:sha], page: params[:page], limit: params[:limit], token: current_user&.gitea_token).call sha: params[:sha], page: params[:page], limit: params[:limit], token: current_user&.gitea_token).call
end end
end end
end end
def commits_slice def commits_slice
@hash_commit = Gitea::Repository::Commits::ListSliceService.call(@owner.login, @project.identifier, @hash_commit = Gitea::Repository::Commits::ListSliceService.call(@owner.login, @project.identifier,
sha: params[:sha], page: params[:page], limit: params[:limit], token: current_user&.gitea_token) sha: params[:sha], page: params[:page], limit: params[:limit], token: current_user&.gitea_token)
end end
def commit def commit
@sha = params[:sha] @sha = params[:sha]
if @project.educoder? if @project.educoder?
return render_error('暂未开放,敬请期待.') return render_error('暂未开放,敬请期待.')
else else
@commit = Gitea::Repository::Commits::GetService.call(@owner.login, @repository.identifier, @sha, current_user&.gitea_token) @commit = Gitea::Repository::Commits::GetService.call(@owner.login, @repository.identifier, @sha, current_user&.gitea_token)
@commit_diff = Gitea::Repository::Commits::GetService.call(@owner.login, @repository.identifier, @sha, current_user&.gitea_token, {diff: true}) @commit_diff = Gitea::Repository::Commits::GetService.call(@owner.login, @repository.identifier, @sha, current_user&.gitea_token, {diff: true})
end end
end end
def tags def tags
result = Gitea::Repository::Tags::ListService.call(current_user&.gitea_token, @owner.login, @project.identifier, {page: params[:page], limit: params[:limit]}) result = Gitea::Repository::Tags::ListService.call(current_user&.gitea_token, @owner.login, @project.identifier, {page: params[:page], limit: params[:limit]})
@tags = result.is_a?(Hash) && result.key?(:status) ? [] : result @tags = result.is_a?(Hash) && result.key?(:status) ? [] : result
end end
def contributors def contributors
if params[:filepath].present? || @project.educoder? if params[:filepath].present? || @project.educoder?
@contributors = [] @contributors = []
else else
result = Gitea::Repository::Contributors::GetService.call(@owner, @repository.identifier) result = Gitea::Repository::Contributors::GetService.call(@owner, @repository.identifier)
@contributors = result.is_a?(Hash) && result.key?(:status) ? [] : result @contributors = result.is_a?(Hash) && result.key?(:status) ? [] : result
end end
rescue rescue
@contributors = [] @contributors = []
end end
def edit def edit
return render_forbidden if !@project.manager?(current_user) && !current_user.admin? return render_forbidden if !@project.manager?(current_user) && !current_user.admin?
end end
def create_file def create_file
interactor = Gitea::CreateFileInteractor.call(current_user.gitea_token, @owner.login, content_params) interactor = Gitea::CreateFileInteractor.call(current_user.gitea_token, @owner.login, content_params)
if interactor.success? if interactor.success?
@file = interactor.result @file = interactor.result
# create_new_pr(params) # create_new_pr(params)
#如果是更新流水线文件 #如果是更新流水线文件
if params[:pipeline_id] if params[:pipeline_id]
update_pipeline(params[:pipeline_id]) update_pipeline(params[:pipeline_id])
end end
else else
render_error(interactor.error) render_error(interactor.error)
end end
end end
def update_pipeline(pipeline_id) def update_pipeline(pipeline_id)
pipeline = Ci::Pipeline.find(pipeline_id) pipeline = Ci::Pipeline.find(pipeline_id)
if pipeline if pipeline
pipeline.update!(sync: 1) pipeline.update!(sync: 1)
end end
end end
def update_file def update_file
interactor = Gitea::UpdateFileInteractor.call(current_user.gitea_token, @owner.login, params.merge(identifier: @project.identifier)) interactor = Gitea::UpdateFileInteractor.call(current_user.gitea_token, @owner.login, params.merge(identifier: @project.identifier))
if interactor.success? if interactor.success?
@file = interactor.result @file = interactor.result
# TODO: 是否创建pr # TODO: 是否创建pr
# create_new_pr(params) # create_new_pr(params)
render_result(1, "更新成功") render_result(1, "更新成功")
else else
render_error(interactor.error) render_error(interactor.error)
end end
end end
def delete_file def delete_file
interactor = Gitea::DeleteFileInteractor.call(current_user.gitea_token, @owner.login, params.merge(identifier: @project.identifier)) interactor = Gitea::DeleteFileInteractor.call(current_user.gitea_token, @owner.login, params.merge(identifier: @project.identifier))
if interactor.success? if interactor.success?
@file = interactor.result @file = interactor.result
render_result(1, "文件删除成功") render_result(1, "文件删除成功")
else else
render_error(interactor.error) render_error(interactor.error)
end end
end end
def repo_hook def repo_hook
end end
def sync_mirror def sync_mirror
return render_error("正在镜像中..") if @repository.mirror.waiting? return render_error("正在镜像中..") if @repository.mirror.waiting?
@repository.sync_mirror! @repository.sync_mirror!
SyncMirroredRepositoryJob.perform_later(@repository.id, current_user.id) SyncMirroredRepositoryJob.perform_later(@repository.id, current_user.id)
render_ok render_ok
end end
def readme def readme
if params[:filepath].present? if params[:filepath].present?
result = Gitea::Repository::Readme::DirService.call(@owner.login, @repository.identifier, params[:filepath], params[:ref], current_user&.gitea_token) result = Gitea::Repository::Readme::DirService.call(@owner.login, @repository.identifier, params[:filepath], params[:ref], current_user&.gitea_token)
else else
result = Gitea::Repository::Readme::GetService.call(@owner.login, @repository.identifier, params[:ref], current_user&.gitea_token) result = Gitea::Repository::Readme::GetService.call(@owner.login, @repository.identifier, params[:ref], current_user&.gitea_token)
end end
@path = Gitea.gitea_config[:domain]+"/#{@owner.login}/#{@repository.identifier}/raw/branch/#{params[:ref]}/" @path = Gitea.gitea_config[:domain]+"/#{@owner.login}/#{@repository.identifier}/raw/branch/#{params[:ref]}/"
@readme = result[:status] === :success ? result[:body] : nil @readme = result[:status] === :success ? result[:body] : nil
@readme['content'] = decode64_content(@readme, @owner, @repository, params[:ref], @path) @readme['content'] = decode64_content(@readme, @owner, @repository, params[:ref], @path)
render json: @readme.slice("type", "encoding", "size", "name", "path", "content", "sha") render json: @readme.slice("type", "encoding", "size", "name", "path", "content", "sha")
rescue rescue
render json: nil render json: nil
end end
def languages def languages
if @project.educoder? if @project.educoder?
render json: {} render json: {}
else else
render json: languages_precentagable render json: languages_precentagable
end end
end end
def archive def archive
domain = Gitea.gitea_config[:domain] domain = Gitea.gitea_config[:domain]
api_url = Gitea.gitea_config[:base_url] api_url = Gitea.gitea_config[:base_url]
archive_url = "/repos/#{@owner.login}/#{@repository.identifier}/archive/#{Addressable::URI.escape(params[:archive])}" archive_url = "/repos/#{@owner.login}/#{@repository.identifier}/archive/#{Addressable::URI.escape(params[:archive])}"
file_path = [domain, api_url, archive_url].join file_path = [domain, api_url, archive_url].join
file_path = [file_path, "access_token=#{current_user&.gitea_token}"].join("?") if @repository.hidden? 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? return render_not_found if !request.format.zip? && !request.format.gzip?
redirect_to file_path redirect_to file_path
end end
def raw def raw
domain = Gitea.gitea_config[:domain] domain = Gitea.gitea_config[:domain]
api_url = Gitea.gitea_config[:base_url] api_url = Gitea.gitea_config[:base_url]
url = "/repos/#{@owner.login}/#{@repository.identifier}/raw/#{Addressable::URI.escape(params[:filepath])}?ref=#{Addressable::URI.escape(params[:ref])}" url = "/repos/#{@owner.login}/#{@repository.identifier}/raw/#{Addressable::URI.escape(params[:filepath])}?ref=#{Addressable::URI.escape(params[:ref])}"
file_path = [domain, api_url, url].join file_path = [domain, api_url, url].join
file_path = [file_path, "access_token=#{current_user&.gitea_token}"].join("&") file_path = [file_path, "access_token=#{current_user&.gitea_token}"].join("&")
redirect_to file_path redirect_to file_path
end end
private private
def find_project def find_project
@project = Project.find params[:id] @project = Project.find params[:id]
render_not_found("未找到相关的仓库") unless @project render_not_found("未找到相关的仓库") unless @project
end end
def find_project_with_includes def find_project_with_includes
@project = Project.includes(:repository, :owner, :watchers, :praise_treads).find params[:id] @project = Project.includes(:repository, :owner, :watchers, :praise_treads).find params[:id]
end end
def authorizate! def authorizate!
return if current_user && current_user.admin? return if current_user && current_user.admin?
if @project.repository.hidden? && !@project.member?(current_user) if @project.repository.hidden? && !@project.member?(current_user)
render_forbidden render_forbidden
end end
end end
# TODO 获取最新commit信息 # TODO 获取最新commit信息
def project_commits def project_commits
if params[:filepath].present? if params[:filepath].present?
file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip)) file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip))
Gitea::Repository::Commits::FileListService.new(@project.owner.login, @project.identifier, file_path_uri, Gitea::Repository::Commits::FileListService.new(@project.owner.login, @project.identifier, file_path_uri,
sha: get_ref, page: 1, limit: 1, token: current_user&.gitea_token).call sha: get_ref, page: 1, limit: 1, token: current_user&.gitea_token).call
else else
Gitea::Repository::Commits::ListService.new(@project.owner.login, @project.identifier, Gitea::Repository::Commits::ListService.new(@project.owner.login, @project.identifier,
sha: get_ref, page: 1, limit: 1, token: current_user&.gitea_token).call sha: get_ref, page: 1, limit: 1, token: current_user&.gitea_token).call
end end
end end
def get_statistics def get_statistics
@branches_count = @project.educoder? ? 0 : Gitea::Repository::Branches::ListService.new(@project.owner, @project.identifier).call&.size @branches_count = @project.educoder? ? 0 : Gitea::Repository::Branches::ListService.new(@project.owner, @project.identifier).call&.size
@tags_count = @project.educoder? ? 0 : Gitea::Repository::Tags::ListService.new(current_user&.gitea_token, @project.owner.login, @project.identifier).call&.size @tags_count = @project.educoder? ? 0 : Gitea::Repository::Tags::ListService.new(current_user&.gitea_token, @project.owner.login, @project.identifier).call&.size
end end
def get_ref def get_ref
@ref = params[:ref] || @project&.default_branch @ref = params[:ref] || @project&.default_branch
end end
def get_latest_commit def get_latest_commit
latest_commit = @project.educoder? ? nil : project_commits latest_commit = @project.educoder? ? nil : project_commits
@latest_commit = latest_commit.present? ? latest_commit[:body][0] : nil @latest_commit = latest_commit.present? ? latest_commit[:body][0] : nil
@commits_count = latest_commit.present? ? latest_commit[:total_count] : 0 @commits_count = latest_commit.present? ? latest_commit[:total_count] : 0
end end
def content_params def content_params
{ {
filepath: params[:filepath], filepath: params[:filepath],
branch: params[:branch], branch: params[:branch],
new_branch: params[:new_branch], new_branch: params[:new_branch],
content: params[:content], content: params[:content],
message: params[:message], message: params[:message],
committer: { committer: {
email: current_user.mail, email: current_user.mail,
name: current_user.login name: current_user.login
}, },
identifier: @project.identifier identifier: @project.identifier
} }
end end
def hook_params(hook_type, params) def hook_params(hook_type, params)
# if hook_type == "push" # if hook_type == "push"
# # TODO hook返回的记录中暂时没有文件代码数量的增减暂时根据 commits数量来计算 # # TODO hook返回的记录中暂时没有文件代码数量的增减暂时根据 commits数量来计算
# uploadPushInfo = { # uploadPushInfo = {
# "sha": params["commits"].present? ? params["commits"].last : "", # "sha": params["commits"].present? ? params["commits"].last : "",
# "branch": params["ref"].to_s.split("/").last, # "branch": params["ref"].to_s.split("/").last,
# "modification_lines": params["commits"].length # "modification_lines": params["commits"].length
# } # }
# elsif hook_type == "pull_request" && params["action"].to_s == "closed" #合并请求合并后才会有上链操作 # elsif hook_type == "pull_request" && params["action"].to_s == "closed" #合并请求合并后才会有上链操作
# uploadPushInfo = { # uploadPushInfo = {
# "branch": params["base"]["ref"].to_s.split("/").last, # "branch": params["base"]["ref"].to_s.split("/").last,
# "sha": params["pull_request"]["merge_base"], # "sha": params["pull_request"]["merge_base"],
# "modification_lines": 1 #pull_request中没有commits数量 # "modification_lines": 1 #pull_request中没有commits数量
# } # }
# else # else
# uploadPushInfo = {} # uploadPushInfo = {}
# end # end
# uploadPushInfo # uploadPushInfo
end end
def create_new_pr(params) def create_new_pr(params)
if params[:new_branch].present? && params[:new_branch] != params[:branch] if params[:new_branch].present? && params[:new_branch] != params[:branch]
local_params = { local_params = {
title: params[:message], #标题 title: params[:message], #标题
body: params[:content], #内容 body: params[:content], #内容
head: params[:new_branch], #源分支 head: params[:new_branch], #源分支
base: params[:branch], #目标分支 base: params[:branch], #目标分支
milestone: 0 #里程碑,未与本地的里程碑关联 milestone: 0 #里程碑,未与本地的里程碑关联
} }
requests_params = local_params.merge({ requests_params = local_params.merge({
assignee: current_user.try(:login), assignee: current_user.try(:login),
assignees: [], assignees: [],
labels: [], labels: [],
due_date: Time.now due_date: Time.now
}) })
issue_params = { issue_params = {
author_id: current_user.id, author_id: current_user.id,
project_id: @project.id, project_id: @project.id,
subject: params[:message], subject: params[:message],
description: params[:content], description: params[:content],
assigned_to_id: nil, assigned_to_id: nil,
fixed_version_id: nil, fixed_version_id: nil,
issue_tags_value: nil, issue_tags_value: nil,
issue_classify: "pull_request", issue_classify: "pull_request",
issue_type: "1", issue_type: "1",
tracker_id: 2, tracker_id: 2,
status_id: 1, status_id: 1,
priority_id: params[:priority_id] || "2" priority_id: params[:priority_id] || "2"
} }
@pull_issue = Issue.new(issue_params) @pull_issue = Issue.new(issue_params)
if @pull_issue.save! if @pull_issue.save!
local_requests = PullRequest.new(local_params.merge(user_id: current_user.try(:id), project_id: @project.id, issue_id: @pull_issue.id)) local_requests = PullRequest.new(local_params.merge(user_id: current_user.try(:id), project_id: @project.id, issue_id: @pull_issue.id))
if local_requests.save if local_requests.save
gitea_request = Gitea::PullRequest::CreateService.new(current_user.try(:gitea_token), @owner.login, @project.try(:identifier), requests_params).call gitea_request = Gitea::PullRequest::CreateService.new(current_user.try(:gitea_token), @owner.login, @project.try(:identifier), requests_params).call
if gitea_request[:status] == :success && local_requests.update_attributes(gpid: gitea_request["body"]["number"]) if gitea_request[:status] == :success && local_requests.update_attributes(gpid: gitea_request["body"]["number"])
local_requests.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create") local_requests.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
end end
end end
end end
end end
end end
end end

View File

@ -1,148 +1,166 @@
module RepositoriesHelper module RepositoriesHelper
def render_permission(user, project) def render_permission(user, project)
return "Admin" if user&.admin? return "Admin" if user&.admin?
project.get_premission(user) project.get_premission(user)
end end
def render_decode64_content(str) def render_decode64_content(str)
return nil if str.blank? return nil if str.blank?
Base64.decode64(str).force_encoding("UTF-8").encode("UTF-8", invalid: :replace) Base64.decode64(str).force_encoding("UTF-8").encode("UTF-8", invalid: :replace)
end end
def download_type(str) def download_type(str)
default_type = %w(xlsx xls ppt pptx pdf zip 7z rar exe pdb obj idb RData rdata doc docx mpp vsdx dot otf eot ttf woff woff2 mp4 mov wmv flv mpeg avi avchd webm mkv) default_type = %w(xlsx xls ppt pptx pdf zip 7z rar exe pdb obj idb RData rdata doc docx mpp vsdx dot otf eot ttf woff woff2 mp4 mov wmv flv mpeg avi avchd webm mkv)
default_type.include?(str&.downcase) || str.blank? default_type.include?(str&.downcase) || str.blank?
end end
def image_type?(str) def image_type?(str)
default_type = %w(png jpg gif tif psd svg bmp webp jpeg ico psd) default_type = %w(png jpg gif tif psd svg bmp webp jpeg ico psd)
default_type.include?(str&.downcase) default_type.include?(str&.downcase)
end end
def is_readme?(type, str) def is_readme?(type, str)
return false if type != 'file' || str.blank? return false if type != 'file' || str.blank?
readme_types = ["readme.md", "readme", "readme_en.md", "readme_zh.md", "readme_en", "readme_zh"] readme_types = ["readme.md", "readme", "readme_en.md", "readme_zh.md", "readme_en", "readme_zh"]
readme_types.include?(str.to_s.downcase) readme_types.include?(str.to_s.downcase)
end end
def render_commit_author(author_json) def render_commit_author(author_json)
return nil if author_json.blank? || (author_json["id"].blank? && author_json['name'].blank?) return nil if author_json.blank? || (author_json["id"].blank? && author_json['name'].blank?)
if author_json["id"].present? if author_json["id"].present?
return find_user_by_gitea_uid author_json['id'] return find_user_by_gitea_uid author_json['id']
end end
if author_json["id"].nil? && (author_json["name"].present? && author_json["email"].present?) if author_json["id"].nil? && (author_json["name"].present? && author_json["email"].present?)
return find_user_by_login_and_mail(author_json['name'], author_json["email"]) return find_user_by_login_and_mail(author_json['name'], author_json["email"])
end end
end end
def render_cache_commit_author(author_json) def render_cache_commit_author(author_json)
Rails.logger.info author_json['Email'] Rails.logger.info author_json['Email']
if author_json["name"].present? && author_json["email"].present? if author_json["name"].present? && author_json["email"].present?
return find_user_in_redis_cache(author_json['name'], author_json['email']) return find_user_in_redis_cache(author_json['name'], author_json['email'])
end end
if author_json["Name"].present? && author_json["Email"].present? if author_json["Name"].present? && author_json["Email"].present?
return find_user_in_redis_cache(author_json['Name'], author_json['Email']) return find_user_in_redis_cache(author_json['Name'], author_json['Email'])
end end
end end
def readme_render_decode64_content(str, owner, repo, ref) def readme_render_decode64_content(str, owner, repo, ref, path)
return nil if str.blank? return nil if str.blank?
begin begin
content = Base64.decode64(str).force_encoding('UTF-8') content = Base64.decode64(str).force_encoding('UTF-8')
c_regex = /\!\[.*?\]\((.*?)\)/ c_regex = /\!\[.*?\]\((.*?)\)/
src_regex = /src=\"(.*?)\"/ src_regex = /src=\"(.*?)\"/
ss = content.to_s.scan(c_regex) src2_regex = /src='(.*?)'/
ss_src = content.to_s.scan(src_regex) ss = content.to_s.scan(c_regex)
total_images = ss + ss_src ss_src = content.scan(src_regex)
if total_images.length > 0 ss_src2 = content.scan(src2_regex)
total_images.each do |s| total_images = ss + ss_src + ss_src2
image_title = /\"(.*?)\"/ if total_images.length > 0
r_content = s[0] total_images.each do |s|
remove_title = r_content.to_s.scan(image_title) image_title = /\"(.*?)\"/
if remove_title.length > 0 r_content = s[0]
r_content = r_content.gsub(/#{remove_title[0]}/, "").strip remove_title = r_content.to_s.scan(image_title)
end # if remove_title.length > 0
# if r_content.include?("?") # r_content = r_content.gsub(/#{remove_title[0]}/, "").strip
# new_r_content = r_content + "&raw=true" # end
# else path_last = r_content
# new_r_content = r_content + "?raw=true" path_current = ""
# end # 相对路径处理
new_r_content = r_content if r_content.start_with?("../")
relative_path_length = r_content.split("../").size - 1
unless r_content.include?("http://") || r_content.include?("https://") || r_content.include?("mailto:") path_pre = path.split("/").size - 1 - relative_path_length
# new_r_content = "#{path}" + new_r_content path_pre = 0 if path_pre < 0
new_r_content = [base_url, "/api/#{owner&.login}/#{repo.identifier}/raw?filepath=#{r_content}&ref=#{ref}"].join path_current = path_pre == 0 ? "" : path.split("/")[0..path_pre].join("/")
end path_last = r_content.split("../").last
content = content.gsub(/#{r_content}/, new_r_content) elsif r_content.start_with?("/") # 根路径处理
end path_last = r_content[1..r_content.size]
end else
path_current = path
return content end
rescue # if r_content.include?("?")
return str # new_r_content = r_content + "&raw=true"
end # else
end # new_r_content = r_content + "?raw=true"
# end
# unix_time values for example: 1604382982 new_r_content = r_content
def render_format_time_with_unix(unix_time)
Time.at(unix_time).strftime("%Y-%m-%d %H:%M") unless r_content.include?("http://") || r_content.include?("https://") || r_content.include?("mailto:")
end # new_r_content = "#{path}" + new_r_content
new_r_content = [base_url, "/api/#{owner&.login}/#{repo.identifier}/raw?filepath=#{path_current}/#{path_last}&ref=#{ref}"].join
# date for example: 2020-11-01T19:57:27+08:00 end
def render_format_time_with_date(date) content = content.gsub(/src=\"#{r_content}\"/, "src=\"#{new_r_content}\"").gsub(/src='#{r_content}'/, "src=\"#{new_r_content}\"")
date.to_time.strftime("%Y-%m-%d %H:%M") end
end end
def decode64_content(entry, owner, repo, ref, path=nil) return content
if is_readme?(entry['type'], entry['name']) rescue
content = Gitea::Repository::Entries::GetService.call(owner, repo.identifier, URI.escape(entry['path']), ref: ref)['content'] return str
readme_render_decode64_content(content, owner, repo, ref) end
else end
file_type = File.extname(entry['name'].to_s)[1..-1]
if image_type?(file_type) # unix_time values for example: 1604382982
return entry['content'].nil? ? Gitea::Repository::Entries::GetService.call(owner, repo.identifier, URI.escape(entry['path']), ref: ref)['content'] : entry['content'] def render_format_time_with_unix(unix_time)
end Time.at(unix_time).strftime("%Y-%m-%d %H:%M")
if download_type(file_type) end
return entry['content']
end # date for example: 2020-11-01T19:57:27+08:00
render_decode64_content(entry['content']) def render_format_time_with_date(date)
end date.to_time.strftime("%Y-%m-%d %H:%M")
end end
def base64_to_image(path, content) def decode64_content(entry, owner, repo, ref, path=nil)
# generate to https://git.trusite.net/pawm36ozq/-/raw/branch/master/entrn.png" if is_readme?(entry['type'], entry['name'])
content = Base64.decode64(content) # content = Gitea::Repository::Entries::GetService.call(owner, repo.identifier, URI.escape(entry['path']), ref: ref)['content']
File.open(path, 'wb') { |f| f.write(content) } content = entry['content']
end path = URI.escape(entry['path']).to_s.downcase.gsub("/readme.md","")
readme_render_decode64_content(content, owner, repo, ref, path)
def render_download_image_url(dir_path, file_path, content) else
full_path = file_path.starts_with?("/") ? [dir_path, file_path].join("") : [dir_path, file_path].join("/") file_type = File.extname(entry['name'].to_s)[1..-1]
file_name = full_path.split("/")[-1] if image_type?(file_type)
# 用户名/项目标识/文件路径 return entry['content'].nil? ? Gitea::Repository::Entries::GetService.call(owner, repo.identifier, URI.escape(entry['path']), ref: ref)['content'] : entry['content']
dir_path = generate_dir_path(full_path.split("/"+file_name)[0]) end
if download_type(file_type)
file_path = [dir_path, file_name].join('/') return entry['content']
end
puts "##### render_download_image_url file_path: #{file_path}" render_decode64_content(entry['content'])
base64_to_image(file_path, content) end
file_path = file_path[6..-1] end
File.join(base_url, file_path)
end def base64_to_image(path, content)
# generate to https://git.trusite.net/pawm36ozq/-/raw/branch/master/entrn.png"
def generate_dir_path(dir_path) content = Base64.decode64(content)
# tmp_dir_path File.open(path, 'wb') { |f| f.write(content) }
# eg: jasder/forgeplus/raw/branch/ref end
dir_path = ["public", tmp_dir, dir_path].join('/')
puts "#### dir_path: #{dir_path}" def render_download_image_url(dir_path, file_path, content)
unless Dir.exists?(dir_path) full_path = file_path.starts_with?("/") ? [dir_path, file_path].join("") : [dir_path, file_path].join("/")
FileUtils.mkdir_p(dir_path) ##不成功这里会抛异常 file_name = full_path.split("/")[-1]
end # 用户名/项目标识/文件路径
dir_path dir_path = generate_dir_path(full_path.split("/"+file_name)[0])
end
file_path = [dir_path, file_name].join('/')
def tmp_dir
"repo" puts "##### render_download_image_url file_path: #{file_path}"
end base64_to_image(file_path, content)
file_path = file_path[6..-1]
end File.join(base_url, file_path)
end
def generate_dir_path(dir_path)
# tmp_dir_path
# eg: jasder/forgeplus/raw/branch/ref
dir_path = ["public", tmp_dir, dir_path].join('/')
puts "#### dir_path: #{dir_path}"
unless Dir.exists?(dir_path)
FileUtils.mkdir_p(dir_path) ##不成功这里会抛异常
end
dir_path
end
def tmp_dir
"repo"
end
end

View File

@ -1,4 +1,5 @@
if @project.forge? if @project.forge?
is_dir = @sub_entries.is_a?(Array)
file_name = entry['name'] file_name = entry['name']
file_type = File.extname(file_name.to_s)[1..-1] file_type = File.extname(file_name.to_s)[1..-1]
direct_download = download_type(file_type) direct_download = download_type(file_type)
@ -9,16 +10,16 @@ if @project.forge?
json.type entry['type'] json.type entry['type']
json.size entry['size'] json.size entry['size']
json.content direct_download ? nil : decode64_content(entry, @owner, @repository, @ref, @path) json.content (direct_download || image_type || is_dir) ? nil : decode64_content(entry, @owner, @repository, @ref, @path)
json.target entry['target'] json.target entry['target']
download_url = download_url =
if image_type if image_type
dir_path = [@owner.login, @repository.identifier, "raw/branch", @ref].join('/') dir_path = [@owner.login, @repository.identifier, "raw/branch", @ref].join('/')
render_download_image_url(dir_path, entry['path'], decode64_content(entry, @owner, @repository, @ref)) is_dir ? "" : render_download_image_url(dir_path, entry['path'], decode64_content(entry, @owner, @repository, @ref))
else else
# entry['download_url'] # entry['download_url']
render_download_file_url(@owner, @repository, entry['path'].to_s, @ref) is_dir ? "" : render_download_file_url(@owner, @repository, entry['path'].to_s, @ref)
end end
json.download_url download_url json.download_url download_url