diff --git a/.drone.yml b/.drone.yml
new file mode 100755
index 0000000..11c8957
--- /dev/null
+++ b/.drone.yml
@@ -0,0 +1,5 @@
+kind: template
+load: bust_rustbin_default_template.yaml
+name: octopush
+data:
+ binName: octopush
diff --git a/.gitignore b/.gitignore
index dddecf9..33117ee 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
+/target
.cuddle/
+target/
.env
diff --git a/CONFIGURATION_SERVER.md b/CONFIGURATION_SERVER.md
deleted file mode 100644
index 04d5c69..0000000
--- a/CONFIGURATION_SERVER.md
+++ /dev/null
@@ -1 +0,0 @@
-# Configuration server
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..730d0ec
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,1590 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "ansi_term"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "async-trait"
+version = "0.1.58"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e805d94e6b5001b651426cf4cd446b1ab5f319d27bab5c644f61de0a804360c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "base64"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bumpalo"
+version = "3.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba"
+
+[[package]]
+name = "bytes"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db"
+
+[[package]]
+name = "cc"
+version = "1.0.73"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
+dependencies = [
+ "jobserver",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "clap"
+version = "2.34.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
+dependencies = [
+ "ansi_term",
+ "atty",
+ "bitflags",
+ "strsim 0.8.0",
+ "textwrap",
+ "unicode-width",
+ "vec_map",
+]
+
+[[package]]
+name = "clap"
+version = "4.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "335867764ed2de42325fafe6d18b8af74ba97ee0c590fa016f157535b42ab04b"
+dependencies = [
+ "atty",
+ "bitflags",
+ "clap_lex",
+ "strsim 0.10.0",
+ "termcolor",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8"
+dependencies = [
+ "os_str_bytes",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
+
+[[package]]
+name = "dotenv"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
+dependencies = [
+ "clap 2.34.0",
+]
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "eyre"
+version = "0.6.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb"
+dependencies = [
+ "indenter",
+ "once_cell",
+]
+
+[[package]]
+name = "fastrand"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "foreign-types"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+dependencies = [
+ "foreign-types-shared",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed"
+dependencies = [
+ "futures-core",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac"
+
+[[package]]
+name = "futures-sink"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9"
+
+[[package]]
+name = "futures-task"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea"
+
+[[package]]
+name = "futures-util"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "pin-project-lite",
+ "pin-utils",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "git2"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2994bee4a3a6a51eb90c218523be382fd7ea09b16380b9312e9dbe955ff7c7d1"
+dependencies = [
+ "bitflags",
+ "libc",
+ "libgit2-sys",
+ "log",
+ "openssl-probe",
+ "openssl-sys",
+ "url",
+]
+
+[[package]]
+name = "gitea_client"
+version = "0.1.0"
+dependencies = [
+ "async-trait",
+ "gitea_raw_client",
+ "reqwest",
+]
+
+[[package]]
+name = "gitea_raw_client"
+version = "1.17.3"
+dependencies = [
+ "reqwest",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "url",
+ "uuid",
+]
+
+[[package]]
+name = "h2"
+version = "0.3.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "http"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+
+[[package]]
+name = "httpdate"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
+
+[[package]]
+name = "hyper"
+version = "0.14.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
+[[package]]
+name = "hyper-tls"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
+dependencies = [
+ "bytes",
+ "hyper",
+ "native-tls",
+ "tokio",
+ "tokio-native-tls",
+]
+
+[[package]]
+name = "idna"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "indenter"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683"
+
+[[package]]
+name = "indexmap"
+version = "1.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
+dependencies = [
+ "autocfg",
+ "hashbrown",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "ipnet"
+version = "2.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f88c5561171189e69df9d98bcf18fd5f9558300f7ea7b801eb8a0fd748bd8745"
+
+[[package]]
+name = "itoa"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc"
+
+[[package]]
+name = "jobserver"
+version = "0.1.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "js-sys"
+version = "0.3.60"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.136"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55edcf6c0bb319052dea84732cf99db461780fd5e8d3eb46ab6ff312ab31f197"
+
+[[package]]
+name = "libgit2-sys"
+version = "0.14.0+1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47a00859c70c8a4f7218e6d1cc32875c4b55f6799445b842b0d8ed5e4c3d959b"
+dependencies = [
+ "cc",
+ "libc",
+ "libssh2-sys",
+ "libz-sys",
+ "openssl-sys",
+ "pkg-config",
+]
+
+[[package]]
+name = "libssh2-sys"
+version = "0.2.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b094a36eb4b8b8c8a7b4b8ae43b2944502be3e59cd87687595cf6b0a71b3f4ca"
+dependencies = [
+ "cc",
+ "libc",
+ "libz-sys",
+ "openssl-sys",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "libz-sys"
+version = "1.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "lock_api"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "matchers"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
+dependencies = [
+ "regex-automata",
+]
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "mime"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
+
+[[package]]
+name = "mime_guess"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef"
+dependencies = [
+ "mime",
+ "unicase",
+]
+
+[[package]]
+name = "mio"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de"
+dependencies = [
+ "libc",
+ "log",
+ "wasi",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "native-tls"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "log",
+ "openssl",
+ "openssl-probe",
+ "openssl-sys",
+ "schannel",
+ "security-framework",
+ "security-framework-sys",
+ "tempfile",
+]
+
+[[package]]
+name = "nu-ansi-term"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+dependencies = [
+ "overload",
+ "winapi",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "octopush"
+version = "0.1.0"
+dependencies = [
+ "dotenv",
+ "eyre",
+ "octopush_cli",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "octopush_cli"
+version = "0.1.0"
+dependencies = [
+ "clap 4.0.18",
+ "eyre",
+ "octopush_core",
+ "octopush_infra",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "octopush_core"
+version = "0.1.0"
+dependencies = [
+ "async-trait",
+ "eyre",
+ "git2",
+ "gitea_client",
+ "hex",
+ "rand",
+ "serde",
+ "serde_yaml",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "octopush_infra"
+version = "0.1.0"
+dependencies = [
+ "eyre",
+ "octopush_core",
+ "tracing",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1"
+
+[[package]]
+name = "openssl"
+version = "0.10.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "020433887e44c27ff16365eaa2d380547a94544ad509aff6eb5b6e3e0b27b376"
+dependencies = [
+ "bitflags",
+ "cfg-if",
+ "foreign-types",
+ "libc",
+ "once_cell",
+ "openssl-macros",
+ "openssl-sys",
+]
+
+[[package]]
+name = "openssl-macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.78"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07d5c8cb6e57b3a3612064d7b18b117912b4ce70955c2504d4b741c9e244b132"
+dependencies = [
+ "autocfg",
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "os_str_bytes"
+version = "6.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff"
+
+[[package]]
+name = "overload"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae"
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.47"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+]
+
+[[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",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "regex"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a"
+dependencies = [
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+dependencies = [
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
+
+[[package]]
+name = "remove_dir_all"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "reqwest"
+version = "0.11.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68cc60575865c7831548863cc02356512e3f1dc2f3f82cb837d7fc4cc8f3c97c"
+dependencies = [
+ "base64",
+ "bytes",
+ "encoding_rs",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-tls",
+ "ipnet",
+ "js-sys",
+ "log",
+ "mime",
+ "mime_guess",
+ "native-tls",
+ "once_cell",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "tokio",
+ "tokio-native-tls",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "winreg",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
+
+[[package]]
+name = "schannel"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2"
+dependencies = [
+ "lazy_static",
+ "windows-sys 0.36.1",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "security-framework"
+version = "2.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c"
+dependencies = [
+ "bitflags",
+ "core-foundation",
+ "core-foundation-sys",
+ "libc",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "serde"
+version = "1.0.147"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.147"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.88"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e8b3801309262e8184d9687fb697586833e939767aea0dda89f5a8e650e8bd7"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_yaml"
+version = "0.9.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d232d893b10de3eb7258ff01974d6ee20663d8e833263c99409d4b13a0209da"
+dependencies = [
+ "indexmap",
+ "itoa",
+ "ryu",
+ "serde",
+ "unsafe-libyaml",
+]
+
+[[package]]
+name = "sharded-slab"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
+
+[[package]]
+name = "socket2"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "strsim"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
+
+[[package]]
+name = "strsim"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+[[package]]
+name = "syn"
+version = "1.0.103"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "tempfile"
+version = "3.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4"
+dependencies = [
+ "cfg-if",
+ "fastrand",
+ "libc",
+ "redox_syscall",
+ "remove_dir_all",
+ "winapi",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
+
+[[package]]
+name = "tokio"
+version = "1.21.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9e03c497dc955702ba729190dc4aac6f2a0ce97f913e5b1b5912fc5039d9099"
+dependencies = [
+ "autocfg",
+ "bytes",
+ "libc",
+ "memchr",
+ "mio",
+ "num_cpus",
+ "parking_lot",
+ "pin-project-lite",
+ "signal-hook-registry",
+ "socket2",
+ "tokio-macros",
+ "winapi",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tokio-native-tls"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b"
+dependencies = [
+ "native-tls",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "tower-service"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+
+[[package]]
+name = "tracing"
+version = "0.1.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
+dependencies = [
+ "cfg-if",
+ "log",
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
+dependencies = [
+ "once_cell",
+ "valuable",
+]
+
+[[package]]
+name = "tracing-log"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
+dependencies = [
+ "lazy_static",
+ "log",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-serde"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1"
+dependencies = [
+ "serde",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
+dependencies = [
+ "matchers",
+ "nu-ansi-term",
+ "once_cell",
+ "regex",
+ "serde",
+ "serde_json",
+ "sharded-slab",
+ "smallvec",
+ "thread_local",
+ "tracing",
+ "tracing-core",
+ "tracing-log",
+ "tracing-serde",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642"
+
+[[package]]
+name = "unicase"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
+dependencies = [
+ "version_check",
+]
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-width"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
+
+[[package]]
+name = "unsafe-libyaml"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1e5fa573d8ac5f1a856f8d7be41d390ee973daf97c806b2c1a465e4e1406e68"
+
+[[package]]
+name = "url"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+]
+
+[[package]]
+name = "uuid"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "valuable"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
+name = "vec_map"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "want"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0"
+dependencies = [
+ "log",
+ "try-lock",
+]
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f"
+
+[[package]]
+name = "web-sys"
+version = "0.3.60"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[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-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi",
+]
+
+[[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-sys"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2"
+dependencies = [
+ "windows_aarch64_msvc 0.36.1",
+ "windows_i686_gnu 0.36.1",
+ "windows_i686_msvc 0.36.1",
+ "windows_x86_64_gnu 0.36.1",
+ "windows_x86_64_msvc 0.36.1",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc 0.42.0",
+ "windows_i686_gnu 0.42.0",
+ "windows_i686_msvc 0.42.0",
+ "windows_x86_64_gnu 0.42.0",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc 0.42.0",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"
+
+[[package]]
+name = "winreg"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
+dependencies = [
+ "winapi",
+]
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..e8d46f3
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,31 @@
+[package]
+name = "octopush"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[workspace]
+members = [
+ "crates/octopush_cli",
+ "crates/octopush_infra",
+ "crates/octopush_core",
+ "crates/gitea_raw_client",
+ "crates/gitea_client",
+]
+
+[workspace.dependencies]
+eyre = { version = "0.6.8" }
+async-trait = "0.1.58"
+tokio = { version = "1.21.2", features = ["full", "test-util"] }
+tracing = { version = "0.1.37", features = ["log"] }
+
+[dependencies]
+octopush_cli = { path = "crates/octopush_cli" }
+
+eyre = { workspace = true }
+tokio = { workspace = true }
+tracing = { workspace = true }
+
+tracing-subscriber = { version = "0.3.16", features = ["json", "env-filter"] }
+dotenv = { version = "0.15.0", features = ["clap", "cli"] }
diff --git a/README.md b/README.md
index 10ea947..1c406de 100644
--- a/README.md
+++ b/README.md
@@ -14,19 +14,19 @@ are so many of them. Octopush aims to change that.
## Features
-- Uses an actions repository, where you store all your pending commands or
- queries to be performed across your fleet of repositories. (See \_examples)
-- Actions can both execute changes, open pull-requests or in some cases commit
- directly to your preferred branch
- - Actions natively use either shell, go or docker files to execute changes
- (see \_examples/actions)
-- Actions can also be analytical, so you can query your fleet for whatever you
- would like
-- Works both as a client, or as a server
+- [x] Uses an actions repository, where you store all your pending commands or
+ queries to be performed across your fleet of repositories. (See
+ \_examples)
+- [x] Actions can both execute changes, open pull-requests or in some cases
+ commit directly to your preferred branch
+ - [x] Actions natively use either shell, go or docker files to execute changes
+ (see \_examples/actions)
+- [ ] Actions can also be analytical, so you can query your fleet for whatever
+ you would like
- Supports SSH/https for fetching repos
-- Supports GPG signing
-- Supports dry-run mode for easy testing when developing your actions (enabled
- by default on the cli)
+- [ ] Supports GPG signing
+- [ ] Supports dry-run mode for easy testing when developing your actions
+ (enabled by default on the cli)
## Roadmap
@@ -34,10 +34,8 @@ Refer to [roadmap.md](roadmap.md)
## Installation
-Octopush comes in two modes. Client or Client -> Server. Octopush can stand alone as
-a client, for smaller and less secure changes. However, for organisations, it
-may be useful to use Octopush in server mode, which supports more features, and
-has extra security built in.
+Octopush runs on your client and acts on your behalf, unless of course it is
+setup on a remote server
### Client (CLI)
@@ -55,8 +53,8 @@ docker run --rm kasperhermansen/octopushcli:latest version
git clone https://github.com/kjuulh/octopush.git
cd octopush
-go build cmd/octopush/octopush.go
-./octopush version
+cargo build --release --target=x64_86-unknown-linux_musl
+./target/x64_86-unknown-linux_musl/octopush version
```
#### Or Build with cuddle
@@ -68,49 +66,12 @@ cd octopush
cuddle_cli x build_cli
```
-### Server
-
-We prefer to run the server directly as a docker image.
-
-```bash
-docker pull kasperhermansen/octopushserver:latest
-docker run -p 9090:80 --rm kasperhermansen/octopushserver:latest
-```
-
-#### Or Build from source
-
-```bash
-git clone https://github.com/kjuulh/octopush.git
-cd octopush
-
-go build cmd/server/server.go
-./server version
-```
-
-#### Or Build with cuddle
-
-```bash
-git clone https://github.com/kjuulh/octopush.git
-cd octopush
-
-cuddle_cli x build_server
-```
-
## Usage
**DISCLAIMER:** It is still early days, and the api of the CLI is subject to
change, this provides the aim of the project, but as it is currently in flux,
there may not be as much handholding in the actual usage.
-I will focus on the client here, as the server provides the same features,
-though available through the cli, but instead as configuration options (see
-[CONFIGURATION_SERVER.md](CONFIGURATION_SERVER.md))
-
-Octopush ships with autocomplete built in (courtesy of spf13/cobra). To add:
-
-- Bash: `echo 'source <(octopush completion bash)' >> ~/.bashrc`
-- Zsh: `echo 'source <(octopush completion zsh)' >> ~/.zshrc`
-
### Creating a new action
Creating a new action
@@ -118,14 +79,15 @@ Creating a new action
```bash
git init my-actions # should only be done once
cd my-actions
-octopush tmpl init write-a-readme --command
+octopush tmpl init write-a-readme --action
cat write-a-readme/octopush.yml
# Output
-# apiVersion: git.front.kjuulh.io/kjuulh/octopush/blob/main/schema/v1
+# apiVersion: action
# name: write-a-readme
# select:
-# repositories: []
+# git:
+# repositories: []
# actions:
# - type: shell
# entry: "main.sh"
@@ -143,9 +105,9 @@ cat << EOF > write-a-readme/octopush.yml
apiVersion: git.front.kjuulh.io/kjuulh/octopush/blob/main/schema/v1
name: write-a-readme
select:
- providers: # new
- - gitea: https://git.front.kjuulh.io # new
- organisation: "kjuulh" # new
+ gitea: # new
+ repositories: # new
+ "kjuulh/octopush" # new
actions:
- type: shell
entry: "main.sh"
@@ -182,8 +144,8 @@ To run the script use
octopush process --path "write-a-readme"
```
-This will cause the octopush process to automatically apply the action on the repo
-and open a pr.
+This will cause the octopush process to automatically apply the action on the
+repo and open a pr.
### Query repositories
@@ -212,8 +174,8 @@ to help test locally, as well as not cause serious issues. The server
configuration is pretty much the same, except the command would look like so:
`octopush server process --path "write-a-readme" --apply`. Octopush will try to
infer as much as possible, but it may be needed to apply some extra flags to
-specify upstream repositories and such. Octopush will also help you setup keys and
-such on the first run, using `octopush setup` or `octopush server setup`.
+specify upstream repositories and such. Octopush will also help you setup keys
+and such on the first run, using `octopush setup` or `octopush server setup`.
## Contributing
@@ -234,16 +196,5 @@ outside core maintainers.
Simply:
```bash
-go run cmd/octopush/octopush.go # CLI
-go run cmd/server/server.go # Server
-```
-
-We follow the `gofmt` formatting, along with optionally but recommend `golines`
-
-If using cuddle
-
-```
-cuddle_cli x run # Run both server and client, will do a quick test sweep on the cli
-cuddle_cli x watch_run # Automatically refresh both
-cuddle_cli x fmt # will format the current code
+cargo build
```
diff --git a/_examples/actions/add_releaserc/go.mod b/_examples/actions/add_releaserc/go.mod
index 248ba10..35fbaf3 100644
--- a/_examples/actions/add_releaserc/go.mod
+++ b/_examples/actions/add_releaserc/go.mod
@@ -2,7 +2,7 @@ module write_a_readme
go 1.19
-require github.com/bitfield/script v0.20.2
+require github.com/bitfield/script v0.21.3
require (
bitbucket.org/creachadair/shell v0.0.7 // indirect
diff --git a/_examples/actions/add_releaserc/go.sum b/_examples/actions/add_releaserc/go.sum
index 234eb1e..0ea3a03 100644
--- a/_examples/actions/add_releaserc/go.sum
+++ b/_examples/actions/add_releaserc/go.sum
@@ -2,6 +2,14 @@ bitbucket.org/creachadair/shell v0.0.7 h1:Z96pB6DkSb7F3Y3BBnJeOZH2gazyMTWlvecSD4
bitbucket.org/creachadair/shell v0.0.7/go.mod h1:oqtXSSvSYr4624lnnabXHaBsYW6RD80caLi2b3hJk0U=
github.com/bitfield/script v0.20.2 h1:4DexsRtBILVMEn3EZwHbtJdDqdk43sXI8gM3F04JXgs=
github.com/bitfield/script v0.20.2/go.mod h1:l3AZPVAtKQrL03bwh7nlNTUtgrgSWurpJSbtqspYrOA=
+github.com/bitfield/script v0.21.0 h1:/OMglZmed2JyzLkmxYvZQMWs18XjPZxDB/0ht0pxrBk=
+github.com/bitfield/script v0.21.0/go.mod h1:l3AZPVAtKQrL03bwh7nlNTUtgrgSWurpJSbtqspYrOA=
+github.com/bitfield/script v0.21.1 h1:k3vYchaqnEPrQ/AS8VFJADM2/B6RbGT75Q3Eago9AHU=
+github.com/bitfield/script v0.21.1/go.mod h1:l3AZPVAtKQrL03bwh7nlNTUtgrgSWurpJSbtqspYrOA=
+github.com/bitfield/script v0.21.2 h1:YoubIUrBWeKKvp3+Ig7laCIyL4++JRs9k2EA3P5f34M=
+github.com/bitfield/script v0.21.2/go.mod h1:l3AZPVAtKQrL03bwh7nlNTUtgrgSWurpJSbtqspYrOA=
+github.com/bitfield/script v0.21.3 h1:M67zRsHvm2XEmUXaKRfr2+VrX9rSFmKt2Nfu+PIueCw=
+github.com/bitfield/script v0.21.3/go.mod h1:l3AZPVAtKQrL03bwh7nlNTUtgrgSWurpJSbtqspYrOA=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
diff --git a/_examples/actions/add_releaserc/octopush.yml b/_examples/actions/add_releaserc/octopush.yml
index d90c930..34d455a 100644
--- a/_examples/actions/add_releaserc/octopush.yml
+++ b/_examples/actions/add_releaserc/octopush.yml
@@ -1,4 +1,4 @@
-apiVersion: git.front.kjuulh.io/kjuulh/octopush/blob/main/schema/v1
+apiVersion: action
name: write-a-readme
select:
repositories:
diff --git a/_examples/actions/docker_action/go.mod b/_examples/actions/docker_action/go.mod
index 248ba10..35fbaf3 100644
--- a/_examples/actions/docker_action/go.mod
+++ b/_examples/actions/docker_action/go.mod
@@ -2,7 +2,7 @@ module write_a_readme
go 1.19
-require github.com/bitfield/script v0.20.2
+require github.com/bitfield/script v0.21.3
require (
bitbucket.org/creachadair/shell v0.0.7 // indirect
diff --git a/_examples/actions/docker_action/go.sum b/_examples/actions/docker_action/go.sum
index 234eb1e..3921743 100644
--- a/_examples/actions/docker_action/go.sum
+++ b/_examples/actions/docker_action/go.sum
@@ -2,6 +2,10 @@ bitbucket.org/creachadair/shell v0.0.7 h1:Z96pB6DkSb7F3Y3BBnJeOZH2gazyMTWlvecSD4
bitbucket.org/creachadair/shell v0.0.7/go.mod h1:oqtXSSvSYr4624lnnabXHaBsYW6RD80caLi2b3hJk0U=
github.com/bitfield/script v0.20.2 h1:4DexsRtBILVMEn3EZwHbtJdDqdk43sXI8gM3F04JXgs=
github.com/bitfield/script v0.20.2/go.mod h1:l3AZPVAtKQrL03bwh7nlNTUtgrgSWurpJSbtqspYrOA=
+github.com/bitfield/script v0.21.0/go.mod h1:l3AZPVAtKQrL03bwh7nlNTUtgrgSWurpJSbtqspYrOA=
+github.com/bitfield/script v0.21.1/go.mod h1:l3AZPVAtKQrL03bwh7nlNTUtgrgSWurpJSbtqspYrOA=
+github.com/bitfield/script v0.21.2/go.mod h1:l3AZPVAtKQrL03bwh7nlNTUtgrgSWurpJSbtqspYrOA=
+github.com/bitfield/script v0.21.3/go.mod h1:l3AZPVAtKQrL03bwh7nlNTUtgrgSWurpJSbtqspYrOA=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
diff --git a/_examples/actions/write_a_readme/dist/bin b/_examples/actions/write_a_readme/dist/bin
new file mode 100755
index 0000000..a562e14
Binary files /dev/null and b/_examples/actions/write_a_readme/dist/bin differ
diff --git a/_examples/actions/write_a_readme/go.mod b/_examples/actions/write_a_readme/go.mod
index 248ba10..35fbaf3 100644
--- a/_examples/actions/write_a_readme/go.mod
+++ b/_examples/actions/write_a_readme/go.mod
@@ -2,7 +2,7 @@ module write_a_readme
go 1.19
-require github.com/bitfield/script v0.20.2
+require github.com/bitfield/script v0.21.3
require (
bitbucket.org/creachadair/shell v0.0.7 // indirect
diff --git a/_examples/actions/write_a_readme/go.sum b/_examples/actions/write_a_readme/go.sum
index 234eb1e..0ea3a03 100644
--- a/_examples/actions/write_a_readme/go.sum
+++ b/_examples/actions/write_a_readme/go.sum
@@ -2,6 +2,14 @@ bitbucket.org/creachadair/shell v0.0.7 h1:Z96pB6DkSb7F3Y3BBnJeOZH2gazyMTWlvecSD4
bitbucket.org/creachadair/shell v0.0.7/go.mod h1:oqtXSSvSYr4624lnnabXHaBsYW6RD80caLi2b3hJk0U=
github.com/bitfield/script v0.20.2 h1:4DexsRtBILVMEn3EZwHbtJdDqdk43sXI8gM3F04JXgs=
github.com/bitfield/script v0.20.2/go.mod h1:l3AZPVAtKQrL03bwh7nlNTUtgrgSWurpJSbtqspYrOA=
+github.com/bitfield/script v0.21.0 h1:/OMglZmed2JyzLkmxYvZQMWs18XjPZxDB/0ht0pxrBk=
+github.com/bitfield/script v0.21.0/go.mod h1:l3AZPVAtKQrL03bwh7nlNTUtgrgSWurpJSbtqspYrOA=
+github.com/bitfield/script v0.21.1 h1:k3vYchaqnEPrQ/AS8VFJADM2/B6RbGT75Q3Eago9AHU=
+github.com/bitfield/script v0.21.1/go.mod h1:l3AZPVAtKQrL03bwh7nlNTUtgrgSWurpJSbtqspYrOA=
+github.com/bitfield/script v0.21.2 h1:YoubIUrBWeKKvp3+Ig7laCIyL4++JRs9k2EA3P5f34M=
+github.com/bitfield/script v0.21.2/go.mod h1:l3AZPVAtKQrL03bwh7nlNTUtgrgSWurpJSbtqspYrOA=
+github.com/bitfield/script v0.21.3 h1:M67zRsHvm2XEmUXaKRfr2+VrX9rSFmKt2Nfu+PIueCw=
+github.com/bitfield/script v0.21.3/go.mod h1:l3AZPVAtKQrL03bwh7nlNTUtgrgSWurpJSbtqspYrOA=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
diff --git a/_examples/actions/write_a_readme/main b/_examples/actions/write_a_readme/main
new file mode 100755
index 0000000..9ac7386
Binary files /dev/null and b/_examples/actions/write_a_readme/main differ
diff --git a/_examples/actions/write_a_readme/main.go b/_examples/actions/write_a_readme/main.go
index 5c24133..8326ca8 100644
--- a/_examples/actions/write_a_readme/main.go
+++ b/_examples/actions/write_a_readme/main.go
@@ -1,12 +1,38 @@
package main
-import "github.com/bitfield/script"
+import (
+ "os"
+
+ "github.com/bitfield/script"
+)
func main() {
_, err := script.
Echo("# Readme").
WriteFile("README.md")
+
if err != nil {
panic(err)
}
+ println("ran stuff")
+ entries, err := os.ReadDir(".")
+ if err != nil {
+ panic(err)
+ }
+ for _, entry := range entries {
+ if !entry.IsDir() {
+ file, err := os.ReadFile(entry.Name())
+ if err != nil {
+ panic(err)
+ }
+ println(string(file))
+ }
+ }
+
+ wd, err := os.Getwd()
+ if err != nil {
+ panic(err)
+ }
+
+ println(wd)
}
diff --git a/_examples/actions/write_a_readme/octopush.yml b/_examples/actions/write_a_readme/octopush.yml
index a4bf81e..9d7a62e 100644
--- a/_examples/actions/write_a_readme/octopush.yml
+++ b/_examples/actions/write_a_readme/octopush.yml
@@ -1,11 +1,26 @@
-apiVersion: git.front.kjuulh.io/kjuulh/octopush/blob/main/schema/v1
+apiVersion: action
name: write-a-readme
select:
- repositories:
- - git@git.front.kjuulh.io:kjuulh/octopush-test.git
- # providers:
- # - gitea: https://git.front.kjuulh.io
- # organisation: "cibus"
-actions:
- - type: go
- entry: "main.go"
+ # github:
+ # repositories:
+ # - kjuulh/octopush-test
+ # push:
+ # pull-request:
+ # name: "write a readme"
+
+ # gitea:
+ # repositories:
+ # - kjuulh/octopush-test
+ # push:
+ # pull-request:
+ # name: "write a readme"
+
+ git:
+ repositories:
+ - git@git.front.kjuulh.io:kjuulh/octopush-test.git
+ push:
+ branch:
+ name: "write a readme"
+action:
+ type: go
+ entry: "main.go"
diff --git a/assets/octopush.png b/assets/octopush.png
deleted file mode 100644
index 9d1c499..0000000
Binary files a/assets/octopush.png and /dev/null differ
diff --git a/assets/octopush.svg b/assets/octopush.svg
deleted file mode 100644
index 8812c64..0000000
--- a/assets/octopush.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/cmd/octopush/commands/process.go b/cmd/octopush/commands/process.go
deleted file mode 100644
index dcfa8ba..0000000
--- a/cmd/octopush/commands/process.go
+++ /dev/null
@@ -1,61 +0,0 @@
-package commands
-
-import (
- "context"
- "time"
-
- "git.front.kjuulh.io/kjuulh/octopush/internal/cli"
- "git.front.kjuulh.io/kjuulh/octopush/internal/commands"
- "github.com/spf13/cobra"
- "go.uber.org/zap"
-)
-
-func CreateOctopushProcessCmd(logger *zap.Logger) *cobra.Command {
-
- var (
- actionsRepo string
- branch string
- path string
- )
- cmd := &cobra.Command{
- Use: "process",
- RunE: func(cmd *cobra.Command, args []string) error {
- if err := cmd.ParseFlags(args); err != nil {
- return err
- }
-
- ctx := cmd.Context()
-
- deps, cleanupFunc, err := cli.Start(ctx, logger)
- if err != nil {
- return err
- }
-
- defer func() {
- ctx, _ = context.WithTimeout(ctx, time.Second*5)
- if err := cleanupFunc(ctx); err != nil {
- panic(err)
- }
- }()
-
- err = commands.
- NewProcessRepos(logger, deps).
- Process(ctx, actionsRepo, branch, path)
- if err != nil {
- return err
- }
-
- return nil
- },
- }
-
- pf := cmd.PersistentFlags()
-
- pf.StringVar(&actionsRepo, "actions-repo", "", "actions repo is the location of your actions, not where to apply the actions themselves, that should be self contained")
- cmd.MarkPersistentFlagRequired("actions-repo")
- pf.StringVar(&branch, "branch", "main", "which branch to look for actions in, will default to main")
- pf.StringVar(&path, "path", "", "the location of the path inside the repository")
- cmd.MarkPersistentFlagRequired("path")
-
- return cmd
-}
diff --git a/cmd/octopush/commands/root.go b/cmd/octopush/commands/root.go
deleted file mode 100644
index 3a6654f..0000000
--- a/cmd/octopush/commands/root.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package commands
-
-import (
- "git.front.kjuulh.io/kjuulh/octopush/cmd/octopush/commands/server"
- "github.com/spf13/cobra"
- "go.uber.org/zap"
-)
-
-func CreateOctopushCmd(logger *zap.Logger) *cobra.Command {
- cmd := &cobra.Command{
- Use: "octopush",
- }
-
- cmd.AddCommand(CreateOctopushProcessCmd(logger))
- cmd.AddCommand(server.CreateOctopushServerCmd(logger))
-
- return cmd
-}
diff --git a/cmd/octopush/commands/server/process.go b/cmd/octopush/commands/server/process.go
deleted file mode 100644
index 04f2041..0000000
--- a/cmd/octopush/commands/server/process.go
+++ /dev/null
@@ -1,73 +0,0 @@
-package server
-
-import (
- "bytes"
- "encoding/json"
- "net/http"
-
- "github.com/spf13/cobra"
-)
-
-func CreateOctopushProcessCmd() *cobra.Command {
-
- var (
- actionsRepo string
- branch string
- path string
- )
- cmd := &cobra.Command{
- Use: "process",
- RunE: func(cmd *cobra.Command, args []string) error {
- if err := cmd.ParseFlags(args); err != nil {
- return err
- }
-
- client := http.Client{}
-
- var buf bytes.Buffer
- err := json.NewEncoder(&buf).
- Encode(struct {
- Repository string `json:"repository"`
- Branch string `json:"branch"`
- Path string `json:"path"`
- }{
- Repository: actionsRepo,
- Branch: branch,
- Path: path,
- })
- if err != nil {
- panic(err)
- }
-
- req, err := http.NewRequestWithContext(
- cmd.Context(),
- http.MethodPost,
- "http://localhost:3000/commands/processRepos",
- &buf,
- )
- if err != nil {
- panic(err)
- }
-
- resp, err := client.Do(req)
- if err != nil {
- panic(err)
- }
- if resp.StatusCode >= 300 {
- panic(resp.Status)
- }
-
- return nil
- },
- }
-
- pf := cmd.PersistentFlags()
-
- pf.StringVar(&actionsRepo, "actions-repo", "", "actions repo is the location of your actions, not where to apply the actions themselves, that should be self contained")
- cmd.MarkPersistentFlagRequired("actions-repo")
- pf.StringVar(&branch, "branch", "main", "which branch to look for actions in, will default to main")
- pf.StringVar(&path, "path", "", "the location of the path inside the repository")
- cmd.MarkPersistentFlagRequired("path")
-
- return cmd
-}
diff --git a/cmd/octopush/commands/server/server.go b/cmd/octopush/commands/server/server.go
deleted file mode 100644
index 90287a6..0000000
--- a/cmd/octopush/commands/server/server.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package server
-
-import (
- "github.com/spf13/cobra"
- "go.uber.org/zap"
-)
-
-func CreateOctopushServerCmd(logger *zap.Logger) *cobra.Command {
- cmd := &cobra.Command{
- Use: "server",
- }
-
- cmd.AddCommand(CreateOctopushProcessCmd())
-
- return cmd
-}
diff --git a/cmd/octopush/octopush.go b/cmd/octopush/octopush.go
deleted file mode 100644
index f75223c..0000000
--- a/cmd/octopush/octopush.go
+++ /dev/null
@@ -1,28 +0,0 @@
-package main
-
-import (
- "os"
-
- "git.front.kjuulh.io/kjuulh/octopush/cmd/octopush/commands"
- "git.front.kjuulh.io/kjuulh/octopush/internal/logger"
- "go.uber.org/zap"
-)
-
-func main() {
- logger, err := logger.New()
- if err != nil {
- panic(err)
- }
- _ = logger.Sync()
-
- zap.ReplaceGlobals(logger)
-
- Execute(logger)
-}
-
-func Execute(logger *zap.Logger) {
- err := commands.CreateOctopushCmd(logger).Execute()
- if err != nil {
- os.Exit(1)
- }
-}
diff --git a/cmd/server/commands/root.go b/cmd/server/commands/root.go
deleted file mode 100644
index 379f24e..0000000
--- a/cmd/server/commands/root.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package commands
-
-import (
- "github.com/spf13/cobra"
- "go.uber.org/zap"
-)
-
-func CreateServerCmd(logger *zap.Logger) *cobra.Command {
- cmd := &cobra.Command{
- Use: "octopushserver",
- }
-
- cmd.AddCommand(NewStartServerCommand(logger))
-
- return cmd
-}
diff --git a/cmd/server/commands/start.go b/cmd/server/commands/start.go
deleted file mode 100644
index 7849f57..0000000
--- a/cmd/server/commands/start.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package commands
-
-import (
- "git.front.kjuulh.io/kjuulh/octopush/internal/server"
- "github.com/spf13/cobra"
- "go.uber.org/zap"
-)
-
-func NewStartServerCommand(logger *zap.Logger) *cobra.Command {
- cmd := &cobra.Command{
- Use: "start",
- Short: "Start the octopush server",
- RunE: func(cmd *cobra.Command, args []string) error {
- return server.Start(logger)
- },
- }
-
- return cmd
-}
diff --git a/cmd/server/server.go b/cmd/server/server.go
deleted file mode 100644
index f050505..0000000
--- a/cmd/server/server.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package main
-
-import (
- "os"
-
- "git.front.kjuulh.io/kjuulh/octopush/cmd/server/commands"
- "git.front.kjuulh.io/kjuulh/octopush/internal/logger"
- "go.uber.org/zap"
-)
-
-func main() {
- logger, err := logger.New()
- if err != nil {
- panic(err)
- }
- _ = logger.Sync()
-
- zap.ReplaceGlobals(logger)
-
- Execute(logger)
-}
-
-func Execute(logger *zap.Logger) {
- err := commands.CreateServerCmd(logger).Execute()
- if err != nil {
- logger.Error("execution failed", zap.Error(err))
- os.Exit(1)
- }
-}
diff --git a/crates/gitea_client/Cargo.toml b/crates/gitea_client/Cargo.toml
new file mode 100644
index 0000000..2b8c3a2
--- /dev/null
+++ b/crates/gitea_client/Cargo.toml
@@ -0,0 +1,13 @@
+[package]
+name = "gitea_client"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+gitea_raw_client = { path = "../gitea_raw_client" }
+
+async-trait = { workspace = true }
+
+reqwest = "0.11.13"
diff --git a/crates/gitea_client/src/apis/defaults/mod.rs b/crates/gitea_client/src/apis/defaults/mod.rs
new file mode 100644
index 0000000..bb787f4
--- /dev/null
+++ b/crates/gitea_client/src/apis/defaults/mod.rs
@@ -0,0 +1 @@
+pub mod repository;
diff --git a/crates/gitea_client/src/apis/defaults/repository.rs b/crates/gitea_client/src/apis/defaults/repository.rs
new file mode 100644
index 0000000..49b32a1
--- /dev/null
+++ b/crates/gitea_client/src/apis/defaults/repository.rs
@@ -0,0 +1,1115 @@
+use std::sync::Arc;
+
+use async_trait::async_trait;
+use gitea_raw_client::{
+ apis::{configuration::Configuration, repository_api::*, Error},
+ models,
+};
+
+use crate::apis::repository::Repository;
+
+pub struct DefaultRepository {
+ conf: Arc,
+}
+
+impl DefaultRepository {
+ pub fn new(conf: Arc) -> Self {
+ Self { conf }
+ }
+}
+
+#[allow(dead_code, unused_variables)]
+#[async_trait]
+impl Repository for DefaultRepository {
+ async fn accept_transfer(
+ &self,
+ owner: &str,
+ repo: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn create_current_user_repo(
+ &self,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn create_fork(
+ &self,
+ owner: &str,
+ repo: &str,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn generate_repo(
+ &self,
+ template_owner: &str,
+ template_repo: &str,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_annotated_tag(
+ &self,
+ owner: &str,
+ repo: &str,
+ sha: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_blob(
+ &self,
+ owner: &str,
+ repo: &str,
+ sha: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_tree(
+ &self,
+ owner: &str,
+ repo: &str,
+ sha: &str,
+ recursive: Option,
+ page: Option,
+ per_page: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn list_forks(
+ &self,
+ owner: &str,
+ repo: &str,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn reject_transfer(
+ &self,
+ owner: &str,
+ repo: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn add_collaborator(
+ &self,
+ owner: &str,
+ repo: &str,
+ collaborator: &str,
+ body: Option,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn add_team(
+ &self,
+ owner: &str,
+ repo: &str,
+ team: &str,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn add_topic(
+ &self,
+ owner: &str,
+ repo: &str,
+ topic: &str,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn apply_diff_patch(
+ &self,
+ owner: &str,
+ repo: &str,
+ body: models::UpdateFileOptions,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn cancel_scheduled_auto_merge(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn check_collaborator(
+ &self,
+ owner: &str,
+ repo: &str,
+ collaborator: &str,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn check_team(
+ &self,
+ owner: &str,
+ repo: &str,
+ team: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn create_branch(
+ &self,
+ owner: &str,
+ repo: &str,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn create_branch_protection(
+ &self,
+ owner: &str,
+ repo: &str,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn create_file(
+ &self,
+ owner: &str,
+ repo: &str,
+ filepath: &str,
+ body: models::CreateFileOptions,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn create_hook(
+ &self,
+ owner: &str,
+ repo: &str,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn create_key(
+ &self,
+ owner: &str,
+ repo: &str,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn create_pull_request(
+ &self,
+ owner: &str,
+ repo: &str,
+ body: Option,
+ ) -> Result> {
+ gitea_raw_client::apis::repository_api::repo_create_pull_request(
+ &self.conf, owner, repo, body,
+ )
+ .await
+ }
+ async fn create_pull_review(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ body: models::CreatePullReviewOptions,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn create_pull_review_requests(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ body: models::PullReviewRequestOptions,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn create_release(
+ &self,
+ owner: &str,
+ repo: &str,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn create_release_attachment(
+ &self,
+ owner: &str,
+ repo: &str,
+ id: i64,
+ attachment: std::path::PathBuf,
+ name: Option<&str>,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn create_status(
+ &self,
+ owner: &str,
+ repo: &str,
+ sha: &str,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn create_tag(
+ &self,
+ owner: &str,
+ repo: &str,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn create_wiki_page(
+ &self,
+ owner: &str,
+ repo: &str,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn delete(&self, owner: &str, repo: &str) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn delete_branch(
+ &self,
+ owner: &str,
+ repo: &str,
+ branch: &str,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn delete_branch_protection(
+ &self,
+ owner: &str,
+ repo: &str,
+ name: &str,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn delete_collaborator(
+ &self,
+ owner: &str,
+ repo: &str,
+ collaborator: &str,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn delete_file(
+ &self,
+ owner: &str,
+ repo: &str,
+ filepath: &str,
+ body: models::DeleteFileOptions,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn delete_git_hook(
+ &self,
+ owner: &str,
+ repo: &str,
+ id: &str,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn delete_hook(
+ &self,
+ owner: &str,
+ repo: &str,
+ id: i64,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn delete_key(
+ &self,
+ owner: &str,
+ repo: &str,
+ id: i64,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn delete_pull_review(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ id: i64,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn delete_pull_review_requests(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ body: models::PullReviewRequestOptions,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn delete_release(
+ &self,
+ owner: &str,
+ repo: &str,
+ id: i64,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn delete_release_attachment(
+ &self,
+ owner: &str,
+ repo: &str,
+ id: i64,
+ attachment_id: i64,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn delete_release_by_tag(
+ &self,
+ owner: &str,
+ repo: &str,
+ tag: &str,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn delete_tag(
+ &self,
+ owner: &str,
+ repo: &str,
+ tag: &str,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn delete_team(
+ &self,
+ owner: &str,
+ repo: &str,
+ team: &str,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn delete_topic(
+ &self,
+ owner: &str,
+ repo: &str,
+ topic: &str,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn delete_wiki_page(
+ &self,
+ owner: &str,
+ repo: &str,
+ page_name: &str,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn dismiss_pull_review(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ id: i64,
+ body: models::DismissPullReviewOptions,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn download_commit_diff_or_patch(
+ &self,
+ owner: &str,
+ repo: &str,
+ sha: &str,
+ diff_type: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn download_pull_diff_or_patch(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ diff_type: &str,
+ binary: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn edit(
+ &self,
+ owner: &str,
+ repo: &str,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn edit_branch_protection(
+ &self,
+ owner: &str,
+ repo: &str,
+ name: &str,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn edit_git_hook(
+ &self,
+ owner: &str,
+ repo: &str,
+ id: &str,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn edit_hook(
+ &self,
+ owner: &str,
+ repo: &str,
+ id: i64,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn edit_pull_request(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn edit_release(
+ &self,
+ owner: &str,
+ repo: &str,
+ id: i64,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn edit_release_attachment(
+ &self,
+ owner: &str,
+ repo: &str,
+ id: i64,
+ attachment_id: i64,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn edit_wiki_page(
+ &self,
+ owner: &str,
+ repo: &str,
+ page_name: &str,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get(
+ &self,
+ owner: &str,
+ repo: &str,
+ ) -> Result> {
+ gitea_raw_client::apis::repository_api::repo_get(&self.conf, owner, repo).await
+ }
+ async fn get_all_commits(
+ &self,
+ owner: &str,
+ repo: &str,
+ sha: Option<&str>,
+ path: Option<&str>,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn get_archive(
+ &self,
+ owner: &str,
+ repo: &str,
+ archive: &str,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn get_assignees(
+ &self,
+ owner: &str,
+ repo: &str,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn get_branch(
+ &self,
+ owner: &str,
+ repo: &str,
+ branch: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_branch_protection(
+ &self,
+ owner: &str,
+ repo: &str,
+ name: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_by_id(&self, id: i64) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_combined_status_by_ref(
+ &self,
+ owner: &str,
+ repo: &str,
+ r#ref: &str,
+ page: Option,
+ limit: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_contents(
+ &self,
+ owner: &str,
+ repo: &str,
+ filepath: &str,
+ r#ref: Option<&str>,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_contents_list(
+ &self,
+ owner: &str,
+ repo: &str,
+ r#ref: Option<&str>,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn get_editor_config(
+ &self,
+ owner: &str,
+ repo: &str,
+ filepath: &str,
+ r#ref: Option<&str>,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn get_git_hook(
+ &self,
+ owner: &str,
+ repo: &str,
+ id: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_hook(
+ &self,
+ owner: &str,
+ repo: &str,
+ id: i64,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_issue_templates(
+ &self,
+ owner: &str,
+ repo: &str,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn get_key(
+ &self,
+ owner: &str,
+ repo: &str,
+ id: i64,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_languages(
+ &self,
+ owner: &str,
+ repo: &str,
+ ) -> Result<::std::collections::HashMap, Error> {
+ todo!("not implemented")
+ }
+ async fn get_note(
+ &self,
+ owner: &str,
+ repo: &str,
+ sha: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_pull_request(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_pull_request_commits(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn get_pull_review(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ id: i64,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_pull_review_comments(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ id: i64,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn get_raw_file(
+ &self,
+ owner: &str,
+ repo: &str,
+ filepath: &str,
+ r#ref: Option<&str>,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn get_raw_file_or_lfs(
+ &self,
+ owner: &str,
+ repo: &str,
+ filepath: &str,
+ r#ref: Option<&str>,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn get_release(
+ &self,
+ owner: &str,
+ repo: &str,
+ id: i64,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_release_attachment(
+ &self,
+ owner: &str,
+ repo: &str,
+ id: i64,
+ attachment_id: i64,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_release_by_tag(
+ &self,
+ owner: &str,
+ repo: &str,
+ tag: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_repo_permissions(
+ &self,
+ owner: &str,
+ repo: &str,
+ collaborator: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_reviewers(
+ &self,
+ owner: &str,
+ repo: &str,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn get_single_commit(
+ &self,
+ owner: &str,
+ repo: &str,
+ sha: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_tag(
+ &self,
+ owner: &str,
+ repo: &str,
+ tag: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_wiki_page(
+ &self,
+ owner: &str,
+ repo: &str,
+ page_name: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_wiki_page_revisions(
+ &self,
+ owner: &str,
+ repo: &str,
+ page_name: &str,
+ page: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn get_wiki_pages(
+ &self,
+ owner: &str,
+ repo: &str,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_all_git_refs(
+ &self,
+ owner: &str,
+ repo: &str,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_branch_protection(
+ &self,
+ owner: &str,
+ repo: &str,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_branches(
+ &self,
+ owner: &str,
+ repo: &str,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_collaborators(
+ &self,
+ owner: &str,
+ repo: &str,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_git_hooks(
+ &self,
+ owner: &str,
+ repo: &str,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_git_refs(
+ &self,
+ owner: &str,
+ repo: &str,
+ r#ref: &str,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_hooks(
+ &self,
+ owner: &str,
+ repo: &str,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_keys(
+ &self,
+ owner: &str,
+ repo: &str,
+ key_id: Option,
+ fingerprint: Option<&str>,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_pull_requests(
+ &self,
+ owner: &str,
+ repo: &str,
+ state: Option<&str>,
+ sort: Option<&str>,
+ milestone: Option,
+ labels: Option>,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_pull_reviews(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_release_attachments(
+ &self,
+ owner: &str,
+ repo: &str,
+ id: i64,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_releases(
+ &self,
+ owner: &str,
+ repo: &str,
+ draft: Option,
+ pre_release: Option,
+ per_page: Option,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_stargazers(
+ &self,
+ owner: &str,
+ repo: &str,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_statuses(
+ &self,
+ owner: &str,
+ repo: &str,
+ sha: &str,
+ sort: Option<&str>,
+ state: Option<&str>,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_statuses_by_ref(
+ &self,
+ owner: &str,
+ repo: &str,
+ r#ref: &str,
+ sort: Option<&str>,
+ state: Option<&str>,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_subscribers(
+ &self,
+ owner: &str,
+ repo: &str,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_tags(
+ &self,
+ owner: &str,
+ repo: &str,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_teams(
+ &self,
+ owner: &str,
+ repo: &str,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn list_topics(
+ &self,
+ owner: &str,
+ repo: &str,
+ page: Option,
+ limit: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn merge_pull_request(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ body: Option,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn migrate(
+ &self,
+ body: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn mirror_sync(&self, owner: &str, repo: &str) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn pull_request_is_merged(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn search(
+ &self,
+ q: Option<&str>,
+ topic: Option,
+ include_desc: Option,
+ uid: Option,
+ priority_owner_id: Option,
+ team_id: Option,
+ starred_by: Option,
+ private: Option,
+ is_private: Option,
+ template: Option,
+ archived: Option,
+ mode: Option<&str>,
+ exclusive: Option,
+ sort: Option<&str>,
+ order: Option<&str>,
+ page: Option,
+ limit: Option,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn signing_key(
+ &self,
+ owner: &str,
+ repo: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn submit_pull_review(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ id: i64,
+ body: models::SubmitPullReviewOptions,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn test_hook(
+ &self,
+ owner: &str,
+ repo: &str,
+ id: i64,
+ r#ref: Option<&str>,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn tracked_times(
+ &self,
+ owner: &str,
+ repo: &str,
+ user: Option<&str>,
+ since: Option,
+ before: Option,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn transfer(
+ &self,
+ owner: &str,
+ repo: &str,
+ body: models::TransferRepoOption,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn un_dismiss_pull_review(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ id: i64,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn update_file(
+ &self,
+ owner: &str,
+ repo: &str,
+ filepath: &str,
+ body: models::UpdateFileOptions,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn update_pull_request(
+ &self,
+ owner: &str,
+ repo: &str,
+ index: i64,
+ style: Option<&str>,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn update_topics(
+ &self,
+ owner: &str,
+ repo: &str,
+ body: Option,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn topic_search(
+ &self,
+ q: &str,
+ page: Option,
+ limit: Option,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+ async fn user_current_check_subscription(
+ &self,
+ owner: &str,
+ repo: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn user_current_delete_subscription(
+ &self,
+ owner: &str,
+ repo: &str,
+ ) -> Result<(), Error> {
+ todo!("not implemented")
+ }
+ async fn user_current_put_subscription(
+ &self,
+ owner: &str,
+ repo: &str,
+ ) -> Result> {
+ todo!("not implemented")
+ }
+ async fn user_tracked_times(
+ &self,
+ owner: &str,
+ repo: &str,
+ user: &str,
+ ) -> Result, Error> {
+ todo!("not implemented")
+ }
+}
diff --git a/crates/gitea_client/src/apis/mod.rs b/crates/gitea_client/src/apis/mod.rs
new file mode 100644
index 0000000..4e31914
--- /dev/null
+++ b/crates/gitea_client/src/apis/mod.rs
@@ -0,0 +1,2 @@
+pub mod defaults;
+pub mod repository;
diff --git a/crates/gitea_client/src/apis/repository.rs b/crates/gitea_client/src/apis/repository.rs
new file mode 100644
index 0000000..34a5c64
--- /dev/null
+++ b/crates/gitea_client/src/apis/repository.rs
@@ -0,0 +1,841 @@
+use std::sync::Arc;
+
+use async_trait::async_trait;
+use gitea_raw_client::{apis::Error, models};
+
+pub use gitea_raw_client::apis::repository_api::*;
+
+#[async_trait]
+pub trait Repository {
+ async fn accept_transfer(
+ &self,
+ owner: &str,
+ repo: &str,
+ ) -> Result>;
+ async fn create_current_user_repo(
+ &self,
+ body: Option,
+ ) -> Result