| |
let mut channel = ChannelBuilder::default();
|
| |
channel
|
| |
.title("Radicle CI broker run information")
|
| - |
.description("All CI runs known to this instance of the Radicle CI broker.")
|
| + |
.description("Latest CI runs known on this instance of the Radicle CI broker.")
|
| |
.link("FIXME:link");
|
| - |
let mut items = vec![];
|
| - |
for (_alias, repo_id) in self.repos() {
|
| - |
for run in self.runs(repo_id) {
|
| - |
items.push(Self::rss_item_from_run(run)?);
|
| - |
}
|
| - |
}
|
| - |
items.sort_by_key(|item| item.pub_date().map(|s| s.to_string()));
|
| - |
items.reverse();
|
| - |
for item in items.iter().take(MAX_RSS_ENTRIES).cloned() {
|
| - |
channel.item(item);
|
| + |
|
| + |
for item in self.sorted_items()?.iter().take(MAX_RSS_ENTRIES) {
|
| + |
channel.item((*item).clone());
|
| |
}
|
| |
Ok(channel.build())
|
| |
}
|
| |
let mut channel = ChannelBuilder::default();
|
| |
channel
|
| |
.title("Radicle CI broker run information")
|
| - |
.description("All CI runs known to this instance of the Radicle CI broker.")
|
| + |
.description("Latest FAILED CI runs on this instance of the Radicle CI broker.")
|
| |
.link("FIXME:link");
|
| - |
for (_alias, repo_id) in self.repos() {
|
| - |
for run in self.runs(repo_id) {
|
| - |
if run.state() == RunState::Finished && run.result() == Some(&RunResult::Failure) {
|
| - |
channel.item(Self::rss_item_from_run(run)?);
|
| - |
}
|
| - |
}
|
| + |
|
| + |
for item in self
|
| + |
.sorted_items_for_runs(|run| {
|
| + |
run.state() == RunState::Finished && run.result() == Some(&RunResult::Failure)
|
| + |
})?
|
| + |
.iter()
|
| + |
.take(MAX_RSS_ENTRIES)
|
| + |
{
|
| + |
channel.item(item.clone());
|
| |
}
|
| + |
|
| |
Ok(channel.build())
|
| |
}
|
| |
|
| |
let mut channel = ChannelBuilder::default();
|
| |
channel
|
| |
.title("Radicle CI broker run information")
|
| - |
.description("All CI runs known to this instance of the Radicle CI broker.")
|
| + |
.description("Latest UNFINISHED CI runs on this instance of the Radicle CI broker.")
|
| |
.link("FIXME:link");
|
| + |
for item in self
|
| + |
.sorted_items_for_runs(|run| {
|
| + |
run.state() == RunState::Triggered || run.state() == RunState::Running
|
| + |
})?
|
| + |
.iter()
|
| + |
.take(MAX_RSS_ENTRIES)
|
| + |
{
|
| + |
channel.item(item.clone());
|
| + |
}
|
| + |
Ok(channel.build())
|
| + |
}
|
| + |
|
| + |
fn sorted_items(&self) -> Result<Vec<Item>, PageError> {
|
| + |
let mut items = vec![];
|
| |
for (_alias, repo_id) in self.repos() {
|
| |
for run in self.runs(repo_id) {
|
| - |
if run.state() == RunState::Triggered || run.state() == RunState::Running {
|
| - |
channel.item(Self::rss_item_from_run(run)?);
|
| + |
if run.state() == RunState::Finished && run.result() == Some(&RunResult::Failure) {
|
| + |
items.push(Self::rss_item_from_run(run)?);
|
| |
}
|
| |
}
|
| |
}
|
| - |
Ok(channel.build())
|
| + |
items.sort_by_key(|(ts, _)| *ts);
|
| + |
items.reverse();
|
| + |
Ok(items.iter().map(|(_, item)| item.clone()).collect())
|
| + |
}
|
| + |
|
| + |
fn sorted_items_for_runs<F>(&self, pred: F) -> Result<Vec<Item>, PageError>
|
| + |
where
|
| + |
F: Fn(&Run) -> bool,
|
| + |
{
|
| + |
let mut items = vec![];
|
| + |
for (_alias, repo_id) in self.repos() {
|
| + |
for run in self.runs(repo_id) {
|
| + |
if pred(run) {
|
| + |
items.push(Self::rss_item_from_run(run)?);
|
| + |
}
|
| + |
}
|
| + |
}
|
| + |
items.sort_by_key(|(ts, _)| *ts);
|
| + |
items.reverse();
|
| + |
Ok(items.iter().map(|(_, item)| item.clone()).collect())
|
| |
}
|
| |
|
| - |
fn rss_item_from_run(run: &Run) -> Result<Item, PageError> {
|
| + |
fn rss_item_from_run(run: &Run) -> Result<(OffsetDateTime, Item), PageError> {
|
| |
let mut guid = Guid::default();
|
| |
guid.set_value(run.broker_run_id().to_string());
|
| |
guid.permalink = false; // guid permalink defaults to true as our guid is not a url set this to false
|