files.rb revision f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksamodule GitRepository::Files
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa # depends on GitRepository
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa extend ActiveSupport::Concern
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa class GitRepository::Files::FileError < StandardError; end
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa class GitFile
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa attr_reader :name, :path, :oid, :mime_type, :mime_category
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa def initialize(repository, rugged_commit, path)
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa @path = path
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa self.repository = repository
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa if !repository.path_exists?(path, rugged_commit.oid)
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa fail FileError, "Path doesn't exist: #{path}"
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa end
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa self.rugged_object = repository.get_object(rugged_commit, path)
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa @oid = rugged_commit.oid
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa @name = path.split('/')[-1]
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa if file?
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa mime_info = repository.class.mime_info(name)
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa @mime_type = mime_info[:mime_type]
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa @mime_category = mime_info[:mime_category]
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa end
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa end
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa def size
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa case type
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa when :file
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa rugged_object.size
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa when :dir
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa content.size
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa end
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa end
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa def content
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa @content ||= case type
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa when :file
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa rugged_object.content
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa when :dir
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa repository.folder_contents(oid, path)
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa end
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa end
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa def file?
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa type == :file
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa end
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa def dir?
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa type == :dir
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa end
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa def type
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa case rugged_object.type
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa when :blob
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa :file
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa when :tree
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa :dir
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa end
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa end
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa def last_change
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa @last_change ||= git.entry_info(path, oid)
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa end
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa protected
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa attr_accessor :repository, :rugged_object
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa end
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksaend