Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/projects/forks/divergence_counts.rb')
-rw-r--r--app/models/projects/forks/divergence_counts.rb72
1 files changed, 0 insertions, 72 deletions
diff --git a/app/models/projects/forks/divergence_counts.rb b/app/models/projects/forks/divergence_counts.rb
deleted file mode 100644
index 7d630b00083..00000000000
--- a/app/models/projects/forks/divergence_counts.rb
+++ /dev/null
@@ -1,72 +0,0 @@
-# frozen_string_literal: true
-
-module Projects
- module Forks
- # Class for calculating the divergence of a fork with the source project
- class DivergenceCounts
- LATEST_COMMITS_COUNT = 10
- EXPIRATION_TIME = 8.hours
-
- def initialize(project, ref)
- @project = project
- @fork_repo = project.repository
- @source_repo = project.fork_source.repository
- @ref = ref
- end
-
- def counts
- ahead, behind = divergence_counts
-
- { ahead: ahead, behind: behind }
- end
-
- private
-
- attr_reader :project, :fork_repo, :source_repo, :ref
-
- def cache_key
- @cache_key ||= ['project_forks', project.id, ref, 'divergence_counts']
- end
-
- def divergence_counts
- fork_sha = fork_repo.commit(ref).sha
- source_sha = source_repo.commit.sha
-
- cached_source_sha, cached_fork_sha, counts = Rails.cache.read(cache_key)
- return counts if cached_source_sha == source_sha && cached_fork_sha == fork_sha
-
- counts = calculate_divergence_counts(fork_sha, source_sha)
-
- Rails.cache.write(cache_key, [source_sha, fork_sha, counts], expires_in: EXPIRATION_TIME)
-
- counts
- end
-
- def calculate_divergence_counts(fork_sha, source_sha)
- # If the upstream latest commit exists in the fork repo, then
- # it's possible to calculate divergence counts within the fork repository.
- return fork_repo.diverging_commit_count(fork_sha, source_sha) if fork_repo.commit(source_sha)
-
- # Otherwise, we need to find a commit that exists both in the fork and upstream
- # in order to use this commit as a base for calculating divergence counts.
- # Considering the fact that a user usually creates a fork to contribute to the upstream,
- # it is expected that they have a limited number of commits ahead of upstream.
- # Let's take the latest N commits and check their existence upstream.
- last_commits_shas = fork_repo.commits(ref, limit: LATEST_COMMITS_COUNT).map(&:sha)
- existence_hash = source_repo.check_objects_exist(last_commits_shas)
- first_matched_commit_sha = last_commits_shas.find { |sha| existence_hash[sha] }
-
- # If we can't find such a commit, we return early and tell the user that the branches
- # have diverged and action is required.
- return unless first_matched_commit_sha
-
- # Otherwise, we use upstream to calculate divergence counts from the matched commit
- ahead, behind = source_repo.diverging_commit_count(first_matched_commit_sha, source_sha)
- # And add the number of commits a fork is ahead of the first matched commit
- ahead += last_commits_shas.index(first_matched_commit_sha)
-
- [ahead, behind]
- end
- end
- end
-end