git_repository.rb revision ee5342a8882c2fc7631fcffb5497e6597747887c
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 GetCommit,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa GetObject,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa GetDiff,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa GetFolderContents,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa GetInfoList,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa Commit,
03dee28977299b4b40210d9b7842bf85c136ab7d= History
03dee28977299b4b40210d9b7842bf85c136ab7d=
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger def initialize(path)
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa if File.exists?(path)
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa @repo = Rugged::Repository.new(path)
76f22aa7c18383199da116500929b79945677076Eugen Kuksa else
5377dc644918632ef318825466e4f3cd861e27ecEugen 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
498a5ce047b7c0873d84f6e7f45f3443e5072b70Eugen Kuksa # DELETEME (exists only for debugging purpose)
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger def repo
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger @repo
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger end
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger
532f6901b468d49af265ef939b52bbc6c8f1ab85Eugen Kuksa def destroy
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa FileUtils.rmtree(@repo.path)
532f6901b468d49af265ef939b52bbc6c8f1ab85Eugen Kuksa end
532f6901b468d49af265ef939b52bbc6c8f1ab85Eugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa def empty?
f4b865988759de2bcc51ffd55897191c74e53ba2Eugen Kuksa @repo.empty?
9e3e0144c09a30bdb6211168a35dacbf0cb130d8Eugen Kuksa end
9e3e0144c09a30bdb6211168a35dacbf0cb130d8Eugen Kuksa
9e3e0144c09a30bdb6211168a35dacbf0cb130d8Eugen Kuksa def dir?(path, commit_oid=nil)
9e3e0144c09a30bdb6211168a35dacbf0cb130d8Eugen Kuksa if empty?
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksa return false
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksa end
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksa
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksa rugged_commit = repo.lookup(commit_oid || head_oid)
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksa object = get_object(rugged_commit, path)
9f9aab3a5e6a6beca675c7f90f9af56a3636f000Eugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa !object.nil? && object.type == :tree
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa def path_exists?(url, commit_oid=nil)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa rugged_commit = get_commit(commit_oid)
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa if !rugged_commit && url.empty?
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa true
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa else
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa path_exists_rugged?(rugged_commit, url)
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa end
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa end
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa def get_file(url, commit_oid=nil)
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa rugged_commit = get_commit(commit_oid)
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa if !rugged_commit && url.empty?
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa nil
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa else
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa get_file_rugged(rugged_commit, url)
f4b865988759de2bcc51ffd55897191c74e53ba2Eugen Kuksa end
a847d9812b328c048773e705606b10875a929034Eugen Kuksa end
a847d9812b328c048773e705606b10875a929034Eugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa def get_path_of_dir(oid=nil, path=nil)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa path ||= ''
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa path = path[0..-2] if(path[-1] == '/')
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa raise URLNotFoundError.new unless path_exists?(path, oid)
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa
a847d9812b328c048773e705606b10875a929034Eugen Kuksa path
a847d9812b328c048773e705606b10875a929034Eugen Kuksa end
a847d9812b328c048773e705606b10875a929034Eugen Kuksa
a847d9812b328c048773e705606b10875a929034Eugen Kuksa def self.directory(path)
a847d9812b328c048773e705606b10875a929034Eugen Kuksa path.split("/")[0..-2].join("/")
a847d9812b328c048773e705606b10875a929034Eugen Kuksa end
a847d9812b328c048773e705606b10875a929034Eugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa def branches
8ec575832389c2588f0b5ca1f1dd2cc42d62eb12= @repo.refs.map do |r|
8ec575832389c2588f0b5ca1f1dd2cc42d62eb12= {
a847d9812b328c048773e705606b10875a929034Eugen Kuksa refname: r.name,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa name: r.name.split('/')[-1],
8ec575832389c2588f0b5ca1f1dd2cc42d62eb12= oid: r.target
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa }
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa def branch_oid(name)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa ref = Rugged::Reference.lookup(@repo, "refs/heads/#{name}")
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa if ref.nil?
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa nil
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa else
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa ref.target
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa end
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa end
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa def build_target_path(url, file_name)
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa file_path = url.dup
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa file_path << '/' if file_path[-1] != '/' && !file_path.empty?
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa file_path << file_name
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa file_path
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa end
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa def is_head?(commit_oid=nil)
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa commit_oid == nil || (!@repo.empty? && commit_oid == head_oid)
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa end
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa def head_oid
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa if @repo.empty?
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa nil
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa else
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa @repo.head.target
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa end
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa end
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa def self.is_repository_with_working_copy?(path)
de9f3aef02867291f2c065985477165653ea11b2Eugen Kuksa repo = Rugged::Repository.new(path)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
de9f3aef02867291f2c065985477165653ea11b2Eugen Kuksa !repo.bare?
de9f3aef02867291f2c065985477165653ea11b2Eugen Kuksa rescue Rugged::RepositoryError
de9f3aef02867291f2c065985477165653ea11b2Eugen Kuksa false
389ef6f0a2c389ad624dcf0b0e7336e39c3fbec5Eugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa def self.is_bare_repository?(path)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa Rugged::Repository.new(path).bare?
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa rescue Rugged::RepositoryError
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa false
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa end
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa def self.mime_type_editable?(mime_type)
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa mime_type.to_s == 'application/xml' || mime_type.to_s.match(/^text\/.*/)
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa end
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa def self.mime_info(filename)
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa ext = File.extname(filename)[1..-1]
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa mime_type = Mime::Type.lookup_by_extension(ext) || Mime::TEXT
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa mime_category = mime_type.to_s.split('/')[0]
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa {
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa mime_type: mime_type,
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa mime_category: mime_category
307902584a4a70170eae6dc80e17d87f680fe2b3Eugen Kuksa }
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa end
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa protected
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa def path_exists_rugged?(rugged_commit, url='')
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa if url.empty?
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa true
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa else
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa tree = rugged_commit.tree
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa nil != get_object(rugged_commit, url)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa rescue Rugged::OdbError
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa false
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa end
391f72f778a8c9e1cbaed1860f4a4754d6881c8aEugen Kuksa
391f72f778a8c9e1cbaed1860f4a4754d6881c8aEugen Kuksa def get_file_rugged(rugged_commit, url='')
8154de978abb605f24405ee3c94bc148ebe4b28bEugen Kuksa return nil unless path_exists_rugged?(rugged_commit, url)
391f72f778a8c9e1cbaed1860f4a4754d6881c8aEugen Kuksa
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa object = get_object(rugged_commit, url)
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa if object.type == :blob
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa filename = url.split('/')[-1]
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa mime_info = self.class.mime_info(filename)
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa {
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa name: filename,
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa size: object.size,
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa content: object.content,
039b6fe97fd37af689c6991e6fceef72bbd617fcEugen Kuksa mime_type: mime_info[:mime_type],
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa mime_category: mime_info[:mime_category]
93ff918a7a1656d812f27a767a976ea33da0921fJulian Kornberger }
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa else
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa nil
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger def head
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger @repo.lookup(head_oid)
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger end
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornbergerend
2725ada6b2a776abaadd22b0006097eae9ba2b02Julian Kornberger