[virt-tools-list] [virt-manager PATCH] formats: make sure 'unar' is existed

Cole Robinson crobinso at redhat.com
Tue Mar 4 16:02:29 UTC 2014

On 03/04/2014 04:06 AM, Martin Kletzander wrote:
> On Tue, Mar 04, 2014 at 04:16:58PM +0800, Chen Hanxiao wrote:
>> Commit 0b4a72fd77f74e5a9f6885179febe601156df617
>> needs unar command to do some tests.
>> But if we haven't installed it, the error message
>> told us nothing valuable as:
>> "OSError: [Errno 2] No such file or directory"
>> This patch will impove the error message.
>> Signed-off-by: Chen Hanxiao <chenhanxiao at cn.fujitsu.com>
>> ---
> I got to the bottom of this when I first saw the error and after some
> time installed it.  But since you're posting this question, shouldn't
> we put unar into .spec.in file and check for it while running
> setup.py?

Were you guys hitting this from the test suite?

> Or even better, can't we use something else than unar since on source
> distributions this requires objective C compiler and some other not
> very usual packages.  It seems a little bit cumbersome for some users;
> and yes, I understand it's the minimum, but if there's an easier way
> than we may as well be nice.

Hmm, didn't realize unar wasn't just a plain C app. That makes adding an
explicit dep kind of annoying.

Since it's only used as a convenience functionality of unarchiving a tar.gz or
zip or xz, we can just fail if unar isn't available and tell the user to
extract the directory themselves, and then point virt-convert at the
directory. For the test suite, we can just duplicate the unar check and skip
the tests if it's not available.

>>  virtconv/formats.py | 6 ++++++
>>  1 file changed, 6 insertions(+)
>> diff --git a/virtconv/formats.py b/virtconv/formats.py
>> index 5eb4356..2602c09 100644
>> --- a/virtconv/formats.py
>> +++ b/virtconv/formats.py
>> @@ -132,6 +132,12 @@ def _find_input(input_file, parser, print_cb):
>>                      prefix="virt-convert-tmp", dir=basedir)
>>              base = os.path.basename(input_file)
>> +
>> +            # check if 'unar' command existed.
>> +            ret = os.system("unar -h > /dev/null")
>> +            if ret:
>> +                raise RuntimeError("Could not find 'unar' command")
>> +
>>              cmd = ["unar", "-o", tempdir, base]
>>              print_cb(_("%s appears to be an archive, running: %s") %
>>                  (base, " ".join(cmd)))
>> --

There's already an imported function called find_executable which can be used.
If unar isn't available and the file looks like an archive, raise an error
message like:

"%(filename)s appears to be an archive, but 'unar' is not installed. Please
either install 'unar', or extract the archive yourself and point virt-convert
at the extracted directory.'

- Cole

More information about the virt-tools-list mailing list