diff options
Diffstat (limited to 'meta/lib')
| -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 | ||
