Subversion: Only fire changed when content has changed (#41036)
* Previously when checking out a subdirectory, if changes are made in the repository that aren't present in the subdirectory (i.e. in a different branch or similiar) then the changes handler still kicks in even though the content of this working copy hasn't necessarily changed. Now we parse the output of svn update and fire if anything changes at all. * Previously when checking out a subdirectory, if changes are made in the repository that aren't present in the subdirectory (i.e. in a different branch or similiar) then the changes handler still kicks in even though the content of this working copy hasn't necessarily changed. Now we parse the output of svn update and svn switch, firing if anything changes at all. * Should not be executable * ==None doesn't do what I want, is None does
This commit is contained in:
parent
f6303ba5df
commit
41db45ac33
1 changed files with 26 additions and 7 deletions
|
@ -137,6 +137,7 @@ class Subversion(object):
|
|||
bits.extend(["--password", self.password])
|
||||
bits.extend(args)
|
||||
rc, out, err = self.module.run_command(bits, check_rc)
|
||||
|
||||
if check_rc:
|
||||
return out.splitlines()
|
||||
else:
|
||||
|
@ -167,15 +168,29 @@ class Subversion(object):
|
|||
def switch(self):
|
||||
'''Change working directory's repo.'''
|
||||
# switch to ensure we are pointing at correct repo.
|
||||
self._exec(["switch", self.repo, self.dest])
|
||||
# it also updates!
|
||||
output = self._exec(["switch", self.repo, self.dest])
|
||||
for line in output:
|
||||
if re.search(r'^[ABDUCGE]\s', line):
|
||||
return True
|
||||
return False
|
||||
|
||||
def update(self):
|
||||
'''Update existing svn working directory.'''
|
||||
self._exec(["update", "-r", self.revision, self.dest])
|
||||
output = self._exec(["update", "-r", self.revision, self.dest])
|
||||
|
||||
for line in output:
|
||||
if re.search(r'^[ABDUCGE]\s', line):
|
||||
return True
|
||||
return False
|
||||
|
||||
def revert(self):
|
||||
'''Revert svn working directory.'''
|
||||
self._exec(["revert", "-R", self.dest])
|
||||
output = self._exec(["revert", "-R", self.dest])
|
||||
for line in output:
|
||||
if re.search(r'^Reverted ', line) is None:
|
||||
return True
|
||||
return False
|
||||
|
||||
def get_revision(self):
|
||||
'''Revision and URL of subversion working directory.'''
|
||||
|
@ -263,8 +278,10 @@ def main():
|
|||
module.exit_json(changed=False)
|
||||
if not export and checkout:
|
||||
svn.checkout()
|
||||
files_changed = True
|
||||
else:
|
||||
svn.export(force=force)
|
||||
files_changed = True
|
||||
elif svn.is_svn_repo():
|
||||
# Order matters. Need to get local mods before switch to avoid false
|
||||
# positives. Need to switch before revert to ensure we are reverting to
|
||||
|
@ -276,19 +293,21 @@ def main():
|
|||
module.fail_json(msg="ERROR: modified files exist in the repository.")
|
||||
check, before, after = svn.needs_update()
|
||||
module.exit_json(changed=check, before=before, after=after)
|
||||
files_changed = False
|
||||
before = svn.get_revision()
|
||||
local_mods = svn.has_local_mods()
|
||||
if switch:
|
||||
svn.switch()
|
||||
files_changed = svn.switch() or files_changed
|
||||
if local_mods:
|
||||
if force:
|
||||
svn.revert()
|
||||
files_changed = svn.revert() or files_changed
|
||||
else:
|
||||
module.fail_json(msg="ERROR: modified files exist in the repository.")
|
||||
svn.update()
|
||||
files_changed = svn.update() or files_changed
|
||||
elif in_place:
|
||||
before = None
|
||||
svn.checkout(force=True)
|
||||
files_changed = True
|
||||
local_mods = svn.has_local_mods()
|
||||
if local_mods and force:
|
||||
svn.revert()
|
||||
|
@ -299,7 +318,7 @@ def main():
|
|||
module.exit_json(changed=True)
|
||||
else:
|
||||
after = svn.get_revision()
|
||||
changed = before != after or local_mods
|
||||
changed = files_changed or local_mods
|
||||
module.exit_json(changed=changed, before=before, after=after)
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue