summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.cargo/config.toml12
-rw-r--r--Cargo.lock1395
-rw-r--r--Cargo.toml16
-rw-r--r--crates/cli_publisher/src/main.rs8
-rw-r--r--locales/en.yml33
-rw-r--r--locales/help_docs/en.yml116
-rw-r--r--locales/help_docs/zh-CN.yml112
-rw-r--r--locales/zh-CN.yml33
-rw-r--r--src/bin/jv.rs5
-rw-r--r--src/bin/jvc.rs1
-rw-r--r--src/bin/jvv.rs434
-rw-r--r--src/jv.rs1
-rw-r--r--src/jvv.rs0
-rw-r--r--src/lib.rs7
-rw-r--r--src/utils.rs2
-rw-r--r--src/utils/lang_selector.rs14
-rw-r--r--src/utils/md_colored.rs20
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"
+]
diff --git a/Cargo.lock b/Cargo.lock
index 94b8a1b..aa87d0a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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"
diff --git a/Cargo.toml b/Cargo.toml
index 0adc8f5..a800431 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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(&current_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
diff --git a/src/lib.rs b/src/lib.rs
index 8b13789..c82b04b 100644
--- a/src/lib.rs
+++ b/src/lib.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: &regex::Captures| {
+ format!("{}", caps[1].bold())
+ })
+ .to_string();
+
+ let italic_re = Regex::new(r"\*(.*?)\*").unwrap();
+ result = italic_re
+ .replace_all(&result, |caps: &regex::Captures| {
+ format!("{}", caps[1].italic())
+ })
+ .to_string();
+
+ result
+}