2 Useful support routines (for internal use).
4 These functions aren't really Zero Install specific; they're things we might
5 wish were in the standard library.
10 # Copyright (C) 2009, Thomas Leonard
11 # See the README file for details, or visit http://0install.net.
13 from zeroinstall
import _
16 def find_in_path(prog
):
17 """Search $PATH for prog.
18 If prog is an absolute path, return it unmodified.
19 @param prog: name of executable to find
20 @return: the full path of prog, or None if not found
23 if os
.path
.isabs(prog
): return prog
24 for d
in os
.environ
.get('PATH', '/bin:/usr/bin').split(':'):
25 path
= os
.path
.join(d
, prog
)
26 if os
.path
.isfile(path
):
30 def read_bytes(fd
, nbytes
, null_ok
= False):
31 """Read exactly nbytes from fd.
32 @param fd: file descriptor to read from
33 @param nbytes: number of bytes to read
34 @param null_ok: if True, it's OK to receive EOF immediately (we then return None)
35 @return: the bytes read
36 @raise Exception: if we received less than nbytes of data
40 got
= os
.read(fd
, nbytes
)
42 if null_ok
and not data
:
44 raise Exception(_("Unexpected end-of-stream. Data so far %(data)s; expecting %(bytes)d bytes more.")
45 % {'data': repr(data
), 'bytes': nbytes
})
48 logging
.debug(_("Message received: %s") % repr(data
))
51 def pretty_size(size
):
52 """Format a size for printing.
53 @param size: the size in bytes
54 @type size: int (or None)
55 @return: the formatted size
61 return _('%d bytes') % size
63 for unit
in (_('KB'), _('MB'), _('GB'), _('TB')):
67 return _('%(size).1f %(unit)s') % {'size': size
, 'unit': unit
}
70 """Like shutil.rmtree, except that we also delete read-only items.
71 @param root: the root of the subtree to remove
75 for main
, dirs
, files
in os
.walk(root
):