commit
8393eb03ee
@ -0,0 +1,2 @@ |
||||
/target |
||||
.idea/ |
@ -0,0 +1,832 @@ |
||||
# This file is automatically @generated by Cargo. |
||||
# It is not intended for manual editing. |
||||
version = 4 |
||||
|
||||
[[package]] |
||||
name = "aho-corasick" |
||||
version = "1.1.3" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" |
||||
dependencies = [ |
||||
"memchr", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "anstream" |
||||
version = "0.6.20" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" |
||||
dependencies = [ |
||||
"anstyle", |
||||
"anstyle-parse", |
||||
"anstyle-query", |
||||
"anstyle-wincon", |
||||
"colorchoice", |
||||
"is_terminal_polyfill", |
||||
"utf8parse", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "anstyle" |
||||
version = "1.0.11" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" |
||||
|
||||
[[package]] |
||||
name = "anstyle-parse" |
||||
version = "0.2.7" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" |
||||
dependencies = [ |
||||
"utf8parse", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "anstyle-query" |
||||
version = "1.1.4" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" |
||||
dependencies = [ |
||||
"windows-sys 0.60.2", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "anstyle-wincon" |
||||
version = "3.0.10" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" |
||||
dependencies = [ |
||||
"anstyle", |
||||
"once_cell_polyfill", |
||||
"windows-sys 0.60.2", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "autocfg" |
||||
version = "1.5.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" |
||||
|
||||
[[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" |
||||
checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" |
||||
|
||||
[[package]] |
||||
name = "byteorder" |
||||
version = "1.5.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" |
||||
|
||||
[[package]] |
||||
name = "cfg-if" |
||||
version = "1.0.3" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" |
||||
|
||||
[[package]] |
||||
name = "clap" |
||||
version = "4.5.47" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" |
||||
dependencies = [ |
||||
"clap_builder", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "clap_builder" |
||||
version = "4.5.47" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" |
||||
dependencies = [ |
||||
"anstream", |
||||
"anstyle", |
||||
"clap_lex", |
||||
"strsim", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "clap_lex" |
||||
version = "0.7.5" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" |
||||
|
||||
[[package]] |
||||
name = "clpack" |
||||
version = "0.1.0" |
||||
dependencies = [ |
||||
"clap", |
||||
"inquire", |
||||
"regex", |
||||
"serde", |
||||
"serde_json", |
||||
"smart-default", |
||||
"thiserror", |
||||
"toml", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "colorchoice" |
||||
version = "1.0.4" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" |
||||
|
||||
[[package]] |
||||
name = "crossterm" |
||||
version = "0.25.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67" |
||||
dependencies = [ |
||||
"bitflags 1.3.2", |
||||
"crossterm_winapi", |
||||
"libc", |
||||
"mio", |
||||
"parking_lot", |
||||
"signal-hook", |
||||
"signal-hook-mio", |
||||
"winapi", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "crossterm_winapi" |
||||
version = "0.9.1" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" |
||||
dependencies = [ |
||||
"winapi", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "dyn-clone" |
||||
version = "1.0.20" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" |
||||
|
||||
[[package]] |
||||
name = "equivalent" |
||||
version = "1.0.2" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" |
||||
|
||||
[[package]] |
||||
name = "fuzzy-matcher" |
||||
version = "0.3.7" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" |
||||
dependencies = [ |
||||
"thread_local", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "fxhash" |
||||
version = "0.2.1" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" |
||||
dependencies = [ |
||||
"byteorder", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "hashbrown" |
||||
version = "0.15.5" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" |
||||
|
||||
[[package]] |
||||
name = "indexmap" |
||||
version = "2.11.1" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921" |
||||
dependencies = [ |
||||
"equivalent", |
||||
"hashbrown", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "inquire" |
||||
version = "0.7.5" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "0fddf93031af70e75410a2511ec04d49e758ed2f26dad3404a934e0fb45cc12a" |
||||
dependencies = [ |
||||
"bitflags 2.9.4", |
||||
"crossterm", |
||||
"dyn-clone", |
||||
"fuzzy-matcher", |
||||
"fxhash", |
||||
"newline-converter", |
||||
"once_cell", |
||||
"unicode-segmentation", |
||||
"unicode-width", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "is_terminal_polyfill" |
||||
version = "1.70.1" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" |
||||
|
||||
[[package]] |
||||
name = "itoa" |
||||
version = "1.0.15" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" |
||||
|
||||
[[package]] |
||||
name = "libc" |
||||
version = "0.2.175" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" |
||||
|
||||
[[package]] |
||||
name = "lock_api" |
||||
version = "0.4.13" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" |
||||
dependencies = [ |
||||
"autocfg", |
||||
"scopeguard", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "log" |
||||
version = "0.4.28" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" |
||||
|
||||
[[package]] |
||||
name = "memchr" |
||||
version = "2.7.5" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" |
||||
|
||||
[[package]] |
||||
name = "mio" |
||||
version = "0.8.11" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" |
||||
dependencies = [ |
||||
"libc", |
||||
"log", |
||||
"wasi", |
||||
"windows-sys 0.48.0", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "newline-converter" |
||||
version = "0.3.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "47b6b097ecb1cbfed438542d16e84fd7ad9b0c76c8a65b7f9039212a3d14dc7f" |
||||
dependencies = [ |
||||
"unicode-segmentation", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "once_cell" |
||||
version = "1.21.3" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" |
||||
|
||||
[[package]] |
||||
name = "once_cell_polyfill" |
||||
version = "1.70.1" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" |
||||
|
||||
[[package]] |
||||
name = "parking_lot" |
||||
version = "0.12.4" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" |
||||
dependencies = [ |
||||
"lock_api", |
||||
"parking_lot_core", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "parking_lot_core" |
||||
version = "0.9.11" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" |
||||
dependencies = [ |
||||
"cfg-if", |
||||
"libc", |
||||
"redox_syscall", |
||||
"smallvec", |
||||
"windows-targets 0.52.6", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "proc-macro2" |
||||
version = "1.0.101" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" |
||||
dependencies = [ |
||||
"unicode-ident", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "quote" |
||||
version = "1.0.40" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" |
||||
dependencies = [ |
||||
"proc-macro2", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "redox_syscall" |
||||
version = "0.5.17" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" |
||||
dependencies = [ |
||||
"bitflags 2.9.4", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "regex" |
||||
version = "1.11.2" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" |
||||
dependencies = [ |
||||
"aho-corasick", |
||||
"memchr", |
||||
"regex-automata", |
||||
"regex-syntax", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "regex-automata" |
||||
version = "0.4.10" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" |
||||
dependencies = [ |
||||
"aho-corasick", |
||||
"memchr", |
||||
"regex-syntax", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "regex-syntax" |
||||
version = "0.8.6" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" |
||||
|
||||
[[package]] |
||||
name = "ryu" |
||||
version = "1.0.20" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" |
||||
|
||||
[[package]] |
||||
name = "scopeguard" |
||||
version = "1.2.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" |
||||
|
||||
[[package]] |
||||
name = "serde" |
||||
version = "1.0.219" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" |
||||
dependencies = [ |
||||
"serde_derive", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "serde_derive" |
||||
version = "1.0.219" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" |
||||
dependencies = [ |
||||
"proc-macro2", |
||||
"quote", |
||||
"syn", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "serde_json" |
||||
version = "1.0.143" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" |
||||
dependencies = [ |
||||
"itoa", |
||||
"memchr", |
||||
"ryu", |
||||
"serde", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "serde_spanned" |
||||
version = "1.0.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" |
||||
dependencies = [ |
||||
"serde", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "signal-hook" |
||||
version = "0.3.18" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" |
||||
dependencies = [ |
||||
"libc", |
||||
"signal-hook-registry", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "signal-hook-mio" |
||||
version = "0.2.4" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" |
||||
dependencies = [ |
||||
"libc", |
||||
"mio", |
||||
"signal-hook", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "signal-hook-registry" |
||||
version = "1.4.6" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" |
||||
dependencies = [ |
||||
"libc", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "smallvec" |
||||
version = "1.15.1" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" |
||||
|
||||
[[package]] |
||||
name = "smart-default" |
||||
version = "0.7.1" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "0eb01866308440fc64d6c44d9e86c5cc17adfe33c4d6eed55da9145044d0ffc1" |
||||
dependencies = [ |
||||
"proc-macro2", |
||||
"quote", |
||||
"syn", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "strsim" |
||||
version = "0.11.1" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" |
||||
|
||||
[[package]] |
||||
name = "syn" |
||||
version = "2.0.106" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" |
||||
dependencies = [ |
||||
"proc-macro2", |
||||
"quote", |
||||
"unicode-ident", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "thiserror" |
||||
version = "2.0.16" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" |
||||
dependencies = [ |
||||
"thiserror-impl", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "thiserror-impl" |
||||
version = "2.0.16" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" |
||||
dependencies = [ |
||||
"proc-macro2", |
||||
"quote", |
||||
"syn", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "thread_local" |
||||
version = "1.1.9" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" |
||||
dependencies = [ |
||||
"cfg-if", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "toml" |
||||
version = "0.9.5" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "75129e1dc5000bfbaa9fee9d1b21f974f9fbad9daec557a521ee6e080825f6e8" |
||||
dependencies = [ |
||||
"indexmap", |
||||
"serde", |
||||
"serde_spanned", |
||||
"toml_datetime", |
||||
"toml_parser", |
||||
"toml_writer", |
||||
"winnow", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "toml_datetime" |
||||
version = "0.7.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" |
||||
dependencies = [ |
||||
"serde", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "toml_parser" |
||||
version = "1.0.2" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10" |
||||
dependencies = [ |
||||
"winnow", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "toml_writer" |
||||
version = "1.0.2" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" |
||||
|
||||
[[package]] |
||||
name = "unicode-ident" |
||||
version = "1.0.19" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" |
||||
|
||||
[[package]] |
||||
name = "unicode-segmentation" |
||||
version = "1.12.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" |
||||
|
||||
[[package]] |
||||
name = "unicode-width" |
||||
version = "0.1.14" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" |
||||
|
||||
[[package]] |
||||
name = "utf8parse" |
||||
version = "0.2.2" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" |
||||
|
||||
[[package]] |
||||
name = "wasi" |
||||
version = "0.11.1+wasi-snapshot-preview1" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" |
||||
|
||||
[[package]] |
||||
name = "winapi" |
||||
version = "0.3.9" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" |
||||
dependencies = [ |
||||
"winapi-i686-pc-windows-gnu", |
||||
"winapi-x86_64-pc-windows-gnu", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "winapi-i686-pc-windows-gnu" |
||||
version = "0.4.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" |
||||
|
||||
[[package]] |
||||
name = "winapi-x86_64-pc-windows-gnu" |
||||
version = "0.4.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" |
||||
|
||||
[[package]] |
||||
name = "windows-link" |
||||
version = "0.1.3" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" |
||||
|
||||
[[package]] |
||||
name = "windows-sys" |
||||
version = "0.48.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" |
||||
dependencies = [ |
||||
"windows-targets 0.48.5", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "windows-sys" |
||||
version = "0.60.2" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" |
||||
dependencies = [ |
||||
"windows-targets 0.53.3", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "windows-targets" |
||||
version = "0.48.5" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" |
||||
dependencies = [ |
||||
"windows_aarch64_gnullvm 0.48.5", |
||||
"windows_aarch64_msvc 0.48.5", |
||||
"windows_i686_gnu 0.48.5", |
||||
"windows_i686_msvc 0.48.5", |
||||
"windows_x86_64_gnu 0.48.5", |
||||
"windows_x86_64_gnullvm 0.48.5", |
||||
"windows_x86_64_msvc 0.48.5", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "windows-targets" |
||||
version = "0.52.6" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" |
||||
dependencies = [ |
||||
"windows_aarch64_gnullvm 0.52.6", |
||||
"windows_aarch64_msvc 0.52.6", |
||||
"windows_i686_gnu 0.52.6", |
||||
"windows_i686_gnullvm 0.52.6", |
||||
"windows_i686_msvc 0.52.6", |
||||
"windows_x86_64_gnu 0.52.6", |
||||
"windows_x86_64_gnullvm 0.52.6", |
||||
"windows_x86_64_msvc 0.52.6", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "windows-targets" |
||||
version = "0.53.3" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" |
||||
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", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "windows_aarch64_gnullvm" |
||||
version = "0.48.5" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" |
||||
|
||||
[[package]] |
||||
name = "windows_aarch64_gnullvm" |
||||
version = "0.52.6" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" |
||||
|
||||
[[package]] |
||||
name = "windows_aarch64_gnullvm" |
||||
version = "0.53.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" |
||||
|
||||
[[package]] |
||||
name = "windows_aarch64_msvc" |
||||
version = "0.48.5" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" |
||||
|
||||
[[package]] |
||||
name = "windows_aarch64_msvc" |
||||
version = "0.52.6" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" |
||||
|
||||
[[package]] |
||||
name = "windows_aarch64_msvc" |
||||
version = "0.53.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" |
||||
|
||||
[[package]] |
||||
name = "windows_i686_gnu" |
||||
version = "0.48.5" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" |
||||
|
||||
[[package]] |
||||
name = "windows_i686_gnu" |
||||
version = "0.52.6" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" |
||||
|
||||
[[package]] |
||||
name = "windows_i686_gnu" |
||||
version = "0.53.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" |
||||
|
||||
[[package]] |
||||
name = "windows_i686_gnullvm" |
||||
version = "0.52.6" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" |
||||
|
||||
[[package]] |
||||
name = "windows_i686_gnullvm" |
||||
version = "0.53.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" |
||||
|
||||
[[package]] |
||||
name = "windows_i686_msvc" |
||||
version = "0.48.5" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" |
||||
|
||||
[[package]] |
||||
name = "windows_i686_msvc" |
||||
version = "0.52.6" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" |
||||
|
||||
[[package]] |
||||
name = "windows_i686_msvc" |
||||
version = "0.53.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" |
||||
|
||||
[[package]] |
||||
name = "windows_x86_64_gnu" |
||||
version = "0.48.5" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" |
||||
|
||||
[[package]] |
||||
name = "windows_x86_64_gnu" |
||||
version = "0.52.6" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" |
||||
|
||||
[[package]] |
||||
name = "windows_x86_64_gnu" |
||||
version = "0.53.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" |
||||
|
||||
[[package]] |
||||
name = "windows_x86_64_gnullvm" |
||||
version = "0.48.5" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" |
||||
|
||||
[[package]] |
||||
name = "windows_x86_64_gnullvm" |
||||
version = "0.52.6" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" |
||||
|
||||
[[package]] |
||||
name = "windows_x86_64_gnullvm" |
||||
version = "0.53.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" |
||||
|
||||
[[package]] |
||||
name = "windows_x86_64_msvc" |
||||
version = "0.48.5" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" |
||||
|
||||
[[package]] |
||||
name = "windows_x86_64_msvc" |
||||
version = "0.52.6" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" |
||||
|
||||
[[package]] |
||||
name = "windows_x86_64_msvc" |
||||
version = "0.53.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" |
||||
|
||||
[[package]] |
||||
name = "winnow" |
||||
version = "0.7.13" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" |
@ -0,0 +1,20 @@ |
||||
[package] |
||||
name = "clpack" |
||||
version = "0.1.0" |
||||
edition = "2024" |
||||
authors = ["Ondřej Hruška <ondra@ondrovo.com>"] |
||||
description = "Manage changelog across multiple release channels" |
||||
|
||||
[dependencies] |
||||
clap = "4.5" |
||||
thiserror = "2" |
||||
serde = { version = "1", features = ["derive"] } |
||||
serde_json = "1" |
||||
toml = "0.9" |
||||
smart-default = "0.7" |
||||
regex = "1" |
||||
|
||||
# input |
||||
|
||||
# sadly this looks mostly abandoned. Alternative is "dialoguer" |
||||
inquire = "0.7.5" |
@ -0,0 +1,11 @@ |
||||
use crate::AppContext; |
||||
use crate::git::get_branch_name; |
||||
|
||||
pub(crate) fn cl_log(ctx: AppContext) { |
||||
let branch = get_branch_name(&ctx); |
||||
let issue = branch.as_ref().map(|b| b.parse_issue(&ctx)).flatten(); |
||||
|
||||
eprintln!("Branch name: {:?}, issue: {:?}", branch, issue); |
||||
|
||||
todo!(); |
||||
} |
@ -0,0 +1,15 @@ |
||||
use crate::AppContext; |
||||
use crate::git::get_branch_name; |
||||
|
||||
pub(crate) fn cl_pack(ctx: AppContext, manual_channel: Option<&str>) { |
||||
let branch = get_branch_name(&ctx); |
||||
let channel = branch.as_ref().map(|b| b.parse_channel(&ctx)).flatten(); |
||||
let version = branch.as_ref().map(|b| b.parse_version(&ctx)).flatten(); |
||||
|
||||
eprintln!( |
||||
"Branch name: {:?}, channel: {:?}, version: {:?}", |
||||
branch, channel, version |
||||
); |
||||
|
||||
todo!(); |
||||
} |
@ -0,0 +1,203 @@ |
||||
use crate::AppContext; |
||||
use std::fmt::Display; |
||||
use std::fmt::Formatter; |
||||
use std::process::exit; |
||||
|
||||
#[derive(Debug, Clone)] |
||||
pub struct BranchName(pub String); |
||||
|
||||
impl Display for BranchName { |
||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { |
||||
f.write_str(&self.0) |
||||
} |
||||
} |
||||
|
||||
/// Best effort identify git branch by looking into the .git folder
|
||||
pub fn get_branch_name(ctx: &AppContext) -> Option<BranchName> { |
||||
let path_to_head = ctx.root.join(".git").join("HEAD"); |
||||
|
||||
if !path_to_head.is_file() { |
||||
return None; |
||||
} |
||||
|
||||
let contents = std::fs::read_to_string(path_to_head).ok()?; |
||||
|
||||
if let Some(branch) = contents.strip_prefix("ref: refs/heads/") { |
||||
let b = branch.trim(); |
||||
if b.is_empty() { |
||||
None |
||||
} else { |
||||
Some(BranchName(branch.trim().to_owned())) |
||||
} |
||||
} else { |
||||
None |
||||
} |
||||
} |
||||
|
||||
impl BranchName { |
||||
/// Extract a value from a branch name using a regex given as string.
|
||||
///
|
||||
/// pat_s - the regex pattern
|
||||
/// regex_conf_name - name of the conf field the regex came from, for error messages
|
||||
fn parse_using_regex(&self, template: &str, regex_conf_name: &str) -> Option<String> { |
||||
let Some(pat_s) = as_regex_pattern(template) else { |
||||
eprintln!( |
||||
"Config field \"{regex_conf_name}\" must contain a regex (encased in slashes). Found: {template}" |
||||
); |
||||
exit(1); |
||||
//return None;
|
||||
}; |
||||
|
||||
let pat = match regex::Regex::new(pat_s) { |
||||
Ok(pat) => pat, |
||||
Err(e) => { |
||||
eprintln!("Invalid regex in \"{regex_conf_name}\": {pat_s}"); |
||||
eprintln!("Error: {e}"); |
||||
exit(1); |
||||
//return None;
|
||||
} |
||||
}; |
||||
|
||||
let num_captures = pat.captures_len(); |
||||
if num_captures != 2 { |
||||
eprintln!("The pattern \"{regex_conf_name}\" is not applicable: {pat_s}"); |
||||
eprintln!( |
||||
"There must be exactly one capturing group. Found {}", |
||||
num_captures - 1 |
||||
); |
||||
exit(1); |
||||
//return None;
|
||||
} |
||||
|
||||
let matches = pat.captures(&self.0)?; |
||||
Some(matches.get(1)?.as_str().to_owned()) |
||||
} |
||||
|
||||
/// Parse version from this branch name.
|
||||
///
|
||||
/// Aborts if the configured regex pattern is invalid.
|
||||
pub fn parse_version(&self, ctx: &AppContext) -> Option<String> { |
||||
self.parse_using_regex( |
||||
ctx.config.branch_version_pattern.as_ref()?, |
||||
"branch_version_pattern", |
||||
) |
||||
} |
||||
|
||||
/// Parse issue number from this branch name.
|
||||
///
|
||||
/// Aborts if the configured regex pattern is invalid.
|
||||
pub fn parse_issue(&self, ctx: &AppContext) -> Option<String> { |
||||
self.parse_using_regex( |
||||
ctx.config.branch_issue_pattern.as_ref()?, |
||||
"branch_issue_pattern", |
||||
) |
||||
} |
||||
|
||||
/// Try to detect a release channel from this branch name (e.g. stable, EAP)
|
||||
pub fn parse_channel(&self, ctx: &AppContext) -> Option<String> { |
||||
for (channel_id, template) in &ctx.config.channels { |
||||
if let Some(pat_s) = as_regex_pattern(template) { |
||||
let pat = match regex::Regex::new(pat_s) { |
||||
Ok(pat) => pat, |
||||
Err(e) => { |
||||
eprintln!("Invalid regex for channel \"{channel_id}\": {template}"); |
||||
eprintln!("Error: {e}"); |
||||
exit(1); |
||||
} |
||||
}; |
||||
|
||||
if pat.is_match(&self.0) { |
||||
return Some(channel_id.to_owned()); |
||||
} |
||||
} else { |
||||
// No regex - match it verbatim
|
||||
if &self.0 == template { |
||||
return Some(channel_id.to_owned()); |
||||
} else { |
||||
continue; |
||||
} |
||||
} |
||||
} |
||||
None |
||||
} |
||||
} |
||||
|
||||
/// If the string is encased in slashes, return the inner part. Otherwise, return None.
|
||||
fn as_regex_pattern(input: &str) -> Option<&str> { |
||||
input.strip_prefix('/')?.strip_suffix('/') |
||||
} |
||||
|
||||
#[cfg(test)] |
||||
mod test { |
||||
use super::*; |
||||
use std::path::PathBuf; |
||||
|
||||
#[test] |
||||
fn test_as_regex_pattern() { |
||||
assert_eq!(as_regex_pattern("foo"), None); |
||||
assert_eq!(as_regex_pattern("/foo"), None); |
||||
assert_eq!(as_regex_pattern("foo/"), None); |
||||
assert_eq!(as_regex_pattern("/foo/"), Some("foo")); |
||||
} |
||||
|
||||
#[test] |
||||
fn test_parse_version() { |
||||
let ctx = AppContext { |
||||
config: Default::default(), |
||||
root: PathBuf::from("/tmp/"), // will not be used
|
||||
}; |
||||
|
||||
assert_eq!( |
||||
BranchName("rel/3.14".to_string()).parse_version(&ctx), |
||||
Some("3.14".to_string()) |
||||
); |
||||
|
||||
assert_eq!(BranchName("rel/foo".to_string()).parse_version(&ctx), None); |
||||
} |
||||
|
||||
#[test] |
||||
fn test_parse_issue() { |
||||
let ctx = AppContext { |
||||
config: Default::default(), |
||||
root: PathBuf::from("/tmp/"), // will not be used
|
||||
}; |
||||
|
||||
assert_eq!( |
||||
BranchName("1234-bober-kurwa".to_string()).parse_issue(&ctx), |
||||
Some("1234".to_string()) |
||||
); |
||||
|
||||
assert_eq!( |
||||
BranchName("SW-778-jakie-bydłe-jebane".to_string()).parse_issue(&ctx), |
||||
Some("SW-778".to_string()) |
||||
); |
||||
|
||||
assert_eq!( |
||||
BranchName("nie-spierdalaj-mordo".to_string()).parse_issue(&ctx), |
||||
None |
||||
); |
||||
} |
||||
|
||||
#[test] |
||||
fn test_parse_channel() { |
||||
let ctx = AppContext { |
||||
config: Default::default(), |
||||
root: PathBuf::from("/tmp/"), // will not be used
|
||||
}; |
||||
|
||||
assert_eq!( |
||||
BranchName("main".to_string()).parse_channel(&ctx), |
||||
Some("default".to_string()) |
||||
); |
||||
|
||||
assert_eq!( |
||||
BranchName("master".to_string()).parse_channel(&ctx), |
||||
Some("default".to_string()) |
||||
); |
||||
|
||||
assert_eq!( |
||||
BranchName("my-cool-feature".to_string()).parse_version(&ctx), |
||||
None |
||||
); |
||||
} |
||||
} |
@ -0,0 +1,183 @@ |
||||
use crate::action_log::cl_log; |
||||
use crate::action_pack::cl_pack; |
||||
use clap::builder::NonEmptyStringValueParser; |
||||
use serde::{Deserialize, Serialize}; |
||||
use smart_default::SmartDefault; |
||||
use std::collections::HashMap; |
||||
use std::path::{Path, PathBuf}; |
||||
use std::process::exit; |
||||
|
||||
mod git; |
||||
|
||||
mod action_log; |
||||
mod action_pack; |
||||
|
||||
#[derive(Debug)] |
||||
struct AppContext { |
||||
config: Config, |
||||
|
||||
root: PathBuf, |
||||
} |
||||
|
||||
/// Main app configuration file
|
||||
#[derive(Debug, Serialize, Deserialize, SmartDefault)] |
||||
#[serde(deny_unknown_fields, default)] |
||||
struct Config { |
||||
/// Folder for data files - the tool will manage contents of this folder.
|
||||
/// Changelog entries are simple text files that may be edited manually
|
||||
/// if corrections need to be made.
|
||||
#[default = "changelog"] |
||||
data_folder: String, |
||||
|
||||
/// ID of the default channel - this only matters inside this config file
|
||||
#[default = "default"] |
||||
default_channel: String, |
||||
|
||||
/// Path or file name of the default changelog file, relative to the root of the project.
|
||||
///
|
||||
/// The name is used as-is.
|
||||
#[default = "CHANGELOG.md"] |
||||
changelog_file_default: String, |
||||
|
||||
/// Path or file of a channel-specific changelog file, relative to the root of the project.
|
||||
///
|
||||
/// Placeholders supported are:
|
||||
/// - `{channel}`, `{Channel}`, `{CHANNEL}` - Channel ID in the respective capitalization
|
||||
#[default = "CHANGELOG-{CHANNEL}.md"] |
||||
changelog_file_channel: String, |
||||
|
||||
/// Changelog sections suggested when creating a new entry.
|
||||
///
|
||||
/// Users may also specify a custom section name.
|
||||
///
|
||||
/// Changelog entries under each section will be grouped in the packed changelog.
|
||||
#[default(vec![ |
||||
"New features".to_string(), |
||||
"Improvements".to_string(), |
||||
"Fixes".to_string(), |
||||
])] |
||||
sections: Vec<String>, |
||||
|
||||
/// Changelog channels - how to identify them from git branch names
|
||||
///
|
||||
/// - Key - changelog ID; this can be used in the channel file name. Examples: default, eap, beta
|
||||
/// - Value - git branch name to recognize the channel. This is a regex pattern.
|
||||
///
|
||||
/// At least one channel must be defined, with the name defined in `default_channel`
|
||||
///
|
||||
/// # Value format
|
||||
/// For simple branch names without special symbols that do not change, e.g. `main`, `master`, `test`, you can just use the name as is.
|
||||
/// To specify a regex, enclose it in slashes, e.g. /rel\/foo/
|
||||
///
|
||||
/// If you have a naming schema like e.g. `beta/1.0` where only the prefix stays the same, you may use e.g. `^beta/.*`
|
||||
#[default(HashMap::from([ |
||||
("default".to_string(), "/^(?:main|master)$/".to_string()) |
||||
]))] |
||||
channels: HashMap<String, String>, |
||||
|
||||
/// Regex pattern to extract issue number from a branch name.
|
||||
/// There should be one capture group that is the number.
|
||||
///
|
||||
/// Example: `/^(SW-\d+)-.*$/` or `/^(\d+)-.*$/`
|
||||
///
|
||||
/// If None, no branch identification will be attempted.
|
||||
#[default(Some(r"/^((?:SW-)?\d+)-.*/".to_string()))] |
||||
branch_issue_pattern: Option<String>, |
||||
|
||||
/// Regex pattern to extract release number from a branch name.
|
||||
/// There should be one capture group that is the version.
|
||||
///
|
||||
/// Example: `/^rel\/(\d+.\d+)$/`
|
||||
///
|
||||
/// If None, no branch identification will be attempted.
|
||||
///
|
||||
/// TODO attempt to parse version from package.json, composer.json, Cargo.toml and others
|
||||
#[default(Some(r"/^rel\/(\d+\.\d+)$/".to_string()))] |
||||
branch_version_pattern: Option<String>, |
||||
} |
||||
|
||||
fn main() { |
||||
let args = clap::Command::new("cl") |
||||
.version(env!("CARGO_PKG_VERSION")) |
||||
.author(env!("CARGO_PKG_AUTHORS")) |
||||
.about(env!("CARGO_PKG_DESCRIPTION")) |
||||
.subcommand( |
||||
clap::Command::new("pack") |
||||
.visible_alias("release") |
||||
.about("Create a release changelog entry for the current channel") |
||||
.arg( |
||||
clap::Arg::new("CHANNEL") |
||||
.help("Channel ID, possible values depend on project config. None for main channel.") |
||||
.value_parser(NonEmptyStringValueParser::new()) |
||||
.required(false), |
||||
), |
||||
) |
||||
.subcommand(clap::Command::new("add") |
||||
.visible_alias("log") |
||||
.about("Add a changelog entry on the current branch")) |
||||
.subcommand_required(false) |
||||
.arg(clap::Arg::new("CONFIG") |
||||
.short('c') |
||||
.long("config") |
||||
.value_parser(NonEmptyStringValueParser::new()) |
||||
.required(false)) |
||||
.after_help( |
||||
"Call with no arguments to create a changelog entry (same as the \"add\" subcommand).", |
||||
) |
||||
.get_matches(); |
||||
|
||||
let specified_config_file = args.get_one::<String>("CONFIG").map(|s| s.as_str()); |
||||
|
||||
let config_file_name: &str = specified_config_file.unwrap_or("clpack.toml"); |
||||
|
||||
eprintln!("Loading configuration from {}", config_file_name); |
||||
|
||||
let Ok(root) = std::env::current_dir() else { |
||||
eprintln!("Failed to get current directory - is it deleted / inaccessible?"); |
||||
exit(1); |
||||
}; |
||||
|
||||
let config_path = if config_file_name.starts_with("/") { |
||||
// It's an absolute path
|
||||
PathBuf::from(config_file_name) |
||||
} else { |
||||
root.join(&config_file_name) |
||||
}; |
||||
|
||||
// Load and parse config
|
||||
|
||||
let config: Config = if let Ok(config_file_content) = std::fs::read_to_string(&config_path) { |
||||
match toml::from_str(&config_file_content) { |
||||
Ok(config) => config, |
||||
Err(e) => { |
||||
eprintln!( |
||||
"Failed to parse config file ({}): {}", |
||||
config_path.display(), |
||||
e |
||||
); |
||||
exit(1); |
||||
} |
||||
} |
||||
} else if specified_config_file.is_some() { |
||||
// Failed to load config the user specifically asked for - make it an error
|
||||
eprintln!("Failed to load config file at {}", config_path.display()); |
||||
exit(1); |
||||
} else { |
||||
Default::default() |
||||
}; |
||||
|
||||
let ctx = AppContext { config, root }; |
||||
|
||||
// eprintln!("AppCtx: {:?}", ctx);
|
||||
|
||||
match args.subcommand() { |
||||
Some(("pack", subargs)) => { |
||||
let manual_channel = subargs.get_one::<String>("CHANNEL"); |
||||
cl_pack(ctx, manual_channel.map(String::as_str)); |
||||
} |
||||
None | Some(("add", _)) => cl_log(ctx), |
||||
Some((other, _)) => { |
||||
unimplemented!("Subcommand {other} is not implemented yet"); |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue