Compare commits

..

2 Commits

Author SHA1 Message Date
Agatha Lovelace 5285c4cfe2
Release 0.2.0 2024-01-08 21:39:06 +01:00
Agatha Lovelace 42b4582092
Update CI; Clean up flake.nix 2024-01-08 21:35:03 +01:00
8 changed files with 118 additions and 202 deletions

View File

@ -27,5 +27,3 @@ jobs:
- uses: cachix/install-nix-action@v23
- name: Lint
run: nix develop --command cargo clippy --all-targets --all-features
- name: Test
run: nix develop --command cargo test

121
Cargo.lock generated
View File

@ -98,9 +98,9 @@ dependencies = [
[[package]]
name = "base64"
version = "0.21.7"
version = "0.21.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
checksum = "c79fed4cdb43e993fcdadc7e58a09fd0e3e649c4436fa11da71c9f1f3ee7feb9"
[[package]]
name = "bitflags"
@ -110,9 +110,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
version = "2.4.2"
version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"
checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
[[package]]
name = "block"
@ -239,12 +239,6 @@ dependencies = [
"syn 1.0.109",
]
[[package]]
name = "diff"
version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
[[package]]
name = "dlib"
version = "0.5.2"
@ -294,9 +288,9 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
[[package]]
name = "fdeflate"
version = "0.3.4"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645"
checksum = "209098dd6dfc4445aa6111f0e98653ac323eaa4dfd212c9ca3931bf9955c31bd"
dependencies = [
"simd-adler32",
]
@ -359,9 +353,9 @@ dependencies = [
[[package]]
name = "getrandom"
version = "0.2.12"
version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f"
dependencies = [
"cfg-if",
"libc",
@ -404,9 +398,9 @@ dependencies = [
[[package]]
name = "hermit-abi"
version = "0.3.4"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f"
checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
[[package]]
name = "idna"
@ -420,13 +414,14 @@ dependencies = [
[[package]]
name = "image"
version = "0.24.8"
version = "0.24.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23"
checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711"
dependencies = [
"bytemuck",
"byteorder",
"color_quant",
"num-rational",
"num-traits",
"png",
"tiff",
@ -461,9 +456,9 @@ checksum = "616cde7c720bb2bb5824a224687d8f77bfd38922027f01d825cd7453be5099fb"
[[package]]
name = "jpeg-decoder"
version = "0.3.1"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0"
checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e"
[[package]]
name = "knuffel"
@ -516,9 +511,9 @@ dependencies = [
[[package]]
name = "linux-raw-sys"
version = "0.4.13"
version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456"
[[package]]
name = "lock_api"
@ -663,6 +658,27 @@ dependencies = [
"minimal-lexical",
]
[[package]]
name = "num-integer"
version = "0.1.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
dependencies = [
"autocfg",
"num-traits",
]
[[package]]
name = "num-rational"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
dependencies = [
"autocfg",
"num-integer",
"num-traits",
]
[[package]]
name = "num-traits"
version = "0.2.17"
@ -779,15 +795,15 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
name = "pkg-config"
version = "0.3.29"
version = "0.3.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb"
checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a"
[[package]]
name = "png"
version = "0.17.11"
version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f6c3c3e617595665b8ea2ff95a86066be38fb121ff920a9c0eb282abcd1da5a"
checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64"
dependencies = [
"bitflags 1.3.2",
"crc32fast",
@ -796,16 +812,6 @@ dependencies = [
"miniz_oxide",
]
[[package]]
name = "pretty_assertions"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66"
dependencies = [
"diff",
"yansi",
]
[[package]]
name = "proc-macro-error"
version = "1.0.4"
@ -832,9 +838,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
version = "1.0.78"
version = "1.0.76"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c"
dependencies = [
"unicode-ident",
]
@ -874,11 +880,11 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
[[package]]
name = "rustix"
version = "0.38.30"
version = "0.38.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca"
checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.4.1",
"errno",
"libc",
"linux-raw-sys",
@ -905,9 +911,9 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
[[package]]
name = "smallvec"
version = "1.13.1"
version = "1.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970"
[[package]]
name = "smawk"
@ -942,9 +948,9 @@ dependencies = [
[[package]]
name = "supports-unicode"
version = "2.1.0"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f850c19edd184a205e883199a261ed44471c81e39bd95b1357f5febbef00e77a"
checksum = "4b6c2cb240ab5dd21ed4906895ee23fe5a48acdbd15a3ce388e7b62a9b66baf7"
dependencies = [
"is-terminal",
]
@ -1027,9 +1033,9 @@ dependencies = [
[[package]]
name = "tiff"
version = "0.9.1"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e"
checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211"
dependencies = [
"flate2",
"jpeg-decoder",
@ -1067,9 +1073,9 @@ dependencies = [
[[package]]
name = "unicode-bidi"
version = "0.3.15"
version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416"
[[package]]
name = "unicode-ident"
@ -1123,7 +1129,6 @@ dependencies = [
"knuffel",
"memoize",
"miette",
"pretty_assertions",
"url",
"wildmatch",
]
@ -1160,7 +1165,7 @@ version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ca7d52347346f5473bf2f56705f360e8440873052e575e55890c4fa57843ed3"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.4.1",
"nix",
"wayland-backend",
"wayland-scanner",
@ -1172,7 +1177,7 @@ version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e253d7107ba913923dc253967f35e8561a3c65f914543e46843c88ddd729e21c"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.4.1",
"wayland-backend",
"wayland-client",
"wayland-scanner",
@ -1184,7 +1189,7 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.4.1",
"wayland-backend",
"wayland-client",
"wayland-protocols",
@ -1215,9 +1220,9 @@ dependencies = [
[[package]]
name = "weezl"
version = "0.1.8"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082"
checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb"
[[package]]
name = "wildmatch"
@ -1430,12 +1435,6 @@ dependencies = [
"nix",
]
[[package]]
name = "yansi"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
[[package]]
name = "zerocopy"
version = "0.7.32"

View File

@ -14,8 +14,5 @@ arboard = { version = "3.3.0", features = ["wayland-data-control"] }
knuffel = "3.0.0"
memoize = { version = "0.4.0", features = ["full"] }
miette = { version = "5.7.0", features = ["fancy"] }
url = "2.5.0"
url = "2.3.1"
wildmatch = "2.1.1"
[dev-dependencies]
pretty_assertions = "1.4.0"

View File

@ -50,7 +50,7 @@ url-eater.inputs.nixpkgs.follows = "nixpkgs"; # optional
```
3. Import NixOS module
```nix
imports = [ url-eater.nixosModules.default ];
imports = [ url-eater.nixosModule ];
```
4. Configure the module:
```nix
@ -74,6 +74,7 @@ Clone this repository, then run:
```sh
cargo build --release
```
You will need Rust 1.65 or newer.
The output binary will be in `target/release/url-eater`
Alternatively,

View File

@ -2,9 +2,7 @@
"nodes": {
"naersk": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1698420672,
@ -22,6 +20,20 @@
}
},
"nixpkgs": {
"locked": {
"lastModified": 1704161960,
"narHash": "sha256-QGua89Pmq+FBAro8NriTuoO/wNaUtugt29/qqA8zeeM=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "63143ac2c9186be6d9da6035fa22620018c85932",
"type": "github"
},
"original": {
"id": "nixpkgs",
"type": "indirect"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1704161960,
"narHash": "sha256-QGua89Pmq+FBAro8NriTuoO/wNaUtugt29/qqA8zeeM=",
@ -40,7 +52,7 @@
"root": {
"inputs": {
"naersk": "naersk",
"nixpkgs": "nixpkgs",
"nixpkgs": "nixpkgs_2",
"utils": "utils"
}
},

View File

@ -1,31 +1,18 @@
{
inputs = {
naersk.url = "github:nix-community/naersk/master";
naersk.inputs.nixpkgs.follows = "nixpkgs";
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
utils.url = "github:numtide/flake-utils";
};
outputs =
{
self,
nixpkgs,
utils,
naersk,
}:
utils.lib.eachDefaultSystem (
system:
outputs = { self, nixpkgs, utils, naersk }:
utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs { inherit system; };
naersk-lib = pkgs.callPackage naersk { };
in
{
packages.default = naersk-lib.buildPackage {
src = ./.;
buildInputs = with pkgs; lib.optionals stdenv.isDarwin [ darwin.apple_sdk.frameworks.AppKit ];
};
devShells.default =
with pkgs;
in {
packages.default = naersk-lib.buildPackage ./.;
devShells.default = with pkgs;
mkShell {
buildInputs = [
cargo
@ -37,21 +24,11 @@
];
RUST_SRC_PATH = rustPlatform.rustLibSrc;
};
}
)
// {
nixosModules.default =
{
config,
lib,
pkgs,
...
}:
}) // {
nixosModules.default = { config, lib, pkgs, ... }:
with lib;
let
cfg = config.services.url-eater;
in
{
let cfg = config.services.url-eater;
in {
options.services.url-eater = {
enable = mkEnableOption "Enables the URL Eater service";
filters = mkOption {
@ -71,12 +48,10 @@
};
config = mkIf cfg.enable {
systemd.user.services."url-eater" =
let
systemd.user.services."url-eater" = let
filters = pkgs.writeText "filters.kdl" cfg.filters;
pkg = self.packages.${pkgs.system}.default;
in
{
pkg = self.defaultPackage.${pkgs.system};
in {
description = "Clipboard URL cleanup service";
after = [ "graphical-session-pre.target" ];

View File

@ -1,16 +1,13 @@
use arboard::Clipboard;
use memoize::memoize;
use miette::{miette, Result};
use std::{borrow::Cow, env, time::Duration};
use std::{env, time::Duration};
use url::Url;
use wildmatch::WildMatch;
mod config;
use config::Config;
#[cfg(test)]
mod tests;
/// How often should clipboard be checked for changes (0 will result in high CPU usage)
const ITERATION_DELAY: Duration = Duration::from_millis(250);
@ -73,7 +70,7 @@ fn clean_url(text: String, patterns: Vec<String>) -> Result<String, String> {
.query_pairs()
.filter(|x| !WildMatch::new(param).matches(&x.0));
// Replace parameters in URL
replace_query(&mut url, query);
url.query_pairs_mut().clear().extend_pairs(query);
}
} else {
// Filter parameters to exclude blocked entries
@ -81,23 +78,12 @@ fn clean_url(text: String, patterns: Vec<String>) -> Result<String, String> {
.query_pairs()
.filter(|x| !WildMatch::new(pattern).matches(&x.0));
// Replace parameters in URL
replace_query(&mut url, query);
url.query_pairs_mut().clear().extend_pairs(query);
}
}
Ok(url.to_string())
}
// Handle dangling ?s when no query pairs are appended
let url = url.as_str().trim_end_matches('?').to_owned();
fn replace_query<'a>(
url: &mut Url,
query_pairs: impl IntoIterator<Item = (Cow<'a, str>, Cow<'a, str>)>,
) {
url.set_query(None);
for (k, v) in query_pairs {
if v.is_empty() {
url.query_pairs_mut().append_key_only(&k);
} else {
url.query_pairs_mut().append_pair(&k, &v);
}
}
Ok(url)
}

View File

@ -1,52 +0,0 @@
use super::*;
#[cfg(test)]
use pretty_assertions::assert_eq;
const PATTERNS: [&str; 2] = ["delete_me", "test@example.com"];
#[test]
fn query_parameters() -> Result<(), String> {
for (url, expected) in [
("http://test.org/meow", "http://test.org/meow"),
("http://test.org/page?delete_me", "http://test.org/page"),
(
"http://test.org/page?delete_me&keep_me",
"http://test.org/page?keep_me",
),
] {
assert_eq!(
clean_url(
url.to_owned(),
PATTERNS.into_iter().map(|v| v.into()).collect()
)?,
expected.to_owned()
);
}
Ok(())
}
#[test]
fn url_fragments() -> Result<(), String> {
for (url, expected) in [
(
"http://test.org/page?delete_me#fragment",
"http://test.org/page#fragment",
),
(
"http://test.org/page#fragment",
"http://test.org/page#fragment",
),
] {
assert_eq!(
clean_url(
url.to_owned(),
PATTERNS.into_iter().map(|v| v.into()).collect()
)?,
expected.to_owned()
);
}
Ok(())
}