Selaa lähdekoodia

size-stats: don't count hard links

This change adds inode tracking to the size-stats script so that hard
links don't cause files to be double counted. This has a significant
effect on the size computation for some packages. For example, git has
around a dozen hard links to a large file. Before this change, git would
weigh in at about 170 MB with the total filesystem size reported as
175 MB. The actual rootfs.ext2 size was around 16 MB. With the change,
the git package registers at 10.5 MB with a total filesystem size of
15.8 MB.

Signed-off-by: Frank Hunleth <fhunleth@troodon-software.com>
Acked-by: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Frank Hunleth 8 vuotta sitten
vanhempi
commit
2ec0a7d11c
1 muutettua tiedostoa jossa 10 lisäystä ja 1 poistoa
  1. 10 1
      support/scripts/size-stats

+ 10 - 1
support/scripts/size-stats

@@ -88,11 +88,20 @@ def build_package_dict(builddir):
 def build_package_size(filesdict, builddir):
 def build_package_size(filesdict, builddir):
     pkgsize = collections.defaultdict(int)
     pkgsize = collections.defaultdict(int)
 
 
+    seeninodes = set()
     for root, _, files in os.walk(os.path.join(builddir, "target")):
     for root, _, files in os.walk(os.path.join(builddir, "target")):
         for f in files:
         for f in files:
             fpath = os.path.join(root, f)
             fpath = os.path.join(root, f)
             if os.path.islink(fpath):
             if os.path.islink(fpath):
                 continue
                 continue
+
+            st = os.stat(fpath)
+            if st.st_ino in seeninodes:
+                # hard link
+                continue
+            else:
+                seeninodes.add(st.st_ino)
+
             frelpath = os.path.relpath(fpath, os.path.join(builddir, "target"))
             frelpath = os.path.relpath(fpath, os.path.join(builddir, "target"))
             if not frelpath in filesdict:
             if not frelpath in filesdict:
                 print("WARNING: %s is not part of any package" % frelpath)
                 print("WARNING: %s is not part of any package" % frelpath)
@@ -100,7 +109,7 @@ def build_package_size(filesdict, builddir):
             else:
             else:
                 pkg = filesdict[frelpath][0]
                 pkg = filesdict[frelpath][0]
 
 
-            pkgsize[pkg] += os.path.getsize(fpath)
+            pkgsize[pkg] += st.st_size
 
 
     return pkgsize
     return pkgsize