git_repository.rb revision 532f6901b468d49af265ef939b52bbc6c8f1ab85
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn# Wrapper for access to the local Git repository
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallynclass GitRepository
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn include \
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn GetCommit,
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn GetObject,
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn GetDiff,
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn GetFolderContents,
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn GetInfoList,
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn Commit
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn def initialize(path)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn if File.exists?(path)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn @repo = Rugged::Repository.new(path)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn else
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn @repo = Rugged::Repository.init_at(path, true)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn def destroy
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn FileUtils.rmtree(@repo.path)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn def get_commit(commit_oid=nil)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn if @repo.empty?
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn nil
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn else
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn @repo.lookup(commit_oid || head_oid)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn def path_exists?(commit_oid=nil, url='')
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn rugged_commit = get_commit(commit_oid)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn if !rugged_commit && url.empty?
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn true
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn else
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn path_exists_rugged?(rugged_commit, url)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn def get_current_file(commit_oid=nil, url='')
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn rugged_commit = get_commit(commit_oid)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn if !rugged_commit && url.empty?
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn nil
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn else
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn get_current_file_rugged(rugged_commit, url)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn def get_url(oid=nil, url=nil)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn url ||= ''
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn url = url[0..-2] if(url[-1] == '/')
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn raise URLNotFoundError.new unless path_exists?(oid, url)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn url
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn def self.directory(path)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn path.split("/")[0..-2].join("/")
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn def get_branches
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn @repo.refs.map do |r|
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn {
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn refname: r.name,
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn name: r.name.split('/')[-1],
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn oid: r.target
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn }
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn def build_target_path(url, file_name)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn file_path = url.dup
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn file_path << '/' if file_path[-1] != '/' && !file_path.empty?
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn file_path << file_name
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn file_path
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn def is_head?(commit_oid=nil)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn commit_oid == nil || (!@repo.empty? && commit_oid == head_oid)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn protected
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn def path_exists_rugged?(rugged_commit, url='')
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn if url.empty?
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn true
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn else
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn tree = rugged_commit.tree
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn nil != get_object(rugged_commit, url)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn rescue Rugged::OdbError
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn false
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn def get_current_file_rugged(rugged_commit, url='')
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn return nil unless path_exists_rugged?(rugged_commit, url)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn object = get_object(rugged_commit, url)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn if object.type == :blob
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn filename = url.split('/')[-1]
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn mime_info = mime_info(filename)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn {
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn name: filename,
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn size: object.size,
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn content: object.content,
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn mime_type: mime_info[:mime_type],
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn mime_category: mime_info[:mime_category]
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn }
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn else
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn nil
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn # NOTE: "destroy repository" function not inserted here
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn def head_oid
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn @repo.head.target
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn def head
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn @repo.lookup(head_oid)
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn end
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallynend
198b363fff1de9afcee2f26b9aa847316f589afeSerge Hallyn