From a95fee40793666b534898bacb2fb145b361d86d9 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Thu, 6 Aug 2015 13:34:25 +0100 Subject: [PATCH 1/2] Use 'pip freeze' output to detect changes with requirement specified If the requirements contains a repos url it will always report 'Successfully installed'; there is no difference in the output to tell apart if anything new was pulled. Use freeze to detect if the environment changed in any way. Should fix ansible/ansible#1705 --- packaging/language/pip.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packaging/language/pip.py b/packaging/language/pip.py index bdd2b40a1aa..3b5f396ab45 100755 --- a/packaging/language/pip.py +++ b/packaging/language/pip.py @@ -363,6 +363,12 @@ def main(): changed = (state == 'present' and not is_present) or (state == 'absent' and is_present) module.exit_json(changed=changed, cmd=freeze_cmd, stdout=out, stderr=err) + if requirements: + freeze_cmd = '%s freeze' % pip + out_freeze_before = module.run_command(freeze_cmd, cwd=chdir)[1] + else: + out_freeze_before = None + rc, out_pip, err_pip = module.run_command(cmd, path_prefix=path_prefix, cwd=chdir) out += out_pip err += err_pip @@ -375,7 +381,11 @@ def main(): if state == 'absent': changed = 'Successfully uninstalled' in out_pip else: - changed = 'Successfully installed' in out_pip + if out_freeze_before is None: + changed = 'Successfully installed' in out_pip + else: + out_freeze_after = module.run_command(freeze_cmd, cwd=chdir)[1] + changed = out_freeze_before != out_freeze_after module.exit_json(changed=changed, cmd=cmd, name=name, version=version, state=state, requirements=requirements, virtualenv=env, From c860af29b28a1c66a13d8e9d4d8d7a518ae9a75c Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Thu, 6 Aug 2015 14:24:41 +0100 Subject: [PATCH 2/2] Detect unchanged pip runs when using a vcs url in name Should fix bug #1645 --- packaging/language/pip.py | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/packaging/language/pip.py b/packaging/language/pip.py index 3b5f396ab45..6d325282770 100755 --- a/packaging/language/pip.py +++ b/packaging/language/pip.py @@ -20,6 +20,7 @@ # import tempfile +import re import os DOCUMENTATION = ''' @@ -321,17 +322,15 @@ def main(): # Automatically apply -e option to extra_args when source is a VCS url. VCS # includes those beginning with svn+, git+, hg+ or bzr+ - if name: - if module.params['editable']: - if name.startswith('svn+') or name.startswith('git+') or \ - name.startswith('hg+') or name.startswith('bzr+'): - args_list = [] # used if extra_args is not used at all - if extra_args: - args_list = extra_args.split(' ') - if '-e' not in args_list: - args_list.append('-e') - # Ok, we will reconstruct the option string - extra_args = ' '.join(args_list) + has_vcs = bool(name and re.match(r'(svn|git|hg|bzr)\+', name)) + if has_vcs and module.params['editable']: + args_list = [] # used if extra_args is not used at all + if extra_args: + args_list = extra_args.split(' ') + if '-e' not in args_list: + args_list.append('-e') + # Ok, we will reconstruct the option string + extra_args = ' '.join(args_list) if extra_args: cmd += ' %s' % extra_args @@ -344,8 +343,7 @@ def main(): if module.check_mode: if extra_args or requirements or state == 'latest' or not name: module.exit_json(changed=True) - elif name.startswith('svn+') or name.startswith('git+') or \ - name.startswith('hg+') or name.startswith('bzr+'): + elif has_vcs: module.exit_json(changed=True) freeze_cmd = '%s freeze' % pip @@ -363,7 +361,7 @@ def main(): changed = (state == 'present' and not is_present) or (state == 'absent' and is_present) module.exit_json(changed=changed, cmd=freeze_cmd, stdout=out, stderr=err) - if requirements: + if requirements or has_vcs: freeze_cmd = '%s freeze' % pip out_freeze_before = module.run_command(freeze_cmd, cwd=chdir)[1] else: