f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksamodule GitRepository::Files
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa # depends on GitRepository
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa extend ActiveSupport::Concern
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa class GitFile
afd1d888784385307c9c0544597a513c2008d342Eugen Kuksa attr_reader :path, :oid, :mime_type, :mime_category
4a4f3fc459705a4a7ee11d4874e2942e3e9ae1d4Eugen Kuksa attr_accessor :repository, :rugged_object
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa def initialize(repository, rugged_commit, path)
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa @path = path
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa self.repository = repository
2e9ab604191df30b4ff93212555f6858bed72b92Eugen Kuksa if repository.empty?
2e9ab604191df30b4ff93212555f6858bed72b92Eugen Kuksa @path = '/'
2e9ab604191df30b4ff93212555f6858bed72b92Eugen Kuksa @content = []
2e9ab604191df30b4ff93212555f6858bed72b92Eugen Kuksa @rugged_commit = nil
2e9ab604191df30b4ff93212555f6858bed72b92Eugen Kuksa @rugged_object = nil
2e9ab604191df30b4ff93212555f6858bed72b92Eugen Kuksa return
2e9ab604191df30b4ff93212555f6858bed72b92Eugen Kuksa end
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa if !repository.path_exists?(path, rugged_commit.oid)
e8b73e98504b46b48d1972b1c3561225aa6c55d2Eugen Kuksa raise GitRepository::PathNotFoundError, "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
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
0c6a378eb7aa5411c336e069126f6f09b67e00abEugen Kuksa when :file
0c6a378eb7aa5411c336e069126f6f09b67e00abEugen Kuksa rugged_object.content
0c6a378eb7aa5411c336e069126f6f09b67e00abEugen Kuksa when :dir
0c6a378eb7aa5411c336e069126f6f09b67e00abEugen Kuksa repository.folder_contents(oid, path)
0c6a378eb7aa5411c336e069126f6f09b67e00abEugen 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
2e9ab604191df30b4ff93212555f6858bed72b92Eugen Kuksa return :dir if rugged_object.nil?
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
afd1d888784385307c9c0544597a513c2008d342Eugen Kuksa def name
e8b73e98504b46b48d1972b1c3561225aa6c55d2Eugen Kuksa @name ||= path.split('/')[-1]
afd1d888784385307c9c0544597a513c2008d342Eugen Kuksa end
afd1d888784385307c9c0544597a513c2008d342Eugen Kuksa
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa def last_change
afd1d888784385307c9c0544597a513c2008d342Eugen Kuksa @last_change ||= repository.entry_info(path, oid)
afd1d888784385307c9c0544597a513c2008d342Eugen Kuksa end
afd1d888784385307c9c0544597a513c2008d342Eugen Kuksa
afd1d888784385307c9c0544597a513c2008d342Eugen Kuksa def ==(other)
afd1d888784385307c9c0544597a513c2008d342Eugen Kuksa [:repository, :path, :oid].all? do |attr|
afd1d888784385307c9c0544597a513c2008d342Eugen Kuksa self.send(attr) == other.send(attr)
afd1d888784385307c9c0544597a513c2008d342Eugen Kuksa end
5f9eeb33c7ef17dd06026f0d62255b89d3d158b7Eugen Kuksa end
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksa end
f46ccf3a7b1e5eb14dcee031cd5e639cb74857f9Eugen Kuksaend