mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-22 20:06:22 +00:00
67 lines
1.5 KiB
Ruby
67 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Representa un objeto git LFS
|
|
class LfsObjectService
|
|
attr_reader :site, :blob
|
|
|
|
# @param :site [Site]
|
|
# @param :blob [ActiveStorage::Blob]
|
|
def initialize(site:, blob:)
|
|
@site = site
|
|
@blob = blob
|
|
end
|
|
|
|
def process
|
|
# Crear el directorio
|
|
FileUtils.mkdir_p(File.dirname(object_path))
|
|
|
|
# Mover el archivo
|
|
FileUtils.mv(path, object_path) unless File.exist? object_path
|
|
|
|
# Crear el pointer
|
|
Site::Writer.new(site: site, file: path, content: pointer).save
|
|
|
|
# Commitear el pointer
|
|
site.repository.commit(file: path, usuarie: author, message: File.basename(path))
|
|
|
|
# Eliminar el pointer
|
|
FileUtils.rm(path)
|
|
|
|
# Hacer link duro del objeto al archivo
|
|
FileUtils.ln(object_path, path)
|
|
end
|
|
|
|
# @return [String]
|
|
def path
|
|
@path ||= blob.service.path_for(blob.key)
|
|
end
|
|
|
|
# @return [String]
|
|
def digest
|
|
@digest ||= Digest::SHA256.file(path).hexdigest
|
|
end
|
|
|
|
# @return [String]
|
|
def object_path
|
|
@object_path ||= File.join(site.path, '.git', 'lfs', 'objects', digest[0..1], digest[2..3], digest)
|
|
end
|
|
|
|
# @return [Integer]
|
|
def size
|
|
@size ||= File.size(File.exist?(object_path) ? object_path : path)
|
|
end
|
|
|
|
# @return [String]
|
|
def pointer
|
|
@pointer ||=
|
|
<<~POINTER
|
|
version https://git-lfs.github.com/spec/v1
|
|
oid sha256:#{digest}
|
|
size #{size}
|
|
POINTER
|
|
end
|
|
|
|
def author
|
|
@author ||= GitAuthor.new email: "disk_service@#{Site.domain}", name: 'DiskService'
|
|
end
|
|
end
|