Let’s have an object:
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:
script.println(scm.extensions[[CloneOption.timeout]]) ...
Advertisement
Answer
A way to do it is this:
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:
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:
println "Class of scm is ${scm.getProp('$class')}"
println "Timeout value is ${scm.getProp('timeout')}"
Which will print:
Class of scm is GitSCM Timeout value is 30