From f43de92b70f2b552324d04f0736f3929cca7a397 Mon Sep 17 00:00:00 2001 From: Michael Mekler Date: Tue, 25 Nov 2025 14:00:17 +0200 Subject: [PATCH 1/9] Updated gradle-dep-tree plugin and added support for the included builds param --- cli/docs/flags.go | 20 ++++++++++-------- cli/scancommands.go | 11 ++++++---- commands/audit/auditparams.go | 6 ++++-- sca/bom/buildinfo/buildinfobom.go | 1 + sca/bom/buildinfo/technologies/common.go | 12 ++++++----- .../technologies/java/deptreemanager.go | 19 +++++++++++------ sca/bom/buildinfo/technologies/java/gradle.go | 3 ++- .../java/resources/gradle-dep-tree.jar | Bin 12253 -> 13989 bytes utils/auditbasicparams.go | 8 +++++++ utils/xray/xrayutils.go | 16 ++++++++------ 10 files changed, 62 insertions(+), 34 deletions(-) diff --git a/cli/docs/flags.go b/cli/docs/flags.go index 6fc2bc134..009585464 100644 --- a/cli/docs/flags.go +++ b/cli/docs/flags.go @@ -7,6 +7,7 @@ import ( "github.com/jfrog/jfrog-cli-core/v2/common/cliutils" pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common" "github.com/jfrog/jfrog-cli-core/v2/plugins/components" + "github.com/jfrog/jfrog-cli-security/commands/git/contributors" "github.com/jfrog/jfrog-cli-security/commands/xray/offlineupdate" "github.com/jfrog/jfrog-cli-security/utils" @@ -71,15 +72,16 @@ const ( InsecureTls = "insecure-tls" // Generic command flags - SpecFlag = "spec" - Threads = "threads" - Recursive = "recursive" - RegexpFlag = "regexp" - AntFlag = "ant" - Project = "project" - Exclusions = "exclusions" - IncludeDirs = "include-dirs" - UseWrapper = "use-wrapper" + SpecFlag = "spec" + Threads = "threads" + Recursive = "recursive" + RegexpFlag = "regexp" + AntFlag = "ant" + Project = "project" + Exclusions = "exclusions" + IncludeDirs = "include-dirs" + UseWrapper = "use-wrapper" + UseIncludedBuilds = "use-included-builds" ) const ( diff --git a/cli/scancommands.go b/cli/scancommands.go index 707f6aafc..fcae26beb 100644 --- a/cli/scancommands.go +++ b/cli/scancommands.go @@ -17,6 +17,7 @@ import ( "github.com/jfrog/jfrog-cli-core/v2/plugins/components" coreConfig "github.com/jfrog/jfrog-cli-core/v2/utils/config" "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" + flags "github.com/jfrog/jfrog-cli-security/cli/docs" auditSpecificDocs "github.com/jfrog/jfrog-cli-security/cli/docs/auditspecific" enrichDocs "github.com/jfrog/jfrog-cli-security/cli/docs/enrich" @@ -28,14 +29,15 @@ import ( scanDocs "github.com/jfrog/jfrog-cli-security/cli/docs/scan/scan" uploadCdxDocs "github.com/jfrog/jfrog-cli-security/cli/docs/upload" + "github.com/jfrog/jfrog-client-go/utils/io/fileutils" + "github.com/jfrog/jfrog-client-go/utils/log" + "github.com/urfave/cli" + "github.com/jfrog/jfrog-cli-security/commands/enrich" "github.com/jfrog/jfrog-cli-security/commands/source_mcp" "github.com/jfrog/jfrog-cli-security/jas" "github.com/jfrog/jfrog-cli-security/sca/bom/indexer" "github.com/jfrog/jfrog-cli-security/utils/xray" - "github.com/jfrog/jfrog-client-go/utils/io/fileutils" - "github.com/jfrog/jfrog-client-go/utils/log" - "github.com/urfave/cli" "github.com/jfrog/jfrog-cli-security/commands/audit" "github.com/jfrog/jfrog-cli-security/commands/curation" @@ -491,7 +493,8 @@ func CreateAuditCmd(c *components.Context) (string, string, *coreConfig.ServerDe SetNpmScope(c.GetStringFlagValue(flags.DepType)). SetPipRequirementsFile(c.GetStringFlagValue(flags.RequirementsFile)). SetMaxTreeDepth(c.GetStringFlagValue(flags.MaxTreeDepth)). - SetExclusions(pluginsCommon.GetStringsArrFlagValue(c, flags.Exclusions)) + SetExclusions(pluginsCommon.GetStringsArrFlagValue(c, flags.Exclusions)). + SetUseIncludedBuilds(c.GetBoolFlagValue(flags.UseIncludedBuilds)) return xrayVersion, xscVersion, serverDetails, auditCmd, err } diff --git a/commands/audit/auditparams.go b/commands/audit/auditparams.go index 71d49b395..11dd839e4 100644 --- a/commands/audit/auditparams.go +++ b/commands/audit/auditparams.go @@ -3,6 +3,8 @@ package audit import ( "time" + "github.com/jfrog/jfrog-client-go/xray/services" + "github.com/jfrog/jfrog-cli-security/sca/bom" "github.com/jfrog/jfrog-cli-security/sca/bom/buildinfo" "github.com/jfrog/jfrog-cli-security/sca/bom/buildinfo/technologies" @@ -12,7 +14,6 @@ import ( "github.com/jfrog/jfrog-cli-security/utils/severityutils" "github.com/jfrog/jfrog-cli-security/utils/techutils" "github.com/jfrog/jfrog-cli-security/utils/xray/scangraph" - "github.com/jfrog/jfrog-client-go/xray/services" ) type AuditParams struct { @@ -206,7 +207,8 @@ func (params *AuditParams) ToBuildInfoBomGenParams() (bomParams technologies.Bui // Python params PipRequirementsFile: params.PipRequirementsFile(), // Pnpm params - MaxTreeDepth: params.MaxTreeDepth(), + MaxTreeDepth: params.MaxTreeDepth(), + UseIncludedBuilds: params.UseIncludedBuilds(), } return } diff --git a/sca/bom/buildinfo/buildinfobom.go b/sca/bom/buildinfo/buildinfobom.go index fe767126c..7d5eb95a5 100644 --- a/sca/bom/buildinfo/buildinfobom.go +++ b/sca/bom/buildinfo/buildinfobom.go @@ -195,6 +195,7 @@ func GetTechDependencyTree(params technologies.BuildInfoBomGeneratorParams, arti UseWrapper: params.UseWrapper, IsCurationCmd: params.IsCurationCmd, CurationCacheFolder: curationCacheFolder, + UseIncludedBuilds: params.UseIncludedBuilds, }, tech) case techutils.Npm: depTreeResult.FullDepTrees, uniqueDepsIds, err = npm.BuildDependencyTree(params) diff --git a/sca/bom/buildinfo/technologies/common.go b/sca/bom/buildinfo/technologies/common.go index 71fb5459c..8eb3683a0 100644 --- a/sca/bom/buildinfo/technologies/common.go +++ b/sca/bom/buildinfo/technologies/common.go @@ -10,10 +10,6 @@ import ( buildInfoUtils "github.com/jfrog/build-info-go/utils" "github.com/jfrog/jfrog-cli-core/v2/utils/config" "github.com/jfrog/jfrog-cli-core/v2/utils/tests" - "github.com/jfrog/jfrog-cli-security/utils" - "github.com/jfrog/jfrog-cli-security/utils/techutils" - "github.com/jfrog/jfrog-cli-security/utils/xray" - "github.com/jfrog/jfrog-cli-security/utils/xray/scangraph" "github.com/jfrog/jfrog-client-go/artifactory/services/fspatterns" clientutils "github.com/jfrog/jfrog-client-go/utils" "github.com/jfrog/jfrog-client-go/utils/errorutils" @@ -21,6 +17,11 @@ import ( "github.com/jfrog/jfrog-client-go/utils/log" "github.com/jfrog/jfrog-client-go/xray/services" xscservices "github.com/jfrog/jfrog-client-go/xsc/services" + + "github.com/jfrog/jfrog-cli-security/utils" + "github.com/jfrog/jfrog-cli-security/utils/techutils" + "github.com/jfrog/jfrog-cli-security/utils/xray" + "github.com/jfrog/jfrog-cli-security/utils/xray/scangraph" ) const ( @@ -57,7 +58,8 @@ type BuildInfoBomGeneratorParams struct { NpmIgnoreNodeModules bool NpmOverwritePackageLock bool // Pnpm params - MaxTreeDepth string + MaxTreeDepth string + UseIncludedBuilds bool } func (bbp *BuildInfoBomGeneratorParams) SetNpmScope(depType string) *BuildInfoBomGeneratorParams { diff --git a/sca/bom/buildinfo/technologies/java/deptreemanager.go b/sca/bom/buildinfo/technologies/java/deptreemanager.go index 50c0f2da1..5b11857cb 100644 --- a/sca/bom/buildinfo/technologies/java/deptreemanager.go +++ b/sca/bom/buildinfo/technologies/java/deptreemanager.go @@ -31,16 +31,18 @@ type DepTreeParams struct { IsMavenDepTreeInstalled bool IsCurationCmd bool CurationCacheFolder string + UseIncludedBuilds bool } type DepTreeManager struct { - server *config.ServerDetails - depsRepo string - useWrapper bool + server *config.ServerDetails + depsRepo string + useWrapper bool + useIncludedBuilds bool } func NewDepTreeManager(params *DepTreeParams) DepTreeManager { - return DepTreeManager{useWrapper: params.UseWrapper, depsRepo: params.DepsRepo, server: params.Server} + return DepTreeManager{useWrapper: params.UseWrapper, depsRepo: params.DepsRepo, server: params.Server, useIncludedBuilds: params.UseIncludedBuilds} } // The structure of a dependency tree of a module in a Gradle/Maven project, as created by the gradle-dep-tree and maven-dep-tree plugins. @@ -78,10 +80,13 @@ func GetModuleTreeAndDependencies(module *moduleDepTree) (*xrayUtils.GraphNode, childId := GavPackageTypeIdentifier + childName childrenList = append(childrenList, childId) } + moduleTreeMap[dependencyId] = xray.DepTreeNode{ - Classifier: dependency.Classifier, - Types: dependency.Types, - Children: childrenList, + Classifier: dependency.Classifier, + Types: dependency.Types, + Children: childrenList, + Unresolved: dependency.Unresolved, + Configurations: dependency.Configurations, } } return xray.BuildXrayDependencyTree(moduleTreeMap, GavPackageTypeIdentifier+module.Root) diff --git a/sca/bom/buildinfo/technologies/java/gradle.go b/sca/bom/buildinfo/technologies/java/gradle.go index 6dce38665..3c3a51991 100644 --- a/sca/bom/buildinfo/technologies/java/gradle.go +++ b/sca/bom/buildinfo/technologies/java/gradle.go @@ -159,7 +159,8 @@ func (gdt *gradleDepTreeManager) execGradleDepTree(depTreeDir string) (outputFil "-q", gradleNoCacheFlag, fmt.Sprintf("-Dcom.jfrog.depsTreeOutputFile=%s", outputFilePath), - "-Dcom.jfrog.includeAllBuildFiles=true"} + "-Dcom.jfrog.includeAllBuildFiles=true", + fmt.Sprintf("-Dcom.jfrog.includeIncludedBuilds=%t", gdt.useIncludedBuilds)} log.Info("Running gradle deps tree command:", gradleExecPath, strings.Join(tasks, " ")) if output, err := exec.Command(gradleExecPath, tasks...).CombinedOutput(); err != nil { return nil, errorutils.CheckErrorf("error running gradle-dep-tree: %s\n%s", err.Error(), string(output)) diff --git a/sca/bom/buildinfo/technologies/java/resources/gradle-dep-tree.jar b/sca/bom/buildinfo/technologies/java/resources/gradle-dep-tree.jar index b855f258b416de4c7ef9a0d487010afc882de99e..f7ad124e84f25f09fd36aabf262adc419061ef51 100644 GIT binary patch delta 6874 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 delta 5114 zcmZWtXHXMN*Nve`?;s$(hawVsiS*u!bQO`Ngc?982_2M9Ab`H9T5Wo zY0^QY35dSx^Un9qGvChKxo6Lwy|Z^__s5=MDE>Z`i9P`#831toI^d16zjZ1VKjGgj zt4mn>XCB2xSobHF2~hpXl4EuYgFpZPM1-v3=0!xC&zsS!(kLSdQG9ISLk{U-5zB34 zLXT+@>x-($QY9Jgp39J~O4fZcgbFbIh&q6WkH2;6CmC`5^^UV%w8@o}#&cc&?0q&E zU)t^p|8agn+0Em7o6lP$DIj6+cKEyx1#k6eQMfRrF0*a>}h(8tgN>2n_g^gK3$SUeD5J{@9d9iz0rm$V;<>oCg}v5!T)Zox7G* zxq+Roc9oDN-#$N6{MYCqiN?dnA3nLZpvHnbp`YH>_g7BYo^`OB-p%HMX2?(wWcu7l z*j`TKHnn*Bwtb*7{5nBAg;VWLO&Vjp@RKw|o&WyP3zMGlwwltGv^;%K>^H?9%1aI3 zZ@V!neXLfbiaszTDMj@<%m-O2Ffobg&97JNn>V!{rTYctwu#}_M~1C22K5D2XCo`o z6m3Bj4t@%q&y8T&EwPuxC96rs%8GW8LH6y->Hp?mYyHkCb$5G!p2 zX&Jf0Da%l|IlYY%crq3q^HX0-S9biau|s=Z2uK7yn*poJ)N?%wi4kcwu^Dt9OD%$x z3LXje6-+o8y#n4)SUbGxG(RqExp4P5vQ^zJ|4i9cJh(=jlgA6+=@#O_&P|LuW^oN< zlTpo=jQizP%3T3-9e00;#ypKa$kafLG0)h?6wi`aT6Dtp49L^`o>rq;Rk*aaA_Y|T z3cA<@jBCR^WcNhBC4|h+FxL^-My2r0bA;6@Q6zdPAPC3nx}B?+B+mm}+qpV2<{g547*3xKxQe6S*6Sa?WW2<-98;}ESM z9>w)2y~0tA>dClQWV=EGK*SN}{~p4hi;lD*5T*MA!lxekGgAWq@mv6a000>#C4|Ve zCJnji>W?tC-K)A=_{3=>ZDlTv$LfW|p>WjG0VEHg5xZbc`Dqw5whSz3;2W8h}Jp7*NJSK8Y z^g_D)s!gqHxzLs2A|W5NRUvxm!QxP~l#cVlCXDMI9XTIMg{nfjswWO~&JKn*&eo1D z;TJqt;mJQIj1d}$s)_vX?y^_q2|u#c5aJ3Ux+|l3a+U&YoEB5dSpBeEe|?4RSbc!$_RFr__Mn!xaQvy7J>C z65~fU33gMBpXYZ}3GE(DBd%v&%-!mBhTqj>zm=)q&@-4pW~JMX8@yJA4HSBt=srJ( z#U3J&uE~@nv13Wb35nE(21a0_h>ga0+dz$Yaae3s6s^OiGl(-z(@;O&*4&n_9Gqcv z8qFcEh?AAOzrJi9IbR!p+SE&)Z8HN_jS#&AWkfUytIG$fgXwT&|t`_#_V)X3HS#5`N(DYV6uX+Q8-J9x#vU8pY3 z^iLirn0%x`Y`Lp^lZbARVjh(a)E$X~kx)+4U9CKylMfwxSTVZfvB2_$&4aDi~gYX(kQ8`zZy$r}8sChGOx~wqzgUM##yqwuHAW$)8C9hDq@TTB7DNLn&Wc z#0GPvm*3Mg#)^+``D6m^vSglnExmg0a{_S*qZvR3wIH&~iO|qiip#CZI*wes0kiS9 zhKVoi4QM$LnRLWDs3gw7wRC*E&p^T67G}A=akv0MES*BtX1Ga)7KJf{@VFAyR+7lqOI^~|g&PAiF^Am4p+Bkw<@qmuU@>m?X|hQ{8dgRESvnf zwIm`btg}qeKqZWiZ4%|uYwKsxH4{Spdb32C?@Q3U$|KF>P5q#mv>{OFhsrC7*hYWcHxjgnEZ?J;g58<4wHrLXc*`8T8Uh5mMnMML77d0wDbUvzfJb`HhK z?SvQ5zPz&KFjSt&xu@sAYq%@5g%V%Iz_8>u z3e4I2Lr)uSrB0yu%`EpB_}ib>4qu|dR}z|*`(J`B7RN~}AVaa^Y<)cfvWpdIVzaI((X~WAz=LvDB^ndE|>I$#oVvh~~=Lu46`W3I_3w zAjD#w1Z(o0JL8gY5B}27#-&%WH7m}6F0)LjJF*)I}XZpQyIQfXpGKekT5r+)MPl>uIPsoq}DaaJRRv!hia?uK`KFFgchtk1sEm-E-Y@zWJrydT4Y?<!2IXPHQH46fs6dQU&y z<7%CkfZw#xLB{$zTyQqop{6Nmy){ zjI>rgI~f@QyA0Q!>U6nm$5PAdItnQ;HzafLJDA574so9<>KUEp%A4gjjqX2sR#Cj_ z?`b;Ij4pW8r}4DgU0nl<#X7kj7%O}F3A7^#RY?n+^_v$yw4EUOny0V47w(c>W5m}O zmf%gNgW9^d?hxdF6OZcRHN_RYV&+GU45KBD;V<9oC+$a;;hx!Zy?JOV>Zr4%@dN`k z+VJ=Eq4O$sx;-XQa!KyiR=nTJQp)-hEANTkdN*owER)9sITK{KK9{Qh$r_lf6WdZO z!~W{NZ4v{le-DZfHBPMd;!V3UJEzBTyYf#P>{Q>Ad{e2hC}POd^=w2c6>Qk8u>aPy z;#&u>jrGffnf=sj!Xt}q%2j!0un7e;+t7H4XY`Af-a87Z;;+sbndgR}&~!))*O0;O z0%oU;lYR76O3#iOy^gnfkLl}lci|r{Yo!lF1MVeUs-1EmY5*IKzQ8TQ`l;RbyB+Sn zqc%cacAazS6cLk0Z(Iy01q0%Y^G6D^FUHP$c+FEP`7$8xrs zFlLLPmgX5y%tYH8oRsWqDLc{CDwnH~>X?=nxf=WM@frL;A zFnG+iqJnIhEd?3Fr0~qa16G^X!=@w=nK+hpP96m3iK+C-w0L^8l-rXDK>0dMuwN*N zooneszqTPPoNnSB>;x7hI+M0pjxO*rZ&hPvtmrU0fnl2ud~q?(>Bcx2rHtlfULj>6 z>Qbn6A(X9=olO0JwPeFx5Tuv|F>ESi-*b3kv60o}yIPsE%Mz)z>OD}{m@g3KDg+(p zKx~SfUcVPReY#sHyZ(t+S^kvJBRH>_&soJN9gZ~M4g<~Q@sE#vCj zd7TG!f;U+4@}Q-*8h>1?@2bcx9E4ean>%Oow$96eJTTYnDva68*sfw--0R$WqR3bLb^niTIg(jo+h>vb(FzrKD z>4Y$|#AcR4hZ>f|-(jenH>S`xfUlf+YZQFf{Z`1g^)buG?+`m=P)`5h*Br)~@1Gn5 z`A457*cXm%J((eLJs^kGPARj0r`{cO&7cCLMAiaZ)vX@bGE$nR;M@rJUuht=hybh} z-VYQ2v9txl{7iV7_}l)Ed*wR+OSmi&MOU_I(#x z;@P(mgLH3|{R2W+Q!H91#4s;sNlJ-DfqMa+@h>x-v)N`0{d zeMpKKFCuVx0q>*A%GF`Hqj!h+3XI`(I)K$z@Q?4zgil<%VcexP8i3IH>M$507`GVx zD{$J+6OsociwHK?z7#BjkFVgKn-@B!_T;!ngvFm1oEnYoY-!Zq`j|bu7Tmun{N(iLyU&#D#m{bh-%1;5V0j zh#Zf2sJb%IJC^e$q;gxPYw`Jj;?UFESwPWk;Fo^Y6D6&6givV2J#@ZC-5%Qf*j#0R zpjBOE!}W6&0W1oRf>RwCGQ(YG$DL5%Q}P@1JW}S9ln)LXc#CGK(o~}tYbQt;F1T7$ zVeFr(bl_5creZN6*f3_G6K^-vUhZlWWT<4^**!h@>d8_5>h8Z$%iWQ zhwC1Qz!%`te~qPv2}b(=qA;Nf z(to%O<~O8&Z78I;q|`saMKbmua3~4>2MB>7e=REHW3c$&ZOB((DcXOVQ~&@wav98r zOp|8f{Idf1J$}1ae+SKfGXOvX*i#)qs!DPG)%^Rz|9>JtQTXX^4L!1)fC*V9MZxvA zUPJ(;=I??Hga82F|D?aQru4|KV9CEC#}CtrAFcra)c;R3$B3-sW Date: Tue, 25 Nov 2025 14:40:27 +0200 Subject: [PATCH 2/9] Merge from dev --- .../java/resources/gradle-dep-tree.jar | Bin 13989 -> 13939 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/sca/bom/buildinfo/technologies/java/resources/gradle-dep-tree.jar b/sca/bom/buildinfo/technologies/java/resources/gradle-dep-tree.jar index f7ad124e84f25f09fd36aabf262adc419061ef51..2d0bef9d785effefa54df04da94b7647bcb46dfb 100644 GIT binary patch delta 6720 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 T5&wT{*%6vgH11Uj{uTcN5D4;! delta 6781 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 Dv2N7J From 559a1a816f61951f32b55b55bc8578b538da5170 Mon Sep 17 00:00:00 2001 From: Michael Mekler Date: Tue, 25 Nov 2025 14:46:20 +0200 Subject: [PATCH 3/9] Formatting --- commands/audit/auditparams.go | 1 - sca/bom/buildinfo/technologies/common.go | 11 ++++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/commands/audit/auditparams.go b/commands/audit/auditparams.go index 6f28dc3ce..db5f7152e 100644 --- a/commands/audit/auditparams.go +++ b/commands/audit/auditparams.go @@ -231,7 +231,6 @@ func (params *AuditParams) ToBuildInfoBomGenParams() (bomParams technologies.Bui // Python params PipRequirementsFile: params.PipRequirementsFile(), // Pnpm params - MaxTreeDepth: params.MaxTreeDepth(), MaxTreeDepth: params.MaxTreeDepth(), UseIncludedBuilds: params.UseIncludedBuilds(), } diff --git a/sca/bom/buildinfo/technologies/common.go b/sca/bom/buildinfo/technologies/common.go index 3f18d7b06..d408d5af7 100644 --- a/sca/bom/buildinfo/technologies/common.go +++ b/sca/bom/buildinfo/technologies/common.go @@ -10,10 +10,6 @@ import ( buildInfoUtils "github.com/jfrog/build-info-go/utils" "github.com/jfrog/jfrog-cli-core/v2/utils/config" "github.com/jfrog/jfrog-cli-core/v2/utils/tests" - "github.com/jfrog/jfrog-cli-security/utils" - "github.com/jfrog/jfrog-cli-security/utils/techutils" - "github.com/jfrog/jfrog-cli-security/utils/xray" - "github.com/jfrog/jfrog-cli-security/utils/xray/scangraph" "github.com/jfrog/jfrog-client-go/artifactory/services/fspatterns" clientutils "github.com/jfrog/jfrog-client-go/utils" "github.com/jfrog/jfrog-client-go/utils/errorutils" @@ -21,6 +17,11 @@ import ( "github.com/jfrog/jfrog-client-go/utils/log" "github.com/jfrog/jfrog-client-go/xray/services" xscservices "github.com/jfrog/jfrog-client-go/xsc/services" + + "github.com/jfrog/jfrog-cli-security/utils" + "github.com/jfrog/jfrog-cli-security/utils/techutils" + "github.com/jfrog/jfrog-cli-security/utils/xray" + "github.com/jfrog/jfrog-cli-security/utils/xray/scangraph" ) const ( @@ -59,7 +60,7 @@ type BuildInfoBomGeneratorParams struct { // Pnpm params MaxTreeDepth string // NuGet params - SolutionFilePath string + SolutionFilePath string UseIncludedBuilds bool } From da36f6260ae4da4e40c5c5319ae61fe5a5df6bb5 Mon Sep 17 00:00:00 2001 From: Michael Mekler Date: Thu, 27 Nov 2025 13:29:22 +0200 Subject: [PATCH 4/9] Added IT with example project --- .../technologies/java/gradle_test.go | 25 +++ .../java/resources/gradle-dep-tree.jar | Bin 13939 -> 14067 bytes .../go/curation-project/go.sum | 3 + .../.jfrog/projects/gradle.yaml | 4 + .../api/build.gradle | 81 ++++++++ .../api/gradle.properties | 3 + .../api/settings.gradle | 5 + .../main/java/org/gradle/api/PersonList.java | 38 ++++ .../src/main/java/org/gradle/api/package.html | 19 ++ .../main/java/org/gradle/apiImpl/Impl.java | 26 +++ .../build.gradle | 76 +++++++ .../gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 55616 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + .../gradle-example-included-builds/gradlew | 188 ++++++++++++++++++ .../gradlew.bat | 100 ++++++++++ .../services/gradle.properties | 3 + .../services/settings.gradle | 8 + .../services/webservice/build.gradle | 46 +++++ .../java/org/gradle/webservice/TestTest.java | 35 ++++ .../org/gradle/webservice/TestTestTest.java | 31 +++ .../settings.gradle | 4 + .../shared/build.gradle | 38 ++++ .../main/java/org/gradle/shared/Person.java | 42 ++++ .../java/org/gradle/shared/package-info.java | 20 ++ .../org/gradle/shared/main.properties | 17 ++ 26 files changed, 820 insertions(+) create mode 100644 tests/testdata/projects/package-managers/go/curation-project/go.sum create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/.jfrog/projects/gradle.yaml create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/build.gradle create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/gradle.properties create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/settings.gradle create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/src/main/java/org/gradle/api/PersonList.java create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/src/main/java/org/gradle/api/package.html create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/src/main/java/org/gradle/apiImpl/Impl.java create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/build.gradle create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/gradle.properties create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/gradle/wrapper/gradle-wrapper.jar create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/gradle/wrapper/gradle-wrapper.properties create mode 100755 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/gradlew create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/gradlew.bat create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/gradle.properties create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/settings.gradle create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/webservice/build.gradle create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/webservice/src/main/java/org/gradle/webservice/TestTest.java create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/webservice/src/test/java/org/gradle/webservice/TestTestTest.java create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/settings.gradle create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/shared/build.gradle create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/shared/src/main/java/org/gradle/shared/Person.java create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/shared/src/main/java/org/gradle/shared/package-info.java create mode 100644 tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/shared/src/main/resources/org/gradle/shared/main.properties diff --git a/sca/bom/buildinfo/technologies/java/gradle_test.go b/sca/bom/buildinfo/technologies/java/gradle_test.go index 03d81a45a..af0ddb2be 100644 --- a/sca/bom/buildinfo/technologies/java/gradle_test.go +++ b/sca/bom/buildinfo/technologies/java/gradle_test.go @@ -12,6 +12,7 @@ import ( "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" "github.com/jfrog/jfrog-cli-core/v2/utils/ioutils" "github.com/jfrog/jfrog-cli-core/v2/utils/tests" + "github.com/jfrog/jfrog-cli-security/sca/bom/buildinfo/technologies" "github.com/stretchr/testify/assert" @@ -91,6 +92,30 @@ func TestGradleTreesWithConfig(t *testing.T) { } } +func TestGradleTreesWithConfig_UsingIncludedBuilds(t *testing.T) { + // Create and change directory to test workspace + tempDirPath, cleanUp := technologies.CreateTestWorkspace(t, filepath.Join("projects", "package-managers", "gradle", "gradle-example-included-builds")) + defer cleanUp() + assert.NoError(t, os.Chmod(filepath.Join(tempDirPath, "gradlew"), 0700)) + + // Run getModulesDependencyTrees + modulesDependencyTrees, uniqueDeps, err := buildGradleDependencyTree(&DepTreeParams{UseWrapper: true, UseIncludedBuilds: true}) + if assert.NoError(t, err) && assert.NotNil(t, modulesDependencyTrees) { + assert.Len(t, modulesDependencyTrees, 4) + assert.Len(t, uniqueDeps, 10) + // Check module + module := tests.GetAndAssertNode(t, modulesDependencyTrees, "org.jfrog.test.gradle.publish:api:1.0-SNAPSHOT") + assert.Len(t, module.Nodes, 4) + + // Check direct dependency + directDependency := tests.GetAndAssertNode(t, module.Nodes, "commons-lang:commons-lang:2.4") + assert.Len(t, directDependency.Nodes, 1) + + // Check transitive dependency + tests.GetAndAssertNode(t, directDependency.Nodes, "commons-io:commons-io:1.2") + } +} + func TestIsGradleWrapperExist(t *testing.T) { // Check Gradle wrapper doesn't exist isWrapperExist, err := isGradleWrapperExist() diff --git a/sca/bom/buildinfo/technologies/java/resources/gradle-dep-tree.jar b/sca/bom/buildinfo/technologies/java/resources/gradle-dep-tree.jar index 2d0bef9d785effefa54df04da94b7647bcb46dfb..f11a80316e6da5dc106ee6ff17f5026b5a17b74a 100644 GIT binary patch delta 5079 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 diff --git a/tests/testdata/projects/package-managers/go/curation-project/go.sum b/tests/testdata/projects/package-managers/go/curation-project/go.sum new file mode 100644 index 000000000..c8bdc71cc --- /dev/null +++ b/tests/testdata/projects/package-managers/go/curation-project/go.sum @@ -0,0 +1,3 @@ +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/.jfrog/projects/gradle.yaml b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/.jfrog/projects/gradle.yaml new file mode 100644 index 000000000..7cb5dd938 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/.jfrog/projects/gradle.yaml @@ -0,0 +1,4 @@ +version: 1 +type: gradle +usePlugin: true +useWrapper: true diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/build.gradle b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/build.gradle new file mode 100644 index 000000000..4eed76a60 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/build.gradle @@ -0,0 +1,81 @@ +configurations { + spi +} + +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath(group: 'org.jfrog.buildinfo', name: 'build-info-extractor-gradle', version: '4+') + } + configurations.classpath { + resolutionStrategy { + cacheDynamicVersionsFor 0, 'seconds' + cacheChangingModulesFor 0, 'seconds' + } + } +} + +apply plugin: 'com.jfrog.artifactory' +group = 'org.jfrog.test.gradle.publish' +version = currentVersion +status = 'Integration' +repositories { + mavenCentral() +} + +apply plugin: 'java' +apply plugin: 'maven-publish' + +dependencies { + testImplementation 'junit:junit:4.7' +} + +publishing { + publications { + mavenJava(MavenPublication) { + from components.java + artifact(file("$rootDir/gradle.properties")) + } + } +} + +apply plugin: 'ivy-publish' + +publishing { + publications { + ivyJava(IvyPublication) { + from components.java + artifact(file("$rootDir/settings.gradle")) { + name "gradle-settings" + extension "txt" + type "text" + } + // The config below will add a extra attribute to the ivy.xml + // See http://ant.apache.org/ivy/history/latest-milestone/concept.html#extra + descriptor.withXml { + asNode().info[0].attributes().put('e:architecture', 'amd64') + } + } + } +} + +artifactoryPublish { + publications(publishing.publications.ivyJava) + properties { + simpleFile '**:**:**:*@*', simpleFile: 'only on settings file' + } +} + +dependencies { + implementation project(':shared') + implementation module("commons-lang:commons-lang:2.4") { + dependency("commons-io:commons-io:1.2") + } + implementation group: 'org.apache.wicket', name: 'wicket', version: '1.3.7' + +} + +// Just a smoke test that using this option does not lead to any exception +compileJava.options.compilerArgs = ['-Xlint:unchecked'] diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/gradle.properties b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/gradle.properties new file mode 100644 index 000000000..266947aa2 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/gradle.properties @@ -0,0 +1,3 @@ +currentVersion=1.0-SNAPSHOT +artifactory_user=admin +artifactory_password=password diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/settings.gradle b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/settings.gradle new file mode 100644 index 000000000..588965a05 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/settings.gradle @@ -0,0 +1,5 @@ +rootProject.name = 'api' +//include 'proj' + +include ':shared' +project(':shared').projectDir=file("$rootDir/../shared") \ No newline at end of file diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/src/main/java/org/gradle/api/PersonList.java b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/src/main/java/org/gradle/api/PersonList.java new file mode 100644 index 000000000..1d80a16b3 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/src/main/java/org/gradle/api/PersonList.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2011 JFrog Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gradle.api; + +import org.gradle.apiImpl.Impl; +import org.gradle.shared.Person; + +import java.util.ArrayList; + + +public class PersonList { + private ArrayList persons = new ArrayList(); + + public void doSomethingWithImpl() { + org.apache.commons.lang.builder.ToStringBuilder stringBuilder; + try { + Class.forName("org.apache.commons.io.FileUtils"); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + new Impl().implMethod(); + } + +} diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/src/main/java/org/gradle/api/package.html b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/src/main/java/org/gradle/api/package.html new file mode 100644 index 000000000..cea998a80 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/src/main/java/org/gradle/api/package.html @@ -0,0 +1,19 @@ + + + +

These are the API classes

+ diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/src/main/java/org/gradle/apiImpl/Impl.java b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/src/main/java/org/gradle/apiImpl/Impl.java new file mode 100644 index 000000000..76cf0cc22 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/src/main/java/org/gradle/apiImpl/Impl.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2011 JFrog Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gradle.apiImpl; + + +public class Impl { + + public void implMethod() { + double a = 4.0 * 4; + } + +} diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/build.gradle b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/build.gradle new file mode 100644 index 000000000..7214b9e74 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/build.gradle @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2013 JFrog Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath(group: 'org.jfrog.buildinfo', name: 'build-info-extractor-gradle', version: '4+') + } + configurations.classpath { + resolutionStrategy { + cacheDynamicVersionsFor 0, 'seconds' + cacheChangingModulesFor 0, 'seconds' + } + } +} + + +allprojects { + apply plugin: 'com.jfrog.artifactory' + group = 'org.jfrog.test.gradle.publish' + version = currentVersion + status = 'Integration' + repositories { + mavenCentral() + } +} + +// Setting this property to true will make the artifactoryPublish task +// skip this module (in our case, the root module): +artifactoryPublish.skip = true + +artifactory { + clientConfig.setIncludeEnvVars(true) + clientConfig.info.addEnvironmentProperty('test.adding.dynVar',new java.util.Date().toString()) + + contextUrl = 'http://127.0.0.1:8081/artifactory' + publish { + repository { + repoKey = 'libs-snapshot-local' // The Artifactory repository key to publish to + username = "${artifactory_user}" // The publisher user name + password = "${artifactory_password}" // The publisher password + // This is an optional section for configuring Ivy publication (when publishIvy = true). + ivy { + ivyLayout = '[organization]/[module]/ivy-[revision].xml' + artifactLayout = '[organization]/[module]/[revision]/[module]-[revision](-[classifier]).[ext]' + mavenCompatible = true //Convert any dots in an [organization] layout value to path separators, similar to Maven's groupId-to-path conversion. True if not specified + } + } + defaults { + // Reference to Gradle publications defined in the build script. + // This is how we tell the Artifactory Plugin which artifacts should be + // published to Artifactory. + publications('mavenJava') + publishArtifacts = true + // Properties to be attached to the published artifacts. + properties = ['qa.level': 'basic', 'dev.team' : 'core'] + publishPom = true // Publish generated POM files to Artifactory (true by default) + publishIvy = true // Publish generated Ivy descriptor files to Artifactory (true by default) + } + } +} diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/gradle.properties b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/gradle.properties new file mode 100644 index 000000000..266947aa2 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/gradle.properties @@ -0,0 +1,3 @@ +currentVersion=1.0-SNAPSHOT +artifactory_user=admin +artifactory_password=password diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/gradle/wrapper/gradle-wrapper.jar b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..5c2d1cf016b3885f6930543d57b744ea8c220a1a GIT binary patch literal 55616 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/gradlew.bat b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/gradlew.bat new file mode 100644 index 000000000..9618d8d96 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/gradlew.bat @@ -0,0 +1,100 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/gradle.properties b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/gradle.properties new file mode 100644 index 000000000..266947aa2 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/gradle.properties @@ -0,0 +1,3 @@ +currentVersion=1.0-SNAPSHOT +artifactory_user=admin +artifactory_password=password diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/settings.gradle b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/settings.gradle new file mode 100644 index 000000000..f5f747740 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/settings.gradle @@ -0,0 +1,8 @@ +rootProject.name = 'services' +include 'webservice' + +include ':shared' +project(':shared').projectDir=file("$rootDir/../shared") + +include ':api' +project(':api').projectDir=file("$rootDir/../api") \ No newline at end of file diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/webservice/build.gradle b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/webservice/build.gradle new file mode 100644 index 000000000..875ff6f01 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/webservice/build.gradle @@ -0,0 +1,46 @@ +apply plugin: 'war' + +apply plugin: 'java' +apply plugin: 'maven-publish' + +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath(group: 'org.jfrog.buildinfo', name: 'build-info-extractor-gradle', version: '4+') + } + configurations.classpath { + resolutionStrategy { + cacheDynamicVersionsFor 0, 'seconds' + cacheChangingModulesFor 0, 'seconds' + } + } +} + +apply plugin: 'com.jfrog.artifactory' +group = 'org.jfrog.test.gradle.publish' +version = currentVersion +status = 'Integration' +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'junit:junit:4.7' +} + +publishing { + publications { + mavenJava(MavenPublication) { + from components.java + artifact(file("$rootDir/gradle.properties")) + } + } +} + +dependencies { + implementation project(':shared'), 'commons-collections:commons-collections:3.2@jar', 'commons-io:commons-io:1.2', 'commons-lang:commons-lang:2.4@jar' + implementation group: 'org.apache.wicket', name: 'wicket', version: '1.3.7' + implementation project(':api') +} diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/webservice/src/main/java/org/gradle/webservice/TestTest.java b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/webservice/src/main/java/org/gradle/webservice/TestTest.java new file mode 100644 index 000000000..4843cca41 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/webservice/src/main/java/org/gradle/webservice/TestTest.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2011 JFrog Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gradle.webservice; + +import org.apache.commons.collections.list.GrowthList; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.lang.builder.ToStringBuilder; +import org.gradle.api.PersonList; +import org.gradle.shared.Person; + +public class TestTest { + private String name; + + public void method() { + FilenameUtils.separatorsToUnix("my/unix/filename"); + ToStringBuilder.reflectionToString(new Person("name")); + new GrowthList(); + new PersonList().doSomethingWithImpl(); // compile with api-spi, runtime with api + } + +} diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/webservice/src/test/java/org/gradle/webservice/TestTestTest.java b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/webservice/src/test/java/org/gradle/webservice/TestTestTest.java new file mode 100644 index 000000000..b8e22a4ad --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/webservice/src/test/java/org/gradle/webservice/TestTestTest.java @@ -0,0 +1,31 @@ +/* + * Copyright 2007 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.gradle.webservice; + +import junit.framework.TestCase; + +/** + * @author Hans Dockter + */ +public class TestTestTest extends TestCase { + public void testClasspath() { + new TestTest().method(); + } + + public void testApiCompileClasspath() { + new org.gradle.api.PersonList(); + } +} diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/settings.gradle b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/settings.gradle new file mode 100644 index 000000000..3f3ffa403 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/settings.gradle @@ -0,0 +1,4 @@ +include "shared" + +includeBuild 'api' +includeBuild 'services' \ No newline at end of file diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/shared/build.gradle b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/shared/build.gradle new file mode 100644 index 000000000..fb7e86462 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/shared/build.gradle @@ -0,0 +1,38 @@ +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath(group: 'org.jfrog.buildinfo', name: 'build-info-extractor-gradle', version: '4+') + } + configurations.classpath { + resolutionStrategy { + cacheDynamicVersionsFor 0, 'seconds' + cacheChangingModulesFor 0, 'seconds' + } + } +} + +apply plugin: 'com.jfrog.artifactory' +group = 'org.jfrog.test.gradle.publish' +version = currentVersion +status = 'Integration' +repositories { + mavenCentral() +} + +apply plugin: 'java' +apply plugin: 'maven-publish' + +dependencies { + testImplementation 'junit:junit:4.7' +} + +publishing { + publications { + mavenJava(MavenPublication) { + from components.java + artifact(file("$rootDir/gradle.properties")) + } + } +} \ No newline at end of file diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/shared/src/main/java/org/gradle/shared/Person.java b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/shared/src/main/java/org/gradle/shared/Person.java new file mode 100644 index 000000000..d9ed11ee8 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/shared/src/main/java/org/gradle/shared/Person.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2011 JFrog Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gradle.shared; + +import java.io.IOException; +import java.util.Properties; + +public class Person { + private String name; + + public Person(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String readProperty() throws IOException { + Properties properties = new Properties(); + properties.load(getClass().getClassLoader().getResourceAsStream("org/gradle/shared/main.properties")); + return properties.getProperty("main"); + } +} diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/shared/src/main/java/org/gradle/shared/package-info.java b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/shared/src/main/java/org/gradle/shared/package-info.java new file mode 100644 index 000000000..7c5f65caf --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/shared/src/main/java/org/gradle/shared/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2011 JFrog Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * These are the shared classes. + */ +package org.gradle.shared; diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/shared/src/main/resources/org/gradle/shared/main.properties b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/shared/src/main/resources/org/gradle/shared/main.properties new file mode 100644 index 000000000..68fed4627 --- /dev/null +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/shared/src/main/resources/org/gradle/shared/main.properties @@ -0,0 +1,17 @@ +# +# Copyright (C) 2011 JFrog Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +main=mainValue From 22ff97f8dea27e5fc06af3890def4a796aafef95 Mon Sep 17 00:00:00 2001 From: Michael Mekler Date: Sun, 30 Nov 2025 14:41:31 +0200 Subject: [PATCH 5/9] conan://ninja:1.13.2 released in 25.11.2025 --- sca/bom/buildinfo/technologies/conan/conan_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sca/bom/buildinfo/technologies/conan/conan_test.go b/sca/bom/buildinfo/technologies/conan/conan_test.go index 57b0dcd69..96235b2ae 100644 --- a/sca/bom/buildinfo/technologies/conan/conan_test.go +++ b/sca/bom/buildinfo/technologies/conan/conan_test.go @@ -10,6 +10,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/jfrog/jfrog-cli-core/v2/utils/tests" + "github.com/jfrog/jfrog-cli-security/sca/bom/buildinfo/technologies" ) @@ -18,10 +19,10 @@ var expectedResult = &xrayUtils.GraphNode{ Nodes: []*xrayUtils.GraphNode{ {Id: "conan://zlib:1.3.1"}, {Id: "conan://openssl:3.0.9", Nodes: []*xrayUtils.GraphNode{{Id: "conan://zlib:1.3.1"}}}, - {Id: "conan://meson:1.4.1", Nodes: []*xrayUtils.GraphNode{{Id: "conan://ninja:1.13.1"}}}, + {Id: "conan://meson:1.4.1", Nodes: []*xrayUtils.GraphNode{{Id: "conan://ninja:1.13.2"}}}, }, } -var expectedUniqueDeps = []string{"conan://openssl:3.0.9", "conan://zlib:1.3.1", "conan://meson:1.4.1", "conan://ninja:1.13.1"} +var expectedUniqueDeps = []string{"conan://openssl:3.0.9", "conan://zlib:1.3.1", "conan://meson:1.4.1", "conan://ninja:1.13.2"} func TestParseConanDependencyTree(t *testing.T) { _, cleanUp := technologies.CreateTestWorkspace(t, filepath.Join("other", "conan")) From cd96fe2ba50cbe7fad6e5da76e7922d50c7771f7 Mon Sep 17 00:00:00 2001 From: Michael Mekler Date: Tue, 2 Dec 2025 13:42:40 +0200 Subject: [PATCH 6/9] Updated download-jars --- buildscripts/download-jars.sh | 2 +- cli/docs/flags.go | 5 +++++ .../java/resources/gradle-dep-tree.jar | Bin 14067 -> 14426 bytes 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/buildscripts/download-jars.sh b/buildscripts/download-jars.sh index 50f55207e..5518cf9fe 100755 --- a/buildscripts/download-jars.sh +++ b/buildscripts/download-jars.sh @@ -7,7 +7,7 @@ # https://github.com/jfrog/maven-dep-tree # Once you have updated the versions mentioned below, please execute this script from the root directory of the jfrog-cli-core to ensure the JAR files are updated. -GRADLE_DEP_TREE_VERSION="3.1.0" +GRADLE_DEP_TREE_VERSION="3.2.0" # Changing this version also requires a change in mavenDepTreeVersion within utils/java/mvn.go. MAVEN_DEP_TREE_VERSION="1.1.5" diff --git a/cli/docs/flags.go b/cli/docs/flags.go index ee9b501d0..67cd1755c 100644 --- a/cli/docs/flags.go +++ b/cli/docs/flags.go @@ -273,6 +273,11 @@ var flagsMap = map[string]components.Flag{ "[Gradle, Maven] Set to true if you'd like to use the Gradle or Maven wrapper.", components.WithBoolDefaultValue(true), ), + UseIncludedBuilds: components.NewBoolFlag( + UseIncludedBuilds, + "[Gradle] Set to true if you'd like to take into account included builds (composite builds) of gradle projects, in addition to including subprojects", + components.WithBoolDefaultValue(false), + ), WorkingDirs: components.NewStringFlag(WorkingDirs, "A comma-separated(,) list of relative working directories, to determine the audit targets locations. If flag isn't provided, a recursive scan is triggered from the root directory of the project."), OutputDir: components.NewStringFlag(OutputDir, "Target directory to save partial results to.", components.SetHiddenStrFlag()), UploadRepoPath: components.NewStringFlag(UploadRepoPath, "Artifactory repository name or path to upload the cyclonedx file to. If no name or path are provided, a local generic repository will be created which will automatically be indexed by Xray.", components.WithStrDefaultValue("import-cdx-scan-results")), diff --git a/sca/bom/buildinfo/technologies/java/resources/gradle-dep-tree.jar b/sca/bom/buildinfo/technologies/java/resources/gradle-dep-tree.jar index f11a80316e6da5dc106ee6ff17f5026b5a17b74a..9ca8c9c8e59752b70f7ae94dffc1cc2eb36baf77 100644 GIT binary patch delta 5552 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 U|C{R}8KKBSfcB#-kw3Hl1Kcxc(EtDd delta 5220 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 aWnPr{Zm?}p2CS0*F0nio!h^#8hW`te(w4XY From e11d8571e23fd7668bde98cb4df598609342a4c5 Mon Sep 17 00:00:00 2001 From: Michael Mekler Date: Wed, 7 Jan 2026 11:30:10 +0200 Subject: [PATCH 7/9] Comments --- cli/docs/flags.go | 2 +- sca/bom/buildinfo/technologies/conan/conan_test.go | 1 - .../projects/package-managers/go/curation-project/go.sum | 3 --- .../gradle-example-included-builds/api/gradle.properties | 2 -- .../gradle/gradle-example-included-builds/gradle.properties | 2 -- .../gradle-example-included-builds/services/gradle.properties | 4 +--- 6 files changed, 2 insertions(+), 12 deletions(-) delete mode 100644 tests/testdata/projects/package-managers/go/curation-project/go.sum diff --git a/cli/docs/flags.go b/cli/docs/flags.go index 0b0aa8a0b..63f5648dd 100644 --- a/cli/docs/flags.go +++ b/cli/docs/flags.go @@ -189,7 +189,7 @@ var commandFlags = map[string][]string{ useWrapperAudit, DepType, RequirementsFile, Fail, ExtendedTable, WorkingDirs, ExclusionsAudit, Mvn, Gradle, Npm, Pnpm, Yarn, Go, Swift, Cocoapods, Nuget, Pip, Pipenv, Poetry, MinSeverity, FixableOnly, ThirdPartyContextualAnalysis, Threads, auditSca, auditIac, auditSast, auditSecrets, auditWithoutCA, SecretValidation, ScanVuln, OutputDir, SkipAutoInstall, AllowPartialResults, MaxTreeDepth, - StaticSca, XrayLibPluginBinaryCustomPath, AnalyzerManagerCustomPath, UploadRtRepoPath, + StaticSca, XrayLibPluginBinaryCustomPath, AnalyzerManagerCustomPath, UploadRtRepoPath, UseIncludedBuilds, }, UploadCdx: { UploadRepoPath, uploadProjectKey, diff --git a/sca/bom/buildinfo/technologies/conan/conan_test.go b/sca/bom/buildinfo/technologies/conan/conan_test.go index 6e9f6a6e1..ef1ca9448 100644 --- a/sca/bom/buildinfo/technologies/conan/conan_test.go +++ b/sca/bom/buildinfo/technologies/conan/conan_test.go @@ -10,7 +10,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/jfrog/jfrog-cli-core/v2/utils/tests" - "github.com/jfrog/jfrog-cli-security/sca/bom/buildinfo/technologies" ) diff --git a/tests/testdata/projects/package-managers/go/curation-project/go.sum b/tests/testdata/projects/package-managers/go/curation-project/go.sum deleted file mode 100644 index c8bdc71cc..000000000 --- a/tests/testdata/projects/package-managers/go/curation-project/go.sum +++ /dev/null @@ -1,3 +0,0 @@ -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/gradle.properties b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/gradle.properties index 266947aa2..38d3a29c7 100644 --- a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/gradle.properties +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/api/gradle.properties @@ -1,3 +1 @@ currentVersion=1.0-SNAPSHOT -artifactory_user=admin -artifactory_password=password diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/gradle.properties b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/gradle.properties index 266947aa2..38d3a29c7 100644 --- a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/gradle.properties +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/gradle.properties @@ -1,3 +1 @@ currentVersion=1.0-SNAPSHOT -artifactory_user=admin -artifactory_password=password diff --git a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/gradle.properties b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/gradle.properties index 266947aa2..1c4a543bb 100644 --- a/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/gradle.properties +++ b/tests/testdata/projects/package-managers/gradle/gradle-example-included-builds/services/gradle.properties @@ -1,3 +1 @@ -currentVersion=1.0-SNAPSHOT -artifactory_user=admin -artifactory_password=password +currentVersion=1.0-SNAPSHOT \ No newline at end of file From 5f741fac8dd9ed2c3dde586452319e64149eaf9c Mon Sep 17 00:00:00 2001 From: Michael Mekler Date: Wed, 7 Jan 2026 11:47:44 +0200 Subject: [PATCH 8/9] Added the UseIncludedBuilds flag to curation audit --- cli/docs/flags.go | 2 +- cli/scancommands.go | 1 + sca/bom/buildinfo/technologies/common.go | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cli/docs/flags.go b/cli/docs/flags.go index 3b34164cd..7fd37355d 100644 --- a/cli/docs/flags.go +++ b/cli/docs/flags.go @@ -214,7 +214,7 @@ var commandFlags = map[string][]string{ StaticSca, XrayLibPluginBinaryCustomPath, AnalyzerManagerCustomPath, AddSastRules, }, CurationAudit: { - CurationOutput, WorkingDirs, Threads, RequirementsFile, InsecureTls, useWrapperAudit, SolutionPath, DockerImageName, + CurationOutput, WorkingDirs, Threads, RequirementsFile, InsecureTls, useWrapperAudit, UseIncludedBuilds, SolutionPath, DockerImageName, }, GitCountContributors: { InputFile, ScmType, ScmApiUrl, Token, Owner, RepoName, Months, DetailedSummary, InsecureTls, diff --git a/cli/scancommands.go b/cli/scancommands.go index 60cf959ac..a6ee14cd5 100644 --- a/cli/scancommands.go +++ b/cli/scancommands.go @@ -695,6 +695,7 @@ func getCurationCommand(c *components.Context) (*curation.CurationAuditCommand, SetExcludeTestDependencies(c.GetBoolFlagValue(flags.ExcludeTestDeps)). SetOutputFormat(format). SetUseWrapper(c.GetBoolFlagValue(flags.UseWrapper)). + SetUseIncludedBuilds(c.GetBoolFlagValue(flags.UseIncludedBuilds)). SetInsecureTls(c.GetBoolFlagValue(flags.InsecureTls)). SetNpmScope(c.GetStringFlagValue(flags.DepType)). SetPipRequirementsFile(c.GetStringFlagValue(flags.RequirementsFile)). diff --git a/sca/bom/buildinfo/technologies/common.go b/sca/bom/buildinfo/technologies/common.go index 45d9c56e9..28180c75c 100644 --- a/sca/bom/buildinfo/technologies/common.go +++ b/sca/bom/buildinfo/technologies/common.go @@ -52,6 +52,7 @@ type BuildInfoBomGeneratorParams struct { // Java params IsMavenDepTreeInstalled bool UseWrapper bool + UseIncludedBuilds bool // Python params PipRequirementsFile string // Npm params @@ -62,8 +63,7 @@ type BuildInfoBomGeneratorParams struct { // Docker params DockerImageName string // NuGet params - SolutionFilePath string - UseIncludedBuilds bool + SolutionFilePath string } func (bbp *BuildInfoBomGeneratorParams) SetNpmScope(depType string) *BuildInfoBomGeneratorParams { From ea4c49ba8a457bae9eb5f40e8b087a030aa1eebb Mon Sep 17 00:00:00 2001 From: Michael Mekler Date: Sun, 11 Jan 2026 11:28:49 +0200 Subject: [PATCH 9/9] Comments 2 --- cli/docs/flags.go | 1 - commands/audit/auditparams.go | 9 +++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cli/docs/flags.go b/cli/docs/flags.go index 7fd37355d..0b97794a8 100644 --- a/cli/docs/flags.go +++ b/cli/docs/flags.go @@ -294,7 +294,6 @@ var flagsMap = map[string]components.Flag{ UseIncludedBuilds: components.NewBoolFlag( UseIncludedBuilds, "[Gradle] Set to true if you'd like to take into account included builds (composite builds) of gradle projects, in addition to including subprojects", - components.WithBoolDefaultValue(false), ), WorkingDirs: components.NewStringFlag(WorkingDirs, "A comma-separated(,) list of relative working directories, to determine the audit targets locations. If flag isn't provided, a recursive scan is triggered from the root directory of the project."), OutputDir: components.NewStringFlag(OutputDir, "Target directory to save partial results to.", components.SetHiddenStrFlag()), diff --git a/commands/audit/auditparams.go b/commands/audit/auditparams.go index db5f7152e..c75da1790 100644 --- a/commands/audit/auditparams.go +++ b/commands/audit/auditparams.go @@ -3,6 +3,9 @@ package audit import ( "time" + "github.com/jfrog/jfrog-client-go/xray/services" + xscServices "github.com/jfrog/jfrog-client-go/xsc/services" + "github.com/jfrog/jfrog-cli-security/policy" "github.com/jfrog/jfrog-cli-security/sca/bom" "github.com/jfrog/jfrog-cli-security/sca/bom/buildinfo" @@ -12,8 +15,6 @@ import ( "github.com/jfrog/jfrog-cli-security/utils/severityutils" "github.com/jfrog/jfrog-cli-security/utils/techutils" "github.com/jfrog/jfrog-cli-security/utils/xray/scangraph" - "github.com/jfrog/jfrog-client-go/xray/services" - xscServices "github.com/jfrog/jfrog-client-go/xsc/services" ) type AuditParams struct { @@ -228,11 +229,11 @@ func (params *AuditParams) ToBuildInfoBomGenParams() (bomParams technologies.Bui // Java params IsMavenDepTreeInstalled: params.IsMavenDepTreeInstalled(), UseWrapper: params.UseWrapper(), + UseIncludedBuilds: params.UseIncludedBuilds(), // Python params PipRequirementsFile: params.PipRequirementsFile(), // Pnpm params - MaxTreeDepth: params.MaxTreeDepth(), - UseIncludedBuilds: params.UseIncludedBuilds(), + MaxTreeDepth: params.MaxTreeDepth(), } return }