saghul / pythonz

Python installation manager supporting CPython, Stackless, PyPy and Jython
http://saghul.github.io/pythonz
MIT License
749 stars 69 forks source link

Idempotent install #83

Open ibuchanan opened 9 years ago

ibuchanan commented 9 years ago

Scenario: a build system reads a file in a repository to know which version of Python is required. The build system uses pythonz to install that version, unless it already exists. Then the build system proceeds with other build tasks.

The ideal solution would be that pythonz install 2.7.9 has a return code of 0 whenever CPython 2.7.9 already exists, so that installation is idempotent. However, that might break behavior someone currently depends on.

An alternative is an additional parameter, like pythonz install 2.7.9 --no-error-if-installed (or maybe --idempotent if shorter is better). That would have a return code of 0 if CPython 2.7.9 already exists. I get my idempotent command but current behavior remains.

My current quick fix is to alter the behavior of locate so that it can be used as a test whether a version exists (pull request pending). Then my code can do the following:

$VERSION = 2.7.9
if ! pythonz locate $VERSION; then
    pythonz install $VERSION
fi
saghul commented 9 years ago

Since we do have a --reinstall option, we should probably not do anything if the requested Python version is already installed, if you're up for writing a fix, I'll take it :-)

jayvdb commented 5 years ago

--reinstall should mean erase and start again. Otherwise we need a --really-reinstall

ifduyue commented 4 years ago
$ pythonz locate 2.7.9
ERROR: `CPython-2.7.9` is not x installed.
$ echo $?
0
$ `which pythonz` locate 2.7.9
ERROR: `CPython-2.7.9` is not x installed.
$ echo $?
1

It's because pythonz bash function wrapper overrides the error code we want.