diff options
Diffstat (limited to 'app/models')
| -rw-r--r-- | app/models/ability.rb | 2 | ||||
| -rw-r--r-- | app/models/concerns/issuable.rb | 13 | ||||
| -rw-r--r-- | app/models/event.rb | 4 | ||||
| -rw-r--r-- | app/models/issue.rb | 33 | ||||
| -rw-r--r-- | app/models/key.rb | 4 | ||||
| -rw-r--r-- | app/models/merge_request.rb | 94 | ||||
| -rw-r--r-- | app/models/milestone.rb | 27 | ||||
| -rw-r--r-- | app/models/namespace.rb | 8 | ||||
| -rw-r--r-- | app/models/project.rb | 4 | ||||
| -rw-r--r-- | app/models/repository.rb | 6 | ||||
| -rw-r--r-- | app/models/user.rb | 8 | ||||
| -rw-r--r-- | app/models/user_team.rb | 5 | ||||
| -rw-r--r-- | app/models/user_team_project_relationship.rb | 4 |
13 files changed, 133 insertions, 79 deletions
diff --git a/app/models/ability.rb b/app/models/ability.rb index 6d087a959a9..6fda2e52c7c 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -123,7 +123,7 @@ class Ability def user_team_abilities user, team rules = [] - # Only group owner and administrators can manage group + # Only group owner and administrators can manage team if team.owner == user || team.admin?(user) || user.admin? rules << [ :manage_user_team ] end diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index 645b35ec660..85337583640 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -17,10 +17,9 @@ module Issuable validates :project, presence: true validates :author, presence: true validates :title, presence: true, length: { within: 0..255 } - validates :closed, inclusion: { in: [true, false] } - scope :opened, -> { where(closed: false) } - scope :closed, -> { where(closed: true) } + scope :opened, -> { with_state(:opened) } + scope :closed, -> { with_state(:closed) } scope :of_group, ->(group) { where(project_id: group.project_ids) } scope :of_user_team, ->(team) { where(project_id: team.project_ids, assignee_id: team.member_ids) } scope :assigned, ->(u) { where(assignee_id: u.id)} @@ -62,14 +61,6 @@ module Issuable assignee_id_changed? end - def is_being_closed? - closed_changed? && closed - end - - def is_being_reopened? - closed_changed? && !closed - end - # # Votes # diff --git a/app/models/event.rb b/app/models/event.rb index 18422e192a4..ae14454c59a 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -130,10 +130,6 @@ class Event < ActiveRecord::Base target if target_type == "MergeRequest" end - def author - @author ||= User.find(author_id) - end - def action_name if closed? "closed" diff --git a/app/models/issue.rb b/app/models/issue.rb index 07c0401143c..112f43c4692 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -9,7 +9,7 @@ # project_id :integer # created_at :datetime not null # updated_at :datetime not null -# closed :boolean default(FALSE), not null +# state :string default(FALSE), not null # position :integer default(0) # branch_name :string(255) # description :text @@ -19,12 +19,35 @@ class Issue < ActiveRecord::Base include Issuable - attr_accessible :title, :assignee_id, :closed, :position, :description, - :milestone_id, :label_list, :author_id_of_changes + attr_accessible :title, :assignee_id, :position, :description, + :milestone_id, :label_list, :author_id_of_changes, + :state_event acts_as_taggable_on :labels - def self.open_for(user) - opened.assigned(user) + class << self + def cared(user) + where('assignee_id = :user', user: user.id) + end + + def open_for(user) + opened.assigned(user) + end + end + + state_machine :state, initial: :opened do + event :close do + transition [:reopened, :opened] => :closed + end + + event :reopen do + transition closed: :reopened + end + + state :opened + + state :reopened + + state :closed end end diff --git a/app/models/key.rb b/app/models/key.rb index 895e8d6cb9c..edb0bcd61fd 100644 --- a/app/models/key.rb +++ b/app/models/key.rb @@ -35,7 +35,7 @@ class Key < ActiveRecord::Base def fingerprintable_key return true unless key # Don't test if there is no key. - # `ssh-keygen -lf /dev/stdin <<< "#{key}"` errors with: redirection unexpected + file = Tempfile.new('key_file') begin file.puts key @@ -45,7 +45,7 @@ class Key < ActiveRecord::Base file.close file.unlink # deletes the temp file end - errors.add(:key, "can't be fingerprinted") if fingerprint_output.match("failed") + errors.add(:key, "can't be fingerprinted") if $?.exitstatus != 0 end def set_identifier diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 345b8d6e07d..06aa9f3c9e0 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -9,15 +9,14 @@ # author_id :integer # assignee_id :integer # title :string(255) -# closed :boolean default(FALSE), not null +# state :string(255) not null # created_at :datetime not null # updated_at :datetime not null # st_commits :text(2147483647) # st_diffs :text(2147483647) -# merged :boolean default(FALSE), not null -# state :integer default(1), not null -# milestone_id :integer +# merge_status :integer default(1), not null # +# milestone_id :integer require Rails.root.join("app/models/commit") require Rails.root.join("lib/static_model") @@ -25,11 +24,33 @@ require Rails.root.join("lib/static_model") class MergeRequest < ActiveRecord::Base include Issuable - attr_accessible :title, :assignee_id, :closed, :target_branch, :source_branch, :milestone_id, - :author_id_of_changes + attr_accessible :title, :assignee_id, :target_branch, :source_branch, :milestone_id, + :author_id_of_changes, :state_event attr_accessor :should_remove_source_branch + state_machine :state, initial: :opened do + event :close do + transition [:reopened, :opened] => :closed + end + + event :merge do + transition [:reopened, :opened] => :merged + end + + event :reopen do + transition closed: :reopened + end + + state :opened + + state :reopened + + state :closed + + state :merged + end + BROKEN_DIFF = "--broken-diff" UNCHECKED = 1 @@ -43,21 +64,33 @@ class MergeRequest < ActiveRecord::Base validates :target_branch, presence: true validate :validate_branches - def self.find_all_by_branch(branch_name) - where("source_branch LIKE :branch OR target_branch LIKE :branch", branch: branch_name) - end + scope :merged, -> { with_state(:merged) } - def self.find_all_by_milestone(milestone) - where("milestone_id = :milestone_id", milestone_id: milestone) + class << self + def find_all_by_branch(branch_name) + where("source_branch LIKE :branch OR target_branch LIKE :branch", branch: branch_name) + end + + def cared(user) + where('assignee_id = :user OR author_id = :user', user: user.id) + end + + def find_all_by_branch(branch_name) + where("source_branch LIKE :branch OR target_branch LIKE :branch", branch: branch_name) + end + + def find_all_by_milestone(milestone) + where("milestone_id = :milestone_id", milestone_id: milestone) + end end - def human_state - states = { + def human_merge_status + merge_statuses = { CAN_BE_MERGED => "can_be_merged", CANNOT_BE_MERGED => "cannot_be_merged", UNCHECKED => "unchecked" } - states[self.state] + merge_statuses[self.merge_status] end def validate_branches @@ -72,20 +105,20 @@ class MergeRequest < ActiveRecord::Base end def unchecked? - state == UNCHECKED + merge_status == UNCHECKED end def mark_as_unchecked - self.state = UNCHECKED + self.merge_status = UNCHECKED self.save end def can_be_merged? - state == CAN_BE_MERGED + merge_status == CAN_BE_MERGED end def check_if_can_be_merged - self.state = if Gitlab::Satellite::MergeAction.new(self.author, self).can_be_merged? + self.merge_status = if Gitlab::Satellite::MergeAction.new(self.author, self).can_be_merged? CAN_BE_MERGED else CANNOT_BE_MERGED @@ -98,7 +131,7 @@ class MergeRequest < ActiveRecord::Base end def reloaded_diffs - if open? && unmerged_diffs.any? + if opened? && unmerged_diffs.any? self.st_diffs = unmerged_diffs self.save end @@ -128,10 +161,6 @@ class MergeRequest < ActiveRecord::Base commits.first end - def merged? - merged && merge_event - end - def merge_event self.project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::MERGED).last end @@ -146,26 +175,16 @@ class MergeRequest < ActiveRecord::Base def probably_merged? unmerged_commits.empty? && - commits.any? && open? - end - - def open? - !closed - end - - def mark_as_merged! - self.merged = true - self.closed = true - save + commits.any? && opened? end def mark_as_unmergable - self.state = CANNOT_BE_MERGED + self.merge_status = CANNOT_BE_MERGED self.save end def reloaded_commits - if open? && unmerged_commits.any? + if opened? && unmerged_commits.any? self.st_commits = unmerged_commits save end @@ -181,7 +200,8 @@ class MergeRequest < ActiveRecord::Base end def merge!(user_id) - self.mark_as_merged! + self.merge + Event.create( project: self.project, action: Event::MERGED, diff --git a/app/models/milestone.rb b/app/models/milestone.rb index 457fe18f35b..d822a68dc7a 100644 --- a/app/models/milestone.rb +++ b/app/models/milestone.rb @@ -13,19 +13,32 @@ # class Milestone < ActiveRecord::Base - attr_accessible :title, :description, :due_date, :closed, :author_id_of_changes + attr_accessible :title, :description, :due_date, :state_event, :author_id_of_changes attr_accessor :author_id_of_changes belongs_to :project has_many :issues has_many :merge_requests - scope :active, -> { where(closed: false) } - scope :closed, -> { where(closed: true) } + scope :active, -> { with_state(:active) } + scope :closed, -> { with_state(:closed) } validates :title, presence: true validates :project, presence: true - validates :closed, inclusion: { in: [true, false] } + + state_machine :state, initial: :active do + event :close do + transition active: :closed + end + + event :activate do + transition closed: :active + end + + state :closed + + state :active + end def expired? if due_date @@ -68,17 +81,13 @@ class Milestone < ActiveRecord::Base end def can_be_closed? - open? && issues.opened.count.zero? + active? && issues.opened.count.zero? end def is_empty? total_items_count.zero? end - def open? - !closed - end - def author_id author_id_of_changes end diff --git a/app/models/namespace.rb b/app/models/namespace.rb index 4e157839369..385fa291b48 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -17,11 +17,15 @@ class Namespace < ActiveRecord::Base has_many :projects, dependent: :destroy belongs_to :owner, class_name: "User" - validates :name, presence: true, uniqueness: true + validates :owner, presence: true + validates :name, presence: true, uniqueness: true, + length: { within: 0..255 }, + format: { with: Gitlab::Regex.name_regex, + message: "only letters, digits, spaces & '_' '-' '.' allowed." } + validates :path, uniqueness: true, presence: true, length: { within: 1..255 }, format: { with: Gitlab::Regex.path_regex, message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" } - validates :owner, presence: true delegate :name, to: :owner, allow_nil: true, prefix: true diff --git a/app/models/project.rb b/app/models/project.rb index 9c62e08fb82..54bfb88e915 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -43,7 +43,7 @@ class Project < ActiveRecord::Base has_many :events, dependent: :destroy has_many :merge_requests, dependent: :destroy - has_many :issues, dependent: :destroy, order: "closed, created_at DESC" + has_many :issues, dependent: :destroy, order: "state, created_at DESC" has_many :milestones, dependent: :destroy has_many :users_projects, dependent: :destroy has_many :notes, dependent: :destroy @@ -146,7 +146,7 @@ class Project < ActiveRecord::Base end def saved? - id && valid? + id && persisted? end def import? diff --git a/app/models/repository.rb b/app/models/repository.rb index 37431fe3b0e..a5ca5533e08 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -132,16 +132,16 @@ class Repository return nil unless commit # Build file path - file_name = self.path_with_namespace + "-" + commit.id.to_s + ".tar.gz" + file_name = self.path_with_namespace.gsub("/","_") + "-" + commit.id.to_s + ".tar.gz" storage_path = Rails.root.join("tmp", "repositories") - file_path = File.join(storage_path, file_name) + file_path = File.join(storage_path, self.path_with_namespace, file_name) # Put files into a directory before archiving prefix = self.path_with_namespace + "/" # Create file if not exists unless File.exists?(file_path) - FileUtils.mkdir_p storage_path + FileUtils.mkdir_p File.dirname(file_path) file = self.repo.archive_to_file(ref, prefix, file_path) end diff --git a/app/models/user.rb b/app/models/user.rb index 10af9b8c165..4ed31c7edce 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -234,8 +234,12 @@ class User < ActiveRecord::Base keys.count == 0 end + def can_change_username? + Gitlab.config.gitlab.username_changing_enabled + end + def can_create_project? - projects_limit > personal_projects.count + projects_limit > owned_projects.count end def can_create_group? @@ -263,7 +267,7 @@ class User < ActiveRecord::Base end def cared_merge_requests - MergeRequest.where("author_id = :id or assignee_id = :id", id: self.id) + MergeRequest.cared(self) end # Remove user from all projects and diff --git a/app/models/user_team.rb b/app/models/user_team.rb index dc8cf9eeb22..2f3091c2353 100644 --- a/app/models/user_team.rb +++ b/app/models/user_team.rb @@ -21,8 +21,11 @@ class UserTeam < ActiveRecord::Base has_many :projects, through: :user_team_project_relationships has_many :members, through: :user_team_user_relationships, source: :user - validates :name, presence: true, uniqueness: true validates :owner, presence: true + validates :name, presence: true, uniqueness: true, + length: { within: 0..255 }, + format: { with: Gitlab::Regex.name_regex, + message: "only letters, digits, spaces & '_' '-' '.' allowed." } validates :path, uniqueness: true, presence: true, length: { within: 1..255 }, format: { with: Gitlab::Regex.path_regex, message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" } diff --git a/app/models/user_team_project_relationship.rb b/app/models/user_team_project_relationship.rb index a7aa88970c7..991510be936 100644 --- a/app/models/user_team_project_relationship.rb +++ b/app/models/user_team_project_relationship.rb @@ -26,6 +26,10 @@ class UserTeamProjectRelationship < ActiveRecord::Base user_team.name end + def human_max_access + UserTeam.access_roles.key(greatest_access) + end + private def check_greatest_access |
