mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Add check mode to git module
Related to issue #2114. This hooks in check_mode to git module. This will exit with changed=True at the following places: * If the repo has not been cloned * If the destination has local modifications, this will exit with changed=True. This is because reset() will exit anyways if there are local mods and force is False. * If the remote HEAD commit id is not the same as that of the local HEAD. This is determined by get_remote_head() that runs 'git ls-remote' to determine remote HEAD. Lastly, if this is run with check_mode enabled, this will exit with changed=False before fetch() is invoked so that no local mods are made.
This commit is contained in:
parent
fc8d9377d5
commit
73772a41e6
1 changed files with 26 additions and 1 deletions
27
library/git
27
library/git
|
@ -103,6 +103,17 @@ def reset(module,dest,force):
|
||||||
module.fail_json(msg="Local modifications exist in repository (force=no).")
|
module.fail_json(msg="Local modifications exist in repository (force=no).")
|
||||||
return module.run_command("git reset --hard HEAD", check_rc=True)
|
return module.run_command("git reset --hard HEAD", check_rc=True)
|
||||||
|
|
||||||
|
def get_remote_head(module, dest, version, remote):
|
||||||
|
if version == 'HEAD':
|
||||||
|
version = get_head_branch(module, dest, remote)
|
||||||
|
os.chdir(dest)
|
||||||
|
cmd = "git ls-remote %s -h refs/heads/%s" % (remote, version)
|
||||||
|
(rc, out, err) = module.run_command(cmd, check_rc=True)
|
||||||
|
if len(out) < 1:
|
||||||
|
module.fail_json(msg="Could not determine remote revision for %s" % version)
|
||||||
|
rev = out.split()[0]
|
||||||
|
return rev
|
||||||
|
|
||||||
def get_branches(module, dest):
|
def get_branches(module, dest):
|
||||||
os.chdir(dest)
|
os.chdir(dest)
|
||||||
branches = []
|
branches = []
|
||||||
|
@ -224,7 +235,8 @@ def main():
|
||||||
version=dict(default='HEAD'),
|
version=dict(default='HEAD'),
|
||||||
remote=dict(default='origin'),
|
remote=dict(default='origin'),
|
||||||
force=dict(default='yes', type='bool')
|
force=dict(default='yes', type='bool')
|
||||||
)
|
),
|
||||||
|
supports_check_mode=True
|
||||||
)
|
)
|
||||||
|
|
||||||
dest = os.path.abspath(os.path.expanduser(module.params['dest']))
|
dest = os.path.abspath(os.path.expanduser(module.params['dest']))
|
||||||
|
@ -242,14 +254,27 @@ def main():
|
||||||
before = None
|
before = None
|
||||||
local_mods = False
|
local_mods = False
|
||||||
if not os.path.exists(gitconfig):
|
if not os.path.exists(gitconfig):
|
||||||
|
if module.check_mode:
|
||||||
|
module.exit_json(changed=True)
|
||||||
(rc, out, err) = clone(module, repo, dest, remote)
|
(rc, out, err) = clone(module, repo, dest, remote)
|
||||||
else:
|
else:
|
||||||
# else do a pull
|
# else do a pull
|
||||||
local_mods = has_local_mods(dest)
|
local_mods = has_local_mods(dest)
|
||||||
before = get_version(dest)
|
before = get_version(dest)
|
||||||
|
# if force, do a reset
|
||||||
|
if local_mods and module.check_mode:
|
||||||
|
module.exit_json(changed=True, msg='Local modifications exist')
|
||||||
(rc, out, err) = reset(module,dest,force)
|
(rc, out, err) = reset(module,dest,force)
|
||||||
if rc != 0:
|
if rc != 0:
|
||||||
module.fail_json(msg=err)
|
module.fail_json(msg=err)
|
||||||
|
# check or get changes from remote
|
||||||
|
remote_head = get_remote_head(module, dest, version, remote)
|
||||||
|
if module.check_mode:
|
||||||
|
remote_head = remote_head[0:7]
|
||||||
|
if before != remote_head:
|
||||||
|
module.exit_json(changed=True, before=before, after=remote_head)
|
||||||
|
else:
|
||||||
|
module.exit_json(changed=False, before=before, after=remote_head)
|
||||||
(rc, out, err) = fetch(module, repo, dest, version, remote)
|
(rc, out, err) = fetch(module, repo, dest, version, remote)
|
||||||
if rc != 0:
|
if rc != 0:
|
||||||
module.fail_json(msg=err)
|
module.fail_json(msg=err)
|
||||||
|
|
Loading…
Reference in a new issue