File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -17,6 +17,7 @@ cdef class EbuildPkg(Pkg):
1717 cdef object _required_use
1818 cdef object _restrict
1919 cdef object _src_uri
20+ cdef frozenset _defined_phases
2021 cdef tuple _homepage
2122 cdef tuple _keywords
2223 cdef tuple _inherit
Original file line number Diff line number Diff line change @@ -165,6 +165,18 @@ cdef class EbuildPkg(Pkg):
165165 self ._src_uri = None if deps is NULL else DepSet.from_ptr(deps)
166166 return self ._src_uri
167167
168+ @property
169+ def defined_phases (self ):
170+ """ Get a package's defined phases."""
171+ cdef char ** phases
172+ cdef size_t length
173+
174+ if self ._defined_phases is None :
175+ phases = C.pkgcraft_ebuild_pkg_defined_phases(self ._ebuild_pkg, & length)
176+ self ._defined_phases = frozenset (phases[i].decode() for i in range (length))
177+ C.pkgcraft_str_array_free(phases, length)
178+ return self ._defined_phases
179+
168180 @property
169181 def homepage (self ):
170182 """ Get a package's homepage."""
Original file line number Diff line number Diff line change @@ -333,6 +333,12 @@ cdef extern from "pkgcraft.h":
333333 # The argument must be a non-null EbuildPkg pointer.
334334 DepSet * pkgcraft_ebuild_pkg_bdepend(EbuildPkg * p);
335335
336+ # Return a package's defined phases.
337+ #
338+ # # Safety
339+ # The argument must be a non-null EbuildPkg pointer.
340+ char ** pkgcraft_ebuild_pkg_defined_phases(EbuildPkg * p, uintptr_t * len );
341+
336342 # Return a package's DEPEND.
337343 #
338344 # Returns NULL on nonexistence.
Original file line number Diff line number Diff line change @@ -122,6 +122,25 @@ def test_src_uri(self, repo):
122122 pkg = repo .create_pkg (src_uri = 'https://a.com/b.tar.gz' )
123123 assert str (pkg .src_uri ) == 'https://a.com/b.tar.gz'
124124
125+ def test_defined_phases (self , repo ):
126+ # none
127+ pkg = repo .create_pkg ()
128+ assert not pkg .defined_phases
129+
130+ # single
131+ data = "src_configure() { :; }"
132+ pkg = repo .create_pkg (data = data )
133+ assert pkg .defined_phases == {'configure' }
134+
135+ # multiple
136+ data = textwrap .dedent ("""
137+ src_prepare() { :; }
138+ src_configure() { :; }
139+ src_compile() { :; }
140+ """ )
141+ pkg = repo .create_pkg (data = data )
142+ assert pkg .defined_phases == {'prepare' , 'configure' , 'compile' }
143+
125144 def test_homepage (self , repo ):
126145 # none
127146 pkg = repo .create_pkg ()
You can’t perform that action at this time.
0 commit comments