fix: merge from develop

This commit is contained in:
yystopf 2022-05-20 11:44:56 +08:00
commit 803fdfc49e
1 changed files with 206 additions and 169 deletions

View File

@ -1,169 +1,206 @@
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)
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, path) 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=\"(.*?)\"/
src2_regex = /src='(.*?)'/ src2_regex = /src='(.*?)'/
ss = content.to_s.scan(c_regex) ss = content.to_s.scan(c_regex)
ss_src = content.scan(src_regex) ss_src = content.scan(src_regex)
ss_src2 = content.scan(src2_regex) ss_src2 = content.scan(src2_regex)
total_images = ss + ss_src + ss_src2 total_images = ss + ss_src + ss_src2
if total_images.length > 0 if total_images.length > 0
total_images.each do |s| total_images.each do |s|
begin begin
image_title = /\"(.*?)\"/ image_title = /\"(.*?)\"/
r_content = s[0] r_content = s[0]
remove_title = r_content.to_s.scan(image_title) remove_title = r_content.to_s.scan(image_title)
# if remove_title.length > 0 # if remove_title.length > 0
# r_content = r_content.gsub(/#{remove_title[0]}/, "").strip # r_content = r_content.gsub(/#{remove_title[0]}/, "").strip
# end # end
path_last = r_content path_last = r_content
path_current = "" path_current = ""
# 相对路径处理 # 相对路径处理
if r_content.start_with?("../") if r_content.start_with?("../")
relative_path_length = r_content.split("../").size - 1 relative_path_length = r_content.split("../").size - 1
path_pre = path.split("/").size - 1 - relative_path_length path_pre = path.split("/").size - 1 - relative_path_length
path_pre = 0 if path_pre < 0 path_pre = 0 if path_pre < 0
path_current = path_pre == 0 ? "" : path.split("/")[0..path_pre].join("/") path_current = path_pre == 0 ? "" : path.split("/")[0..path_pre].join("/")
path_last = r_content.split("../").last path_last = r_content.split("../").last
elsif r_content.start_with?("/") # 根路径处理 elsif r_content.start_with?("/") # 根路径处理
path_last = r_content[1..r_content.size] path_last = r_content[1..r_content.size]
else else
path_current = path path_current = path
end end
# if r_content.include?("?") # if r_content.include?("?")
# new_r_content = r_content + "&raw=true" # new_r_content = r_content + "&raw=true"
# else # else
# new_r_content = r_content + "?raw=true" # new_r_content = r_content + "?raw=true"
# end # end
new_r_content = r_content new_r_content = r_content
unless r_content.include?("http://") || r_content.include?("https://") || r_content.include?("mailto:") unless r_content.include?("http://") || r_content.include?("https://") || r_content.include?("mailto:")
# new_r_content = "#{path}" + new_r_content # 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 new_r_content = [base_url, "/api/#{owner&.login}/#{repo.identifier}/raw?filepath=#{path_current}/#{path_last}&ref=#{ref}"].join
end end
content = content.gsub(/src=\"#{r_content}\"/, "src=\"#{new_r_content}\"").gsub(/src='#{r_content}'/, "src=\"#{new_r_content}\"") content = content.gsub(/src=\"#{r_content}\"/, "src=\"#{new_r_content}\"").gsub(/src='#{r_content}'/, "src=\"#{new_r_content}\"")
rescue rescue
next next
end end
end end
end end
return content return content
rescue rescue
return str return str
end end
end end
# unix_time values for example: 1604382982 # author hui.he
def render_format_time_with_unix(unix_time) def new_readme_render_decode64_content(str, owner, repo, ref)
Time.at(unix_time).strftime("%Y-%m-%d %H:%M") path = [owner&.login, repo&.identifier, 'tree', ref].join("/")
end return nil if str.blank?
content = Base64.decode64(str).force_encoding('UTF-8')
# date for example: 2020-11-01T19:57:27+08:00 s_regex = /\[.*?\]\((.*?)\)/
def render_format_time_with_date(date) src_regex = /src=\"(.*?)\"/
date.to_time.strftime("%Y-%m-%d %H:%M") ss = content.to_s.scan(s_regex)
end ss_src = content.to_s.scan(src_regex)
total_sources = ss + ss_src
def decode64_content(entry, owner, repo, ref, path=nil) total_sources.uniq!
if is_readme?(entry['type'], entry['name']) total_sources.each do |s|
# content = Gitea::Repository::Entries::GetService.call(owner, repo.identifier, URI.escape(entry['path']), ref: ref)['content'] begin
content = entry['content'] s_content = s[0]
path = URI.escape(entry['path']).to_s.downcase.gsub("/readme.md","") # 链接直接跳过不做替换
readme_render_decode64_content(content, owner, repo, ref, path) next if s_content.starts_with?('http://') || s_content.starts_with?('https://') || s_content.starts_with?('mailto:')
else # 路径替换
file_type = File.extname(entry['name'].to_s)[1..-1] if s_content.starts_with?('./') || s_content.starts_with?("../") || s_content.starts_with?("/")
if image_type?(file_type) s_content = File.expand_path(s_content, path)
return entry['content'].nil? ? Gitea::Repository::Entries::GetService.call(owner, repo.identifier, URI.escape(entry['path']), ref: ref)['content'] : entry['content'] s_content = s_content.split("#{Rails.root}/")[1]
end content = content.gsub(s[0], "/#{s_content}")
if download_type(file_type) else
return entry['content'] # 图片资源替换
end s_content = [base_url, "/api/#{owner&.login}/#{repo.identifier}/raw?filepath=#{s_content}&ref=#{ref}"].join
render_decode64_content(entry['content']) content = content.gsub(s[0], s_content)
end end
end rescue
next
def base64_to_image(path, content) end
# generate to https://git.trusite.net/pawm36ozq/-/raw/branch/master/entrn.png" end
content = Base64.decode64(content)
File.open(path, 'wb') { |f| f.write(content) } return content
end rescue
return str
def render_download_image_url(dir_path, file_path, content) end
full_path = file_path.starts_with?("/") ? [dir_path, file_path].join("") : [dir_path, file_path].join("/")
file_name = full_path.split("/")[-1] # unix_time values for example: 1604382982
# 用户名/项目标识/文件路径 def render_format_time_with_unix(unix_time)
dir_path = generate_dir_path(full_path.split("/"+file_name)[0]) Time.at(unix_time).strftime("%Y-%m-%d %H:%M")
end
file_path = [dir_path, file_name].join('/')
# date for example: 2020-11-01T19:57:27+08:00
puts "##### render_download_image_url file_path: #{file_path}" def render_format_time_with_date(date)
base64_to_image(file_path, content) date.to_time.strftime("%Y-%m-%d %H:%M")
file_path = file_path[6..-1] end
File.join(base_url, file_path)
end def decode64_content(entry, owner, repo, ref, path=nil)
if is_readme?(entry['type'], entry['name'])
def generate_dir_path(dir_path) # content = Gitea::Repository::Entries::GetService.call(owner, repo.identifier, URI.escape(entry['path']), ref: ref)['content']
# tmp_dir_path content = entry['content']
# eg: jasder/forgeplus/raw/branch/ref path = URI.escape(entry['path']).to_s.downcase.gsub("/readme.md","")
dir_path = ["public", tmp_dir, dir_path].join('/') # readme_render_decode64_content(content, owner, repo, ref, path)
puts "#### dir_path: #{dir_path}" new_readme_render_decode64_content(content, owner, repo, ref)
unless Dir.exists?(dir_path) else
FileUtils.mkdir_p(dir_path) ##不成功这里会抛异常 file_type = File.extname(entry['name'].to_s)[1..-1]
end if image_type?(file_type)
dir_path return entry['content'].nil? ? Gitea::Repository::Entries::GetService.call(owner, repo.identifier, URI.escape(entry['path']), ref: ref)['content'] : entry['content']
end end
if download_type(file_type)
def tmp_dir return entry['content']
"repo" end
end render_decode64_content(entry['content'])
end
end end
def base64_to_image(path, content)
# generate to https://git.trusite.net/pawm36ozq/-/raw/branch/master/entrn.png"
content = Base64.decode64(content)
File.open(path, 'wb') { |f| f.write(content) }
end
def render_download_image_url(dir_path, file_path, content)
full_path = file_path.starts_with?("/") ? [dir_path, file_path].join("") : [dir_path, file_path].join("/")
file_name = full_path.split("/")[-1]
# 用户名/项目标识/文件路径
dir_path = generate_dir_path(full_path.split("/"+file_name)[0])
file_path = [dir_path, file_name].join('/')
puts "##### render_download_image_url file_path: #{file_path}"
base64_to_image(file_path, content)
file_path = file_path[6..-1]
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