//! Some dates adjusted to be a year apart, but still 'c1' and 'c2' with the same date. use super::*; use crate::util::{fixture, odb_at}; use gix_traverse::commit::simple::CommitTimeOrder; fn adjusted_dates_repo() -> crate::Result<(std::path::PathBuf, gix_odb::Handle)> { let dir = fixture("make_traversal_repo_for_commits_with_dates.sh")?; let odb = odb_at(dir.join(".git").join("objects"))?; Ok((dir, odb)) } #[test] fn head_breadth_first() -> crate::Result { let (repo_dir, odb) = adjusted_dates_repo()?; // Timestamps show b1c1 (978393600) is a year newer than c2 (946771200), // explaining why date-order puts b1c1 before c2. insta::assert_snapshot!(git_graph_with_time(&repo_dir)?, @r" * Oid(1) 1009929600 (HEAD -> main) m1b1 |\ | * Oid(2) 978393600 (branch1) b1c1 * | Oid(3) 946771200 c2 |/ * Oid(4) 946771200 c1 "); let tip = hex_to_id("288e509293165cb5630d08f4185bdf2445bf6170"); // m1b1 // Git also shows `b1c1` first, making topo-order similar to date order, // even though c2 *is* the first parent. let expected = [ tip, hex_to_id("9902e3c3e8f0c569b4ab295ddf473e6de763e1e7"), // c2 hex_to_id("bcb05040a6925f2ff5e10d3ae1f9264f2e8c43ac"), // b1c1 hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03"), // c1 ]; let result = traverse_both([tip], &odb, Sorting::BreadthFirst, Parents::All, [])?; assert_eq!(result, expected); Ok(()) } #[test] fn head_date_order() -> crate::Result { let (_repo_dir, odb) = adjusted_dates_repo()?; // Graph with timestamps shown in `head_breadth_first` let tip = hex_to_id("288e509293165cb5630d08f4185bdf2445bf6170"); // m1b1 // NewestFirst let expected_newest = [ tip, hex_to_id("bcb05040a6925f2ff5e10d3ae1f9264f2e8c43ac"), // b1c1 hex_to_id("9902e3c3e8f0c569b4ab295ddf473e6de763e1e7"), // c2 hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03"), // c1 ]; let result = traverse_both( [tip], &odb, Sorting::ByCommitTime(CommitTimeOrder::NewestFirst), Parents::All, [], )?; assert_eq!(result, expected_newest); // OldestFirst let expected_oldest = [ tip, hex_to_id("9902e3c3e8f0c569b4ab295ddf473e6de763e1e7"), // c2 hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03"), // c1 hex_to_id("bcb05040a6925f2ff5e10d3ae1f9264f2e8c43ac"), // b1c1 ]; let result = traverse_both( [tip], &odb, Sorting::ByCommitTime(CommitTimeOrder::OldestFirst), Parents::All, [], )?; assert_eq!(result, expected_oldest); Ok(()) } #[test] fn head_date_order_with_cutoff() -> crate::Result { let (_repo_dir, odb) = adjusted_dates_repo()?; // Graph shown in `head_breadth_first` let tip = hex_to_id("288e509293165cb5630d08f4185bdf2445bf6170"); // m1b1 let expected = [ tip, hex_to_id("bcb05040a6925f2ff5e10d3ae1f9264f2e8c43ac"), // b1c1 ]; for order in [CommitTimeOrder::NewestFirst, CommitTimeOrder::OldestFirst] { let result = traverse_both( [tip], &odb, Sorting::ByCommitTimeCutoff { order, seconds: 978393600, // =2001-01-02 00:00:00 +0000 }, Parents::All, [], )?; assert_eq!(result, expected, "order = {order:?}"); } Ok(()) } #[test] fn head_date_order_with_cutoff_disabled() -> crate::Result { let (_repo_dir, odb) = adjusted_dates_repo()?; // Graph shown in `head_breadth_first` let tip = hex_to_id("288e509293165cb5630d08f4185bdf2445bf6170"); // m1b1 let very_early = 878393600; // an early date before any commit // NewestFirst with early cutoff (effectively disabled) let expected_newest = [ tip, hex_to_id("bcb05040a6925f2ff5e10d3ae1f9264f2e8c43ac"), // b1c1 hex_to_id("9902e3c3e8f0c569b4ab295ddf473e6de763e1e7"), // c2 hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03"), // c1 ]; let result = traverse_both( [tip], &odb, Sorting::ByCommitTimeCutoff { order: CommitTimeOrder::NewestFirst, seconds: very_early, }, Parents::All, [], )?; assert_eq!(result, expected_newest); // OldestFirst with early cutoff let expected_oldest = [ tip, hex_to_id("9902e3c3e8f0c569b4ab295ddf473e6de763e1e7"), // c2 hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03"), // c1 hex_to_id("bcb05040a6925f2ff5e10d3ae1f9264f2e8c43ac"), // b1c1 ]; let result = traverse_both( [tip], &odb, Sorting::ByCommitTimeCutoff { order: CommitTimeOrder::OldestFirst, seconds: very_early, }, Parents::All, [], )?; assert_eq!(result, expected_oldest); Ok(()) } #[test] fn date_order_with_cutoff_is_applied_to_starting_position() -> crate::Result { let (_repo_dir, odb) = adjusted_dates_repo()?; // Graph shown in `head_breadth_first` let tip = hex_to_id("9902e3c3e8f0c569b4ab295ddf473e6de763e1e7"); // c2 for order in [CommitTimeOrder::NewestFirst, CommitTimeOrder::OldestFirst] { let graph = commit_graph(odb.store_ref()); let count = Simple::new([tip], &odb) .sorting(Sorting::ByCommitTimeCutoff { order, seconds: 978393600, // =2001-01-02 00:00:00 +0000 })? .commit_graph(graph) .count(); assert_eq!( count, 0, "initial tips that don't pass cutoff value are not returned either" ); } Ok(()) } #[test] fn head_date_order_first_parent_only() -> crate::Result { let (_repo_dir, odb) = adjusted_dates_repo()?; // Graph shown in `head_breadth_first` let tip = hex_to_id("288e509293165cb5630d08f4185bdf2445bf6170"); // m1b1 let expected = [ tip, hex_to_id("9902e3c3e8f0c569b4ab295ddf473e6de763e1e7"), // c2 hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03"), // c1 ]; for order in [CommitTimeOrder::NewestFirst, CommitTimeOrder::OldestFirst] { let result = traverse_both([tip], &odb, Sorting::ByCommitTime(order), Parents::First, [])?; assert_eq!(result, expected, "order = {order:?}"); } Ok(()) }