From 779ac7d3a26a4c2f6138c15752f0ce63f33e8d9b Mon Sep 17 00:00:00 2001 From: Isaac Shoebottom Date: Wed, 19 Mar 2025 16:56:58 -0300 Subject: [PATCH] Initial commit --- .gitignore | 17 ++++++ Cargo.lock | 147 +++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 9 +++ example.toml | 22 ++++++++ manifest.py | 23 ++++++++ pyproject.toml | 17 ++++++ src/main.rs | 80 +++++++++++++++++++++++++++ update.py | 0 8 files changed, 315 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 example.toml create mode 100644 manifest.py create mode 100644 pyproject.toml create mode 100644 src/main.rs create mode 100644 update.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6e771f8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb + +# RustRover +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..dbb10c7 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,147 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "indexmap" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "local-updater" +version = "0.1.0" +dependencies = [ + "serde", + "serde_derive", + "toml", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "syn" +version = "2.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "toml" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "winnow" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" +dependencies = [ + "memchr", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..261262e --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "local-updater" +version = "0.1.0" +edition = "2024" + +[dependencies] +serde = "1.0.219" +serde_derive = "1.0.219" +toml = "0.8.20" diff --git a/example.toml b/example.toml new file mode 100644 index 0000000..c01b41a --- /dev/null +++ b/example.toml @@ -0,0 +1,22 @@ +[metadata] +name = "example" +version = "0.1.0" +description = "Example package" +homepage = "https://example.com" +url = "https://example.com/example-0.1.0-linux-amd64.tar.gz" +license = "MIT" + +# Uses XDG Base Directory Specification +# Except bin, which just goes in $HOME/.local/bin +[install] +bin = ["example"] +config = ["config.toml"] +share = ["data"] + +[update.check] +type_ = "github" +checkver = "https://example.com/checkver" +regex = "v([0-9]+\\.[0-9]+\\.[0-9]+)" + +[update.template] +url = "https://example.com/$version-$os-$arch.tar.gz" diff --git a/manifest.py b/manifest.py new file mode 100644 index 0000000..7d51f27 --- /dev/null +++ b/manifest.py @@ -0,0 +1,23 @@ +import tomlkit as tomllib +import os +import sys + + +def load_from_state(name): + # Get xdg data home + xdg_data_home = os.environ.get('XDG_DATA_HOME', os.path.join(os.environ['HOME'], '.local', 'share')) + # Get the path to the state file + state_file = os.path.join(xdg_data_home, 'local-updater', name + '.toml') + # Load the state file + return load(state_file) + +def load(filename): + with open(filename, 'r') as f: + return tomllib.loads(f.read()) + +def main(filename): + tmp = load(filename[0]) + print(tmp) + +if __name__ == '__main__': + main(sys.argv[1:]) \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..9b3f589 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,17 @@ +[project] +name = "local-updater" +version = "0.1.0" +description = "" +authors = [ + {name = "Isaac Shoebottom",email = "ir.shoebottom@gmail.com"} +] +readme = "README.md" +requires-python = ">=3.9" +dependencies = [ + "tomlkit (>=0.13.2,<0.14.0)" +] + + +[build-system] +requires = ["poetry-core>=2.0.0,<3.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..d2d69f4 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,80 @@ +use serde_derive::Deserialize; +use toml; + +// Example TOML file +/* +[metadata] +name = "example" +version = "0.1.0" +description = "Example package" +homepage = "https://example.com" +url = "https://example.com/example-0.1.0-linux-amd64.tar.gz" +license = "MIT" + +# Uses XDG Base Directory Specification +# Except bin, which just goes in $HOME/.local/bin +[install] +bin = ["example"] +config = ["config.toml"] +share = ["data"] + +[update.check] +type = "github" +checkver = "https://example.com/checkver" +regex = "v([0-9]+\\.[0-9]+\\.[0-9]+)" + +[update.template] +url = "https://example.com/$version-$os-$arch.tar.gz" +*/ + +#[derive(Debug, Deserialize)] +struct Manifest { + metadata: Metadata, + install: Install, + update: Update, +} +#[derive(Debug, Deserialize)] +struct Metadata { + name: String, + version: String, + description: String, + homepage: String, + url: String, + license: String, +} +#[derive(Debug, Deserialize)] +struct Install { + bin: Vec, + config: Vec, + share: Vec, +} +#[derive(Debug, Deserialize)] +struct Update { + check: Check, + template: Template, +} +#[derive(Debug, Deserialize)] +struct Check { + type_: String, + checkver: String, + regex: String, +} +#[derive(Debug, Deserialize)] +struct Template { + url: String, +} + +// Load TOML file from first argument +// Then parse it into a Manifest struct +// Then print the struct + +fn main() { + let args: Vec = std::env::args().collect(); + if args.len() != 2 { + eprintln!("Usage: {} ", args[0]); + std::process::exit(1); + } + let file = std::fs::read_to_string(&args[1]).unwrap(); + let manifest: Manifest = toml::from_str(&file).unwrap(); + println!("{:#?}", manifest); +} diff --git a/update.py b/update.py new file mode 100644 index 0000000..e69de29