Let’s have an object:
JavaScript
x
def scm = [
$class: 'GitSCM',
branches: branches,
userRemoteConfigs:
[ [ credentialsId: credentialsId, url: repoUrl, name: remote, refspec: refspecs ] ],
extensions: [
[$class: 'RelativeTargetDirectory', relativeTargetDir: (args.path ? args.path : args.repository.name) ],
[$class: 'CloneOption', honorRefspec: true, noTags: true, reference: '', shallow: false, timeout: 30],
[$class: 'ScmName', name: args.repository.name]
]
]
I want to check the value of timeout
from CloneOption
.
I unsuccessfully tried things like:
JavaScript
script.println(scm.extensions[[CloneOption.timeout]])
Advertisement
Answer
A way to do it is this:
JavaScript
•••scm.extensions.find { it.'$class' == 'CloneOption' }?.timeout
Because scm.extensions
is a List
, we use find
to take one element out of it that matches the condition inside the closure… in the closure, we ask which element has a property $class
whose value is CloneOption
.
find
returns either one element that matches the condition, or null
, so to access timeout
we use the null-safe operator: ?.timeout
.
You can go further and add a helper method to Maps (the type of your “object”) which lets you access property from it or its “extensions” more easily:
JavaScript
•••Map.metaClass.getProp = { String name ->
if (containsKey(name)) return get(name)
extensions.find { e -> e."$name" != null }?."$name"
}
Now, you can use getProp
to achieve that:
JavaScript
println "Class of scm is ${scm.getProp('$class')}"
println "Timeout value is ${scm.getProp('timeout')}"
Which will print:
JavaScript
Class of scm is GitSCM
Timeout value is 30