git_repository.rb revision 81da36894af70bbb8d8e24b004026ad4c5c1bc99
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger# Wrapper for access to the local Git repository
b66a6512eb6dea6cf5339eaa857a81d1b89cb4deJulian Kornberger# requires git and git-svn to be installed for the functions clone_git and clone_svn to work
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornbergerclass GitRepository
b66a6512eb6dea6cf5339eaa857a81d1b89cb4deJulian Kornberger require 'git_repository/config'
ee5342a8882c2fc7631fcffb5497e6597747887cTim Reddehase
81da36894af70bbb8d8e24b004026ad4c5c1bc99Eugen Kuksa include GitRepository::Config
81da36894af70bbb8d8e24b004026ad4c5c1bc99Eugen Kuksa include GitRepository::Cloning
81da36894af70bbb8d8e24b004026ad4c5c1bc99Eugen Kuksa include GitRepository::Files
81da36894af70bbb8d8e24b004026ad4c5c1bc99Eugen Kuksa include GitRepository::GetCommit
81da36894af70bbb8d8e24b004026ad4c5c1bc99Eugen Kuksa include GitRepository::GetObject
81da36894af70bbb8d8e24b004026ad4c5c1bc99Eugen Kuksa include GitRepository::GetDiff
81da36894af70bbb8d8e24b004026ad4c5c1bc99Eugen Kuksa include GitRepository::GetFolderContents
81da36894af70bbb8d8e24b004026ad4c5c1bc99Eugen Kuksa include GitRepository::GetInfoList
81da36894af70bbb8d8e24b004026ad4c5c1bc99Eugen Kuksa include GitRepository::Committing
81da36894af70bbb8d8e24b004026ad4c5c1bc99Eugen Kuksa include GitRepository::History
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa attr_reader :repo
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa
76f22aa7c18383199da116500929b79945677076Eugen Kuksa delegate :path, :empty?, to: :repo
5377dc644918632ef318825466e4f3cd861e27ecEugen Kuksa
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger def initialize(path)
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger if File.exists?(path)
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger @repo = Rugged::Repository.new(path)
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger else
498a5ce047b7c0873d84f6e7f45f3443e5072b70Eugen Kuksa FileUtils.mkdir_p(Ontohub::Application.config.git_root)
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger @repo = Rugged::Repository.init_at(path, true)
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger end
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger end
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger
532f6901b468d49af265ef939b52bbc6c8f1ab85Eugen Kuksa def destroy
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa FileUtils.rmtree(self.path)
532f6901b468d49af265ef939b52bbc6c8f1ab85Eugen Kuksa end
532f6901b468d49af265ef939b52bbc6c8f1ab85Eugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa def dir?(path, commit_oid = nil)
f4b865988759de2bcc51ffd55897191c74e53ba2Eugen Kuksa path ||= '/'
9e3e0144c09a30bdb6211168a35dacbf0cb130d8Eugen Kuksa if empty?
9e3e0144c09a30bdb6211168a35dacbf0cb130d8Eugen Kuksa return false
9e3e0144c09a30bdb6211168a35dacbf0cb130d8Eugen Kuksa end
9e3e0144c09a30bdb6211168a35dacbf0cb130d8Eugen Kuksa
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksa rugged_commit = repo.lookup(commit_oid || head_oid)
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksa object = get_object(rugged_commit, path)
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksa
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksa !object.nil? && object.type == :tree
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksa end
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa def path_exists?(path, commit_oid = nil)
674411b4cc02cf3bffadda96eed60751162ebf5fEugen Kuksa return true if path == '/' || path.empty?
674411b4cc02cf3bffadda96eed60751162ebf5fEugen Kuksa return false if empty?
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa rugged_commit = get_commit(commit_oid)
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa if !rugged_commit && path.empty?
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa true
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa else
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa path_exists_rugged?(rugged_commit, path)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa def paths_starting_with(path, commit_oid = nil)
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa dir = dir?(path, commit_oid) ? path : path.split('/')[0..-2].join('/')
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa contents = folder_contents(commit_oid, dir)
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa contents.map { |git_file| git_file.path }.
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa select { |p| p.starts_with?(path) }
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa end
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa def get_file(path, commit_oid = nil)
f4b865988759de2bcc51ffd55897191c74e53ba2Eugen Kuksa begin
a847d9812b328c048773e705606b10875a929034Eugen Kuksa get_file!(path, commit_oid)
a847d9812b328c048773e705606b10875a929034Eugen Kuksa rescue GitRepository::PathNotFoundError
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa nil
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa def get_file!(path, commit_oid = nil)
a847d9812b328c048773e705606b10875a929034Eugen Kuksa path ||= '/'
a847d9812b328c048773e705606b10875a929034Eugen Kuksa rugged_commit = get_commit(commit_oid)
a847d9812b328c048773e705606b10875a929034Eugen Kuksa raise GitRepository::PathNotFoundError if !rugged_commit && path.empty?
a847d9812b328c048773e705606b10875a929034Eugen Kuksa
a847d9812b328c048773e705606b10875a929034Eugen Kuksa GitFile.new(self, rugged_commit, path)
a847d9812b328c048773e705606b10875a929034Eugen Kuksa end
a847d9812b328c048773e705606b10875a929034Eugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa def get_path_of_dir(oid = nil, path = nil)
8ec575832389c2588f0b5ca1f1dd2cc42d62eb12= path ||= ''
8ec575832389c2588f0b5ca1f1dd2cc42d62eb12= path = path[0..-2] if(path[-1] == '/')
a847d9812b328c048773e705606b10875a929034Eugen Kuksa raise PathNotFoundError.new unless path_exists?(path, oid)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
8ec575832389c2588f0b5ca1f1dd2cc42d62eb12= path
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa def self.directory(path)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa path.split("/")[0..-2].join("/")
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
78b69b71ee6bb1b213a2af7a2daec9e2e16052efEugen Kuksa def deepest_existing_dir(path, commit_oid = nil)
78b69b71ee6bb1b213a2af7a2daec9e2e16052efEugen Kuksa path ||= '/'
78b69b71ee6bb1b213a2af7a2daec9e2e16052efEugen Kuksa dirs = path.split('/')
78b69b71ee6bb1b213a2af7a2daec9e2e16052efEugen Kuksa
78b69b71ee6bb1b213a2af7a2daec9e2e16052efEugen Kuksa dir = nil
075e8216f719a593d9111ce303e5028bcb0400faEugen Kuksa Array(0..dirs.length - 1).reverse.each do |i|
78b69b71ee6bb1b213a2af7a2daec9e2e16052efEugen Kuksa if dir.nil?
78b69b71ee6bb1b213a2af7a2daec9e2e16052efEugen Kuksa path = dirs[0..i].join('/')
78b69b71ee6bb1b213a2af7a2daec9e2e16052efEugen Kuksa dir = path if dir?(path, commit_oid)
78b69b71ee6bb1b213a2af7a2daec9e2e16052efEugen Kuksa end
78b69b71ee6bb1b213a2af7a2daec9e2e16052efEugen Kuksa end
78b69b71ee6bb1b213a2af7a2daec9e2e16052efEugen Kuksa
78b69b71ee6bb1b213a2af7a2daec9e2e16052efEugen Kuksa dir
78b69b71ee6bb1b213a2af7a2daec9e2e16052efEugen Kuksa end
78b69b71ee6bb1b213a2af7a2daec9e2e16052efEugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa # Given a commit oid or a branch name, commit_id returns a hash of oid and
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa # branch name if existent.
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa def commit_id(ref)
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa return {oid: head_oid, branch_name: 'master'} if ref.nil?
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa if ref.match(/[0-9a-fA-F]{40}/)
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa commit_id_by_oid(ref)
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa else
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa commit_id_by_branch_name(ref)
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa end
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa end
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa def commit_id_by_oid(oid)
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa branch_names = branches_by_oid(oid)
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa {oid: oid, branch_name: branch_names.empty? ? nil : branch_names[0][:name]}
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa end
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa def commit_id_by_branch_name(name)
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa if branch_oid(name).nil?
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa nil
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa else
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa {oid: branch_oid(name), branch_name: name}
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa end
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa end
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa def branches_by_oid(oid)
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa branches.select { |b| b[:oid] == oid }
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa end
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa def branches
de9f3aef02867291f2c065985477165653ea11b2Eugen Kuksa repo.refs.map do |ref|
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa {
de9f3aef02867291f2c065985477165653ea11b2Eugen Kuksa refname: ref.name,
de9f3aef02867291f2c065985477165653ea11b2Eugen Kuksa name: ref.name.split('/')[-1],
de9f3aef02867291f2c065985477165653ea11b2Eugen Kuksa commit: ref.target,
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa oid: ref.target.oid,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa }
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa def branch_commit(name)
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa ref = repo.references["refs/heads/#{name}"]
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa if ref.nil?
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa nil
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa else
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa ref.target
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa end
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa end
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa def branch_oid(name)
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa if commit = branch_commit(name)
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa commit.oid
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa end
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa end
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa def build_target_path(path, file_name)
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa file_path = path.dup
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa file_path << '/' if file_path[-1] != '/' && !file_path.empty?
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa file_path << file_name
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa file_path
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa def is_head?(commit_oid=nil)
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa commit_oid.nil? || (!empty? && commit_oid == head_oid)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa def head_oid
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa if empty?
391f72f778a8c9e1cbaed1860f4a4754d6881c8aEugen Kuksa nil
391f72f778a8c9e1cbaed1860f4a4754d6881c8aEugen Kuksa else
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa repo.head.target.oid
391f72f778a8c9e1cbaed1860f4a4754d6881c8aEugen Kuksa end
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa end
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa def self.is_repository_with_working_copy?(path)
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa repo = Rugged::Repository.new(path)
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa !repo.bare?
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa rescue Rugged::RepositoryError
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa false
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa end
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa def self.is_bare_repository?(path)
93ff918a7a1656d812f27a767a976ea33da0921fJulian Kornberger Rugged::Repository.new(path).bare?
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa rescue Rugged::RepositoryError
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa false
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger def self.mime_type_editable?(mime_type)
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger mime_type.to_s == 'application/xml' || mime_type.to_s.match(/^text\/.*/)
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger end
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger def self.mime_info(filename)
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger ext = File.extname(filename)[1..-1]
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger mime_type = Mime::Type.lookup_by_extension(ext) || Mime::TEXT
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger mime_category = mime_type.to_s.split('/')[0]
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger {
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger mime_type: mime_type,
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger mime_category: mime_category
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger }
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger end
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa protected
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa def path_exists_rugged?(rugged_commit, path = '/')
305425741178bd2bf246258c91a8b2833aacd964Eugen Kuksa path.empty? || !get_object(rugged_commit, path).nil?
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa rescue Rugged::OdbError
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa false
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa def head
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa repo.lookup(head_oid)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksaend