Save progress when interrupted
This commit is contained in:
parent
5f6c087097
commit
b4ce27a1b9
5 changed files with 40 additions and 1 deletions
11
Cargo.lock
generated
11
Cargo.lock
generated
|
@ -928,6 +928,7 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"serde_yaml",
|
"serde_yaml",
|
||||||
|
"signal-hook",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"tokio",
|
"tokio",
|
||||||
"wikitext-parser",
|
"wikitext-parser",
|
||||||
|
@ -1600,6 +1601,16 @@ dependencies = [
|
||||||
"digest",
|
"digest",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "signal-hook"
|
||||||
|
version = "0.3.17"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"signal-hook-registry",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "signal-hook-registry"
|
name = "signal-hook-registry"
|
||||||
version = "1.4.1"
|
version = "1.4.1"
|
||||||
|
|
|
@ -19,6 +19,7 @@ regex = "1.10.2"
|
||||||
serde = { version = "1.0.139", features = ["derive"] }
|
serde = { version = "1.0.139", features = ["derive"] }
|
||||||
serde_json = "1.0.108"
|
serde_json = "1.0.108"
|
||||||
serde_yaml = "0.8.25"
|
serde_yaml = "0.8.25"
|
||||||
|
signal-hook = "0.3.17"
|
||||||
thiserror = "1.0.50"
|
thiserror = "1.0.50"
|
||||||
tokio = { version = "1.34.0", features = ["full"] }
|
tokio = { version = "1.34.0", features = ["full"] }
|
||||||
wikitext-parser = "0.3.3"
|
wikitext-parser = "0.3.3"
|
||||||
|
|
14
src/main.rs
14
src/main.rs
|
@ -6,6 +6,13 @@ mod schema;
|
||||||
mod steam;
|
mod steam;
|
||||||
mod wiki;
|
mod wiki;
|
||||||
|
|
||||||
|
use std::sync::{
|
||||||
|
atomic::{AtomicBool, Ordering},
|
||||||
|
Arc,
|
||||||
|
};
|
||||||
|
|
||||||
|
use once_cell::sync::Lazy;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
manifest::{Manifest, ManifestOverride},
|
manifest::{Manifest, ManifestOverride},
|
||||||
resource::ResourceFile,
|
resource::ResourceFile,
|
||||||
|
@ -14,6 +21,11 @@ use crate::{
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const REPO: &str = env!("CARGO_MANIFEST_DIR");
|
pub const REPO: &str = env!("CARGO_MANIFEST_DIR");
|
||||||
|
static CANCEL: Lazy<Arc<AtomicBool>> = Lazy::new(|| Arc::new(AtomicBool::new(false)));
|
||||||
|
|
||||||
|
pub fn should_cancel() -> bool {
|
||||||
|
CANCEL.load(Ordering::Relaxed)
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
|
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
|
@ -90,6 +102,8 @@ impl Error {
|
||||||
async fn main() {
|
async fn main() {
|
||||||
let cli = cli::parse();
|
let cli = cli::parse();
|
||||||
|
|
||||||
|
signal_hook::flag::register(signal_hook::consts::SIGINT, (*CANCEL).clone()).unwrap();
|
||||||
|
|
||||||
let mut wiki_cache = WikiCache::load().unwrap();
|
let mut wiki_cache = WikiCache::load().unwrap();
|
||||||
let mut wiki_meta_cache = WikiMetaCache::load().unwrap();
|
let mut wiki_meta_cache = WikiMetaCache::load().unwrap();
|
||||||
let mut steam_cache = SteamCache::load().unwrap();
|
let mut steam_cache = SteamCache::load().unwrap();
|
||||||
|
|
|
@ -3,6 +3,7 @@ use std::{collections::BTreeMap, process::Command};
|
||||||
use crate::{
|
use crate::{
|
||||||
manifest::{placeholder, Os},
|
manifest::{placeholder, Os},
|
||||||
resource::ResourceFile,
|
resource::ResourceFile,
|
||||||
|
should_cancel,
|
||||||
wiki::WikiCache,
|
wiki::WikiCache,
|
||||||
Error, State, REPO,
|
Error, State, REPO,
|
||||||
};
|
};
|
||||||
|
@ -36,6 +37,10 @@ impl SteamCache {
|
||||||
});
|
});
|
||||||
|
|
||||||
for app_id in app_ids {
|
for app_id in app_ids {
|
||||||
|
if should_cancel() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
let latest = SteamCacheEntry::fetch_from_id(app_id)?;
|
let latest = SteamCacheEntry::fetch_from_id(app_id)?;
|
||||||
self.0.insert(
|
self.0.insert(
|
||||||
app_id,
|
app_id,
|
||||||
|
|
10
src/wiki.rs
10
src/wiki.rs
|
@ -7,7 +7,7 @@ use wikitext_parser::{Attribute, TextPiece};
|
||||||
use crate::{
|
use crate::{
|
||||||
manifest::{placeholder, Os, Store, Tag},
|
manifest::{placeholder, Os, Store, Tag},
|
||||||
resource::ResourceFile,
|
resource::ResourceFile,
|
||||||
Error, Regularity, State,
|
should_cancel, Error, Regularity, State,
|
||||||
};
|
};
|
||||||
|
|
||||||
const SAVE_INTERVAL: u32 = 100;
|
const SAVE_INTERVAL: u32 = 100;
|
||||||
|
@ -212,6 +212,10 @@ impl WikiCache {
|
||||||
.as_array()
|
.as_array()
|
||||||
.ok_or(Error::WikiData("query.categorymembers"))?
|
.ok_or(Error::WikiData("query.categorymembers"))?
|
||||||
{
|
{
|
||||||
|
if should_cancel() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
let title = page["title"]
|
let title = page["title"]
|
||||||
.as_str()
|
.as_str()
|
||||||
.ok_or(Error::WikiData("query.categorymembers[].title"))?;
|
.ok_or(Error::WikiData("query.categorymembers[].title"))?;
|
||||||
|
@ -277,6 +281,10 @@ impl WikiCache {
|
||||||
});
|
});
|
||||||
|
|
||||||
for title in &titles {
|
for title in &titles {
|
||||||
|
if should_cancel() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
let cached = self.0.get(title).cloned().unwrap_or_default();
|
let cached = self.0.get(title).cloned().unwrap_or_default();
|
||||||
|
|
||||||
println!("Wiki: {}", title);
|
println!("Wiki: {}", title);
|
||||||
|
|
Reference in a new issue