diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-09 00:00:12 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-09 00:00:49 +0900 |
| commit | 1c0eb589741de4aa52ef941ff9315b34dbe48aa0 (patch) | |
| tree | 8d821cf3a7fb3f8c753dec7861ad9597f6948493 /crates/shirabe/src/repository/vcs | |
| parent | e5b789616ec4c1cbd152c5ccbefe2d27ced4a18f (diff) | |
| download | php-shirabe-1c0eb589741de4aa52ef941ff9315b34dbe48aa0.tar.gz php-shirabe-1c0eb589741de4aa52ef941ff9315b34dbe48aa0.tar.zst php-shirabe-1c0eb589741de4aa52ef941ff9315b34dbe48aa0.zip | |
feat(datetime): resolve datetime TODOs
Introduce shim functions and constants, replacing the ad-hoc chrono
format strings and parse helpers used as phase-b placeholders.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/repository/vcs')
| -rw-r--r-- | crates/shirabe/src/repository/vcs/forgejo_driver.rs | 9 | ||||
| -rw-r--r-- | crates/shirabe/src/repository/vcs/fossil_driver.rs | 20 | ||||
| -rw-r--r-- | crates/shirabe/src/repository/vcs/git_bitbucket_driver.rs | 20 | ||||
| -rw-r--r-- | crates/shirabe/src/repository/vcs/git_driver.rs | 16 | ||||
| -rw-r--r-- | crates/shirabe/src/repository/vcs/github_driver.rs | 23 | ||||
| -rw-r--r-- | crates/shirabe/src/repository/vcs/gitlab_driver.rs | 22 | ||||
| -rw-r--r-- | crates/shirabe/src/repository/vcs/hg_driver.rs | 18 | ||||
| -rw-r--r-- | crates/shirabe/src/repository/vcs/perforce_driver.rs | 4 | ||||
| -rw-r--r-- | crates/shirabe/src/repository/vcs/svn_driver.rs | 16 | ||||
| -rw-r--r-- | crates/shirabe/src/repository/vcs/vcs_driver.rs | 13 | ||||
| -rw-r--r-- | crates/shirabe/src/repository/vcs/vcs_driver_interface.rs | 7 |
11 files changed, 99 insertions, 69 deletions
diff --git a/crates/shirabe/src/repository/vcs/forgejo_driver.rs b/crates/shirabe/src/repository/vcs/forgejo_driver.rs index a40f6a9..73975cd 100644 --- a/crates/shirabe/src/repository/vcs/forgejo_driver.rs +++ b/crates/shirabe/src/repository/vcs/forgejo_driver.rs @@ -5,7 +5,7 @@ use anyhow::Result; use indexmap::IndexMap; use shirabe_external_packages::composer::pcre::{CaptureKey, Preg}; use shirabe_php_shim::{ - PhpMixed, RuntimeException, base64_decode, explode, extension_loaded, urlencode, + DATE_RFC3339, PhpMixed, RuntimeException, base64_decode, explode, extension_loaded, urlencode, }; use crate::cache::Cache; @@ -185,7 +185,7 @@ impl ForgejoDriver { pub fn get_change_date( &mut self, identifier: &str, - ) -> Result<Option<chrono::DateTime<chrono::Utc>>> { + ) -> Result<Option<chrono::DateTime<chrono::FixedOffset>>> { if let Some(ref mut git_driver) = self.git_driver { return git_driver.get_change_date(identifier); } @@ -218,8 +218,7 @@ impl ForgejoDriver { code: 0, })?; - let date = chrono::DateTime::parse_from_rfc3339(&date_str) - .map(|d| d.with_timezone(&chrono::Utc))?; + let date: chrono::DateTime<chrono::FixedOffset> = shirabe_php_shim::date_create(&date_str)?; Ok(Some(date)) } @@ -725,7 +724,7 @@ impl crate::repository::vcs::VcsDriverInterface for ForgejoDriver { fn get_change_date( &mut self, identifier: &str, - ) -> anyhow::Result<Option<chrono::DateTime<chrono::Utc>>> { + ) -> anyhow::Result<Option<chrono::DateTime<chrono::FixedOffset>>> { ForgejoDriver::get_change_date(self, identifier) } diff --git a/crates/shirabe/src/repository/vcs/fossil_driver.rs b/crates/shirabe/src/repository/vcs/fossil_driver.rs index 0ee20da..15328c0 100644 --- a/crates/shirabe/src/repository/vcs/fossil_driver.rs +++ b/crates/shirabe/src/repository/vcs/fossil_driver.rs @@ -1,10 +1,12 @@ //! ref: composer/src/Composer/Repository/Vcs/FossilDriver.php use crate::io::io_interface; -use chrono::{DateTime, Utc}; +use chrono::{DateTime, FixedOffset, Utc}; use indexmap::IndexMap; use shirabe_external_packages::composer::pcre::Preg; -use shirabe_php_shim::{PhpMixed, RuntimeException, dirname, is_dir, is_file, is_writable}; +use shirabe_php_shim::{ + DATE_RFC3339, PhpMixed, RuntimeException, dirname, is_dir, is_file, is_writable, +}; use crate::cache::Cache; use crate::config::Config; @@ -256,7 +258,10 @@ impl FossilDriver { Ok(Some(content)) } - pub fn get_change_date(&self, _identifier: &str) -> anyhow::Result<Option<DateTime<Utc>>> { + pub fn get_change_date( + &self, + _identifier: &str, + ) -> anyhow::Result<Option<DateTime<FixedOffset>>> { let mut output = String::new(); self.inner.process.borrow_mut().execute_args( &["fossil", "finfo", "-b", "-n", "1", "composer.json"] @@ -268,8 +273,8 @@ impl FossilDriver { let parts: Vec<&str> = output.trim().splitn(3, ' ').collect(); let date = parts.get(1).copied().unwrap_or(""); - let date = DateTime::parse_from_rfc3339(date).map(|d| d.with_timezone(&Utc))?; - Ok(Some(date)) + let date: DateTime<Utc> = shirabe_php_shim::date_create(date)?; + Ok(Some(date.fixed_offset())) } pub fn get_tags(&mut self) -> anyhow::Result<IndexMap<String, String>> { @@ -383,7 +388,10 @@ impl crate::repository::vcs::VcsDriverInterface for FossilDriver { FossilDriver::get_file_content(self, file, identifier) } - fn get_change_date(&mut self, identifier: &str) -> anyhow::Result<Option<DateTime<Utc>>> { + fn get_change_date( + &mut self, + identifier: &str, + ) -> anyhow::Result<Option<DateTime<FixedOffset>>> { FossilDriver::get_change_date(self, identifier) } diff --git a/crates/shirabe/src/repository/vcs/git_bitbucket_driver.rs b/crates/shirabe/src/repository/vcs/git_bitbucket_driver.rs index f8cfd7a..de1f814 100644 --- a/crates/shirabe/src/repository/vcs/git_bitbucket_driver.rs +++ b/crates/shirabe/src/repository/vcs/git_bitbucket_driver.rs @@ -2,13 +2,13 @@ use crate::io::io_interface; use anyhow::Result; -use chrono::{DateTime, Utc}; +use chrono::{DateTime, FixedOffset}; use indexmap::IndexMap; use shirabe_external_packages::composer::pcre::{CaptureKey, Preg}; use shirabe_php_shim::{ - InvalidArgumentException, LogicException, PhpMixed, RuntimeException, array_key_exists, - array_search_mixed, extension_loaded, http_build_query_mixed, implode, in_array, is_array, - sprintf, strpos, + DATE_RFC3339, InvalidArgumentException, LogicException, PhpMixed, RuntimeException, + array_key_exists, array_search_mixed, extension_loaded, http_build_query_mixed, implode, + in_array, is_array, sprintf, strpos, }; use crate::cache::Cache; @@ -461,7 +461,7 @@ impl GitBitbucketDriver { } /// @inheritDoc - pub fn get_change_date(&mut self, identifier: &str) -> Result<Option<DateTime<Utc>>> { + pub fn get_change_date(&mut self, identifier: &str) -> Result<Option<DateTime<FixedOffset>>> { if let Some(fallback) = self.fallback_driver.as_mut() { return fallback.get_change_date(identifier); } @@ -486,11 +486,8 @@ impl GitBitbucketDriver { .fetch_with_oauth_credentials(&resource, false)? .decode_json()?; - // TODO(phase-b): port PHP `new \DateTimeImmutable($commit['date'])` let date_str = commit.get("date").and_then(|v| v.as_string()).unwrap_or(""); - let date: DateTime<Utc> = chrono::DateTime::parse_from_rfc3339(date_str) - .map_err(|e| anyhow::anyhow!(e))? - .with_timezone(&Utc); + let date: DateTime<FixedOffset> = shirabe_php_shim::date_create(date_str)?; Ok(Some(date)) } @@ -920,7 +917,10 @@ impl crate::repository::vcs::VcsDriverInterface for GitBitbucketDriver { GitBitbucketDriver::get_file_content(self, file, identifier) } - fn get_change_date(&mut self, identifier: &str) -> anyhow::Result<Option<DateTime<Utc>>> { + fn get_change_date( + &mut self, + identifier: &str, + ) -> anyhow::Result<Option<DateTime<FixedOffset>>> { GitBitbucketDriver::get_change_date(self, identifier) } diff --git a/crates/shirabe/src/repository/vcs/git_driver.rs b/crates/shirabe/src/repository/vcs/git_driver.rs index 4878ffe..7f8c206 100644 --- a/crates/shirabe/src/repository/vcs/git_driver.rs +++ b/crates/shirabe/src/repository/vcs/git_driver.rs @@ -2,7 +2,7 @@ use crate::io::io_interface; use chrono::TimeZone; -use chrono::{DateTime, Utc}; +use chrono::{DateTime, FixedOffset, Utc}; use indexmap::IndexMap; use shirabe_external_packages::composer::pcre::{CaptureKey, Preg}; use shirabe_php_shim::{ @@ -281,7 +281,10 @@ impl GitDriver { Ok(Some(content)) } - pub fn get_change_date(&mut self, identifier: &str) -> anyhow::Result<Option<DateTime<Utc>>> { + pub fn get_change_date( + &mut self, + identifier: &str, + ) -> anyhow::Result<Option<DateTime<FixedOffset>>> { if identifier.starts_with('-') { return Err(RuntimeException { message: format!( @@ -310,7 +313,9 @@ impl GitDriver { let timestamp_str = GitUtil::parse_rev_list_output(&output, &self.inner.process); let timestamp: i64 = timestamp_str.trim().parse().unwrap_or(0); - Ok(Some(Utc.timestamp_opt(timestamp, 0).unwrap())) + Ok(Some( + Utc.timestamp_opt(timestamp, 0).unwrap().fixed_offset(), + )) } pub fn get_tags(&mut self) -> anyhow::Result<IndexMap<String, String>> { @@ -514,7 +519,10 @@ impl crate::repository::vcs::VcsDriverInterface for GitDriver { GitDriver::get_file_content(self, file, identifier) } - fn get_change_date(&mut self, identifier: &str) -> anyhow::Result<Option<DateTime<Utc>>> { + fn get_change_date( + &mut self, + identifier: &str, + ) -> anyhow::Result<Option<DateTime<FixedOffset>>> { GitDriver::get_change_date(self, identifier) } diff --git a/crates/shirabe/src/repository/vcs/github_driver.rs b/crates/shirabe/src/repository/vcs/github_driver.rs index 45ba7b7..aa1e135 100644 --- a/crates/shirabe/src/repository/vcs/github_driver.rs +++ b/crates/shirabe/src/repository/vcs/github_driver.rs @@ -2,13 +2,14 @@ use crate::io::io_interface; use anyhow::Result; -use chrono::{DateTime, Utc}; +use chrono::{DateTime, FixedOffset}; use indexmap::IndexMap; use shirabe_external_packages::composer::pcre::{CaptureKey, Preg}; use shirabe_php_shim::{ - InvalidArgumentException, PhpMixed, RuntimeException, array_diff, array_key_exists, array_map, - array_search_mixed, base64_decode, basename, count, empty, explode, extension_loaded, in_array, - parse_url_all, sprintf, strpos, strtolower, substr, trim, urlencode, + DATE_RFC3339, InvalidArgumentException, PhpMixed, RuntimeException, array_diff, + array_key_exists, array_map, array_search_mixed, base64_decode, basename, count, empty, + explode, extension_loaded, in_array, parse_url_all, sprintf, strpos, strtolower, substr, trim, + urlencode, }; use crate::cache::Cache; @@ -821,7 +822,7 @@ impl GitHubDriver { Ok(Some(content)) } - pub fn get_change_date(&mut self, identifier: &str) -> Result<Option<DateTime<Utc>>> { + pub fn get_change_date(&mut self, identifier: &str) -> Result<Option<DateTime<FixedOffset>>> { if let Some(ref mut git_driver) = self.git_driver { return git_driver.get_change_date(identifier); } @@ -851,11 +852,8 @@ impl GitHubDriver { _ => String::new(), }; - Ok(Some( - DateTime::parse_from_rfc3339(&date_str) - .map(|dt| dt.with_timezone(&Utc)) - .unwrap_or_else(|_| Utc::now()), - )) + let date: DateTime<FixedOffset> = shirabe_php_shim::date_create(&date_str)?; + Ok(Some(date)) } pub fn get_tags(&mut self) -> Result<IndexMap<String, String>> { @@ -1364,7 +1362,10 @@ impl crate::repository::vcs::VcsDriverInterface for GitHubDriver { GitHubDriver::get_file_content(self, file, identifier) } - fn get_change_date(&mut self, identifier: &str) -> anyhow::Result<Option<DateTime<Utc>>> { + fn get_change_date( + &mut self, + identifier: &str, + ) -> anyhow::Result<Option<DateTime<FixedOffset>>> { GitHubDriver::get_change_date(self, identifier) } diff --git a/crates/shirabe/src/repository/vcs/gitlab_driver.rs b/crates/shirabe/src/repository/vcs/gitlab_driver.rs index 97dcc30..8ab30d4 100644 --- a/crates/shirabe/src/repository/vcs/gitlab_driver.rs +++ b/crates/shirabe/src/repository/vcs/gitlab_driver.rs @@ -2,13 +2,13 @@ use crate::io::io_interface; use anyhow::Result; -use chrono::{DateTime, Utc}; +use chrono::{DateTime, FixedOffset}; use indexmap::IndexMap; use shirabe_external_packages::composer::pcre::{CaptureKey, Preg}; use shirabe_php_shim::{ - InvalidArgumentException, LogicException, PhpMixed, RuntimeException, array_search_mixed, - array_shift, ctype_alnum, empty, explode, extension_loaded, implode, in_array, is_array, - is_string, ord, sprintf, strpos, strtolower, + DATE_RFC3339, InvalidArgumentException, LogicException, PhpMixed, RuntimeException, + array_search_mixed, array_shift, ctype_alnum, empty, explode, extension_loaded, implode, + in_array, is_array, is_string, ord, sprintf, strpos, strtolower, }; use crate::cache::Cache; @@ -458,7 +458,7 @@ impl GitLabDriver { Ok(content) } - pub fn get_change_date(&mut self, identifier: &str) -> Result<Option<DateTime<Utc>>> { + pub fn get_change_date(&mut self, identifier: &str) -> Result<Option<DateTime<FixedOffset>>> { if let Some(ref mut git_driver) = self.git_driver { return git_driver.get_change_date(identifier); } @@ -468,11 +468,8 @@ impl GitLabDriver { .get("committed_date") .and_then(|v| v.as_string()) .unwrap_or(""); - return Ok(Some( - DateTime::parse_from_rfc3339(committed_date) - .map(|dt| dt.with_timezone(&Utc)) - .unwrap_or_else(|_| Utc::now()), - )); + let date: DateTime<FixedOffset> = shirabe_php_shim::date_create(committed_date)?; + return Ok(Some(date)); } Ok(None) @@ -1153,7 +1150,10 @@ impl crate::repository::vcs::VcsDriverInterface for GitLabDriver { GitLabDriver::get_file_content(self, file, identifier) } - fn get_change_date(&mut self, identifier: &str) -> anyhow::Result<Option<DateTime<Utc>>> { + fn get_change_date( + &mut self, + identifier: &str, + ) -> anyhow::Result<Option<DateTime<FixedOffset>>> { GitLabDriver::get_change_date(self, identifier) } diff --git a/crates/shirabe/src/repository/vcs/hg_driver.rs b/crates/shirabe/src/repository/vcs/hg_driver.rs index c35a574..f637437 100644 --- a/crates/shirabe/src/repository/vcs/hg_driver.rs +++ b/crates/shirabe/src/repository/vcs/hg_driver.rs @@ -10,10 +10,10 @@ use crate::repository::vcs::VcsDriverBase; use crate::util::Filesystem; use crate::util::Hg as HgUtils; use crate::util::Url; -use chrono::{DateTime, Utc}; +use chrono::{DateTime, FixedOffset, Utc}; use indexmap::IndexMap; use shirabe_external_packages::composer::pcre::{CaptureKey, Preg}; -use shirabe_php_shim::{PhpMixed, RuntimeException, dirname, is_dir, is_writable}; +use shirabe_php_shim::{DATE_RFC3339, PhpMixed, RuntimeException, dirname, is_dir, is_writable}; #[derive(Debug)] pub struct HgDriver { @@ -197,7 +197,10 @@ impl HgDriver { Ok(Some(content)) } - pub fn get_change_date(&self, identifier: &str) -> anyhow::Result<Option<DateTime<Utc>>> { + pub fn get_change_date( + &self, + identifier: &str, + ) -> anyhow::Result<Option<DateTime<FixedOffset>>> { if identifier.starts_with('-') { return Err(RuntimeException { message: format!( @@ -225,8 +228,8 @@ impl HgDriver { Some(self.repo_dir.clone()), ); - let date = DateTime::parse_from_rfc3339(output.trim()).map(|d| d.with_timezone(&Utc))?; - Ok(Some(date)) + let date: DateTime<Utc> = shirabe_php_shim::date_create(output.trim())?; + Ok(Some(date.fixed_offset())) } pub fn get_tags(&mut self) -> anyhow::Result<IndexMap<String, String>> { @@ -410,7 +413,10 @@ impl crate::repository::vcs::VcsDriverInterface for HgDriver { HgDriver::get_file_content(self, file, identifier) } - fn get_change_date(&mut self, identifier: &str) -> anyhow::Result<Option<DateTime<Utc>>> { + fn get_change_date( + &mut self, + identifier: &str, + ) -> anyhow::Result<Option<DateTime<FixedOffset>>> { HgDriver::get_change_date(self, identifier) } diff --git a/crates/shirabe/src/repository/vcs/perforce_driver.rs b/crates/shirabe/src/repository/vcs/perforce_driver.rs index 0fe0f6f..65f2856 100644 --- a/crates/shirabe/src/repository/vcs/perforce_driver.rs +++ b/crates/shirabe/src/repository/vcs/perforce_driver.rs @@ -113,7 +113,7 @@ impl PerforceDriver { pub fn get_change_date( &self, _identifier: &str, - ) -> anyhow::Result<Option<chrono::DateTime<chrono::Utc>>> { + ) -> anyhow::Result<Option<chrono::DateTime<chrono::FixedOffset>>> { Ok(None) } @@ -248,7 +248,7 @@ impl crate::repository::vcs::VcsDriverInterface for PerforceDriver { fn get_change_date( &mut self, identifier: &str, - ) -> anyhow::Result<Option<chrono::DateTime<chrono::Utc>>> { + ) -> anyhow::Result<Option<chrono::DateTime<chrono::FixedOffset>>> { PerforceDriver::get_change_date(self, identifier) } diff --git a/crates/shirabe/src/repository/vcs/svn_driver.rs b/crates/shirabe/src/repository/vcs/svn_driver.rs index ef8787a..f4e2bba 100644 --- a/crates/shirabe/src/repository/vcs/svn_driver.rs +++ b/crates/shirabe/src/repository/vcs/svn_driver.rs @@ -1,7 +1,7 @@ //! ref: composer/src/Composer/Repository/Vcs/SvnDriver.php use anyhow::Result; -use chrono::{DateTime, TimeZone, Utc}; +use chrono::{DateTime, FixedOffset, Utc}; use indexmap::IndexMap; use shirabe_external_packages::composer::pcre::{CaptureKey, Preg}; use shirabe_php_shim::{ @@ -296,7 +296,7 @@ impl SvnDriver { Ok(Some(output)) } - pub fn get_change_date(&mut self, identifier: &str) -> Result<Option<DateTime<Utc>>> { + pub fn get_change_date(&mut self, identifier: &str) -> Result<Option<DateTime<FixedOffset>>> { let identifier = format!("/{}/", trim(identifier, Some("/"))); let (path, rev) = if let Ok(Some(m)) = @@ -329,10 +329,9 @@ impl SvnDriver { .unwrap_or(false) { let date_str = m.get(&CaptureKey::ByIndex(1)).cloned().unwrap_or_default(); - // PHP: new \DateTimeImmutable($match[1], new \DateTimeZone('UTC')) - return Ok(Utc - .datetime_from_str(date_str.trim(), "%Y-%m-%d %H:%M:%S %z") - .ok()); + return Ok(shirabe_php_shim::date_create::<Utc>(date_str.trim()) + .ok() + .map(|d| d.fixed_offset())); } } } @@ -638,7 +637,10 @@ impl crate::repository::vcs::VcsDriverInterface for SvnDriver { SvnDriver::get_file_content(self, file, identifier) } - fn get_change_date(&mut self, identifier: &str) -> anyhow::Result<Option<DateTime<Utc>>> { + fn get_change_date( + &mut self, + identifier: &str, + ) -> anyhow::Result<Option<DateTime<FixedOffset>>> { SvnDriver::get_change_date(self, identifier) } diff --git a/crates/shirabe/src/repository/vcs/vcs_driver.rs b/crates/shirabe/src/repository/vcs/vcs_driver.rs index 94c3ff8..dc88387 100644 --- a/crates/shirabe/src/repository/vcs/vcs_driver.rs +++ b/crates/shirabe/src/repository/vcs/vcs_driver.rs @@ -1,9 +1,9 @@ //! ref: composer/src/Composer/Repository/Vcs/VcsDriver.php -use chrono::{DateTime, Utc}; +use chrono::{DateTime, FixedOffset}; use indexmap::IndexMap; use shirabe_external_packages::composer::pcre::Preg; -use shirabe_php_shim::{PhpMixed, extension_loaded}; +use shirabe_php_shim::{DATE_RFC3339, PhpMixed, extension_loaded}; use crate::cache::Cache; use crate::config::Config; @@ -94,7 +94,7 @@ impl VcsDriverBase { pub fn finish_base_composer_information( identifier: &str, composer_file_content: Option<String>, - change_date: impl FnOnce() -> anyhow::Result<Option<DateTime<Utc>>>, + change_date: impl FnOnce() -> anyhow::Result<Option<DateTime<FixedOffset>>>, ) -> anyhow::Result<Option<IndexMap<String, PhpMixed>>> { let content = match composer_file_content { None => return Ok(None), @@ -123,7 +123,10 @@ impl VcsDriverBase { .map_or(true, |v| v.as_string().map_or(true, |s| s.is_empty())) { if let Some(d) = change_date()? { - composer.insert("time".to_string(), PhpMixed::String(d.to_rfc3339())); + composer.insert( + "time".to_string(), + PhpMixed::String(d.format(DATE_RFC3339).to_string()), + ); } } @@ -284,7 +287,7 @@ pub trait VcsDriver: VcsDriverInterface { if let Some(change_date) = self.get_change_date(identifier)? { composer.insert( "time".to_string(), - PhpMixed::String(change_date.to_rfc3339()), + PhpMixed::String(change_date.format(DATE_RFC3339).to_string()), ); } } diff --git a/crates/shirabe/src/repository/vcs/vcs_driver_interface.rs b/crates/shirabe/src/repository/vcs/vcs_driver_interface.rs index e845300..5d2be04 100644 --- a/crates/shirabe/src/repository/vcs/vcs_driver_interface.rs +++ b/crates/shirabe/src/repository/vcs/vcs_driver_interface.rs @@ -2,7 +2,7 @@ use crate::config::Config; use crate::io::IOInterface; -use chrono::{DateTime, Utc}; +use chrono::{DateTime, FixedOffset}; use indexmap::IndexMap; use shirabe_php_shim::PhpMixed; use std::cell::RefCell; @@ -18,7 +18,10 @@ pub trait VcsDriverInterface: std::fmt::Debug { fn get_file_content(&mut self, file: &str, identifier: &str) -> anyhow::Result<Option<String>>; - fn get_change_date(&mut self, identifier: &str) -> anyhow::Result<Option<DateTime<Utc>>>; + fn get_change_date( + &mut self, + identifier: &str, + ) -> anyhow::Result<Option<DateTime<FixedOffset>>>; fn get_root_identifier(&mut self) -> anyhow::Result<String>; |
