Skip to content

Commit

Permalink
dep: add initial Cpn object support for pkgcraft changes
Browse files Browse the repository at this point in the history
  • Loading branch information
radhermit committed Jan 30, 2024
1 parent 44a46f7 commit 3e4318d
Show file tree
Hide file tree
Showing 9 changed files with 102 additions and 47 deletions.
22 changes: 19 additions & 3 deletions lib/pkgcraft/dep.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,13 @@
module Pkgcraft
# FFI bindings for Dep related functionality
module C
# Wrapper for Cpn pointers
class Cpn < AutoPointer
def self.release(ptr)
C.pkgcraft_cpn_free(ptr)
end
end

# Wrapper for Cpv pointers
class Cpv < AutoPointer
def self.release(ptr)
Expand Down Expand Up @@ -33,6 +40,7 @@ def self.release(ptr)
end
end

require_relative "dep/cpn"
require_relative "dep/cpv"
require_relative "dep/pkg"
require_relative "dep/base"
Expand All @@ -41,6 +49,15 @@ def self.release(ptr)
module Pkgcraft
# FFI bindings for Dep related functionality
module C
# cpn support
attach_function :pkgcraft_cpn_free, [:pointer], :void
attach_function :pkgcraft_cpn_new, [:string], Cpn
attach_function :pkgcraft_cpn_category, [Cpn], String
attach_function :pkgcraft_cpn_package, [Cpn], String
attach_function :pkgcraft_cpn_hash, [Cpn], :uint64
attach_function :pkgcraft_cpn_cmp, [Cpn, Cpn], :int
attach_function :pkgcraft_cpn_str, [Cpn], String

# cpv support
attach_function :pkgcraft_cpv_free, [:pointer], :void
attach_function :pkgcraft_cpv_new, [:string], Cpv
Expand All @@ -52,7 +69,7 @@ module C
attach_function :pkgcraft_cpv_pr, [Cpv], String
attach_function :pkgcraft_cpv_pv, [Cpv], String
attach_function :pkgcraft_cpv_pvr, [Cpv], String
attach_function :pkgcraft_cpv_cpn, [Cpv], String
attach_function :pkgcraft_cpv_cpn, [Cpv], Pkgcraft::Dep::Cpn
attach_function :pkgcraft_cpv_intersects, [Cpv, Cpv], :bool
attach_function :pkgcraft_cpv_intersects_dep, [Cpv, Dep], :bool
attach_function :pkgcraft_cpv_hash, [Cpv], :uint64
Expand All @@ -63,7 +80,6 @@ module C
# dep support
attach_function :pkgcraft_dep_free, [:pointer], :void
attach_function :pkgcraft_dep_new, [:string, Eapi], Dep
attach_function :pkgcraft_dep_new_cpn, [:string], Dep
attach_function :pkgcraft_dep_blocker, [Dep], :int
attach_function :pkgcraft_dep_blocker_from_str, [:string], :int
attach_function :pkgcraft_dep_category, [Dep], String
Expand All @@ -80,7 +96,7 @@ module C
attach_function :pkgcraft_dep_pr, [Dep], String
attach_function :pkgcraft_dep_pv, [Dep], String
attach_function :pkgcraft_dep_pvr, [Dep], String
attach_function :pkgcraft_dep_cpn, [Dep], String
attach_function :pkgcraft_dep_cpn, [Dep], Pkgcraft::Dep::Cpn
attach_function :pkgcraft_dep_cpv, [Dep], String
attach_function :pkgcraft_dep_intersects, [Dep, Dep], :bool
attach_function :pkgcraft_dep_intersects_cpv, [Dep, Cpv], :bool
Expand Down
50 changes: 50 additions & 0 deletions lib/pkgcraft/dep/cpn.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# frozen_string_literal: true

module Pkgcraft
module Dep
# Cpn object support (category/package)
class Cpn < C::Cpn
include InspectPointerRender
include Comparable

# Create a Cpn from a pointer.
def self.from_ptr(ptr)
obj = allocate
obj.instance_variable_set(:@ptr, ptr)
obj
end

private_class_method :from_ptr

def initialize(str)
@ptr = C.pkgcraft_cpn_new(str.to_s)
raise Error::InvalidCpn if @ptr.null?
end

def category
@category = C.pkgcraft_cpn_category(self) if @category.nil?
@category
end

def package
@package = C.pkgcraft_cpn_package(self) if @package.nil?
@package
end

def to_s
C.pkgcraft_cpn_str(self)
end

def <=>(other)
C.pkgcraft_cpn_cmp(self, other)
end

alias eql? ==

def hash
@hash = C.pkgcraft_cpn_hash(self) if @hash.nil?
@hash
end
end
end
end
3 changes: 2 additions & 1 deletion lib/pkgcraft/dep/cpv.rb
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ def pvr
end

def cpn
C.pkgcraft_cpv_cpn(self)
ptr = C.pkgcraft_cpv_cpn(self)
Cpn.send(:from_ptr, ptr)
end

def intersects(other)
Expand Down
8 changes: 0 additions & 8 deletions lib/pkgcraft/dep/pkg.rb
Original file line number Diff line number Diff line change
Expand Up @@ -196,13 +196,5 @@ def hash
@hash
end
end

# Unversioned package dependency
class Cpn < Dep
def initialize(str)
@ptr = C.pkgcraft_dep_new_cpn(str.to_s)
raise Error::InvalidDep if @ptr.null?
end
end
end
end
1 change: 1 addition & 0 deletions lib/pkgcraft/error.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ def initialize(msg = nil)
end

