use anyhow::Result;
use swh_graph::graph::NodeId;
use swh_graph::graph_builder::GraphBuilder;
use swh_graph::swhid;
use swh_graph_stdlib::*;
mod data;
fn build_linear_history(builder: &mut GraphBuilder) -> Result<(NodeId, NodeId, NodeId, NodeId)> {
let a = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000010))?
.committer_timestamp(100, 0)
.done();
let b = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000020))?
.committer_timestamp(200, 0)
.done();
let c = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000030))?
.committer_timestamp(300, 0)
.done();
let d = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000040))?
.committer_timestamp(400, 0)
.done();
builder.arc(d, c);
builder.arc(c, b);
builder.arc(b, a);
Ok((a, b, c, d))
}
#[test]
fn test_find_head_rev() -> Result<()> {
let mut builder = GraphBuilder::default();
let snp0 = builder
.node(swhid!(swh:1:snp:0000000000000000000000000000000000000000))?
.done();
let rev1 = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000001))?
.done();
let rev2 = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000002))?
.done();
let rev3 = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000003))?
.done();
builder.snp_arc(snp0, rev1, "refs/heads/bug");
builder.snp_arc(snp0, rev2, "refs/heads/main");
builder.snp_arc(snp0, rev3, "refs/heads/new-sux");
let graph = builder.done()?;
assert_eq!(vcs::find_head_rev(&graph, snp0)?, Some(rev2));
Ok(())
}
#[test]
fn test_list_root_revisions() -> Result<()> {
let mut builder = GraphBuilder::default();
let a = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000010))?
.done();
let b = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000020))?
.done();
let c = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000030))?
.done();
let d = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000040))?
.done();
let e = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000050))?
.done();
let f = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000060))?
.done();
let dir = builder
.node(swhid!(swh:1:dir:0000000000000000000000000000000000000070))?
.done();
builder.arc(b, a);
builder.arc(d, b);
builder.arc(d, c);
builder.arc(f, e);
builder.arc(b, dir);
let graph = builder.done()?;
let mut roots = vcs::list_root_revisions(&graph)?;
roots.sort();
assert_eq!(roots, vec![a, c, e]);
Ok(())
}
#[test]
fn test_list_revisions_linear() -> Result<()> {
let mut builder = GraphBuilder::default();
let (a, b, c, d) = build_linear_history(&mut builder)?;
let graph = builder.done()?;
let revs = vcs::list_revisions(&graph, d)?;
assert_eq!(revs, vec![d, c, b, a]);
Ok(())
}
#[test]
fn test_list_revisions_branching() -> Result<()> {
let mut builder = GraphBuilder::default();
let a = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000010))?
.committer_timestamp(100, 0)
.done();
let b = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000020))?
.committer_timestamp(200, 0)
.done();
let c = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000030))?
.committer_timestamp(300, 0)
.done();
let d = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000040))?
.committer_timestamp(400, 0)
.done();
builder.arc(b, a);
builder.arc(d, b);
builder.arc(d, c);
builder.arc(c, b);
let graph = builder.done()?;
let revs = vcs::list_revisions(&graph, d)?;
assert_eq!(revs, vec![d, c, b, a]);
Ok(())
}
#[test]
fn test_list_revisions_with_exclude() -> Result<()> {
let mut builder = GraphBuilder::default();
let (_a, b, c, d) = build_linear_history(&mut builder)?;
let graph = builder.done()?;
let revs = vcs::list_revisions_with(&graph, &[d], &[b], &Default::default())?;
assert_eq!(revs, vec![d, c]);
Ok(())
}
#[test]
fn test_list_revisions_with_since_until() -> Result<()> {
let mut builder = GraphBuilder::default();
let (_a100, b200, c300, d400) = build_linear_history(&mut builder)?;
let graph = builder.done()?;
let opts = vcs::RevListOptions {
since: Some(200),
until: Some(300),
..Default::default()
};
let revs = vcs::list_revisions_with(&graph, &[d400], &[], &opts)?;
assert_eq!(revs, vec![c300, b200]);
let revs = vcs::list_revisions_with(&graph, &[c300], &[], &opts)?;
assert_eq!(revs, vec![c300, b200]);
Ok(())
}
#[test]
fn test_list_revisions_with_max_parents() -> Result<()> {
let mut builder = GraphBuilder::default();
let a = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000010))?
.committer_timestamp(100, 0)
.done();
let b = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000020))?
.committer_timestamp(200, 0)
.done();
let c = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000030))?
.committer_timestamp(300, 0)
.done();
let d = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000040))?
.committer_timestamp(400, 0)
.done();
let e = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000050))?
.committer_timestamp(500, 0)
.done();
builder.arc(b, a);
builder.arc(d, b);
builder.arc(d, c);
builder.arc(e, d);
let graph = builder.done()?;
let opts = vcs::RevListOptions {
max_parents: Some(1),
..Default::default()
};
let revs = vcs::list_revisions_with(&graph, &[e], &[], &opts)?;
assert_eq!(revs, vec![e, c, b, a]);
let opts = vcs::RevListOptions {
min_parents: Some(2),
..Default::default()
};
let revs = vcs::list_revisions_with(&graph, &[e], &[], &opts)?;
assert_eq!(revs, vec![d]);
let opts = vcs::RevListOptions {
max_parents: Some(0),
..Default::default()
};
let revs = vcs::list_revisions_with(&graph, &[e], &[], &opts)?;
assert_eq!(revs, vec![c, a]);
Ok(())
}
#[test]
fn test_list_revisions_release_peeling() -> Result<()> {
let mut builder = GraphBuilder::default();
let rev_a = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000010))?
.committer_timestamp(100, 0)
.done();
let rev_b = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000020))?
.committer_timestamp(200, 0)
.done();
let rel = builder
.node(swhid!(swh:1:rel:0000000000000000000000000000000000000030))?
.done();
builder.arc(rev_b, rev_a);
builder.arc(rel, rev_b);
let graph = builder.done()?;
let revs = vcs::list_revisions(&graph, rel)?;
assert_eq!(revs, vec![rev_b, rev_a]);
Ok(())
}
#[test]
fn test_list_revisions_multiple_starts() -> Result<()> {
let mut builder = GraphBuilder::default();
let a = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000010))?
.committer_timestamp(100, 0)
.done();
let b = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000020))?
.committer_timestamp(200, 0)
.done();
let c = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000030))?
.committer_timestamp(300, 0)
.done();
let d = builder
.node(swhid!(swh:1:rev:0000000000000000000000000000000000000040))?
.committer_timestamp(400, 0)
.done();
builder.arc(b, a);
builder.arc(d, c);
let graph = builder.done()?;
let revs = vcs::list_revisions_with(&graph, &[b, d], &[], &Default::default())?;
assert_eq!(revs, vec![d, c, b, a]);
Ok(())
}
#[test]
fn test_list_revisions_unpeelable_start() -> Result<()> {
let mut builder = GraphBuilder::default();
let dir = builder
.node(swhid!(swh:1:dir:0000000000000000000000000000000000000010))?
.done();
let cnt = builder
.node(swhid!(swh:1:cnt:0000000000000000000000000000000000000020))?
.done();
builder.dir_arc(dir, cnt, swh_graph::labels::Permission::Content, "README");
let graph = builder.done()?;
assert!(vcs::list_revisions(&graph, dir).is_err());
Ok(())
}
#[test]
fn test_list_revisions_exclude_release() -> Result<()> {
let mut builder = GraphBuilder::default();
let (_a, b, c, d) = build_linear_history(&mut builder)?;
let rel = builder
.node(swhid!(swh:1:rel:0000000000000000000000000000000000000050))?
.done();
builder.arc(rel, b);
let graph = builder.done()?;
let revs = vcs::list_revisions_with(&graph, &[d], &[rel], &Default::default())?;
assert_eq!(revs, vec![d, c]);
Ok(())
}
#[test]
fn test_list_revisions_duplicate_starts() -> Result<()> {
let mut builder = GraphBuilder::default();
let (a, b, c, _d) = build_linear_history(&mut builder)?;
let graph = builder.done()?;
let revs = vcs::list_revisions_with(&graph, &[c, c, b], &[], &Default::default())?;
assert_eq!(revs, vec![c, b, a]);
Ok(())
}