git_repositories.rb revision 8ec575832389c2588f0b5ca1f1dd2cc42d62eb12
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainenmodule Repository::GitRepositories
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen extend ActiveSupport::Concern
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen included do
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen after_create :git
1171f0abf442638bac1827bb24a0b6b8eb682a82Timo Sirainen after_destroy :destroy_git
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen end
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen def git
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen @git ||= GitRepository.new(local_path)
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen end
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
fcfb528483369975066c6adf1c55c16e6fb6e91fTimo Sirainen def local_path
fcfb528483369975066c6adf1c55c16e6fb6e91fTimo Sirainen "#{Ontohub::Application.config.git_root}/#{id}"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen end
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def destroy_git
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen FileUtils.rmtree local_path
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen end
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen def is_head?(commit_oid=nil)
fcfb528483369975066c6adf1c55c16e6fb6e91fTimo Sirainen git.is_head?(commit_oid)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen end
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def save_file(tmp_file, filepath, message, user, iri=nil)
fcfb528483369975066c6adf1c55c16e6fb6e91fTimo Sirainen version = nil
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen git.add_file({email: user[:email], name: user[:name]}, tmp_file, filepath, message) do |commit_oid|
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen o = ontologies.where(path: filepath).first
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if o
fcfb528483369975066c6adf1c55c16e6fb6e91fTimo Sirainen # update existing ontology
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen version = o.versions.build({ :commit_oid => commit_oid, :user => user }, { without_protection: true })
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen o.ontology_version = version
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen o.save!
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen else
fcfb528483369975066c6adf1c55c16e6fb6e91fTimo Sirainen # create new ontology
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen clazz = filepath.ends_with?('.casl') ? DistributedOntology : SingleOntology
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen o = clazz.new
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen o.path = filepath
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen o.iri = iri || "http://#{Settings.hostname}/#{path}/#{Ontology.filename_without_extension(filepath)}"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen o.name = filepath.split('/')[-1].split(".")[0].capitalize
fcfb528483369975066c6adf1c55c16e6fb6e91fTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen version = o.versions.build({ :commit_oid => commit_oid, :user => user }, { without_protection: true })
fcfb528483369975066c6adf1c55c16e6fb6e91fTimo Sirainen
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen o.repository = self
fcfb528483369975066c6adf1c55c16e6fb6e91fTimo Sirainen o.save!
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen o.ontology_version = version;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen o.save!
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen end
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen end
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen touch
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen version
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen end
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen def path_exists?(path, commit_oid=nil)
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen path ||= '/'
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen git.path_exists?(path, commit_oid)
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen end
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen def path_info(path=nil, commit_oid=nil)
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen path ||= '/'
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen if path_exists?(path, commit_oid)
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen file = git.get_file(path, commit_oid)
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen return {type: :raw, file: file} if file
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen return {type: :dir, entries: list_folder(path, commit_oid)}
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen end
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen file = path.split('/')[-1]
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen path = path.split('/')[0..-2].join('/')
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen entries = list_folder(path, commit_oid).select { |e| e[:name].split('.')[0] == file }
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen return nil if entries.empty?
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen if entries.size == 1
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen { type: :file_base,
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen entry: entries[0]
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen }
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen else
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen { type: :file_base_ambiguous,
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen entries: entries
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen }
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen end
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen end
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen
aff3354de83df9d683587e27461697193ff36591Timo Sirainen def list_folder(folderpath, commit_oid=nil)
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen folderpath ||= '/'
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen git.folder_contents(commit_oid, folderpath)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen end
72368bc3058d36912317ffe55e6017205f4fa036Timo Sirainen
72368bc3058d36912317ffe55e6017205f4fa036Timo Sirainen def read_file(filepath, commit_oid=nil)
72368bc3058d36912317ffe55e6017205f4fa036Timo Sirainen git.get_file(filepath, commit_oid)
72368bc3058d36912317ffe55e6017205f4fa036Timo Sirainen end
72368bc3058d36912317ffe55e6017205f4fa036Timo Sirainen
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen # given a commit oid or a branch name, commit_id returns a hash of oid and branch name if existent
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen def commit_id(oid)
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen return { oid: git.head_oid, branch_name: 'master' } if oid.nil?
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen if oid.match /[0-9a-fA-F]{40}/
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen branch_names = git.get_branches.select { |b| b[:oid] == oid }
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen if branch_names.empty?
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen { oid: oid, branch_name: nil }
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen else
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { oid: oid, branch_name: branch_names[0][:name] }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen end
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen else
785b1ca149341b70bf2cb8cc3049f1c4c1070b52Timo Sirainen if git.branch_oid(oid).nil?
785b1ca149341b70bf2cb8cc3049f1c4c1070b52Timo Sirainen nil
287ba82a8da3eaa473b5735d4eeac2fb4c5d8117Timo Sirainen else
785b1ca149341b70bf2cb8cc3049f1c4c1070b52Timo Sirainen { oid: git.branch_oid(oid), branch_name: oid }
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen end
287ba82a8da3eaa473b5735d4eeac2fb4c5d8117Timo Sirainen end
785b1ca149341b70bf2cb8cc3049f1c4c1070b52Timo Sirainen end
785b1ca149341b70bf2cb8cc3049f1c4c1070b52Timo Sirainen
785b1ca149341b70bf2cb8cc3049f1c4c1070b52Timo Sirainen def entries_info(oid=nil, path=nil)
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen dirpath = git.get_path_of_dir(oid, path)
785b1ca149341b70bf2cb8cc3049f1c4c1070b52Timo Sirainen git.entries_info(oid,dirpath)
785b1ca149341b70bf2cb8cc3049f1c4c1070b52Timo Sirainen end
785b1ca149341b70bf2cb8cc3049f1c4c1070b52Timo Sirainenend
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen