git_repository.rb revision 1167711784176c2c46f3b69a3530a8aff0d575f7
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger# Wrapper for access to the local Git repository
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornbergerclass GitRepository
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa#requires git and git-svn to be installed for the functions clone_git and clone_svn to work
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa require 'open3'
532f6901b468d49af265ef939b52bbc6c8f1ab85Eugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa include \
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa GetCommit,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa GetObject,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa GetDiff,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa GetFolderContents,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa GetInfoList,
03dee28977299b4b40210d9b7842bf85c136ab7d= Commit,
03dee28977299b4b40210d9b7842bf85c136ab7d= History
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger def initialize(path)
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger if File.exists?(path)
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger @repo = Rugged::Repository.new(path)
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger else
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger @repo = Rugged::Repository.init_at(path, true)
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger end
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger end
5c4c13ac875d79def115ce3d8443d4ec87b3252aJulian Kornberger
03dee28977299b4b40210d9b7842bf85c136ab7d= def repo
03dee28977299b4b40210d9b7842bf85c136ab7d= @repo
03dee28977299b4b40210d9b7842bf85c136ab7d= end
03dee28977299b4b40210d9b7842bf85c136ab7d=
532f6901b468d49af265ef939b52bbc6c8f1ab85Eugen Kuksa def destroy
532f6901b468d49af265ef939b52bbc6c8f1ab85Eugen Kuksa FileUtils.rmtree(@repo.path)
532f6901b468d49af265ef939b52bbc6c8f1ab85Eugen Kuksa end
532f6901b468d49af265ef939b52bbc6c8f1ab85Eugen Kuksa
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa def empty?
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa @repo.empty?
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
f458e516c452c779efc7fc8949edfc2092d3fb82Julian Kornberger def path_exists?(url, commit_oid=nil)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa rugged_commit = get_commit(commit_oid)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa if !rugged_commit && url.empty?
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa true
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa else
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa path_exists_rugged?(rugged_commit, url)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
f458e516c452c779efc7fc8949edfc2092d3fb82Julian Kornberger def get_file(url, commit_oid=nil)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa rugged_commit = get_commit(commit_oid)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa if !rugged_commit && url.empty?
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa nil
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa else
1b3a30e097b49e2c7a8d09b5d4cf544c1fec299bEugen Kuksa get_file_rugged(rugged_commit, url)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
8ec575832389c2588f0b5ca1f1dd2cc42d62eb12= def get_path_of_dir(oid=nil, path=nil)
8ec575832389c2588f0b5ca1f1dd2cc42d62eb12= path ||= ''
8ec575832389c2588f0b5ca1f1dd2cc42d62eb12= path = path[0..-2] if(path[-1] == '/')
8ec575832389c2588f0b5ca1f1dd2cc42d62eb12= raise URLNotFoundError.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
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa def get_branches
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa @repo.refs.map do |r|
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa {
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa refname: r.name,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa name: r.name.split('/')[-1],
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa oid: r.target
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa }
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa def branch_oid(name)
a5a4e2f7ee10435dab96569b4514486f0eee6c09Eugen Kuksa ref = Rugged::Reference.lookup(@repo, "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
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa def build_target_path(url, file_name)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa file_path = url.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)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa commit_oid == nil || (!@repo.empty? && commit_oid == head_oid)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa def head_oid
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa @repo.head.target
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa end
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa def self.clone_git(source, target_path, depth=nil)
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa if depth.nil? || depth == 0
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa stdin, stdout, stderr, wait_thr = Open3.popen3 'git', 'clone', '--bare', source, target_path
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa else
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa stdin, stdout, stderr, wait_thr = Open3.popen3 'git', 'clone', '--bare', source, target_path, '--depth', "#{depth}"
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa end
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa { out: stdout.gets(nil), err: stderr.gets(nil), success: wait_thr.value.success? }
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa end
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa def self.clone_svn(source, target_path)
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa target_path = target_path[0..-2] if target_path[-1] == '/'
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa target_path_svn = target_path_svn_base = "#{target_path}_svn"
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa if File.exists? target_path
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa { out: nil, err: "#{target_path} already exists.", success: false}
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa else
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa i = 0
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa while File.exists? target_path_svn do
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa target_path_svn = "#{target_path_svn_base}#{i}"
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa i = i+1
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa end
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa stdin, stdout, stderr, wait_thr = Open3.popen3 'git', 'svn', 'clone', '-r', 'HEAD', source, target_path_svn
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa out = stdout.gets(nil)
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa err = stderr.gets(nil)
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa if wait_thr.value.success?
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa result = GitRepository.clone_git(target_path_svn, target_path)
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa FileUtils.rmtree target_path_svn
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa result
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa else
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa { out: out, err: err, success: false }
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa end
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa end
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa end
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa def self.is_bare_repository?(path)
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa repo = Rugged::Repository.new(path)
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa repo.bare?
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa rescue Rugged::RepositoryError
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa false
1167711784176c2c46f3b69a3530a8aff0d575f7Eugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen 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
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa nil != get_object(rugged_commit, url)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa rescue Rugged::OdbError
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa false
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
1b3a30e097b49e2c7a8d09b5d4cf544c1fec299bEugen Kuksa def get_file_rugged(rugged_commit, url='')
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa return nil unless path_exists_rugged?(rugged_commit, url)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa object = get_object(rugged_commit, url)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa if object.type == :blob
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa filename = url.split('/')[-1]
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa mime_info = mime_info(filename)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa {
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa name: filename,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa size: object.size,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa content: object.content,
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa mime_type: mime_info[:mime_type],
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa mime_category: mime_info[:mime_category]
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa }
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa else
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa nil
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa def mime_info(filename)
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa ext = File.extname(filename)[1..-1]
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa mime_type = Mime::Type.lookup_by_extension(ext) || Mime::TEXT
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa mime_category = mime_type.to_s.split('/')[0]
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa {
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa mime_type: mime_type,
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa mime_category: mime_category
82943dcc7f878756736a3f21a8100b389b94ba46Eugen Kuksa }
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa def head
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa @repo.lookup(head_oid)
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksa end
a2b3d5bb602a9a0d970b6640948f1d7d75ce78bfEugen Kuksaend