mirror of
https://seed.radicle.dev/rad:z2UcCU1LgMshWvXj6hXSDDrwB8q8M.git
synced 2026-10-18 19:30:30 +08:00
feat: add --latest flag to get the latest job run
This commit is contained in:
committed by
Fintan Halpenny
parent
d462bc66d0
commit
c6d10d40f5
+41
-4
@@ -273,15 +273,23 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn show_job<A>(
|
fn show_job<A>(
|
||||||
command::Show { pretty, rev }: command::Show,
|
command::Show {
|
||||||
|
pretty,
|
||||||
|
latest,
|
||||||
|
rev,
|
||||||
|
}: command::Show,
|
||||||
jobs: &Jobs<Repository, A>,
|
jobs: &Jobs<Repository, A>,
|
||||||
) -> Result<(), error::Show>
|
) -> Result<(), error::Show>
|
||||||
where
|
where
|
||||||
A: Access,
|
A: Access,
|
||||||
{
|
{
|
||||||
// Resolve shorthand revisions (e.g. `bf23a86`) to a full commit OID.
|
let (id, job) = if latest {
|
||||||
|
latest_job(jobs)?
|
||||||
|
} else {
|
||||||
|
let rev = rev.expect("rev is required unless --latest");
|
||||||
let oid = revparse(jobs.as_ref(), &rev)?;
|
let oid = revparse(jobs.as_ref(), &rev)?;
|
||||||
let (id, job) = find_by_commit(oid, jobs)?;
|
find_by_commit(oid, jobs)?
|
||||||
|
};
|
||||||
let show = radicle_job::display::Job::new(id, &job);
|
let show = radicle_job::display::Job::new(id, &job);
|
||||||
if pretty {
|
if pretty {
|
||||||
println!("{}", show.pretty());
|
println!("{}", show.pretty());
|
||||||
@@ -305,6 +313,21 @@ where
|
|||||||
.map_err(|err| error::Find::FindCommit { oid, err })
|
.map_err(|err| error::Find::FindCommit { oid, err })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Find the job with the most recent run activity, across all nodes.
|
||||||
|
fn latest_job<A>(jobs: &Jobs<Repository, A>) -> Result<(JobId, Job), error::Latest>
|
||||||
|
where
|
||||||
|
A: Access,
|
||||||
|
{
|
||||||
|
jobs.all()
|
||||||
|
.map_err(error::Latest::All)?
|
||||||
|
.filter_map(Result::ok)
|
||||||
|
.map(|(id, job)| (JobId::from(id), job))
|
||||||
|
// Jobs with no runs have no timestamp (`None`), so any job with run
|
||||||
|
// activity sorts ahead of them.
|
||||||
|
.max_by_key(|(_, job)| job.latest().map(|(_, _, run)| *run.timestamp()).max())
|
||||||
|
.ok_or(error::Latest::NoJobs)
|
||||||
|
}
|
||||||
|
|
||||||
/// Resolve a Git revision, such as a shorthand OID, to a full commit OID.
|
/// Resolve a Git revision, such as a shorthand OID, to a full commit OID.
|
||||||
fn revparse(repo: &Repository, rev: &str) -> Result<Oid, error::Revparse> {
|
fn revparse(repo: &Repository, rev: &str) -> Result<Oid, error::Revparse> {
|
||||||
repo.backend
|
repo.backend
|
||||||
@@ -385,8 +408,12 @@ mod command {
|
|||||||
/// Format output in a more human oriented way than JSON.
|
/// Format output in a more human oriented way than JSON.
|
||||||
#[clap(long)]
|
#[clap(long)]
|
||||||
pub pretty: bool,
|
pub pretty: bool,
|
||||||
|
/// Show the most recently active job instead of one for a revision.
|
||||||
|
#[clap(long, conflicts_with = "rev")]
|
||||||
|
pub latest: bool,
|
||||||
/// Git revision for the commit, such as a full or shorthand OID.
|
/// Git revision for the commit, such as a full or shorthand OID.
|
||||||
pub rev: String,
|
#[clap(required_unless_present = "latest")]
|
||||||
|
pub rev: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Record a new run for an existing job COB.
|
/// Record a new run for an existing job COB.
|
||||||
@@ -439,10 +466,20 @@ mod error {
|
|||||||
Revparse(#[from] Revparse),
|
Revparse(#[from] Revparse),
|
||||||
#[error(transparent)]
|
#[error(transparent)]
|
||||||
Find(#[from] Find),
|
Find(#[from] Find),
|
||||||
|
#[error(transparent)]
|
||||||
|
Latest(#[from] Latest),
|
||||||
#[error("failed to show job, could not serialize to JSON")]
|
#[error("failed to show job, could not serialize to JSON")]
|
||||||
Json(#[source] serde_json::Error),
|
Json(#[source] serde_json::Error),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Error)]
|
||||||
|
pub enum Latest {
|
||||||
|
#[error("failed to list jobs")]
|
||||||
|
All(#[source] cob::store::Error),
|
||||||
|
#[error("no jobs found in this repository")]
|
||||||
|
NoJobs,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Error)]
|
#[derive(Debug, Error)]
|
||||||
#[error("failed to resolve Git revision {rev}")]
|
#[error("failed to resolve Git revision {rev}")]
|
||||||
pub struct Revparse {
|
pub struct Revparse {
|
||||||
|
|||||||
Reference in New Issue
Block a user