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

create_package_service.rb « go « packages « services « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 4e8b8ef8d6b72b57c8b52be8bd08993677a573ab (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 Packages
  module Go
    class CreatePackageService < BaseService
      GoZipSizeError = Class.new(StandardError)

      attr_accessor :version

      def initialize(project, user = nil, version:)
        super(project, user)

        @version = version
      end

      def execute
        # check for existing package to avoid SQL errors due to the index
        package = ::Packages::Go::PackageFinder.new(version.mod.project, version.mod.name, version.name).execute
        return package if package

        # this can be expensive, so do it outside the transaction
        files = {}
        files[:mod] = prepare_file(version, :mod, version.gomod)
        files[:zip] = prepare_file(version, :zip, version.archive.string)

        ActiveRecord::Base.transaction do
          # create new package and files
          package = create_package
          files.each { |type, (file, digests)| create_file(package, type, file, digests) }
          package
        end
      end

      private

      def prepare_file(version, type, content)
        file = CarrierWaveStringFile.new(content)
        raise GoZipSizeError, "#{version.mod.name}@#{version.name}.#{type} exceeds size limit" if file.size > project.actual_limits.golang_max_file_size

        digests = {
          md5: Digest::MD5.hexdigest(content),
          sha1: Digest::SHA1.hexdigest(content),
          sha256: Digest::SHA256.hexdigest(content)
        }

        [file, digests]
      end

      def create_package
        version.mod.project.packages.create!(
          name: version.mod.name,
          version: version.name,
          package_type: :golang,
          created_at: version.commit.committed_date
        )
      end

      def create_file(package, type, file, digests)
        CreatePackageFileService.new(package,
          file: file,
          size: file.size,
          file_name: "#{version.name}.#{type}",
          file_md5: digests[:md5],
          file_sha1: digests[:sha1],
          file_sha256: digests[:sha256]
        ).execute
      end
    end
  end
end