@@ -3620,6 +3620,7 @@ export async function createPythonBom(path, options) {
3620
3620
let dependencies = [ ] ;
3621
3621
let pkgList = [ ] ;
3622
3622
let formulationList = [ ] ;
3623
+ const packageTechniqueMap = new Map ( ) ;
3623
3624
const tempDir = mkdtempSync ( join ( getTmpDir ( ) , "cdxgen-venv-" ) ) ;
3624
3625
let parentComponent = createDefaultParentComponent ( path , "pypi" , options ) ;
3625
3626
// We are checking only the root here for pipenv
@@ -3851,6 +3852,10 @@ export async function createPythonBom(path, options) {
3851
3852
const basePath = dirname ( f ) ;
3852
3853
let reqData ;
3853
3854
let frozen = false ;
3855
+
3856
+ reqData = readFileSync ( f , { encoding : "utf-8" } ) ;
3857
+ await parseReqFile ( reqData , true , packageTechniqueMap ) ;
3858
+
3854
3859
// Attempt to pip freeze in a virtualenv to improve precision
3855
3860
if ( options . installDeps ) {
3856
3861
// If there are multiple requirements files then the tree is getting constructed for each one
@@ -3862,6 +3867,35 @@ export async function createPythonBom(path, options) {
3862
3867
parentComponent ,
3863
3868
) ;
3864
3869
if ( pkgMap . pkgList ?. length ) {
3870
+ pkgMap . pkgList . forEach ( ( pkg ) => {
3871
+ const existingTechnique = packageTechniqueMap . get (
3872
+ pkg . name . toLowerCase ( ) ,
3873
+ ) ;
3874
+ if ( existingTechnique ) {
3875
+ // Update evidence to preserve original technique
3876
+ if ( pkg . evidence ?. identity ?. methods ) {
3877
+ pkg . evidence . identity . methods =
3878
+ pkg . evidence . identity . methods . map ( ( method ) => ( {
3879
+ ...method ,
3880
+ technique : existingTechnique ,
3881
+ } ) ) ;
3882
+ }
3883
+ } else {
3884
+ // New transitive dependency - mark as manifest-analysis derived
3885
+ packageTechniqueMap . set (
3886
+ pkg . name . toLowerCase ( ) ,
3887
+ "manifest-analysis" ,
3888
+ ) ;
3889
+ if ( pkg . evidence ?. identity ?. methods ) {
3890
+ pkg . evidence . identity . methods =
3891
+ pkg . evidence . identity . methods . map ( ( method ) => ( {
3892
+ ...method ,
3893
+ technique : "manifest-analysis" ,
3894
+ } ) ) ;
3895
+ }
3896
+ }
3897
+ } ) ;
3898
+
3865
3899
pkgList = pkgList . concat ( pkgMap . pkgList ) ;
3866
3900
frozen = pkgMap . frozen ;
3867
3901
}
0 commit comments