Jump to…
snowinitial commitqoxwzsukwmkx1mo
1//! `df-index` — reconstruction of jj semantics from pushed Git objects.
2//!
3//! Dogfood never runs the `jj` binary. A `jj git push` is an ordinary Git push;
4//! this crate reads jj's metadata back out of the pushed commit objects and
5//! turns it into the change index the product is built on.
6//!
7//! The crate is deliberately free of any Git library dependency. Everything
8//! here operates on raw bytes and plain data, which keeps `gix` confined to
9//! `df-store` (spec §3 rule 1) and makes the format-sensitive logic testable
10//! against byte literals captured from real repositories.
11
12pub mod change_id;
13pub mod indexer;
14pub mod synthetic;
15
16pub use change_id::{
17 extract_change_id, extract_conflict_trees, is_conflict_artifact, ChangeId, ConflictTrees,
18};
19pub use indexer::{line_map, rebase_anchor, stack_edges, AnchorOutcome, IndexedCommit, NewLine, StackEdge};
20pub use synthetic::{normalise_diff, synthetic_change_id, PatchIdentity, SyntheticId};
21
22/// The identity assigned to an indexed commit.
23///
24/// Every commit gets one. Which variant it is determines whether the UI shows a
25/// change chip and how much revision history Dogfood can promise (spec §4).
26#[derive(Debug, Clone, PartialEq, Eq)]
27pub enum Identity {
28 /// A real jj change id, read from the commit's `change-id` header.
29 Change(ChangeId),
30 /// A patch-derived identity for a commit authored by plain git.
31 Synthetic(SyntheticId),
32}
33
34impl Identity {
35 /// The canonical string stored in `changes.change_id`.
36 pub fn as_str(&self) -> &str {
37 match self {
38 Identity::Change(c) => c.as_str(),
39 Identity::Synthetic(s) => s.as_str(),
40 }
41 }
42
43 /// Whether this identity is synthesised rather than authored by jj.
44 /// Maps directly to `changes.synthetic`.
45 pub fn is_synthetic(&self) -> bool {
46 matches!(self, Identity::Synthetic(_))
47 }
48}

48 lines · Rust