Class: MilkTea::PackageLock

Inherits:
Object
  • Object
show all
Defined in:
lib/milk_tea/packages/lock.rb

Defined Under Namespace

Classes: CheckResult, LockedPackage, Result

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path, source_resolver: PackageSourceResolver.new) ⇒ PackageLock

Returns a new instance of PackageLock.



42
43
44
45
# File 'lib/milk_tea/packages/lock.rb', line 42

def initialize(path, source_resolver: PackageSourceResolver.new)
  @path = File.expand_path(path)
  @source_resolver = source_resolver
end

Class Method Details

.check(path, source_resolver: PackageSourceResolver.new) ⇒ Object



30
31
32
# File 'lib/milk_tea/packages/lock.rb', line 30

def self.check(path, source_resolver: PackageSourceResolver.new)
  new(path, source_resolver:).check
end

.load(path, source_resolver: PackageSourceResolver.new) ⇒ Object



26
27
28
# File 'lib/milk_tea/packages/lock.rb', line 26

def self.load(path, source_resolver: PackageSourceResolver.new)
  new(path, source_resolver:).load
end

.locked_packages(path, source_resolver: PackageSourceResolver.new) ⇒ Object



34
35
36
# File 'lib/milk_tea/packages/lock.rb', line 34

def self.locked_packages(path, source_resolver: PackageSourceResolver.new)
  new(path, source_resolver:).locked_packages
end

.write(path, source_resolver: PackageSourceResolver.new) ⇒ Object



38
39
40
# File 'lib/milk_tea/packages/lock.rb', line 38

def self.write(path, source_resolver: PackageSourceResolver.new)
  new(path, source_resolver:).write
end

Instance Method Details

#checkObject



91
92
93
94
95
96
97
98
99
100
# File 'lib/milk_tea/packages/lock.rb', line 91

def check
  lock_path, expected_content = rendered_lockfile
  return CheckResult.new(lock_path:, expected_content:, actual_content: nil, status: :missing) unless File.file?(lock_path)

  actual_content = File.read(lock_path)
  status = actual_content == expected_content ? :current : :stale
  CheckResult.new(lock_path:, expected_content:, actual_content:, status:)
rescue SystemCallError => e
  raise PackageLockError, "failed to read #{lock_path || File.join(@path, 'package.lock')}: #{e.message}"
end

#loadObject

Raises:



47
48
49
50
51
52
53
# File 'lib/milk_tea/packages/lock.rb', line 47

def load
  _root_manifest, _lock_path, _root_package_name, root_package_id, records_by_id = locked_records

  raise PackageLockError, "package.lock missing root package #{root_package_id}" unless records_by_id.key?(root_package_id)

  build_locked_node(root_package_id, records_by_id, {}, [])
end

#locked_packagesObject

Raises:



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/milk_tea/packages/lock.rb', line 55

def locked_packages
  _root_manifest, lock_path, _root_package_name, root_package_id, schema_version, packages = lockfile_context

  records_by_id = packages.each_with_object({}) do |entry, records|
    record = build_locked_package_record(entry, lock_path, schema_version)
    if records.key?(record[:instance_id])
      raise PackageLockError, "duplicate package instance #{record[:instance_id]} in #{lock_path}"
    end

    records[record[:instance_id]] = record
  end

  raise PackageLockError, "package.lock missing root package #{root_package_id}" unless records_by_id.key?(root_package_id)

  records_by_id.values.map do |record|
    dependency_names = record[:dependency_ids].map do |dependency_id|
      dependency_record = records_by_id[dependency_id]
      unless dependency_record
        raise PackageLockError,
              "package.lock missing dependency #{dependency_id} referenced by #{record[:package_name]}"
      end

      dependency_record[:package_name]
    end

    LockedPackage.new(
      package_name: record[:package_name],
      instance_id: record[:instance_id],
      identity: record[:identity],
      manifest_path: record[:manifest_path],
      dependency_names:,
      dependency_ids: record[:dependency_ids],
    )
  end
end

#writeObject



102
103
104
105
106
107
108
109
110
# File 'lib/milk_tea/packages/lock.rb', line 102

def write
  lock_path, content = rendered_lockfile

  PackageAtomicWrite.write(lock_path, content)

  Result.new(lock_path:, content:)
rescue SystemCallError => e
  raise PackageLockError, "failed to write #{lock_path || File.join(@path, 'package.lock')}: #{e.message}"
end