diff --git a/jenkins_jobs/modules/scm.py b/jenkins_jobs/modules/scm.py
index 7f54a27a5..a442cd736 100644
--- a/jenkins_jobs/modules/scm.py
+++ b/jenkins_jobs/modules/scm.py
@@ -39,7 +39,8 @@ Example of an empty ``scm``:
import logging
import xml.etree.ElementTree as XML
import jenkins_jobs.modules.base
-from jenkins_jobs.errors import JenkinsJobsException
+from jenkins_jobs.errors import (InvalidAttributeError,
+ JenkinsJobsException)
def git(parser, xml_parent, data):
@@ -499,6 +500,9 @@ def svn(parser, xml_parent, data):
(default '.')
:arg str credentials-id: optional argument to specify the ID of credentials
to use
+ :arg str repo-depth: Repository depth. Can be one of 'infinity', 'empty',
+ 'files', 'immediates' or 'unknown'. (default 'infinity')
+ :arg bool ignore-externals: Ignore Externals. (default false)
:arg str workspaceupdater: optional argument to specify
how to update the workspace (default wipeworkspace)
:arg list(str) excluded-users: list of users to ignore revisions from
@@ -518,8 +522,12 @@ def svn(parser, xml_parent, data):
:Repo: * **url** (`str`) -- URL for the repository
* **basedir** (`str`) -- Location relative to the workspace
- root to checkout to (default '.')
+ root to checkout to (default '.')
* **credentials-id** - optional ID of credentials to use
+ * **repo-depth** - Repository depth. Can be one of 'infinity',
+ 'empty', 'files', 'immediates' or 'unknown'.
+ (default 'infinity')
+ * **ignore-externals** - Ignore Externals. (default false)
:workspaceupdater values:
:wipeworkspace: - deletes the workspace before checking out
@@ -538,24 +546,29 @@ def svn(parser, xml_parent, data):
scm = XML.SubElement(xml_parent, 'scm', {'class':
'hudson.scm.SubversionSCM'})
locations = XML.SubElement(scm, 'locations')
- if 'repos' in data:
- repos = data['repos']
- for repo in repos:
- module = XML.SubElement(locations,
- 'hudson.scm.SubversionSCM_-ModuleLocation')
- XML.SubElement(module, 'remote').text = repo['url']
- XML.SubElement(module, 'local').text = repo.get('basedir', '.')
- if 'credentials-id' in repo:
- XML.SubElement(module, 'credentialsId').text = repo[
- 'credentials-id']
- elif 'url' in data:
- module = XML.SubElement(locations,
+
+ def populate_repo_xml(parent, data):
+ module = XML.SubElement(parent,
'hudson.scm.SubversionSCM_-ModuleLocation')
XML.SubElement(module, 'remote').text = data['url']
XML.SubElement(module, 'local').text = data.get('basedir', '.')
if 'credentials-id' in data:
XML.SubElement(module, 'credentialsId').text = data[
'credentials-id']
+ repo_depths = ['infinity', 'empty', 'files', 'immediates', 'unknown']
+ repo_depth = data.get('repo-depth', 'infinity')
+ if repo_depth not in repo_depths:
+ raise InvalidAttributeError('repo_depth', repo_depth, repo_depths)
+ XML.SubElement(module, 'depthOption').text = repo_depth
+ XML.SubElement(module, 'ignoreExternalsOption').text = str(
+ data.get('ignore-externals', False)).lower()
+
+ if 'repos' in data:
+ repos = data['repos']
+ for repo in repos:
+ populate_repo_xml(locations, repo)
+ elif 'url' in data:
+ populate_repo_xml(locations, data)
else:
raise JenkinsJobsException("A top level url or repos list must exist")
updater = data.get('workspaceupdater', 'wipeworkspace')
diff --git a/tests/scm/fixtures/svn-multiple-repos-001.xml b/tests/scm/fixtures/svn-multiple-repos-001.xml
index d75139ddb..5422c58f8 100644
--- a/tests/scm/fixtures/svn-multiple-repos-001.xml
+++ b/tests/scm/fixtures/svn-multiple-repos-001.xml
@@ -6,10 +6,14 @@
http://svn.example.com/repo
.
abcdef01234567890
+ files
+ true
http://svn.example.com/repo2
repo2
+ infinity
+ false
diff --git a/tests/scm/fixtures/svn-multiple-repos-001.yaml b/tests/scm/fixtures/svn-multiple-repos-001.yaml
index 66441d96e..78adc52f5 100644
--- a/tests/scm/fixtures/svn-multiple-repos-001.yaml
+++ b/tests/scm/fixtures/svn-multiple-repos-001.yaml
@@ -5,5 +5,7 @@ scm:
- url: http://svn.example.com/repo
basedir: .
credentials-id: "abcdef01234567890"
+ repo-depth: files
+ ignore-externals: true
- url: http://svn.example.com/repo2
basedir: repo2
diff --git a/tests/scm/fixtures/svn-regions-001.xml b/tests/scm/fixtures/svn-regions-001.xml
index 544f1d1e1..e61dfc738 100644
--- a/tests/scm/fixtures/svn-regions-001.xml
+++ b/tests/scm/fixtures/svn-regions-001.xml
@@ -6,6 +6,8 @@
http://svn.apache.org/repos/asf/spamassassin/trunk
.
abcdef01234567890
+ empty
+ true
diff --git a/tests/scm/fixtures/svn-regions-001.yaml b/tests/scm/fixtures/svn-regions-001.yaml
index 2fddbebab..ccaa70656 100644
--- a/tests/scm/fixtures/svn-regions-001.yaml
+++ b/tests/scm/fixtures/svn-regions-001.yaml
@@ -2,6 +2,8 @@ scm:
- svn:
url: http://svn.apache.org/repos/asf/spamassassin/trunk
credentials-id: "abcdef01234567890"
+ repo-depth: empty
+ ignore-externals: true
workspaceupdater: wipeworkspace
included-regions:
- /region1/.*\.cpp