MCPcopy Create free account
hub / github.com/bootc-dev/bootc / write_filedef

Method write_filedef

crates/ostree-ext/src/fixture.rs:646–706  ·  view source on GitHub ↗
(&self, root: &ostree::MutableTree, def: &FileDef)

Source from the content-addressed store, hash-verified

644
645 #[context("Writing filedef {}", def.path.as_str())]
646 pub fn write_filedef(&self, root: &ostree::MutableTree, def: &FileDef) -> Result<()> {
647 let parent_path = def.path.parent();
648 let parent = if let Some(parent_path) = parent_path {
649 let meta = require_dirmeta(&self.srcrepo, parent_path, self.selinux)?;
650 Some(ensure_parent_dirs(root, &def.path, meta.as_str())?)
651 } else {
652 None
653 };
654 let parent = parent.as_ref().unwrap_or(root);
655 let name = def.path.file_name().expect("file name");
656 let label = if self.selinux {
657 Some(SeLabel::from_path(&def.path))
658 } else {
659 None
660 };
661 let mut xattrs = label.as_ref().map(|v| v.xattrs()).unwrap_or_default();
662 xattrs.extend(
663 def.xattrs
664 .iter()
665 .map(|xattr| (xattr.key.as_bytes_with_nul(), &xattr.value[..])),
666 );
667 let xattrs = if xattrs.is_empty() {
668 None
669 } else {
670 xattrs.sort_by(|a, b| a.0.cmp(b.0));
671 Some(xattrs.to_variant())
672 };
673 let xattrs = xattrs.as_ref();
674 let checksum = match &def.ty {
675 FileDefType::Regular(contents) => self
676 .srcrepo
677 .write_regfile_inline(
678 None,
679 0,
680 0,
681 libc::S_IFREG | def.mode,
682 xattrs,
683 contents.as_bytes(),
684 gio::Cancellable::NONE,
685 )
686 .context("Writing regfile inline")?,
687 FileDefType::Symlink(target) => self.srcrepo.write_symlink(
688 None,
689 def.uid,
690 def.gid,
691 xattrs,
692 target.as_str(),
693 gio::Cancellable::NONE,
694 )?,
695 FileDefType::Directory => {
696 let d = parent.ensure_dir(name)?;
697 let meta = require_dirmeta(&self.srcrepo, &def.path, self.selinux)?;
698 d.set_metadata_checksum(meta.as_str());
699 return Ok(());
700 }
701 };
702 parent
703 .replace_file(name, checksum.as_str())

Callers 2

commit_filedefsMethod · 0.80
updateMethod · 0.80

Calls 8

require_dirmetaFunction · 0.85
ensure_parent_dirsFunction · 0.85
xattrsMethod · 0.80
as_refMethod · 0.45
extendMethod · 0.45
iterMethod · 0.45
is_emptyMethod · 0.45
cmpMethod · 0.45

Tested by

no test coverage detected