1
0
Fork 1
mirror of https://github.com/NixOS/nixpkgs.git synced 2024-11-24 22:50:49 +00:00

stream_layered_image: Add docstrings to functions

This commit is contained in:
Utku Demir 2020-06-21 12:09:22 +12:00
parent 26402290bf
commit f1d7a09146
No known key found for this signature in database
GPG key ID: F3F8629C3E0BF60B

View file

@ -44,8 +44,19 @@ from datetime import datetime
from collections import namedtuple from collections import namedtuple
# Adds the given store paths to as a tar to the given writable stream.
def archive_paths_to(obj, paths, mtime, add_nix, filter=None): def archive_paths_to(obj, paths, mtime, add_nix, filter=None):
"""
Writes the given store paths as a tar file to the given stream.
obj: Stream to write to. Should have a 'write' method.
paths: List of store paths.
add_nix: Whether /nix and /nix/store directories should be
prepended to the archive.
filter: An optional transformation to be applied to TarInfo
objects. Should take a single TarInfo object and return
another one. Defaults to identity.
"""
filter = filter if filter else lambda i: i filter = filter if filter else lambda i: i
# gettarinfo makes the paths relative, this makes them # gettarinfo makes the paths relative, this makes them
@ -92,9 +103,12 @@ def archive_paths_to(obj, paths, mtime, add_nix, filter=None):
tar.addfile(ti) tar.addfile(ti)
# A writable stream which only calculates the final file size and
# sha256sum, while discarding the actual contents.
class ExtractChecksum: class ExtractChecksum:
"""
A writable stream which only calculates the final file size and
sha256sum, while discarding the actual contents.
"""
def __init__(self): def __init__(self):
self._digest = hashlib.sha256() self._digest = hashlib.sha256()
self._size = 0 self._size = 0
@ -104,6 +118,9 @@ class ExtractChecksum:
self._size += len(data) self._size += len(data)
def extract(self): def extract(self):
"""
Returns: Hex-encoded sha256sum and size as a tuple.
"""
return (self._digest.hexdigest(), self._size) return (self._digest.hexdigest(), self._size)
@ -111,9 +128,24 @@ class ExtractChecksum:
LayerInfo = namedtuple("LayerInfo", ["size", "checksum", "path", "paths"]) LayerInfo = namedtuple("LayerInfo", ["size", "checksum", "path", "paths"])
# Given a list of store paths 'paths', creates a layer add append it
# to tarfile 'tar'. Returns some a 'LayerInfo' for the layer.
def add_layer_dir(tar, paths, mtime, add_nix=True, filter=None): def add_layer_dir(tar, paths, mtime, add_nix=True, filter=None):
"""
Appends given store paths to a TarFile object as a new layer.
tar: 'tarfile.TarFile' object for the new layer to be added to.
paths: List of store paths.
mtime: 'mtime' of the added files and the layer tarball.
Should be an integer representing a POSIX time.
add_nix: Whether /nix and /nix/store directories should be
added to a layer.
filter: An optional transformation to be applied to TarInfo
objects inside the layer. Should take a single TarInfo
object and return another one. Defaults to identity.
Returns: A 'LayerInfo' object containing some metadata of
the layer added.
"""
assert all(i.startswith("/nix/store/") for i in paths) assert all(i.startswith("/nix/store/") for i in paths)
# First, calculate the tarball checksum and the size. # First, calculate the tarball checksum and the size.
@ -157,8 +189,19 @@ def add_layer_dir(tar, paths, mtime, add_nix=True, filter=None):
return LayerInfo(size=size, checksum=checksum, path=path, paths=paths) return LayerInfo(size=size, checksum=checksum, path=path, paths=paths)
# Adds the contents of the store path to the root as a new layer.
def add_customisation_layer(tar, path, mtime): def add_customisation_layer(tar, path, mtime):
"""
Adds the contents of the store path as a new layer. This is different
than the 'add_layer_dir' function defaults in the sense that the contents
of a single store path will be added to the root of the layer. eg (without
the /nix/store prefix).
tar: 'tarfile.TarFile' object for the new layer to be added to.
path: A store path.
mtime: 'mtime' of the added files and the layer tarball. Should be an
integer representing a POSIX time.
"""
def filter(ti): def filter(ti):
ti.name = re.sub("^/nix/store/[^/]*", "", ti.name) ti.name = re.sub("^/nix/store/[^/]*", "", ti.name)
return ti return ti
@ -171,8 +214,15 @@ def add_customisation_layer(tar, path, mtime):
) )
# Adds a file to the tarball with given path and contents.
def add_bytes(tar, path, content, mtime): def add_bytes(tar, path, content, mtime):
"""
Adds a file to the tarball with given path and contents.
tar: 'tarfile.TarFile' object.
path: Path of the file as a string.
content: Contents of the file.
mtime: 'mtime' of the file. Should be an integer representing a POSIX time.
"""
assert type(content) is bytes assert type(content) is bytes
ti = tarfile.TarInfo(path) ti = tarfile.TarInfo(path)