diff options
Diffstat (limited to 'pkgs/by-name/ba/back/src')
-rw-r--r-- | pkgs/by-name/ba/back/src/git_bug/format/mod.rs | 21 | ||||
-rw-r--r-- | pkgs/by-name/ba/back/src/web/mod.rs | 31 |
2 files changed, 39 insertions, 13 deletions
diff --git a/pkgs/by-name/ba/back/src/git_bug/format/mod.rs b/pkgs/by-name/ba/back/src/git_bug/format/mod.rs index 4ebf6d4..b3b6bcc 100644 --- a/pkgs/by-name/ba/back/src/git_bug/format/mod.rs +++ b/pkgs/by-name/ba/back/src/git_bug/format/mod.rs @@ -61,6 +61,27 @@ impl Display for TimeStamp { } } +/// An UNIX time stamp. +/// +/// These should only ever be used for human-display, because timestamps are unreliably in a +/// distributed system. +/// +/// This one allows underlying access to it's value and is only obtainable via `unsafe` code. +/// The reason behind this is, that you might need to access this to improve the display for humans +/// (i.e., sorting by date). +#[derive(Debug, Default, Clone, Copy, Ord, PartialOrd, Eq, PartialEq)] +pub struct UnsafeTimeStamp { + value: u64, +} +impl TimeStamp { + /// # Safety + /// This is not really unsafe, but there is just no way your can trust a time stamp in a + /// distributed system. As such access to the raw value could lead to bugs. + pub unsafe fn to_unsafe(self) -> UnsafeTimeStamp { + UnsafeTimeStamp { value: self.value } + } +} + #[derive(Debug, Default, Deserialize, Clone, PartialEq, Eq)] /// A string that should be escaped when injected into html content. pub struct HtmlString { diff --git a/pkgs/by-name/ba/back/src/web/mod.rs b/pkgs/by-name/ba/back/src/web/mod.rs index 1e6a5af..35dc59f 100644 --- a/pkgs/by-name/ba/back/src/web/mod.rs +++ b/pkgs/by-name/ba/back/src/web/mod.rs @@ -39,20 +39,25 @@ pub fn issue_list_boilerplate( ) -> error::Result<RawHtml<String>> { let repository = &config.repository; - let issue_list = issues_from_repository(&repository.to_thread_local())? + let mut issue_list = issues_from_repository(&repository.to_thread_local())? .into_iter() - .fold(String::new(), |acc, val| { - let issue = val.collaps(); + .map(|issue| issue.collapse()) + .collect::<Vec<CollapsedIssue>>(); - format!("{}{}", acc, { - if issue.status == wanted_status { - let issue_entry = issue.to_list_entry(); - issue_entry.0 - } else { - String::new() - } - }) - }); + // Sort by date descending. + issue_list.sort_by_key(|issue| unsafe { issue.timestamp.to_unsafe() }); + issue_list.reverse(); + + let issue_list_str = issue_list.into_iter().fold(String::new(), |acc, issue| { + format!("{}{}", acc, { + if issue.status == wanted_status { + let issue_entry = issue.to_list_entry(); + issue_entry.0 + } else { + String::new() + } + }) + }); let counter_status_lower = counter_status.to_string().to_lowercase(); Ok(RawHtml(format!( @@ -81,7 +86,7 @@ pub fn issue_list_boilerplate( --> </div> <ol class="issue-list"> - {issue_list} + {issue_list_str} </ol> </main> </div> |