init commit
This commit is contained in:
parent
93efff9452
commit
9ba1224867
307 changed files with 11053 additions and 0 deletions
149
app/models/project.rb
Normal file
149
app/models/project.rb
Normal file
|
@ -0,0 +1,149 @@
|
|||
require "grit"
|
||||
|
||||
class Project < ActiveRecord::Base
|
||||
has_many :issues, :dependent => :destroy
|
||||
has_many :users_projects, :dependent => :destroy
|
||||
has_many :users, :through => :users_projects
|
||||
has_many :notes, :dependent => :destroy
|
||||
|
||||
validates :name,
|
||||
:uniqueness => true,
|
||||
:presence => true,
|
||||
:length => { :within => 0..255 }
|
||||
|
||||
validates :path,
|
||||
:uniqueness => true,
|
||||
:presence => true,
|
||||
:length => { :within => 0..255 }
|
||||
|
||||
validates :description,
|
||||
:length => { :within => 0..2000 }
|
||||
|
||||
validates :code,
|
||||
:presence => true,
|
||||
:uniqueness => true,
|
||||
:length => { :within => 3..12 }
|
||||
|
||||
before_save :format_code
|
||||
after_destroy :destroy_gitosis_project
|
||||
after_save :update_gitosis_project
|
||||
|
||||
attr_protected :private_flag
|
||||
|
||||
scope :public_only, where(:private_flag => false)
|
||||
|
||||
def to_param
|
||||
code
|
||||
end
|
||||
|
||||
def common_notes
|
||||
notes.where(:noteable_type => ["", nil])
|
||||
end
|
||||
|
||||
def format_code
|
||||
read_attribute(:code).downcase.strip.gsub(' ', '')
|
||||
end
|
||||
|
||||
|
||||
def update_gitosis_project
|
||||
Gitosis.new.configure do |c|
|
||||
c.update_project(path, gitosis_writers)
|
||||
end
|
||||
end
|
||||
|
||||
def destroy_gitosis_project
|
||||
Gitosis.new.configure do |c|
|
||||
c.destroy_project(self)
|
||||
end
|
||||
end
|
||||
|
||||
def add_access(user, *access)
|
||||
opts = { :user => user }
|
||||
access.each { |name| opts.merge!(name => true) }
|
||||
users_projects.create(opts)
|
||||
end
|
||||
|
||||
def reset_access(user)
|
||||
users_projects.where(:project_id => self.id, :user_id => user.id).destroy if self.id
|
||||
end
|
||||
|
||||
def writers
|
||||
@writers ||= users_projects.includes(:user).where(:write => true).map(&:user)
|
||||
end
|
||||
|
||||
def gitosis_writers
|
||||
keys = Key.joins({:user => :users_projects}).where("users_projects.project_id = ? AND users_projects.write = ?", id, true)
|
||||
keys.map(&:identifier)
|
||||
end
|
||||
|
||||
def readers
|
||||
@readers ||= users_projects.includes(:user).where(:read => true).map(&:user)
|
||||
end
|
||||
|
||||
def admins
|
||||
@admins ||=users_projects.includes(:user).where(:admin => true).map(&:user)
|
||||
end
|
||||
|
||||
def public?
|
||||
!private_flag
|
||||
end
|
||||
|
||||
def private?
|
||||
private_flag
|
||||
end
|
||||
|
||||
def url_to_repo
|
||||
"#{GITOSIS["git_user"]}@#{GITOSIS["host"]}:#{path}.git"
|
||||
end
|
||||
|
||||
def path_to_repo
|
||||
GITOSIS["base_path"] + path + ".git"
|
||||
end
|
||||
|
||||
def repo
|
||||
@repo ||= Grit::Repo.new(path_to_repo)
|
||||
end
|
||||
|
||||
def tags
|
||||
repo.tags.map(&:name).sort.reverse
|
||||
end
|
||||
|
||||
def repo_exists?
|
||||
repo rescue false
|
||||
end
|
||||
|
||||
def commit(commit_id = nil)
|
||||
if commit_id
|
||||
repo.commits(commit_id).first
|
||||
else
|
||||
repo.commits.first
|
||||
end
|
||||
end
|
||||
|
||||
def tree(fcommit, path = nil)
|
||||
fcommit = commit if fcommit == :head
|
||||
tree = fcommit.tree
|
||||
path ? (tree / path) : tree
|
||||
end
|
||||
|
||||
def valid_repo?
|
||||
repo
|
||||
rescue
|
||||
errors.add(:path, "Invalid repository path")
|
||||
false
|
||||
end
|
||||
end
|
||||
# == Schema Information
|
||||
#
|
||||
# Table name: projects
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# name :string(255)
|
||||
# path :string(255)
|
||||
# description :text
|
||||
# created_at :datetime
|
||||
# updated_at :datetime
|
||||
# private_flag :boolean default(TRUE), not null
|
||||
# code :string(255)
|
||||
#
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue