Skip to content

Commit c2de6a7

Browse files
committed
fix(metadata): fix metadata sync interval handling
1 parent 3ba2a63 commit c2de6a7

File tree

3 files changed

+27
-14
lines changed

3 files changed

+27
-14
lines changed

soar-cli/src/state.rs

-5
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,6 @@ impl AppState {
4747
let mut tasks = Vec::new();
4848

4949
for repo in &self.inner.config.repositories {
50-
let db_file = repo.get_path()?.join("metadata.db");
51-
if !db_file.exists() {
52-
fs::create_dir_all(repo.get_path()?)?;
53-
File::create(&db_file)?;
54-
}
5550
let repo_clone = repo.clone();
5651
let task = tokio::task::spawn(async move { fetch_metadata(repo_clone, force).await });
5752
tasks.push(task);

soar-core/src/database/models.rs

+15
Original file line numberDiff line numberDiff line change
@@ -278,18 +278,26 @@ pub struct RemotePackage {
278278
#[serde(default, deserialize_with = "optional_number")]
279279
pub rank: Option<u64>,
280280

281+
#[serde(default, deserialize_with = "empty_is_none")]
281282
pub pkg: Option<String>,
282283
pub pkg_id: String,
283284
pub pkg_name: String,
285+
286+
#[serde(default, deserialize_with = "empty_is_none")]
284287
pub pkg_family: Option<String>,
288+
289+
#[serde(default, deserialize_with = "empty_is_none")]
285290
pub pkg_type: Option<String>,
286291

287292
#[serde(default, deserialize_with = "empty_is_none")]
288293
pub pkg_webpage: Option<String>,
289294

290295
pub description: String,
291296
pub version: String,
297+
298+
#[serde(default, deserialize_with = "empty_is_none")]
292299
pub version_upstream: Option<String>,
300+
293301
pub download_url: String,
294302

295303
#[serde(default, deserialize_with = "optional_number")]
@@ -302,7 +310,11 @@ pub struct RemotePackage {
302310
pub ghcr_size_raw: Option<u64>,
303311

304312
pub ghcr_files: Option<Vec<String>>,
313+
314+
#[serde(default, deserialize_with = "empty_is_none")]
305315
pub ghcr_blob: Option<String>,
316+
317+
#[serde(default, deserialize_with = "empty_is_none")]
306318
pub ghcr_url: Option<String>,
307319

308320
#[serde(alias = "src_url")]
@@ -323,7 +335,10 @@ pub struct RemotePackage {
323335
#[serde(alias = "tag")]
324336
pub tags: Option<Vec<String>>,
325337

338+
#[serde(default, deserialize_with = "empty_is_none")]
326339
pub bsum: Option<String>,
340+
341+
#[serde(default, deserialize_with = "empty_is_none")]
327342
pub shasum: Option<String>,
328343

329344
#[serde(default, deserialize_with = "empty_is_none")]

soar-core/src/metadata.rs

+12-9
Original file line numberDiff line numberDiff line change
@@ -69,19 +69,27 @@ pub async fn fetch_public_key<P: AsRef<Path>>(
6969

7070
pub async fn fetch_metadata(repo: Repository, force: bool) -> SoarResult<()> {
7171
let repo_path = repo.get_path()?;
72-
if !repo_path.is_dir() {
73-
return Err(SoarError::InvalidPath);
72+
let metadata_db = repo_path.join("metadata.db");
73+
74+
if !metadata_db.exists() {
75+
fs::create_dir_all(repo.get_path()?)?;
76+
File::create(&metadata_db)?;
7477
}
7578

76-
let metadata_db = repo_path.join("metadata.db");
77-
if !force {
79+
let conn = Connection::open(&metadata_db)?;
80+
let etag: String = conn
81+
.query_row("SELECT etag FROM repository", [], |row| row.get(0))
82+
.unwrap_or_default();
83+
84+
if !force && !etag.is_empty() {
7885
let file_info = metadata_db.metadata()?;
7986
if let Ok(created) = file_info.created() {
8087
if repo.sync_interval() >= created.elapsed()?.as_millis() as u128 {
8188
return Ok(());
8289
}
8390
}
8491
}
92+
drop(conn);
8593

8694
let client = reqwest::Client::new();
8795

@@ -100,11 +108,6 @@ pub async fn fetch_metadata(repo: Repository, force: bool) -> SoarResult<()> {
100108
}
101109

102110
let etag = {
103-
let conn = Connection::open(&metadata_db)?;
104-
let etag: String = conn
105-
.query_row("SELECT etag FROM repository", [], |row| row.get(0))
106-
.unwrap_or_default();
107-
108111
match resp.headers().get(header::ETAG) {
109112
Some(remote_etag) => {
110113
let remote_etag = remote_etag.to_str().unwrap();

0 commit comments

Comments
 (0)