//! Build directory structure used through rebel
//!
//! # Current structure
//!
//! ```text
//! build/
//! ├── build.lock
//! ├── downloads/
//! │ └── ...
//! ├── state/
//! │ ├── output/
//! │ │ ├── .tar.tmp # during packing
//! │ │ ├── .tar # files are renamed when packing is finished
//! │ │ └── ...
//! │ ├── layer/
//! │ │ ├── / # overlayfs layer dir of finished tasks
//! │ │ └── ...
//! │ └── task/
//! │ ├── /
//! │ │ ├── layer/ # overlayfs layer dir (moved to layer/ after build)
//! │ │ ├── work/ # overlayfs work dir (discarded after build)
//! │ │ ├── task.json.tmp # during write
//! │ │ ├── task.json # after write
//! │ │ ├── task.log # stdout/stderr output of the task
//! │ │ └── task.lock # task lockfile
//! │ └── ...
//! └── tmp/ # temporary files (cleaned on start)
//! ├── dev/ # container /dev
//! ├── depends/ # unpacked dependencies
//! └── task/
//! └── /
//! ├── build/ # mount point for /build directory
//! │ ├── downloads/ # downloaded sources
//! │ ├── task/ # internal runner files
//! │ └── work/ # build overlay mountpoint
//! └── rootfs/ # rootfs overlay mountpoint
//! ```
use common::string_hash::*;
pub const DOWNLOADS_DIR: &str = "build/downloads";
pub const PIN_DIR: &str = "build/pinned";
pub const TMP_DIR: &str = "build/tmp";
pub const DEV_DIR: &str = "build/tmp/dev";
pub const DEPENDS_TMP_DIR: &str = "build/tmp/depends";
pub const TASK_TMP_DIR: &str = "build/tmp/task";
pub const TASK_TMP_ROOTFS_SUBDIR: &str = "rootfs";
pub const LOCKFILE: &str = "build/build.lock";
pub const OUTPUT_STATE_DIR: &str = "build/state/output";
pub const TASK_STATE_DIR: &str = "build/state/task";
pub const LAYER_STATE_DIR: &str = "build/state/layer";
pub const TASK_STATE_LAYER_SUBDIR: &str = "layer";
pub const TASK_STATE_WORK_SUBDIR: &str = "work";
pub const TASK_BUILDDIR: &str = "build";
pub const TASK_TASKDIR: &str = "build/task";
pub const TASK_RUN: &str = "run";
pub fn join(paths: &[&str]) -> String {
paths.join("/")
}
pub fn task_tmp_dir(hash: &InputHash) -> String {
join(&[TASK_TMP_DIR, &hash.to_string()])
}
pub fn task_state_dir(hash: &InputHash) -> String {
join(&[TASK_STATE_DIR, &hash.to_string()])
}
pub fn task_cache_tmp_filename(hash: &InputHash) -> String {
join(&[TASK_STATE_DIR, &hash.to_string(), "task.json.tmp"])
}
pub fn task_cache_filename(hash: &InputHash) -> String {
join(&[TASK_STATE_DIR, &hash.to_string(), "task.json"])
}
pub fn task_log_filename(hash: &InputHash) -> String {
join(&[TASK_STATE_DIR, &hash.to_string(), "task.log"])
}
pub fn task_lock_filename(hash: &InputHash) -> String {
join(&[TASK_STATE_DIR, &hash.to_string(), "task.lock"])
}
pub fn layer_dir(hash: &LayerHash) -> String {
join(&[LAYER_STATE_DIR, &hash.to_string()])
}
pub fn depend_tmp_dir(hash: &ArchiveHash) -> String {
join(&[DEPENDS_TMP_DIR, &hash.to_string()])
}
pub fn depend_dir(hash: &ArchiveHash) -> String {
join(&[DEPENDS_TMP_DIR, &hash.to_string()])
}
pub fn depend_lock_filename(hash: &ArchiveHash) -> String {
join(&[DEPENDS_TMP_DIR, &format!("{}.lock", hash.to_string())])
}
pub fn archive_tmp_filename(hash: &InputHash) -> String {
join(&[OUTPUT_STATE_DIR, &format!("{}.tar.tmp", hash)])
}
pub fn archive_filename(hash: &ArchiveHash) -> String {
join(&[OUTPUT_STATE_DIR, &format!("{}.tar", hash)])
}
pub fn pinned_archive_filename(name: &str) -> String {
join(&[PIN_DIR, &format!("{}.tar", name)])
}