diff options
author | Bob Van Landuyt <bob@vanlanduyt.co> | 2017-09-28 16:38:12 +0200 |
---|---|---|
committer | Bob Van Landuyt <bob@vanlanduyt.co> | 2017-10-07 11:46:23 +0200 |
commit | d328007214786c7137c31d2c73e9ee76b025e6ed (patch) | |
tree | fe4ec118148b7397890f86c6b2982ce667086c38 /app/models | |
parent | 20727db1702849b78e6714197f16f602f68cecf8 (diff) | |
download | gitlab-ce-d328007214786c7137c31d2c73e9ee76b025e6ed.tar.gz |
Create a fork network when forking a project
When no fork network exists for the source projects, we create a new
one with the correct source
Diffstat (limited to 'app/models')
-rw-r--r-- | app/models/fork_network.rb | 10 | ||||
-rw-r--r-- | app/models/fork_network_member.rb | 7 | ||||
-rw-r--r-- | app/models/project.rb | 13 |
3 files changed, 27 insertions, 3 deletions
diff --git a/app/models/fork_network.rb b/app/models/fork_network.rb index 60c8c167b21..fd2510d0a4c 100644 --- a/app/models/fork_network.rb +++ b/app/models/fork_network.rb @@ -1,3 +1,11 @@ class ForkNetwork < ActiveRecord::Base - belongs_to :root_project + belongs_to :root_project, class_name: 'Project' + has_many :fork_network_members + has_many :projects, through: :fork_network_members + + after_create :add_root_as_member, if: :root_project + + def add_root_as_member + projects << root_project + end end diff --git a/app/models/fork_network_member.rb b/app/models/fork_network_member.rb new file mode 100644 index 00000000000..6a9b52a1ef8 --- /dev/null +++ b/app/models/fork_network_member.rb @@ -0,0 +1,7 @@ +class ForkNetworkMember < ActiveRecord::Base + belongs_to :fork_network + belongs_to :project + belongs_to :forked_from_project, class_name: 'Project' + + validates :fork_network, :project, presence: true +end diff --git a/app/models/project.rb b/app/models/project.rb index 608b545f99f..aff8fd768f5 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -118,11 +118,20 @@ class Project < ActiveRecord::Base has_one :mock_monitoring_service has_one :microsoft_teams_service + # TODO: replace these relations with the fork network versions has_one :forked_project_link, foreign_key: "forked_to_project_id" has_one :forked_from_project, through: :forked_project_link has_many :forked_project_links, foreign_key: "forked_from_project_id" has_many :forks, through: :forked_project_links, source: :forked_to_project + # TODO: replace these relations with the fork network versions + + has_one :root_of_fork_network, + foreign_key: 'root_project_id', + inverse_of: :root_project, + class_name: 'ForkNetwork' + has_one :fork_network_member + has_one :fork_network, through: :fork_network_member # Merge Requests for target project should be removed with it has_many :merge_requests, foreign_key: 'target_project_id' @@ -1119,8 +1128,8 @@ class Project < ActiveRecord::Base end end - def forked_from?(project) - forked? && project == forked_from_project + def in_fork_network_of?(project) + forked? && project.fork_network == fork_network end def origin_merge_requests |