diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e1a7f2e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ +## [0.2.0] - 2026-09-24 + +### ๐Ÿš€ Features + +- Added changelog +- Added Themes +- Added Virtual Scrolling. This allows us to scan a whole /16 subnet without overloading the UI or using a lot of RAM. + +### ๐Ÿ› Bug Fixes + +- Fixed updater to only check for newer version using proper semver checking. Before it only checked if the current in use version was different than what was available. +## [0.1.0] - 2026-09-23 diff --git a/cliff.toml b/cliff.toml new file mode 100644 index 0000000..a18fc20 --- /dev/null +++ b/cliff.toml @@ -0,0 +1,94 @@ +# git-cliff ~ configuration file +# https://git-cliff.org/docs/configuration + + +[changelog] +# A Tera template to be rendered for each release in the changelog. +# See https://keats.github.io/tera/docs/#introduction +body = """ +{% if version %}\ + ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} +{% else %}\ + ## [unreleased] +{% endif %}\ +{% for group, commits in commits | group_by(attribute="group") %} + ### {{ group | striptags | trim | upper_first }} + {% for commit in commits %} + - {% if commit.scope %}*({{ commit.scope }})* {% endif %}\ + {% if commit.breaking %}[**breaking**] {% endif %}\ + {{ commit.message | upper_first }}\ + {% endfor %} +{% endfor %} +""" +# Remove leading and trailing whitespaces from the changelog's body. +trim = true +# Render body even when there are no releases to process. +render_always = true +# An array of regex based postprocessors to modify the changelog. +postprocessors = [ + # Replace the placeholder with a URL. + #{ pattern = '', replace = "https://github.com/orhun/git-cliff" }, +] +# render body even when there are no releases to process +# render_always = true +# output file path +# output = "test.md" + +[git] +# Parse commits according to the conventional commits specification. +# See https://www.conventionalcommits.org +conventional_commits = true +# Exclude commits that do not match the conventional commits specification. +filter_unconventional = true +# Require all commits to be conventional. +# Takes precedence over filter_unconventional. +require_conventional = false +# Split commits on newlines, treating each line as an individual commit. +split_commits = false +# An array of regex based parsers to modify commit messages prior to further processing. +commit_preprocessors = [ + # Replace issue numbers with link templates to be updated in `changelog.postprocessors`. + #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))"}, + # Check spelling of the commit message using https://github.com/crate-ci/typos. + # If the spelling is incorrect, it will be fixed automatically. + #{ pattern = '.*', replace_command = 'typos --write-changes -' }, +] +# Prevent commits that are breaking from being excluded by commit parsers. +protect_breaking_commits = false +# An array of regex based parsers for extracting data from the commit message. +# Assigns commits to groups. +# Optionally sets the commit's scope and can decide to exclude commits from further processing. +commit_parsers = [ + { message = "^feat", group = "๐Ÿš€ Features" }, + { message = "^fix", group = "๐Ÿ› Bug Fixes" }, + { message = "^doc", group = "๐Ÿ“š Documentation" }, + { message = "^perf", group = "โšก Performance" }, + { message = "^refactor", group = "๐Ÿšœ Refactor" }, + { message = "^style", group = "๐ŸŽจ Styling" }, + { message = "^test", group = "๐Ÿงช Testing" }, + { message = "^chore\\(release\\): prepare for", skip = true }, + { message = "^chore\\(deps.*\\)", skip = true }, + { message = "^chore\\(pr\\)", skip = true }, + { message = "^chore\\(pull\\)", skip = true }, + { message = "^chore|^ci", group = "โš™๏ธ Miscellaneous Tasks" }, + { body = ".*security", group = "๐Ÿ›ก๏ธ Security" }, + { message = "^revert", group = "โ—€๏ธ Revert" }, + { message = ".*", group = "๐Ÿ’ผ Other" }, +] +# Exclude commits that are not matched by any commit parser. +filter_commits = false +# Fail on a commit that is not matched by any commit parser. +fail_on_unmatched_commit = false +# An array of link parsers for extracting external references, and turning them into URLs, using regex. +link_parsers = [] +# Include only the tags that belong to the current branch. +use_branch_tags = false +# Order releases topologically instead of chronologically. +topo_order = false +# Order commits topologically instead of chronologically. +topo_order_commits = true +# Order of commits in each group/release within the changelog. +# Allowed values: newest, oldest +sort_commits = "oldest" +# Process submodules commits +recurse_submodules = false diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 410e26b..ee13966 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -49,7 +49,7 @@ checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "argus" -version = "0.1.0" +version = "0.2.0" dependencies = [ "csv", "dns-lookup", @@ -58,7 +58,9 @@ dependencies = [ "libc", "open", "ping-async", + "pulldown-cmark", "reqwest 0.12.28", + "semver", "serde", "serde_json", "tauri", @@ -1367,6 +1369,15 @@ dependencies = [ "version_check", ] +[[package]] +name = "getopts" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe4fbac503b8d1f88e6676011885f34b7174f46e59956bba534ba83abded4df" +dependencies = [ + "unicode-width", +] + [[package]] name = "getrandom" version = "0.2.17" @@ -3006,6 +3017,25 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "pulldown-cmark" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f068eba8e7071c5f9511831b44f32c740d5adf574e990f946ddb53db2f314e" +dependencies = [ + "bitflags 2.13.2", + "getopts", + "memchr", + "pulldown-cmark-escape", + "unicase", +] + +[[package]] +name = "pulldown-cmark-escape" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" + [[package]] name = "quick-xml" version = "0.42.0" @@ -4738,6 +4768,12 @@ dependencies = [ "unic-common", ] +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + [[package]] name = "unicode-ident" version = "1.0.26" @@ -4750,6 +4786,12 @@ version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + [[package]] name = "untrusted" version = "0.9.0" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 3aadae9..07a3276 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "argus" -version = "0.1.0" +version = "0.2.0" description = "An All in One Network Utility" authors = ["James Brotosky Result { + let options = Options::ENABLE_HEADING_ATTRIBUTES + | Options::ENABLE_STRIKETHROUGH + | Options::ENABLE_TABLES; + + let parser = Parser::new_ext(CHANGELOG_MD, options); + let mut html_output = String::new(); + html::push_html(&mut html_output, parser); + + Ok(html_output) +} \ No newline at end of file diff --git a/src-tauri/src/commands/mod.rs b/src-tauri/src/commands/mod.rs index 10e5871..a4c75eb 100644 --- a/src-tauri/src/commands/mod.rs +++ b/src-tauri/src/commands/mod.rs @@ -1,4 +1,5 @@ pub mod actions; +pub mod changelog; pub mod export; pub mod monitor; pub mod nmap; diff --git a/src-tauri/src/commands/updater.rs b/src-tauri/src/commands/updater.rs index ef9c8ac..c5a522f 100644 --- a/src-tauri/src/commands/updater.rs +++ b/src-tauri/src/commands/updater.rs @@ -1,7 +1,8 @@ use serde::{Deserialize, Serialize}; use tauri::AppHandle; -const UPDATE_URL: &str = "https://git.racooncity.org/api/v1/repos/mysticmomba/argus/releases/latest"; +const UPDATE_URL: &str = + "https://git.racooncity.org/api/v1/repos/mysticmomba/argus/releases/latest"; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct UpdateInfo { @@ -29,10 +30,7 @@ pub async fn check_for_update(app: AppHandle) -> Result, Stri .as_str() .ok_or_else(|| "No tag_name in response".to_string())?; - let html_url = body["html_url"] - .as_str() - .unwrap_or("") - .to_string(); + let html_url = body["html_url"].as_str().unwrap_or("").to_string(); let notes = body["body"] .as_str() @@ -42,7 +40,12 @@ pub async fn check_for_update(app: AppHandle) -> Result, Stri let remote_version = tag.strip_prefix('v').unwrap_or(tag); let current = app.package_info().version.to_string(); - if remote_version != current { + let remote_semver = semver::Version::parse(remote_version) + .map_err(|e| format!("Invalid remote version '{}': {}", remote_version, e))?; + let current_semver = semver::Version::parse(¤t) + .map_err(|e| format!("Invalid current version '{}': {}", current, e))?; + + if remote_semver > current_semver { Ok(Some(UpdateInfo { version: remote_version.to_string(), url: html_url, @@ -51,4 +54,4 @@ pub async fn check_for_update(app: AppHandle) -> Result, Stri } else { Ok(None) } -} \ No newline at end of file +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 6cbb804..8a6c46c 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -31,6 +31,7 @@ pub fn run() { commands::monitor::monitor_stop, commands::updater::check_for_update, commands::actions::check_privileges, + commands::changelog::get_changelog, ]) .run(tauri::generate_context!()) .expect("error while running tauri application"); diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 294eae2..4848268 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "argus", - "version": "0.1.0", + "version": "0.2.0", "identifier": "io.argus.app", "build": { "frontendDist": "../src" @@ -10,7 +10,7 @@ "withGlobalTauri": true, "windows": [ { - "title": "argus", + "title": "Argus", "width": 800, "height": 600 } @@ -22,6 +22,7 @@ "bundle": { "active": true, "targets": "all", + "copyright": "Copyright \u00A9 2026 James Brotosky. Licensed under AGPLv3. All rights reserved.", "windows": { "webviewInstallMode": { "type": "embedBootstrapper" diff --git a/src/index.html b/src/index.html index 4e5a390..2a97886 100644 --- a/src/index.html +++ b/src/index.html @@ -199,6 +199,14 @@
Argus + + unprivileged
@@ -212,6 +220,16 @@
+ +