Subversion: checking out with existing content (#38366)

* Subversion: If the directory exists, we want the ability to checkout into it
and use the content as existing files; equivalent to svn checkout --force

I was expecting the force option to do this, however I understand why it
doesn't do that currently. I was debating with changing the meaning of force
to include this behaviour, however I've opted for a seperate flag for now
for backwards compatibility.

* Subversion: Sanity tests have failed suggesting this is the correct value

https://app.shippable.com/github/ansible/ansible/runs/60302/1/console
This commit is contained in:
Rob Emery 2018-05-24 23:29:11 +01:00 committed by Adam Miller
parent 2f5f57a78f
commit be8559bfa9

23
lib/ansible/modules/source_control/subversion.py Normal file → Executable file
View file

@ -44,6 +44,13 @@ options:
Prior to 1.9 the default was C(yes).
type: bool
default: "no"
in_place:
description:
- If the directory exists, then the working copy will be checked-out over-the-top using
svn checkout --force; if force is specified then existing files with different content are reverted
type: bool
default: "no"
version_added: "2.6"
username:
description:
- C(--username) parameter passed to svn.
@ -140,9 +147,13 @@ class Subversion(object):
rc = self._exec(["info", self.dest], check_rc=False)
return rc == 0
def checkout(self):
def checkout(self, force=False):
'''Creates new svn working directory if it does not already exist.'''
self._exec(["checkout", "-r", self.revision, self.repo, self.dest])
cmd = ["checkout"]
if force:
cmd.append("--force")
cmd.extend(["-r", self.revision, self.repo, self.dest])
self._exec(cmd)
def export(self, force=False):
'''Export svn repo to directory'''
@ -214,6 +225,7 @@ def main():
checkout=dict(type='bool', default=True),
update=dict(type='bool', default=True),
switch=dict(type='bool', default=True),
in_place=dict(type='bool', default=False),
),
supports_check_mode=True,
)
@ -229,6 +241,7 @@ def main():
switch = module.params['switch']
checkout = module.params['checkout']
update = module.params['update']
in_place = module.params['in_place']
# We screenscrape a huge amount of svn commands so use C locale anytime we
# call run_command()
@ -273,6 +286,12 @@ def main():
else:
module.fail_json(msg="ERROR: modified files exist in the repository.")
svn.update()
elif in_place:
before = None
svn.checkout(force=True)
local_mods = svn.has_local_mods()
if local_mods and force:
svn.revert()
else:
module.fail_json(msg="ERROR: %s folder already exists, but its not a subversion repository." % (dest,))