From 3e4318db919a9e40203167d5a3dcab36413adae2 Mon Sep 17 00:00:00 2001 From: Tim Harder Date: Mon, 29 Jan 2024 22:40:27 -0700 Subject: [PATCH] dep: add initial Cpn object support for pkgcraft changes --- lib/pkgcraft/dep.rb | 22 +++++++++++++++--- lib/pkgcraft/dep/cpn.rb | 50 +++++++++++++++++++++++++++++++++++++++++ lib/pkgcraft/dep/cpv.rb | 3 ++- lib/pkgcraft/dep/pkg.rb | 8 ------- lib/pkgcraft/error.rb | 1 + test/dep/test_cpn.rb | 23 +++++++++++++++++++ test/dep/test_cpv.rb | 4 ++-- test/dep/test_pkg.rb | 36 ++++------------------------- test/pkg/test_ebuild.rb | 2 +- 9 files changed, 102 insertions(+), 47 deletions(-) create mode 100644 lib/pkgcraft/dep/cpn.rb create mode 100644 test/dep/test_cpn.rb diff --git a/lib/pkgcraft/dep.rb b/lib/pkgcraft/dep.rb index cda9887..a73d51c 100644 --- a/lib/pkgcraft/dep.rb +++ b/lib/pkgcraft/dep.rb @@ -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) @@ -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" @@ -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 @@ -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 @@ -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 @@ -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 diff --git a/lib/pkgcraft/dep/cpn.rb b/lib/pkgcraft/dep/cpn.rb new file mode 100644 index 0000000..b8c0b52 --- /dev/null +++ b/lib/pkgcraft/dep/cpn.rb @@ -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 diff --git a/lib/pkgcraft/dep/cpv.rb b/lib/pkgcraft/dep/cpv.rb index a579ce2..1999960 100644 --- a/lib/pkgcraft/dep/cpv.rb +++ b/lib/pkgcraft/dep/cpv.rb @@ -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) diff --git a/lib/pkgcraft/dep/pkg.rb b/lib/pkgcraft/dep/pkg.rb index d3de4c5..43cd218 100644 --- a/lib/pkgcraft/dep/pkg.rb +++ b/lib/pkgcraft/dep/pkg.rb @@ -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 diff --git a/lib/pkgcraft/error.rb b/lib/pkgcraft/error.rb index a8b6172..9e05004 100644 --- a/lib/pkgcraft/error.rb +++ b/lib/pkgcraft/error.rb @@ -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 diff --git a/test/dep/test_cpn.rb b/test/dep/test_cpn.rb new file mode 100644 index 0000000..482f20e --- /dev/null +++ b/test/dep/test_cpn.rb @@ -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 diff --git a/test/dep/test_cpv.rb b/test/dep/test_cpv.rb index 212bed7..39862a6 100644 --- a/test/dep/test_cpv.rb +++ b/test/dep/test_cpv.rb @@ -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") @@ -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) diff --git a/test/dep/test_pkg.rb b/test/dep/test_pkg.rb index 66e6502..8511051 100644 --- a/test/dep/test_pkg.rb +++ b/test/dep/test_pkg.rb @@ -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") @@ -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") @@ -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") @@ -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]") @@ -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 diff --git a/test/pkg/test_ebuild.rb b/test/pkg/test_ebuild.rb index c6d58be..b3f8ce1 100644 --- a/test/pkg/test_ebuild.rb +++ b/test/pkg/test_ebuild.rb @@ -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