pub struct Stamp { /* private fields */ }Expand description
A picture of the git control files: what the repository looked like when a generation was built.
Two stamps that are equal mean git has not been asked to move anything. They are compared, never interpreted: nothing reads a head or a branch out of one.
use majordomus_cli::live::Stamp;
use std::process::Command;
let dir = tempfile::tempdir().expect("a temporary directory");
let git = |args: &[&str]| {
Command::new("git").arg("-C").arg(dir.path()).args(args).output().expect("git")
};
git(&["init", "-q"]);
git(&["config", "user.email", "t@example.com"]);
git(&["config", "user.name", "t"]);
std::fs::write(dir.path().join("a"), "a").expect("a file");
git(&["add", "-A"]);
git(&["commit", "-qm", "one"]);
let watch = Stamp::watching(dir.path()).expect("a work tree is watchable");
let before = watch.take();
assert_eq!(before, watch.take(), "nothing moved, nothing changed");
std::fs::write(dir.path().join("b"), "b").expect("a second file");
git(&["add", "-A"]);
git(&["commit", "-qm", "two"]);
assert_ne!(before, watch.take(), "a commit moved the repository");Implementations§
Source§impl Stamp
impl Stamp
Sourcepub fn watching(root: &Path) -> Option<Stamp>
pub fn watching(root: &Path) -> Option<Stamp>
The control files of the checkout at root, resolved once.
git rev-parse is run exactly here — one subprocess for the life of the process —
because the two directories it names do not move while a checkout exists, and a
subprocess on the request path is the cost this whole module exists to avoid.
None when the directory is not a work tree, which is a repository of the layer
that is simply not version controlled: it has no moves to follow.
use majordomus_cli::live::Stamp;
// a directory git knows nothing about has nothing to watch, and that is not a failure
let plain = tempfile::tempdir().expect("a temporary directory");
assert!(Stamp::watching(plain.path()).is_none());Sourcepub fn paths(&self) -> &[String]
pub fn paths(&self) -> &[String]
The files this stamp is taken over, absolute. The hash sorts them, so this order is the order they were collected in and carries no meaning of its own.
Sourcepub fn take(&self) -> String
pub fn take(&self) -> String
Take the stamp: one stat per watched file, hashed.
A file that is not there contributes its absence, which is itself a move worth
noticing — MERGE_HEAD appearing and disappearing is how a merge begins and ends.
The work is crate::environment::cache::fingerprint_of, which is the
fingerprint-over-files this crate already had; a second implementation of it would
be a second thing to keep correct.
use majordomus_cli::live::Stamp;
use std::process::Command;
let dir = tempfile::tempdir().expect("a temporary directory");
Command::new("git").arg("-C").arg(dir.path()).args(["init", "-q"]).output().expect("git");
let watch = Stamp::watching(dir.path()).expect("a work tree");
// taking it twice over a repository nobody touched gives one value
assert_eq!(watch.take(), watch.take());