class ConfigError < PkgcraftError; end
class InvalidCpn < PkgcraftError; end
class InvalidCpv < PkgcraftError; end
class InvalidDep < PkgcraftError; end
class InvalidRepo < PkgcraftError; end
Expand Down
23 changes: 23 additions & 0 deletions test/dep/test_cpn.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# frozen_string_literal: true

require "set"

require "test_helper"

class TestCpn < Minitest::Test
include Pkgcraft::Dep
include Pkgcraft::Error

def test_new
cpn = Cpn.new("cat/pkg")
assert_equal("cat", cpn.category)
assert_equal("pkg", cpn.package)

# invalid
["cat/pkg-1", "=cat/pkg-1", "", nil].each do |s|
assert_raises InvalidCpn do
Cpn.new(s)
end
end
end
end
4 changes: 2 additions & 2 deletions test/dep/test_cpv.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def test_new
assert_equal("r2", cpv1.pr)
assert_equal("1", cpv1.pv)
assert_equal("1-r2", cpv1.pvr)
assert_equal("cat/pkg", cpv1.cpn)
assert_equal(Cpn.new("cat/pkg"), cpv1.cpn)
assert_equal("cat/pkg-1-r2", cpv1.to_s)
assert_includes(cpv1.inspect, "cat/pkg-1-r2")

Expand All @@ -34,7 +34,7 @@ def test_new
assert_equal("r0", cpv2.pr)
assert_equal("2", cpv2.pv)
assert_equal("2", cpv2.pvr)
assert_equal("cat/pkg", cpv2.cpn)
assert_equal(Cpn.new("cat/pkg"), cpv2.cpn)
assert_equal("cat/pkg-2", cpv2.to_s)
assert_includes(cpv2.inspect, "cat/pkg-2")
assert_operator(cpv1, :<, cpv2)
Expand Down
36 changes: 4 additions & 32 deletions test/dep/test_pkg.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def test_new
assert_equal("r2", dep1.pr)
assert_equal("1", dep1.pv)
assert_equal("1-r2", dep1.pvr)
assert_equal("cat/pkg", dep1.cpn)
assert_equal(Cpn.new("cat/pkg"), dep1.cpn)
assert_equal("cat/pkg-1-r2", dep1.cpv)
assert_equal("=cat/pkg-1-r2", dep1.to_s)
assert_includes(dep1.inspect, "=cat/pkg-1-r2")
Expand All @@ -35,7 +35,7 @@ def test_new
assert_equal("r0", dep2.pr)
assert_equal("2", dep2.pv)
assert_equal("2", dep2.pvr)
assert_equal("cat/pkg", dep2.cpn)
assert_equal(Cpn.new("cat/pkg"), dep2.cpn)
assert_equal("cat/pkg-2", dep2.cpv)
assert_equal("=cat/pkg-2", dep2.to_s)
assert_includes(dep2.inspect, "=cat/pkg-2")
Expand All @@ -49,7 +49,7 @@ def test_new
assert_nil(dep.pr)
assert_nil(dep.pv)
assert_nil(dep.pvr)
assert_equal("cat/pkg", dep.cpn)
assert_equal(Cpn.new("cat/pkg"), dep.cpn)
assert_equal("cat/pkg", dep.cpv)
assert_equal("cat/pkg", dep.to_s)
assert_includes(dep.inspect, "cat/pkg")
Expand All @@ -72,7 +72,7 @@ def test_new
assert_equal("r2", dep.pr)
assert_equal("1", dep.pv)
assert_equal("1-r2", dep.pvr)
assert_equal("cat/pkg", dep.cpn)
assert_equal(Cpn.new("cat/pkg"), dep.cpn)
assert_equal("cat/pkg-1-r2", dep.cpv)
assert_equal("!!>=cat/pkg-1-r2:0/2=::repo[a,b,c]", dep.to_s)
assert_includes(dep.inspect, "!!>=cat/pkg-1-r2:0/2=::repo[a,b,c]")
Expand Down Expand Up @@ -230,31 +230,3 @@ def test_hash
end
end
end

class TestCpn < Minitest::Test
include Pkgcraft
include Pkgcraft::Dep
include Pkgcraft::Error

def test_new
dep = Cpn.new("cat/pkg")
assert_nil(dep.version)
assert_nil(dep.revision)
assert_equal("pkg", dep.p)
assert_equal("pkg", dep.pf)
assert_nil(dep.pr)
assert_nil(dep.pv)
assert_nil(dep.pvr)
assert_equal("cat/pkg", dep.cpn)
assert_equal("cat/pkg", dep.cpv)
assert_equal("cat/pkg", dep.to_s)
assert_includes(dep.inspect, "cat/pkg")

# invalid
["=cat/pkg-1", "cat/pkg-1", "", nil].each do |s|
assert_raises InvalidDep do
Cpn.new(s)
end
end
end
end
2 changes: 1 addition & 1 deletion test/pkg/test_ebuild.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def test_cpv
assert_equal("r2", pkg.pr)
assert_equal("1", pkg.pv)
assert_equal("1-r2", pkg.pvr)
assert_equal("cat/pkg", pkg.cpn)
assert_equal(Cpn.new("cat/pkg"), pkg.cpn)
end

def test_eapi
Expand Down

0 comments on commit 3e4318d

Please sign in to comment.