diff options
| author | 魏曹先生 <1992414357@qq.com> | 2025-10-14 17:17:48 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2025-10-14 17:17:48 +0800 |
| commit | 0cd19e64d4d255e45233255478ca3a0bd5c439ae (patch) | |
| tree | 6bfa39c10731328edacc6b1c86ae49c85197f7ed | |
| parent | 24c2c8cad43c755cf668ea92a08c0be7fb3b819d (diff) | |
feat: add internationalization support and new command-line tools
- Add locale support with English and Chinese translations
- Introduce new jv and jvv command-line tools
- Replace jvc.rs with improved command structure
- Add utility modules for language selection and markdown coloring
- Update configuration and dependencies
| -rw-r--r-- | .cargo/config.toml | 12 | ||||
| -rw-r--r-- | Cargo.lock | 1395 | ||||
| -rw-r--r-- | Cargo.toml | 16 | ||||
| -rw-r--r-- | crates/cli_publisher/src/main.rs | 8 | ||||
| -rw-r--r-- | locales/en.yml | 33 | ||||
| -rw-r--r-- | locales/help_docs/en.yml | 116 | ||||
| -rw-r--r-- | locales/help_docs/zh-CN.yml | 112 | ||||
| -rw-r--r-- | locales/zh-CN.yml | 33 | ||||
| -rw-r--r-- | src/bin/jv.rs | 5 | ||||
| -rw-r--r-- | src/bin/jvc.rs | 1 | ||||
| -rw-r--r-- | src/bin/jvv.rs | 434 | ||||
| -rw-r--r-- | src/jv.rs | 1 | ||||
| -rw-r--r-- | src/jvv.rs | 0 | ||||
| -rw-r--r-- | src/lib.rs | 7 | ||||
| -rw-r--r-- | src/utils.rs | 2 | ||||
| -rw-r--r-- | src/utils/lang_selector.rs | 14 | ||||
| -rw-r--r-- | src/utils/md_colored.rs | 20 |
17 files changed, 2084 insertions, 125 deletions
diff --git a/.cargo/config.toml b/.cargo/config.toml index 663077d..6be452a 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,6 +1,16 @@ [build] target-dir = "./.temp/target/" +[alias] +dev = "run --manifest-path crates/cli_publisher/Cargo.toml" +release = "run --manifest-path crates/cli_publisher/Cargo.toml --release" + [publish] target-dir = "./.temp/publish/" -binaries = ["jvc", "jvc.exe"] +binaries = [ + "jv", + "jv.exe", + + "jvv", + "jvv.exe" +] @@ -3,10 +3,36 @@ version = 4 [[package]] +name = "action_system" +version = "0.1.0" +source = "git+https://github.com/JustEnoughVCS/VersionControl#b9bbfb31bee88f6b10a9cc5b49e7618bef9d0be5" +dependencies = [ + "action_system_macros", + "serde", + "serde_json", + "tcp_connection", + "tokio", +] + +[[package]] +name = "action_system_macros" +version = "0.1.0" +source = "git+https://github.com/JustEnoughVCS/VersionControl#b9bbfb31bee88f6b10a9cc5b49e7618bef9d0be5" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "serde_json", + "string_proc", + "syn", + "tcp_connection", +] + +[[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] @@ -18,6 +44,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] name = "aho-corasick" version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -28,9 +65,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.20" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -43,9 +80,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" @@ -77,6 +114,24 @@ dependencies = [ ] [[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] name = "async-trait" version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -95,9 +150,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -105,16 +160,34 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link", ] [[package]] +name = "base62" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1adf9755786e27479693dedd3271691a92b5e242ab139cacb9fb8e7fb5381111" + +[[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] +name = "base64ct" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] name = "bitflags" version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -124,18 +197,93 @@ dependencies = [ ] [[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.11.0-rc.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9ef36a6fcdb072aa548f3da057640ec10859eb4e91ddf526ee648d50c76a949" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bstr" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +dependencies = [ + "memchr", + "serde", +] + +[[package]] name = "bumpalo" version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] name = "bytes" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cc" +version = "1.2.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] name = "cfg-if" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -144,7 +292,7 @@ checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_file" version = "0.1.0" -source = "git+https://github.com/JustEnoughVCS/VersionControl#1c7db5aaef2a91b3f87c999d4a21794b19d49ab6" +source = "git+https://github.com/JustEnoughVCS/VersionControl#b9bbfb31bee88f6b10a9cc5b49e7618bef9d0be5" dependencies = [ "async-trait", "cfg_file_derive", @@ -153,25 +301,47 @@ dependencies = [ "serde_json", "serde_yaml", "tokio", - "toml", + "toml 0.9.8", ] [[package]] name = "cfg_file_derive" version = "0.1.0" -source = "git+https://github.com/JustEnoughVCS/VersionControl#1c7db5aaef2a91b3f87c999d4a21794b19d49ab6" +source = "git+https://github.com/JustEnoughVCS/VersionControl#b9bbfb31bee88f6b10a9cc5b49e7618bef9d0be5" dependencies = [ "quote", "syn", ] [[package]] +name = "chacha20" +version = "0.10.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd162f2b8af3e0639d83f28a637e4e55657b7a74508dba5a9bf4da523d5c9e9" +dependencies = [ + "cfg-if", + "cpufeatures", + "rand_core 0.9.3", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common 0.1.6", + "inout", +] + +[[package]] name = "clap" version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" dependencies = [ "clap_builder", + "clap_derive", ] [[package]] @@ -187,6 +357,18 @@ dependencies = [ ] [[package]] +name = "clap_derive" +version = "4.5.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] name = "clap_lex" version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -198,7 +380,7 @@ version = "0.0.1" dependencies = [ "colored 3.0.0", "serde", - "toml", + "toml 0.9.8", ] [[package]] @@ -227,17 +409,195 @@ dependencies = [ ] [[package]] -name = "env" -version = "0.1.0" -source = "git+https://github.com/JustEnoughVCS/VersionControl#1c7db5aaef2a91b3f87c999d4a21794b19d49ab6" +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ - "cfg_file", - "serde", - "string_proc", - "uuid", + "libc", +] + +[[package]] +name = "crc" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-common" +version = "0.2.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8235645834fbc6832939736ce2f2d08192652269e11010a6240f61b908a1c6" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "curve25519-dalek" +version = "5.0.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f9200d1d13637f15a6acb71e758f64624048d85b31a5fdbfd8eca1e2687d0b7" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.11.0-rc.3", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid", + "crypto-common 0.1.6", + "subtle", +] + +[[package]] +name = "digest" +version = "0.11.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dac89f8a64533a9b0eaa73a68e424db0fb1fd6271c74cc0125336a05f090568d" +dependencies = [ + "block-buffer 0.11.0-rc.5", + "crypto-common 0.2.0-rc.4", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "ed25519" +version = "3.0.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ef49c0b20c0ad088893ad2a790a29c06a012b3f05bcfc66661fd22a94b32129" +dependencies = [ + "signature 3.0.0-rc.4", +] + +[[package]] +name = "ed25519-dalek" +version = "3.0.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad207ed88a133091f83224265eac21109930db09bedcad05d5252f2af2de20a1" +dependencies = [ + "curve25519-dalek", + "ed25519", + "sha2 0.11.0-rc.2", + "subtle", + "zeroize", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] name = "env_filter" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -267,6 +627,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] +name = "fiat-crypto" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" + +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + +[[package]] +name = "generic-array" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dc8f7d2ded5f9209535e4b3fd4d39c002f30902ff5ce9f64e2c33d549576500" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] name = "getrandom" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -280,9 +673,39 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "globset" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "globwalk" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" +dependencies = [ + "bitflags 1.3.2", + "ignore", + "walkdir", +] [[package]] name = "hashbrown" @@ -291,6 +714,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "hybrid-array" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f471e0a81b2f90ffc0cb2f951ae04da57de8baa46fa99112b062a5173a5088d0" +dependencies = [ + "typenum", +] + +[[package]] +name = "ignore" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] name = "indexmap" version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -301,12 +764,22 @@ dependencies = [ ] [[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] name = "io-uring" version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" dependencies = [ - "bitflags", + "bitflags 2.9.4", "cfg-if", "libc", ] @@ -318,6 +791,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] name = "itoa" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -349,9 +831,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.80" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -359,13 +841,14 @@ dependencies = [ [[package]] name = "just_enough_vcs" -version = "0.1.0" -source = "git+https://github.com/JustEnoughVCS/VersionControl#1c7db5aaef2a91b3f87c999d4a21794b19d49ab6" +version = "0.0.0" +source = "git+https://github.com/JustEnoughVCS/VersionControl#b9bbfb31bee88f6b10a9cc5b49e7618bef9d0be5" dependencies = [ "cfg_file", - "env", "string_proc", "tcp_connection", + "vcs_actions", + "vcs_data", ] [[package]] @@ -377,6 +860,8 @@ dependencies = [ "env_logger", "just_enough_vcs", "log", + "regex", + "rust-i18n", "tokio", ] @@ -385,20 +870,38 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] [[package]] name = "libc" -version = "0.2.175" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +dependencies = [ + "bitflags 2.9.4", + "libc", +] [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] @@ -410,9 +913,9 @@ checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "miniz_oxide" @@ -435,10 +938,66 @@ dependencies = [ ] [[package]] +name = "normpath" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf23ab2b905654b4cb177e30b629937b3868311d4e1cba859f899c041046e69b" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] @@ -456,10 +1015,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" [[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -467,15 +1032,50 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest 0.10.7", + "hmac", +] + +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64", + "serde_core", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", ] [[package]] @@ -485,6 +1085,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs5" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e847e2c91a18bfa887dd028ec33f2fe6f25db77db3619024764914affe8b69a6" +dependencies = [ + "aes", + "cbc", + "der", + "pbkdf2", + "scrypt", + "sha2 0.10.9", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "pkcs5", + "rand_core 0.6.4", + "spki", +] + +[[package]] name = "portable-atomic" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -500,6 +1138,15 @@ dependencies = [ ] [[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] name = "proc-macro2" version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -510,9 +1157,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -524,19 +1171,78 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.10.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ec474812b9de55111b29da8a1559f1718ef3dc20fa36f031f1b5d9e3836ad6c" +dependencies = [ + "chacha20", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", +] + +[[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.9.4", +] + +[[package]] +name = "redox_users" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ - "bitflags", + "getrandom 0.2.16", + "libredox", + "thiserror 2.0.17", ] [[package]] name = "regex" -version = "1.11.2" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +checksum = "4a52d8d02cacdb176ef4678de6c052efb4b3da14b78e4db683a4252762be5433" dependencies = [ "aho-corasick", "memchr", @@ -546,9 +1252,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +checksum = "722166aa0d7438abbaa4d5cc2c649dac844e8c56d82fb3d33e9c34b5cd268fc6" dependencies = [ "aho-corasick", "memchr", @@ -557,9 +1263,45 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" +checksum = "c3160422bbd54dd5ecfdca71e5fd59b7b8fe2b1697ab2baf64f6d05dcc66d298" + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rmp" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +dependencies = [ + "byteorder", + "rmp", + "serde", +] [[package]] name = "ron" @@ -568,19 +1310,103 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db09040cc89e461f1a265139777a2bde7f8d8c67c4936f700c63ce3e2904d468" dependencies = [ "base64", - "bitflags", + "bitflags 2.9.4", "serde", "serde_derive", "unicode-ident", ] [[package]] +name = "rsa" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" +dependencies = [ + "const-oid", + "digest 0.10.7", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "sha2 0.10.9", + "signature 2.2.0", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rust-i18n" +version = "3.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda2551fdfaf6cc5ee283adc15e157047b92ae6535cf80f6d4962d05717dc332" +dependencies = [ + "globwalk", + "once_cell", + "regex", + "rust-i18n-macro", + "rust-i18n-support", + "smallvec", +] + +[[package]] +name = "rust-i18n-macro" +version = "3.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22baf7d7f56656d23ebe24f6bb57a5d40d2bce2a5f1c503e692b5b2fa450f965" +dependencies = [ + "glob", + "once_cell", + "proc-macro2", + "quote", + "rust-i18n-support", + "serde", + "serde_json", + "serde_yaml", + "syn", +] + +[[package]] +name = "rust-i18n-support" +version = "3.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940ed4f52bba4c0152056d771e563b7133ad9607d4384af016a134b58d758f19" +dependencies = [ + "arc-swap", + "base62", + "globwalk", + "itertools", + "lazy_static", + "normpath", + "once_cell", + "proc-macro2", + "regex", + "serde", + "serde_json", + "serde_yaml", + "siphasher", + "toml 0.8.23", + "triomphe", +] + +[[package]] name = "rustc-demangle" version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] name = "rustversion" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -593,16 +1419,51 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] +name = "scrypt" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" +dependencies = [ + "pbkdf2", + "salsa20", + "sha2 0.10.9", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] name = "serde" -version = "1.0.226" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", @@ -610,18 +1471,18 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.226" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.226" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -643,9 +1504,18 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.2" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5417783452c2be558477e104686f7de5dae53dba813c28435e0e70f82d9b04ee" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" dependencies = [ "serde_core", ] @@ -664,6 +1534,34 @@ dependencies = [ ] [[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1e3878ab0f98e35b2df35fe53201d088299b41a6bb63e3e34dada2ac4abd924" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.11.0-rc.3", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] name = "signal-hook-registry" version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -673,6 +1571,28 @@ dependencies = [ ] [[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "signature" +version = "3.0.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc280a6ff65c79fbd6622f64d7127f32b85563bca8c53cd2e9141d6744a9056d" + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] name = "slab" version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -695,9 +1615,31 @@ dependencies = [ ] [[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] name = "string_proc" version = "0.1.0" -source = "git+https://github.com/JustEnoughVCS/VersionControl#1c7db5aaef2a91b3f87c999d4a21794b19d49ab6" +source = "git+https://github.com/JustEnoughVCS/VersionControl#b9bbfb31bee88f6b10a9cc5b49e7618bef9d0be5" [[package]] name = "strsim" @@ -706,6 +1648,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] name = "syn" version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -719,11 +1667,62 @@ dependencies = [ [[package]] name = "tcp_connection" version = "0.1.0" -source = "git+https://github.com/JustEnoughVCS/VersionControl#1c7db5aaef2a91b3f87c999d4a21794b19d49ab6" +source = "git+https://github.com/JustEnoughVCS/VersionControl#b9bbfb31bee88f6b10a9cc5b49e7618bef9d0be5" dependencies = [ + "base64", + "blake3", + "crc", + "ed25519-dalek", + "pem", + "rand 0.10.0-rc.0", + "ring", + "rmp-serde", + "rsa", "serde", "serde_json", + "thiserror 1.0.69", "tokio", + "uuid", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -759,14 +1758,26 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.7" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit", +] + +[[package]] +name = "toml" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" dependencies = [ "indexmap", "serde_core", - "serde_spanned", - "toml_datetime", + "serde_spanned 1.0.3", + "toml_datetime 0.7.3", "toml_parser", "toml_writer", "winnow", @@ -774,27 +1785,73 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.2" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ "serde_core", ] [[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow", +] + +[[package]] name = "toml_parser" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" dependencies = [ "winnow", ] [[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] name = "toml_writer" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d163a63c116ce562a22cda521fcc4d79152e7aba014456fb5eb442f6d6a10109" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" + +[[package]] +name = "triomphe" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39" +dependencies = [ + "arc-swap", + "serde", + "stable_deref_trait", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicode-ident" @@ -809,6 +1866,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" [[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] name = "utf8parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -820,13 +1883,61 @@ version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom", + "getrandom 0.3.3", "js-sys", "serde", "wasm-bindgen", ] [[package]] +name = "vcs_actions" +version = "0.1.0" +source = "git+https://github.com/JustEnoughVCS/VersionControl#b9bbfb31bee88f6b10a9cc5b49e7618bef9d0be5" +dependencies = [ + "action_system", + "cfg_file", + "log", + "serde", + "serde_json", + "string_proc", + "tcp_connection", + "thiserror 1.0.69", + "tokio", + "vcs_data", +] + +[[package]] +name = "vcs_data" +version = "0.1.0" +source = "git+https://github.com/JustEnoughVCS/VersionControl#b9bbfb31bee88f6b10a9cc5b49e7618bef9d0be5" +dependencies = [ + "action_system", + "cfg_file", + "dirs", + "serde", + "string_proc", + "tcp_connection", + "tokio", + "uuid", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -852,9 +1963,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", @@ -865,9 +1976,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", @@ -879,9 +1990,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -889,9 +2000,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", @@ -902,18 +2013,36 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] [[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] name = "windows-link" -version = "0.1.3" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] [[package]] name = "windows-sys" @@ -930,7 +2059,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", ] [[package]] @@ -951,19 +2089,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ "windows-link", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -974,9 +2112,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -986,9 +2124,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -998,9 +2136,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -1010,9 +2148,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -1022,9 +2160,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -1034,9 +2172,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -1046,9 +2184,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -1058,18 +2196,47 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +dependencies = [ + "memchr", +] [[package]] name = "wit-bindgen" version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" @@ -2,10 +2,6 @@ name = "just_enough_vcs_cli" edition = "2024" -[dependencies.just_enough_vcs] -git = "https://github.com/JustEnoughVCS/VersionControl" -features = ["all"] - [workspace] members = ["crates/cli_publisher"] @@ -32,9 +28,13 @@ panic = "abort" strip = "symbols" [dependencies] +# Just Enough VCS +just_enough_vcs = { git = "https://github.com/JustEnoughVCS/VersionControl", features = [ + "all", +] } # Command Line -clap = "4.5" +clap = { version = "4.5", features = ["derive"] } # Logging log = "0.4" @@ -45,3 +45,9 @@ tokio = { version = "1", features = ["full"] } # Color colored = "2.0" + +# i18n +rust-i18n = "3" + +# Regex +regex = "1.12.1" diff --git a/crates/cli_publisher/src/main.rs b/crates/cli_publisher/src/main.rs index 9e0c5e8..7e6555a 100644 --- a/crates/cli_publisher/src/main.rs +++ b/crates/cli_publisher/src/main.rs @@ -125,15 +125,15 @@ fn get_array(section: &str, array_name: &str) -> Result<Vec<String>, std::io::Er } /// Get the target directory of the current project -// By reading the `build.target-dir` configuration item in the `.cargo/config.toml` file -// Returns the complete path relative to the current directory +/// By reading the `build.target-dir` configuration item in the `.cargo/config.toml` file +/// Returns the complete path relative to the current directory fn current_target_dir() -> Result<std::path::PathBuf, std::io::Error> { get_target_dir("build") } /// Get the publish directory of the current project -// By reading the `publish.target-dir` configuration item in the `.cargo/config.toml` file -// Returns the complete path relative to the current directory +/// By reading the `publish.target-dir` configuration item in the `.cargo/config.toml` file +/// Returns the complete path relative to the current directory fn current_publish_dir() -> Result<std::path::PathBuf, std::io::Error> { get_target_dir("publish") } diff --git a/locales/en.yml b/locales/en.yml new file mode 100644 index 0000000..8268a70 --- /dev/null +++ b/locales/en.yml @@ -0,0 +1,33 @@ +# Localization for jvv +jvv_cmd: + name: + here: "Query here" + create: "Create vault" + init: "Initialize vault here" + member: + register: "Register member" + remove: "Remove member" + list: "List members" + service: + listen: "Listen" + description: + here: "Query information about the vault here" + create: "Create a vault with given name in subdirectory" + init: "Create a vault with current directory name" + member: + register: "Add a name to member list (need to manually store public key)" + remove: "Remove given name from member list (won't delete public key)" + list: "List members who can access current vault through service" + service: + listen: "Start service for vault here to listen for client connections" + +# Localization for jv +jv_cmd: + name: + description: + +# utils::help_builder template +help: + header: "Help: %{raw_name} - %{name}" + desc_line: "Description: %{description}" + footer: "Usage: %{usage_text}" diff --git a/locales/help_docs/en.yml b/locales/help_docs/en.yml new file mode 100644 index 0000000..c426e51 --- /dev/null +++ b/locales/help_docs/en.yml @@ -0,0 +1,116 @@ +jvv: + help: | + **JustEnoughVCS Upstream Vault Commands** + This program directly creates, manages, and runs JustEnoughVCS upstream vaults. + **Tip**: It directly operates on vault data - please operate with caution! + * With great power comes great responsibility * + + **Create Vault**: + jvv create <VAULT_NAME> - Create a vault in the given directory name + jvv init - Create a vault in the current directory + + **Query**: + jvv here - Query information about the current directory + jvv member list - Query all members + + **Member Management**: + jvv member <register/remove> <MEMBER_NAME> - Register or remove members + + **Service**: + jvv service listen - Run the server in the current vault + + Additionally, you can use jvv <CMD_NAME> --help to query more detailed help! + + here: | + **Query Vault Information Here** + Displays different information based on the current directory: + - Root *(./)*: Basic vault information + - Members *(./members/)*: Members and key registrations + - Storage *(./storage/)*: File count and total size + - Sheets *(./sheets/)*: Tables and their managers + + **Example**: cd ./target_dir/ && jvv here + + create: | + **Create a new vault with the given name** + **Usage**: jvv create <VAULT_NAME> + + **Example**: jvv create MyVault + Creates a directory named 'MyVault' and initializes a vault inside it. + + init: | + **Initialize a vault in the current directory** + **Usage**: jvv init + + Uses the current directory's name as the vault name. + + member: | + **Member Management** + **Usage**: jvv member <register/remove> <MEMBER_NAME> + + Register or remove members based on the given member name. + + It is recommended to use the "snake_case" naming format, + as it will be stored in this format in the configuration file + **Example**: jvv member register vault_member + + **Query**: jvv member list + Equivalent to running `jvv here` in the members directory. + + **Tip**: Does not manage private keys automatically. Keys must be handled manually. + + service: | + **Service Management** + **Usage**: + jvv service listen - Start the vault server in the current vault to accept client connections + You can use --no-log to disable log output + + fail: + jvcs: "JustEnoughVCS Error: %{err}" + + no_vault_here: No vault found here + + tokio: + fs: + create_dir: Failed to create directory %{dir} + create_dir_all: Failed to create directory %{dir} + + std: + current_dir: Failed to get current directory + current_dir_name: Failed to get current directory name + set_current_dir: Failed to set current directory to %{dir} + + here: + cfg_not_found: Could not find vault configuration! + + create: + not_empty: Operation denied! The specified directory already exists. + + init: + not_empty: Operation denied! The directory is not empty. + + member: + register: Failed to create member! Please check if a member with the same name already exists + list: Failed to get member ID! + + success: + here: + root: | + Found vault `%{name}`! + **Tip**: You can use jvv here --help to learn how to view vault details + + create: Successfully created vault at `%{name}`! + + init: Successfully initialized vault here! + + member: + register: Successfully created member `%{member}`! + remove: | + Successfully removed `%{member}` from the vault! + (or they were never here?) + list: + header: | + **Members in the vault:** + + footer: | + Total %{num} member(s) diff --git a/locales/help_docs/zh-CN.yml b/locales/help_docs/zh-CN.yml new file mode 100644 index 0000000..c8760b2 --- /dev/null +++ b/locales/help_docs/zh-CN.yml @@ -0,0 +1,112 @@ +jvv: + help: | + **JustEnoughVCS 上游库命令** + 该程序直接创建、管理、运行 JustEnoughVCS 的上游库 + **注意**:它能直接操作库的数据,请谨慎使用!*(能力越大,责任越大)* + + **创建库**: + jvv create <名称> - 在给定的目录名称中创建库 + jvv init - 在当前目录中创建库 + + **查询**: + jvv here - 查询当前目录的信息 + jvv member list - 查询所有成员 + + **成员管理**: + jvv member <register/remove> <成员名称> - 注册或删除成员 + + **服务**: + jvv service listen - 在当前库中运行服务端 + + 另外,你可以使用 jvv <命令名称> --help 来查询更详细的帮助! + + here: | + **查询此处库的信息** + 在不同目录执行该命令时会查询不同的信息: + 1. 当根目录 *(./)* 时:查询库的基本信息 + 2. 当成员目录 *(./members/)* 时:查询库的成员和密钥注册信息 + 3. 当存储目录 *(./storage/)* 时:查询库托管的文件总数量、总大小 + 4. 当表目录 *(./sheets/)* 时:查询库中所有的表和其管理者 + + **例如**:cd ./你需要查询的目录/ && jvv here + + create: | + **在给定的目录名称中创建库** + **使用方法**:jvv create **<库名称>** + + **例如**:jvv create MyVault + 上述操作会在当前目录创建目录 MyVault,然后在该目录内初始化库 + + init: | + **在当前目录创建库** + **使用方法**:jvv init + + 该命令会在当前所在的目录创建库,库名称由当前所在目录名称决定 + + member: | + **成员管理** + **使用方法**:jvv member <register/remove> <成员名称> + + 根据给定的 成员名称,注册(若不存在)或移除(若存在)指定成员 + + 推荐使用 "snake_case" 命名格式,因为在配置文件中将以该格式存储 + **例如**:jvv member register vault_member + + **查询**:jvv member list + 该命令的效果和在库的成员目录中执行 jvv here 命令等效 + + **注意**:该命令不会影响到库中私钥目录,请手动添加或删除私钥! + + service: | + **服务设置相关** + **使用方法**: + jvv service listen - 在当前库中启动服务器,以接受客户端连接 + 你可以使用 --no-log 来禁用日志输出 + + fail: + jvcs: JustEnoughVCS 错误:%{err} + + no_vault_here: 此处并没有找到库文件 + + tokio: + fs: + create_dir: 无法创建目录 %{dir} + create_dir_all: 无法创建目录 %{dir} + + std: + current_dir: 无法获得当前目录 + current_dir_name: 无法获得当前目录的名称 + set_current_dir: 无法设置到目录 %{dir} + + here: + cfg_not_found: 无法找到库的配置! + + create: + not_empty: 禁止的操作!指定的目录已经存在。 + + init: + not_empty: 禁止的操作!该目录不为空。 + + member: + register: 创建成员失败!请检查是否存在同名的成员 + list: 获取成员 ID 失败! + + success: + here: + root: | + 找到库 `%{name}`! + **提示**:你可以使用 jvv here --help 去了解如何查看库的详细信息 + + create: 成功在 `%{name}` 创建库! + + init: 在此处初始化库成功! + + member: + register: 创建成员 `%{member}` 成功! + remove: 好的, `%{member}` 已不再存在于库中(或本就不在?)! + list: + header: | + **当前库中的成员:** + + footer: | + 共 %{num} 个成员 diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml new file mode 100644 index 0000000..ffa4699 --- /dev/null +++ b/locales/zh-CN.yml @@ -0,0 +1,33 @@ +# jvv 的本地化 +jvv_cmd: + name: + here: "查询此处" + create: "创建库" + init: "在此处初始化库" + member: + register: "注册成员" + remove: "移除成员" + list: "列出成员" + service: + listen: "监听" + description: + here: "查询此处库的信息" + create: "在子目录中创建指定名称的库" + init: "使用当前目录名称创建库" + member: + register: "将名称添加到成员列表(需要手动存储公钥)" + remove: "从成员列表中移除指定名称(不会删除公钥)" + list: "列出可通过服务访问当前库的成员" + service: + listen: "启动此处库的服务以监听客户端连接" + +# jv 的本地化 +jv_cmd: + name: + description: + +# utils::help_builder 的模板 +help: + header: "帮助: %{raw_name} - %{name}" + desc_line: "描述: %{description}" + footer: "用法: %{usage_text}" diff --git a/src/bin/jv.rs b/src/bin/jv.rs new file mode 100644 index 0000000..f7ab768 --- /dev/null +++ b/src/bin/jv.rs @@ -0,0 +1,5 @@ +// Import i18n files +rust_i18n::i18n!("locales", fallback = "en"); + +#[tokio::main] +async fn main() {} diff --git a/src/bin/jvc.rs b/src/bin/jvc.rs deleted file mode 100644 index f328e4d..0000000 --- a/src/bin/jvc.rs +++ /dev/null @@ -1 +0,0 @@ -fn main() {} diff --git a/src/bin/jvv.rs b/src/bin/jvv.rs new file mode 100644 index 0000000..828a093 --- /dev/null +++ b/src/bin/jvv.rs @@ -0,0 +1,434 @@ +use std::{env::set_current_dir, path::Path}; + +use clap::{Parser, Subcommand}; +use env_logger::{Builder, Target}; +use just_enough_vcs::{ + utils::{ + cfg_file::config::ConfigFile, + string_proc::{self, pascal_case}, + }, + vcs::{ + connection::action_service::server_entry, + constants::SERVER_FILE_VAULT, + current::current_vault_path, + data::{ + member::Member, + vault::{Vault, config::VaultConfig}, + }, + }, +}; +use just_enough_vcs_cli::utils::{lang_selector::current_locales, md_colored::md}; +use log::LevelFilter; +use rust_i18n::{set_locale, t}; +use tokio::fs::{self}; + +// Import i18n files +rust_i18n::i18n!("locales/help_docs", fallback = "en"); + +#[derive(Parser, Debug)] +#[command( + disable_help_flag = true, + disable_version_flag = true, + disable_help_subcommand = true, + help_template = "{all-args}" +)] +struct JustEnoughVcsVault { + #[command(subcommand)] + command: JustEnoughVcsCommand, +} + +#[derive(Subcommand, Debug)] +enum JustEnoughVcsCommand { + /// Get vault info in the current directory + Here(HereArgs), + + /// Create a new directory and initialize a vault + Create(CreateVaultArgs), + + /// Create a vault in the current directory + Init(InitVaultArgs), + + /// Member manage + #[command(subcommand)] + Member(MemberManage), + + /// Manage service + #[command(subcommand)] + Service(ServiceManage), +} + +#[derive(Subcommand, Debug)] +enum MemberManage { + /// Register a member to the vault + Register(MemberRegisterArgs), + + /// Remove a member from the vault + Remove(MemberRemoveArgs), + + /// List all members in the vault + List(MemberListArgs), + + /// Show help information + #[command(alias = "--help", alias = "-h")] + Help, +} + +#[derive(Subcommand, Debug)] +enum ServiceManage { + /// Listen connection at current vault + Listen(ListenArgs), + + /// Show help information + #[command(alias = "--help", alias = "-h")] + Help, +} + +#[derive(Parser, Debug)] +struct HereArgs { + /// Show help information + #[arg(short, long)] + help: bool, +} + +#[derive(Parser, Debug)] +struct CreateVaultArgs { + /// Show help information + #[arg(short, long)] + help: bool, + + /// Vault name to create + vault_name: String, +} + +#[derive(Parser, Debug)] +struct InitVaultArgs { + /// Show help information + #[arg(short, long)] + help: bool, +} + +#[derive(Parser, Debug)] +struct MemberRegisterArgs { + /// Show help information + #[arg(short, long)] + help: bool, + + /// Member name + member_name: String, +} + +#[derive(Parser, Debug)] +struct MemberRemoveArgs { + /// Show help information + #[arg(short, long)] + help: bool, + + /// Member name + member_name: String, +} + +#[derive(Parser, Debug)] +struct MemberListArgs { + /// Show help information + #[arg(short, long)] + help: bool, +} + +#[derive(Parser, Debug)] +struct ListenArgs { + /// Show help information + #[arg(short, long)] + help: bool, + + /// Disable logging + #[arg(short, long)] + no_log: bool, +} + +#[tokio::main] +async fn main() { + set_locale(¤t_locales()); + + let Ok(parser) = JustEnoughVcsVault::try_parse() else { + println!("{}", md(t!("jvv.help"))); + return; + }; + + match parser.command { + JustEnoughVcsCommand::Here(here_args) => { + if here_args.help { + println!("{}", md(t!("jvv.here"))); + return; + } + jvv_here(here_args).await; + } + JustEnoughVcsCommand::Create(create_vault_args) => { + if create_vault_args.help { + println!("{}", md(t!("jvv.create"))); + return; + } + jvv_create(create_vault_args).await; + } + JustEnoughVcsCommand::Init(init_vault_args) => { + if init_vault_args.help { + println!("{}", md(t!("jvv.init"))); + return; + } + jvv_init(init_vault_args).await; + } + JustEnoughVcsCommand::Member(member_manage) => { + let vault_cfg = VaultConfig::read() + .await + .expect(t!("jvv.fail.no_vault_here").trim()); + + let vault = match Vault::init_current_dir(vault_cfg) { + Some(vault) => vault, + None => { + eprintln!( + "{}", + t!("jvv.fail.jvcs", err = "Failed to initialize vault") + ); + return; + } + }; + + match member_manage { + MemberManage::Register(member_register_args) => { + if member_register_args.help { + println!("{}", md(t!("jvv.member"))); + return; + } + jvv_member_register(vault, member_register_args).await; + } + MemberManage::Remove(member_remove_args) => { + if member_remove_args.help { + println!("{}", md(t!("jvv.member"))); + return; + } + jvv_member_remove(vault, member_remove_args).await; + } + MemberManage::List(member_list_args) => { + if member_list_args.help { + println!("{}", md(t!("jvv.member"))); + return; + } + jvv_member_list(vault, member_list_args).await; + } + MemberManage::Help => { + println!("{}", md(t!("jvv.member"))); + return; + } + } + } + JustEnoughVcsCommand::Service(service_manage) => match service_manage { + ServiceManage::Listen(listen_args) => { + if listen_args.help { + println!("{}", md(t!("jvv.service"))); + return; + } + jvv_service_listen(listen_args).await; + } + ServiceManage::Help => { + println!("{}", md(t!("jvv.service"))); + return; + } + }, + } +} + +async fn jvv_here(_args: HereArgs) { + let Some(current_vault) = current_vault_path() else { + eprintln!("{}", t!("jvv.fail.here.cfg_not_found").trim()); + return; + }; + + // Read vault cfg + let vault_cfg_file = current_vault.join(SERVER_FILE_VAULT); + if !vault_cfg_file.exists() { + eprintln!("{}", t!("jvv.fail.here.cfg_not_found").trim()); + return; + } + + let vault_cfg = VaultConfig::read() + .await + .expect(t!("jvv.fail.here.cfg_not_found").trim()); + + // Get vault name + let vault_name = vault_cfg.vault_name(); + + // Success + println!("{}", md(t!("jvv.success.here.root", name = vault_name))) +} + +async fn jvv_init(_args: InitVaultArgs) { + let current_dir = std::env::current_dir().expect(t!("jvv.fail.std.current_dir").trim()); + if !current_dir.read_dir().unwrap().next().is_none() { + eprintln!("{}", t!("jvv.fail.init.not_empty")); + return; + } + + // Setup vault + let vault_name = current_dir + .file_name() + .expect(t!("jvv.fail.std.current_dir_name").trim()) + .to_string_lossy() + .to_string(); + let vault_name = pascal_case!(vault_name); + + if let Err(err) = Vault::setup_vault(current_dir.clone()).await { + eprintln!("{}", t!("jvv.fail.jvcs", err = err.to_string())); + return; + } + + // Read vault cfg + let mut vault_cfg = match VaultConfig::read().await { + Ok(cfg) => cfg, + Err(err) => { + eprintln!("{}", t!("jvv.fail.jvcs", err = err.to_string())); + return; + } + }; + + vault_cfg.change_name(vault_name); + if let Err(err) = VaultConfig::write(&vault_cfg).await { + eprintln!("{}", t!("jvv.fail.jvcs", err = err.to_string())); + return; + } + + // Success + println!( + "{}", + t!("jvv.success.init", name = current_dir.to_string_lossy()) + ) +} + +async fn jvv_create(args: CreateVaultArgs) { + let current_dir = std::env::current_dir().expect(t!("jvv.fail.std.current_dir").trim()); + let target_dir = current_dir.join(args.vault_name.clone()); + + // Create directory + if let Err(_) = fs::create_dir_all(&target_dir).await { + eprintln!( + "{}", + t!( + "jvv.fail.tokio.fs.create_dir", + dir = target_dir.to_string_lossy() + ) + ); + return; + } + + if !target_dir.read_dir().unwrap().next().is_none() { + eprintln!("{}", t!("jvv.fail.create.not_empty")); + return; + } + + // Setup vault + let vault_name = pascal_case!(args.vault_name); + if let Err(err) = Vault::setup_vault(target_dir.clone()).await { + eprintln!("{}", t!("jvv.fail.jvcs", err = err.to_string())); + return; + } + + // Enter target_dir + if let Err(_) = set_current_dir(&target_dir) { + eprintln!( + "{}", + t!( + "jvv.fail.std.set_current_dir", + dir = target_dir.to_string_lossy() + ) + ); + return; + } + + // Read vault cfg + let mut vault_cfg = match VaultConfig::read().await { + Ok(cfg) => cfg, + Err(err) => { + eprintln!("{}", t!("jvv.fail.jvcs", err = err.to_string())); + return; + } + }; + + vault_cfg.change_name(vault_name); + if let Err(err) = VaultConfig::write(&vault_cfg).await { + eprintln!("{}", t!("jvv.fail.jvcs", err = err.to_string())); + return; + } + + // Success + println!( + "{}", + t!("jvv.success.create", name = target_dir.to_string_lossy()) + ) +} + +async fn jvv_member_register(vault: Vault, args: MemberRegisterArgs) { + let register = vault + .register_member_to_vault(Member::new(args.member_name.clone())) + .await; + + if register.is_err() { + eprintln!("{}", t!("jvv.fail.member.register").trim()); + return; + } + + println!( + "{}", + t!("jvv.success.member.register", member = args.member_name) + ) +} + +async fn jvv_member_remove(vault: Vault, args: MemberRemoveArgs) { + let _ = vault.remove_member_from_vault(&args.member_name); + + println!( + "{}", + t!("jvv.success.member.remove", member = args.member_name) + ) +} + +async fn jvv_member_list(vault: Vault, _args: MemberListArgs) { + // Get id list + let ids = vault.member_ids().expect(t!("jvv.fail.member.list").trim()); + + // Print header + println!("{}", md(t!("jvv.success.member.list.header"))); + + // Print list + let mut i = 0; + for member in ids { + println!("{}. {}", i + 1, member); + i += 1; + } + + // Print footer + println!("{}", md(t!("jvv.success.member.list.footer", num = i))); +} + +async fn jvv_service_listen(args: ListenArgs) { + let Some(current_vault) = current_vault_path() else { + eprintln!("{}", t!("jvv.fail.here.cfg_not_found").trim()); + return; + }; + + if !args.no_log { + build_env_logger(current_vault.join("log.txt")); + } + + let _ = server_entry(current_vault).await; +} + +fn build_env_logger(log_path: impl AsRef<Path>) { + let mut builder = Builder::from_default_env(); + builder + .filter_level(LevelFilter::Info) + .target(Target::Stdout); + + let log_file = std::fs::File::create(log_path).expect("Failed to create log file"); + builder + .filter_module("just_enough_vcs", LevelFilter::Trace) + .target(Target::Pipe(Box::new(log_file))) + .init(); +} diff --git a/src/jv.rs b/src/jv.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/jv.rs @@ -0,0 +1 @@ + diff --git a/src/jvv.rs b/src/jvv.rs new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/jvv.rs @@ -1 +1,8 @@ +/// JustEnoughVCS - Local Manager & Client +pub mod jv; +/// JustEnoughVCS - Vault Manager & Server +pub mod jvv; + +/// Utils +pub mod utils; diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 0000000..0446ece --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,2 @@ +pub mod lang_selector; +pub mod md_colored; diff --git a/src/utils/lang_selector.rs b/src/utils/lang_selector.rs new file mode 100644 index 0000000..c3603ea --- /dev/null +++ b/src/utils/lang_selector.rs @@ -0,0 +1,14 @@ +pub fn current_locales() -> String { + if let Ok(lang) = std::env::var("APP_LANG") { + return lang; + } + + if let Ok(lang) = std::env::var("LANG") { + if let Some(base_lang) = lang.split('.').next() { + return base_lang.replace('_', "-"); + } + return lang; + } + + "en".to_string() +} diff --git a/src/utils/md_colored.rs b/src/utils/md_colored.rs new file mode 100644 index 0000000..9991014 --- /dev/null +++ b/src/utils/md_colored.rs @@ -0,0 +1,20 @@ +use colored::*; +use regex::Regex; + +pub fn md(text: impl AsRef<str>) -> String { + let bold_re = Regex::new(r"\*\*(.*?)\*\*").unwrap(); + let mut result = bold_re + .replace_all(text.as_ref().trim(), |caps: ®ex::Captures| { + format!("{}", caps[1].bold()) + }) + .to_string(); + + let italic_re = Regex::new(r"\*(.*?)\*").unwrap(); + result = italic_re + .replace_all(&result, |caps: ®ex::Captures| { + format!("{}", caps[1].italic()) + }) + .to_string(); + + result +} |
