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

language_detection.rb « gitlab « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 7600e60b904e5dac6c6486177b79ee4746021b5e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# frozen_string_literal: true

module Gitlab
  class LanguageDetection
    MAX_LANGUAGES = 5

    def initialize(repository, repository_languages)
      @repository = repository
      @repository_languages = repository_languages
    end

    def languages
      detection.keys
    end

    def language_color(name)
      detection.dig(name, :color)
    end

    # Newly detected languages, returned in a structure accepted by
    # Gitlab::Database.bulk_insert
    def insertions(programming_languages)
      lang_to_id = programming_languages.map { |p| [p.name, p.id] }.to_h

      (languages - previous_language_names).map do |new_lang|
        {
          project_id: @repository.project.id,
          share: detection[new_lang][:value],
          programming_language_id: lang_to_id[new_lang]
        }
      end
    end

    # updates analyses which records only require updating of their share
    def updates
      to_update = @repository_languages.select do |lang|
        detection.key?(lang.name) && detection[lang.name][:value] != lang.share
      end

      to_update.map do |lang|
        { programming_language_id: lang.programming_language_id, share: detection[lang.name][:value] }
      end
    end

    # Returns the ids of the programming languages that do not occur in the detection
    # as current repository languages
    def deletions
      @repository_languages.map do |repo_lang|
        next if detection.key?(repo_lang.name)

        repo_lang.programming_language_id
      end.compact
    end

    private

    def previous_language_names
      @previous_language_names ||= @repository_languages.map(&:name)
    end

    def detection
      @detection ||=
        @repository
        .languages
        .first(MAX_LANGUAGES)
        .map { |l| [l[:label], l] }
        .to_h
    end
  end
end