summaryrefslogtreecommitdiff
path: root/app/models
diff options
context:
space:
mode:
Diffstat (limited to 'app/models')
-rw-r--r--app/models/ability.rb2
-rw-r--r--app/models/concerns/issuable.rb13
-rw-r--r--app/models/event.rb4
-rw-r--r--app/models/issue.rb33
-rw-r--r--app/models/key.rb4
-rw-r--r--app/models/merge_request.rb94
-rw-r--r--app/models/milestone.rb27
-rw-r--r--app/models/namespace.rb8
-rw-r--r--app/models/project.rb4
-rw-r--r--app/models/repository.rb6
-rw-r--r--app/models/user.rb8
-rw-r--r--app/models/user_team.rb5
-rw-r--r--app/models/user_team_project_relationship.rb4
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