git_repository.rb revision 8154de978abb605f24405ee3c94bc148ebe4b28b
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
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa include \
b66a6512eb6dea6cf5339eaa857a81d1b89cb4deJulian Kornberger Config,
9cfb01db247ca04bb4b5b337bbd77c66b7150e53Julian Kornberger Cloning,
f4b865988759de2bcc51ffd55897191c74e53ba2Eugen Kuksa Files,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa GetCommit,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa GetObject,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa GetDiff,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa GetFolderContents,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa GetInfoList,
03dee28977299b4b40210d9b7842bf85c136ab7d= Commit,
03dee28977299b4b40210d9b7842bf85c136ab7d= History
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa attr_reader :repo
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa
5377dc644918632ef318825466e4f3cd861e27ecEugen Kuksa delegate :path, 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
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa def empty?
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa repo.empty?
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen 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
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa def path_exists?(path, commit_oid=nil)
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
8154de978abb605f24405ee3c94bc148ebe4b28bEugen 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
f4b865988759de2bcc51ffd55897191c74e53ba2Eugen 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
a847d9812b328c048773e705606b10875a929034Eugen 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
8ec575832389c2588f0b5ca1f1dd2cc42d62eb12= 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
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa # given a commit oid or a branch name, commit_id returns a hash of oid and branch name if existent
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa def commit_id(oid)
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa return { oid: head_oid, branch_name: 'master' } if oid.nil?
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa if oid.match(/[0-9a-fA-F]{40}/)
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa branch_names = branches.select { |b| b[:oid] == oid }
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa if branch_names.empty?
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa { oid: oid, branch_name: nil }
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa else
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa { oid: oid, branch_name: branch_names[0][:name] }
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa end
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa else
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa if branch_oid(oid).nil?
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa nil
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa else
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa { oid: branch_oid(oid), branch_name: oid }
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa end
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa end
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa end
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa def branches
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa repo.refs.map do |r|
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa {
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa refname: r.name,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa name: r.name.split('/')[-1],
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa commit: r.target,
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa oid: r.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
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa def path_exists_rugged?(rugged_commit, path='')
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa path ||= '/'
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa if path.empty?
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa true
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa else
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa nil != get_object(rugged_commit, path)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
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