← retour aux snippets

tarfile: archives reproductibles (mtime, uid/gid)

Normaliser metadata pour des tar identiques à contenu égal.

objectif

Normaliser metadata pour des tar identiques à contenu égal.

code minimal

import tarfile, io, time
buf = io.BytesIO()
with tarfile.open(fileobj=buf, mode="w") as tar:
    info = tarfile.TarInfo("a.txt")
    info.size = 1
    info.mtime = 0
    info.uid = info.gid = 0
    info.uname = info.gname = ""
    tar.addfile(info, io.BytesIO(b"x"))
data1 = buf.getvalue()
data2 = buf.getvalue()
print(data1 == data2)  # attendu: True

utilisation

import tarfile, io
buf = io.BytesIO()
with tarfile.open(fileobj=buf, mode="w") as tar:
    ti = tarfile.TarInfo("b.txt"); ti.size = 1; ti.mtime = 0
    tar.addfile(ti, io.BytesIO(b"y"))
print(len(buf.getvalue()) > 0)

variante(s) utile(s)

import tarfile
print(hasattr(tarfile, "TarInfo"))

notes

  • Fixez mtime, uid/gid, uname/gname et l’ordre des entrées pour la reproductibilité.
  • Évitez PAX headers variables (ajustez format si nécessaire).