You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

175 lines
5.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

require "rugged"
require "fileutils"
require_relative "db"
class GitRepo
attr :path, :error, :db
def initialize(path, db)
@path = nil
@error = nil
@db = db
if File.absolute_path?(path)
if File.exist?(path)
@path = path
end
else
apath = File.realpath(path)
if File.exist?(apath)
@path = apath
end
end
end
def create_git(project_name, description)
@error = nil
ret_val = 0
fname = File.expand_path("#{project_name}.git", @path)
if File.exist?(fname)
@error = "Репозиторий с таким именем уже существует: #{project_name}"
ret_val = 1
else
Dir.mkdir(fname)
Rugged::Repository.init_at(fname, :bare)
repo = Rugged::Repository.new(fname)
created = false
if repo.bare?
@error = @db.creategit(project_name, description)
if @error.nil?
created = true
end
else
@error = "Репозиторий почему-то не пустой"
end
unless created
FileUtils.rm_rf(fname, secure: true)
end
end
ret_val
end
def create_git_db_only(project_name)
@error = @db.creategit(project_name, "")
@error
end
def getrepos
repos_data = []
repos_files = Dir[File.join(@path, "*.git")]
repos_files.each do |fl|
repo_name = File.basename(fl, ".git")
db_info = @db.get_repo_info_by_name(repo_name)
unless db_info.nil?
repos_data << { :reponame => db_info.reponame, :descr => db_info.descr, :public => db_info.public, :id => db_info.id }
else
result = create_git_db_only(repo_name)
if result.nil?
db_info = @db.get_repo_info_by_name(repo_name)
repos_data << { :reponame => db_info.reponame, :descr => db_info.descr, :public => db_info.public, :id => db_info.id }
end
end
end
repos_data
end
def repo_info(reponame, branch = nil)
info = {}
result = ""
@error = nil
repos_data = { :full => 0 }
git_path = File.join(@path, reponame + ".git")
if File.exist?(git_path)
repo = Rugged::Repository.new(git_path)
db_info = @db.get_repo_info_by_name(reponame)
unless db_info.nil?
repos_data = { :reponame => db_info.reponame, :descr => db_info.descr, :public => db_info.public, :full => 1 }
else
result = create_git_db_only(reponame)
if result.nil?
db_info = @db.get_repo_info_by_name(reponame)
db_info = db_info.first
repos_data = { :reponame => db_info.reponame, :descr => db_info.descr, :public => db_info.public, :full => 1 }
end
end
if repos_data[:full] == 1
info[:info] = repos_data
if repo.empty?
info[:commits] = []
info[:branches] = []
info[:tags] = []
else
ref = repo.head
unless branch.nil?
ref_name = File.join("refs/heads/", branch)
ref = repo.references[ref_name]
end
commits = []
unless ref.nil?
walker = Rugged::Walker.new(repo)
walker.sorting(Rugged::SORT_DATE)
walker.push(ref.target)
commits = walker.map do |commit|
{ :message => commit.message, :author => commit.author, :time => commit.time, :sha => commit.oid }
end.first(10)
end
info[:commits] = commits
info[:branches] = repo.branches.each_name(:local).sort
info[:tags] = repo.tags.map { |tag| tag.name }
end
else
@error = result
end
else
@error = "Репозиторий отсутсвует"
end
info[:error] = @error
info
end
def delete_repo(reponame)
git_path = File.expand_path(reponame + ".git", @path)
if File.exist?(git_path)
FileUtils.rm_rf(git_path, secure: true)
@db.delete_repo_by_name(reponame)
end
end
def get_repo_short_info_by_id(id)
@db.get_repo_info_by_id(id)
end
def clone_repo_master(id, path)
@error = nil
repo_info = @db.get_repo_info_by_id(id)
unless repo_info.nil?
git_path = File.join(@path, repo_info[:reponame] + ".git")
if File.exist?(git_path)
repo = Rugged::Repository.new(git_path)
if repo.empty?
@error = "Репозиторий пустой, нельзя добавить в проект пустой репозиторий"
else
if File.exist?(path)
FileUtils.rm_rf(path, secure: true)
end
Dir.mkdir(path)
Rugged::Repository.clone_at(repo.path, path)
end
else
@error = "Файла репозитория не существует"
end
else
@error = "Нет информации о репозитории"
end
@error
end
def is_repos_sync(repo_name, prj_repo_path)
res = false
repo = Rugged::Repository.new(prj_repo_path)
git_path = File.join(@path, repo_name + ".git")
bare_repo = Rugged::Repository.new(git_path)
res = (bare_repo.head.target.tree.oid == repo.head.target.tree.oid)
res
end
end