diff options
Diffstat (limited to 'meta')
-rw-r--r-- | meta/lib/oe/utils.py | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/meta/lib/oe/utils.py b/meta/lib/oe/utils.py index 9a2187e36f..a84039f585 100644 --- a/meta/lib/oe/utils.py +++ b/meta/lib/oe/utils.py | |||
@@ -536,3 +536,34 @@ class ImageQAFailed(Exception): | |||
536 | def sh_quote(string): | 536 | def sh_quote(string): |
537 | import shlex | 537 | import shlex |
538 | return shlex.quote(string) | 538 | return shlex.quote(string) |
539 | |||
540 | def directory_size(root, blocksize=4096): | ||
541 | """ | ||
542 | Calculate the size of the directory, taking into account hard links, | ||
543 | rounding up every size to multiples of the blocksize. | ||
544 | """ | ||
545 | def roundup(size): | ||
546 | """ | ||
547 | Round the size up to the nearest multiple of the block size. | ||
548 | """ | ||
549 | import math | ||
550 | return math.ceil(size / blocksize) * blocksize | ||
551 | |||
552 | def getsize(filename): | ||
553 | """ | ||
554 | Get the size of the filename, not following symlinks, taking into | ||
555 | account hard links. | ||
556 | """ | ||
557 | stat = os.lstat(filename) | ||
558 | if stat.st_ino not in inodes: | ||
559 | inodes.add(stat.st_ino) | ||
560 | return stat.st_size | ||
561 | else: | ||
562 | return 0 | ||
563 | |||
564 | inodes = set() | ||
565 | total = 0 | ||
566 | for root, dirs, files in os.walk(root): | ||
567 | total += sum(roundup(getsize(os.path.join(root, name))) for name in files) | ||
568 | total += roundup(getsize(root)) | ||
569 | return total | ||