Compare commits
	
		
			2 Commits 
		
	
	
		
			777d57512e
			...
			f761e3b36d
		
	
	| Author | SHA1 | Date | 
|---|---|---|
| 
							
							
								
									
								
								 | 
						f761e3b36d | |
| 
							
							
								
									
								
								 | 
						4225ce3471 | 
| 
						 | 
				
			
			@ -132,6 +132,154 @@ version = "0.7.4"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "async-attributes"
 | 
			
		||||
version = "1.1.2"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "quote",
 | 
			
		||||
 "syn 1.0.109",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "async-channel"
 | 
			
		||||
version = "1.9.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "concurrent-queue",
 | 
			
		||||
 "event-listener 2.5.3",
 | 
			
		||||
 "futures-core",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "async-channel"
 | 
			
		||||
version = "2.3.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "concurrent-queue",
 | 
			
		||||
 "event-listener-strategy",
 | 
			
		||||
 "futures-core",
 | 
			
		||||
 "pin-project-lite",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "async-executor"
 | 
			
		||||
version = "1.12.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "async-task",
 | 
			
		||||
 "concurrent-queue",
 | 
			
		||||
 "fastrand 2.1.0",
 | 
			
		||||
 "futures-lite 2.3.0",
 | 
			
		||||
 "slab",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "async-global-executor"
 | 
			
		||||
version = "2.4.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "async-channel 2.3.1",
 | 
			
		||||
 "async-executor",
 | 
			
		||||
 "async-io 2.3.3",
 | 
			
		||||
 "async-lock 3.4.0",
 | 
			
		||||
 "blocking",
 | 
			
		||||
 "futures-lite 2.3.0",
 | 
			
		||||
 "once_cell",
 | 
			
		||||
 "tokio",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "async-io"
 | 
			
		||||
version = "1.13.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "async-lock 2.8.0",
 | 
			
		||||
 "autocfg",
 | 
			
		||||
 "cfg-if",
 | 
			
		||||
 "concurrent-queue",
 | 
			
		||||
 "futures-lite 1.13.0",
 | 
			
		||||
 "log",
 | 
			
		||||
 "parking",
 | 
			
		||||
 "polling 2.8.0",
 | 
			
		||||
 "rustix 0.37.27",
 | 
			
		||||
 "slab",
 | 
			
		||||
 "socket2 0.4.10",
 | 
			
		||||
 "waker-fn",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "async-io"
 | 
			
		||||
version = "2.3.3"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "async-lock 3.4.0",
 | 
			
		||||
 "cfg-if",
 | 
			
		||||
 "concurrent-queue",
 | 
			
		||||
 "futures-io",
 | 
			
		||||
 "futures-lite 2.3.0",
 | 
			
		||||
 "parking",
 | 
			
		||||
 "polling 3.7.2",
 | 
			
		||||
 "rustix 0.38.34",
 | 
			
		||||
 "slab",
 | 
			
		||||
 "tracing",
 | 
			
		||||
 "windows-sys 0.52.0",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "async-lock"
 | 
			
		||||
version = "2.8.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "event-listener 2.5.3",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "async-lock"
 | 
			
		||||
version = "3.4.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "event-listener 5.3.1",
 | 
			
		||||
 "event-listener-strategy",
 | 
			
		||||
 "pin-project-lite",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "async-std"
 | 
			
		||||
version = "1.12.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "async-attributes",
 | 
			
		||||
 "async-channel 1.9.0",
 | 
			
		||||
 "async-global-executor",
 | 
			
		||||
 "async-io 1.13.0",
 | 
			
		||||
 "async-lock 2.8.0",
 | 
			
		||||
 "crossbeam-utils",
 | 
			
		||||
 "futures-channel",
 | 
			
		||||
 "futures-core",
 | 
			
		||||
 "futures-io",
 | 
			
		||||
 "futures-lite 1.13.0",
 | 
			
		||||
 "gloo-timers",
 | 
			
		||||
 "kv-log-macro",
 | 
			
		||||
 "log",
 | 
			
		||||
 "memchr",
 | 
			
		||||
 "once_cell",
 | 
			
		||||
 "pin-project-lite",
 | 
			
		||||
 "pin-utils",
 | 
			
		||||
 "slab",
 | 
			
		||||
 "wasm-bindgen-futures",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "async-stream"
 | 
			
		||||
version = "0.3.5"
 | 
			
		||||
| 
						 | 
				
			
			@ -154,6 +302,12 @@ dependencies = [
 | 
			
		|||
 "syn 2.0.66",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "async-task"
 | 
			
		||||
version = "4.7.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "async-trait"
 | 
			
		||||
version = "0.1.80"
 | 
			
		||||
| 
						 | 
				
			
			@ -337,6 +491,19 @@ dependencies = [
 | 
			
		|||
 "generic-array",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "blocking"
 | 
			
		||||
version = "1.6.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "async-channel 2.3.1",
 | 
			
		||||
 "async-task",
 | 
			
		||||
 "futures-io",
 | 
			
		||||
 "futures-lite 2.3.0",
 | 
			
		||||
 "piper",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "borsh"
 | 
			
		||||
version = "1.5.0"
 | 
			
		||||
| 
						 | 
				
			
			@ -486,6 +653,15 @@ version = "1.0.1"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "concurrent-queue"
 | 
			
		||||
version = "2.5.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "crossbeam-utils",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "const-oid"
 | 
			
		||||
version = "0.9.6"
 | 
			
		||||
| 
						 | 
				
			
			@ -606,6 +782,14 @@ dependencies = [
 | 
			
		|||
 "serde",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "entity"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "sea-orm",
 | 
			
		||||
 "serde",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "equivalent"
 | 
			
		||||
version = "1.0.1"
 | 
			
		||||
| 
						 | 
				
			
			@ -639,6 +823,36 @@ version = "2.5.3"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "event-listener"
 | 
			
		||||
version = "5.3.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "concurrent-queue",
 | 
			
		||||
 "parking",
 | 
			
		||||
 "pin-project-lite",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "event-listener-strategy"
 | 
			
		||||
version = "0.5.2"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "event-listener 5.3.1",
 | 
			
		||||
 "pin-project-lite",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "fastrand"
 | 
			
		||||
version = "1.9.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "instant",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "fastrand"
 | 
			
		||||
version = "2.1.0"
 | 
			
		||||
| 
						 | 
				
			
			@ -750,6 +964,34 @@ version = "0.3.30"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "futures-lite"
 | 
			
		||||
version = "1.13.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "fastrand 1.9.0",
 | 
			
		||||
 "futures-core",
 | 
			
		||||
 "futures-io",
 | 
			
		||||
 "memchr",
 | 
			
		||||
 "parking",
 | 
			
		||||
 "pin-project-lite",
 | 
			
		||||
 "waker-fn",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "futures-lite"
 | 
			
		||||
version = "2.3.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "fastrand 2.1.0",
 | 
			
		||||
 "futures-core",
 | 
			
		||||
 "futures-io",
 | 
			
		||||
 "parking",
 | 
			
		||||
 "pin-project-lite",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "futures-macro"
 | 
			
		||||
version = "0.3.30"
 | 
			
		||||
| 
						 | 
				
			
			@ -824,6 +1066,18 @@ version = "0.3.1"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "gloo-timers"
 | 
			
		||||
version = "0.2.6"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "futures-channel",
 | 
			
		||||
 "futures-core",
 | 
			
		||||
 "js-sys",
 | 
			
		||||
 "wasm-bindgen",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "h2"
 | 
			
		||||
version = "0.4.5"
 | 
			
		||||
| 
						 | 
				
			
			@ -892,6 +1146,12 @@ version = "0.3.9"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "hermit-abi"
 | 
			
		||||
version = "0.4.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "hex"
 | 
			
		||||
version = "0.4.3"
 | 
			
		||||
| 
						 | 
				
			
			@ -1072,6 +1332,26 @@ version = "0.1.15"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "instant"
 | 
			
		||||
version = "0.1.13"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cfg-if",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "io-lifetimes"
 | 
			
		||||
version = "1.0.11"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "hermit-abi 0.3.9",
 | 
			
		||||
 "libc",
 | 
			
		||||
 "windows-sys 0.48.0",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "is_terminal_polyfill"
 | 
			
		||||
version = "1.70.0"
 | 
			
		||||
| 
						 | 
				
			
			@ -1102,6 +1382,15 @@ dependencies = [
 | 
			
		|||
 "wasm-bindgen",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "kv-log-macro"
 | 
			
		||||
version = "1.0.7"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "log",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "lazy_static"
 | 
			
		||||
version = "1.4.0"
 | 
			
		||||
| 
						 | 
				
			
			@ -1150,6 +1439,12 @@ dependencies = [
 | 
			
		|||
 "vcpkg",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "linux-raw-sys"
 | 
			
		||||
version = "0.3.8"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "linux-raw-sys"
 | 
			
		||||
version = "0.4.14"
 | 
			
		||||
| 
						 | 
				
			
			@ -1171,6 +1466,9 @@ name = "log"
 | 
			
		|||
version = "0.4.21"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "value-bag",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "matchers"
 | 
			
		||||
| 
						 | 
				
			
			@ -1203,6 +1501,14 @@ version = "2.7.2"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "migration"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "async-std",
 | 
			
		||||
 "sea-orm-migration",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "mime"
 | 
			
		||||
version = "0.3.17"
 | 
			
		||||
| 
						 | 
				
			
			@ -1334,7 +1640,7 @@ version = "1.16.0"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "hermit-abi",
 | 
			
		||||
 "hermit-abi 0.3.9",
 | 
			
		||||
 "libc",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1392,6 +1698,12 @@ version = "0.1.1"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "parking"
 | 
			
		||||
version = "2.2.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "parking_lot"
 | 
			
		||||
version = "0.12.3"
 | 
			
		||||
| 
						 | 
				
			
			@ -1491,6 +1803,17 @@ version = "0.1.0"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "piper"
 | 
			
		||||
version = "0.2.3"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "atomic-waker",
 | 
			
		||||
 "fastrand 2.1.0",
 | 
			
		||||
 "futures-io",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "pkcs1"
 | 
			
		||||
version = "0.7.5"
 | 
			
		||||
| 
						 | 
				
			
			@ -1518,6 +1841,37 @@ version = "0.3.30"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "polling"
 | 
			
		||||
version = "2.8.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "autocfg",
 | 
			
		||||
 "bitflags 1.3.2",
 | 
			
		||||
 "cfg-if",
 | 
			
		||||
 "concurrent-queue",
 | 
			
		||||
 "libc",
 | 
			
		||||
 "log",
 | 
			
		||||
 "pin-project-lite",
 | 
			
		||||
 "windows-sys 0.48.0",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "polling"
 | 
			
		||||
version = "3.7.2"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cfg-if",
 | 
			
		||||
 "concurrent-queue",
 | 
			
		||||
 "hermit-abi 0.4.0",
 | 
			
		||||
 "pin-project-lite",
 | 
			
		||||
 "rustix 0.38.34",
 | 
			
		||||
 "tracing",
 | 
			
		||||
 "windows-sys 0.52.0",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "powerfmt"
 | 
			
		||||
version = "0.2.0"
 | 
			
		||||
| 
						 | 
				
			
			@ -1728,13 +2082,14 @@ dependencies = [
 | 
			
		|||
 "axum",
 | 
			
		||||
 "chrono",
 | 
			
		||||
 "clap",
 | 
			
		||||
 "entity",
 | 
			
		||||
 "figment",
 | 
			
		||||
 "futures",
 | 
			
		||||
 "http-body-util",
 | 
			
		||||
 "libarchive",
 | 
			
		||||
 "migration",
 | 
			
		||||
 "regex",
 | 
			
		||||
 "sea-orm",
 | 
			
		||||
 "sea-orm-migration",
 | 
			
		||||
 "sea-query",
 | 
			
		||||
 "serde",
 | 
			
		||||
 "sha256",
 | 
			
		||||
| 
						 | 
				
			
			@ -1833,6 +2188,20 @@ version = "0.1.24"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "rustix"
 | 
			
		||||
version = "0.37.27"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bitflags 1.3.2",
 | 
			
		||||
 "errno",
 | 
			
		||||
 "io-lifetimes",
 | 
			
		||||
 "libc",
 | 
			
		||||
 "linux-raw-sys 0.3.8",
 | 
			
		||||
 "windows-sys 0.48.0",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "rustix"
 | 
			
		||||
version = "0.38.34"
 | 
			
		||||
| 
						 | 
				
			
			@ -1842,7 +2211,7 @@ dependencies = [
 | 
			
		|||
 "bitflags 2.5.0",
 | 
			
		||||
 "errno",
 | 
			
		||||
 "libc",
 | 
			
		||||
 "linux-raw-sys",
 | 
			
		||||
 "linux-raw-sys 0.4.14",
 | 
			
		||||
 "windows-sys 0.52.0",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2071,18 +2440,18 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b"
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "serde"
 | 
			
		||||
version = "1.0.203"
 | 
			
		||||
version = "1.0.204"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094"
 | 
			
		||||
checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "serde_derive",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "serde_derive"
 | 
			
		||||
version = "1.0.203"
 | 
			
		||||
version = "1.0.204"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
 | 
			
		||||
checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
| 
						 | 
				
			
			@ -2215,6 +2584,16 @@ version = "1.13.2"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "socket2"
 | 
			
		||||
version = "0.4.10"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "libc",
 | 
			
		||||
 "winapi",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "socket2"
 | 
			
		||||
version = "0.5.7"
 | 
			
		||||
| 
						 | 
				
			
			@ -2289,7 +2668,7 @@ dependencies = [
 | 
			
		|||
 "crc",
 | 
			
		||||
 "crossbeam-queue",
 | 
			
		||||
 "either",
 | 
			
		||||
 "event-listener",
 | 
			
		||||
 "event-listener 2.5.3",
 | 
			
		||||
 "futures-channel",
 | 
			
		||||
 "futures-core",
 | 
			
		||||
 "futures-intrusive",
 | 
			
		||||
| 
						 | 
				
			
			@ -2571,8 +2950,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		|||
checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cfg-if",
 | 
			
		||||
 "fastrand",
 | 
			
		||||
 "rustix",
 | 
			
		||||
 "fastrand 2.1.0",
 | 
			
		||||
 "rustix 0.38.34",
 | 
			
		||||
 "windows-sys 0.52.0",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2666,7 +3045,7 @@ dependencies = [
 | 
			
		|||
 "parking_lot",
 | 
			
		||||
 "pin-project-lite",
 | 
			
		||||
 "signal-hook-registry",
 | 
			
		||||
 "socket2",
 | 
			
		||||
 "socket2 0.5.7",
 | 
			
		||||
 "tokio-macros",
 | 
			
		||||
 "windows-sys 0.48.0",
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			@ -2975,6 +3354,12 @@ version = "0.1.0"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "value-bag"
 | 
			
		||||
version = "1.9.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "5a84c137d37ab0142f0f2ddfe332651fdbf252e7b7dbb4e67b6c1f1b2e925101"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "vcpkg"
 | 
			
		||||
version = "0.2.15"
 | 
			
		||||
| 
						 | 
				
			
			@ -2987,6 +3372,12 @@ version = "0.9.4"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "waker-fn"
 | 
			
		||||
version = "1.2.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "wasi"
 | 
			
		||||
version = "0.11.0+wasi-snapshot-preview1"
 | 
			
		||||
| 
						 | 
				
			
			@ -3024,6 +3415,18 @@ dependencies = [
 | 
			
		|||
 "wasm-bindgen-shared",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "wasm-bindgen-futures"
 | 
			
		||||
version = "0.4.42"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cfg-if",
 | 
			
		||||
 "js-sys",
 | 
			
		||||
 "wasm-bindgen",
 | 
			
		||||
 "web-sys",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "wasm-bindgen-macro"
 | 
			
		||||
version = "0.2.92"
 | 
			
		||||
| 
						 | 
				
			
			@ -3053,6 +3456,16 @@ version = "0.2.92"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "web-sys"
 | 
			
		||||
version = "0.3.69"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "js-sys",
 | 
			
		||||
 "wasm-bindgen",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "webpki-roots"
 | 
			
		||||
version = "0.25.4"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,10 @@
 | 
			
		|||
[workspace]
 | 
			
		||||
members = [
 | 
			
		||||
    'migration',
 | 
			
		||||
    'server',
 | 
			
		||||
    'libarchive',
 | 
			
		||||
    'libarchive3-sys'
 | 
			
		||||
]
 | 
			
		||||
, "entity"]
 | 
			
		||||
 | 
			
		||||
[profile.release]
 | 
			
		||||
lto = "fat"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
[package]
 | 
			
		||||
name = "entity"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
sea-orm = "0.12.15"
 | 
			
		||||
serde = { version = "1.0.204", features = ["derive"] }
 | 
			
		||||
| 
						 | 
				
			
			@ -8,6 +8,7 @@ use serde::{Deserialize, Serialize};
 | 
			
		|||
pub struct Model {
 | 
			
		||||
    #[sea_orm(primary_key)]
 | 
			
		||||
    pub id: i32,
 | 
			
		||||
    #[sea_orm(unique)]
 | 
			
		||||
    pub name: String,
 | 
			
		||||
    pub description: Option<String>,
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,11 +1,8 @@
 | 
			
		|||
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1
 | 
			
		||||
 | 
			
		||||
use chrono::NaiveDateTime;
 | 
			
		||||
use sea_orm::entity::prelude::*;
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
 | 
			
		||||
use crate::db::PackageState;
 | 
			
		||||
 | 
			
		||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq, Serialize, Deserialize)]
 | 
			
		||||
#[sea_orm(table_name = "package")]
 | 
			
		||||
pub struct Model {
 | 
			
		||||
| 
						 | 
				
			
			@ -20,14 +17,13 @@ pub struct Model {
 | 
			
		|||
    pub c_size: i64,
 | 
			
		||||
    pub description: Option<String>,
 | 
			
		||||
    pub url: Option<String>,
 | 
			
		||||
    pub build_date: NaiveDateTime,
 | 
			
		||||
    pub build_date: DateTime,
 | 
			
		||||
    pub packager: Option<String>,
 | 
			
		||||
    pub pgp_sig: Option<String>,
 | 
			
		||||
    pub pgp_sig_size: Option<i64>,
 | 
			
		||||
    pub sha256_sum: String,
 | 
			
		||||
    pub compression: String,
 | 
			
		||||
    #[serde(skip_serializing)]
 | 
			
		||||
    pub state: PackageState,
 | 
			
		||||
    pub state: crate::PackageState,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
 | 
			
		||||
| 
						 | 
				
			
			@ -3,15 +3,13 @@
 | 
			
		|||
use sea_orm::entity::prelude::*;
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
 | 
			
		||||
use crate::db::PackageRelatedEnum;
 | 
			
		||||
 | 
			
		||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq, Serialize, Deserialize)]
 | 
			
		||||
#[sea_orm(table_name = "package_related")]
 | 
			
		||||
pub struct Model {
 | 
			
		||||
    #[sea_orm(primary_key, auto_increment = false)]
 | 
			
		||||
    pub package_id: i32,
 | 
			
		||||
    #[sea_orm(primary_key, auto_increment = false)]
 | 
			
		||||
    pub r#type: PackageRelatedEnum,
 | 
			
		||||
    pub r#type: crate::PackageRelatedEnum,
 | 
			
		||||
    #[sea_orm(primary_key, auto_increment = false)]
 | 
			
		||||
    pub name: String,
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -9,6 +9,7 @@ pub struct Model {
 | 
			
		|||
    #[sea_orm(primary_key)]
 | 
			
		||||
    pub id: i32,
 | 
			
		||||
    pub distro_id: i32,
 | 
			
		||||
    #[sea_orm(unique)]
 | 
			
		||||
    pub name: String,
 | 
			
		||||
    pub description: Option<String>,
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,37 @@
 | 
			
		|||
pub mod entity;
 | 
			
		||||
pub use entity::prelude::*;
 | 
			
		||||
pub use entity::*;
 | 
			
		||||
 | 
			
		||||
use sea_orm::{DeriveActiveEnum, EnumIter};
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
 | 
			
		||||
#[derive(EnumIter, DeriveActiveEnum, Serialize, Deserialize, PartialEq, Eq, Clone, Debug)]
 | 
			
		||||
#[sea_orm(rs_type = "i32", db_type = "Integer")]
 | 
			
		||||
#[serde(rename_all = "lowercase")]
 | 
			
		||||
pub enum PackageRelatedEnum {
 | 
			
		||||
    #[sea_orm(num_value = 0)]
 | 
			
		||||
    Conflicts,
 | 
			
		||||
    #[sea_orm(num_value = 1)]
 | 
			
		||||
    Replaces,
 | 
			
		||||
    #[sea_orm(num_value = 2)]
 | 
			
		||||
    Provides,
 | 
			
		||||
    #[sea_orm(num_value = 3)]
 | 
			
		||||
    Depend,
 | 
			
		||||
    #[sea_orm(num_value = 4)]
 | 
			
		||||
    Makedepend,
 | 
			
		||||
    #[sea_orm(num_value = 5)]
 | 
			
		||||
    Checkdepend,
 | 
			
		||||
    #[sea_orm(num_value = 6)]
 | 
			
		||||
    Optdepend,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(EnumIter, DeriveActiveEnum, Deserialize, Serialize, PartialEq, Eq, Clone, Debug)]
 | 
			
		||||
#[sea_orm(rs_type = "i32", db_type = "Integer")]
 | 
			
		||||
pub enum PackageState {
 | 
			
		||||
    #[sea_orm(num_value = 0)]
 | 
			
		||||
    PendingCommit,
 | 
			
		||||
    #[sea_orm(num_value = 1)]
 | 
			
		||||
    Committed,
 | 
			
		||||
    #[sea_orm(num_value = 2)]
 | 
			
		||||
    PendingDeletion,
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
[package]
 | 
			
		||||
name = "migration"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
publish = false
 | 
			
		||||
 | 
			
		||||
[lib]
 | 
			
		||||
name = "migration"
 | 
			
		||||
path = "src/lib.rs"
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
async-std = { version = "1", features = ["attributes", "tokio1"] }
 | 
			
		||||
 | 
			
		||||
[dependencies.sea-orm-migration]
 | 
			
		||||
version = "0.12.0"
 | 
			
		||||
features = [
 | 
			
		||||
    "sqlx-postgres",
 | 
			
		||||
    "sqlx-sqlite",
 | 
			
		||||
    "runtime-tokio-rustls",
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,41 @@
 | 
			
		|||
# Running Migrator CLI
 | 
			
		||||
 | 
			
		||||
- Generate a new migration file
 | 
			
		||||
    ```sh
 | 
			
		||||
    cargo run -- generate MIGRATION_NAME
 | 
			
		||||
    ```
 | 
			
		||||
- Apply all pending migrations
 | 
			
		||||
    ```sh
 | 
			
		||||
    cargo run
 | 
			
		||||
    ```
 | 
			
		||||
    ```sh
 | 
			
		||||
    cargo run -- up
 | 
			
		||||
    ```
 | 
			
		||||
- Apply first 10 pending migrations
 | 
			
		||||
    ```sh
 | 
			
		||||
    cargo run -- up -n 10
 | 
			
		||||
    ```
 | 
			
		||||
- Rollback last applied migrations
 | 
			
		||||
    ```sh
 | 
			
		||||
    cargo run -- down
 | 
			
		||||
    ```
 | 
			
		||||
- Rollback last 10 applied migrations
 | 
			
		||||
    ```sh
 | 
			
		||||
    cargo run -- down -n 10
 | 
			
		||||
    ```
 | 
			
		||||
- Drop all tables from the database, then reapply all migrations
 | 
			
		||||
    ```sh
 | 
			
		||||
    cargo run -- fresh
 | 
			
		||||
    ```
 | 
			
		||||
- Rollback all applied migrations, then reapply all migrations
 | 
			
		||||
    ```sh
 | 
			
		||||
    cargo run -- refresh
 | 
			
		||||
    ```
 | 
			
		||||
- Rollback all applied migrations
 | 
			
		||||
    ```sh
 | 
			
		||||
    cargo run -- reset
 | 
			
		||||
    ```
 | 
			
		||||
- Check the status of all migrations
 | 
			
		||||
    ```sh
 | 
			
		||||
    cargo run -- status
 | 
			
		||||
    ```
 | 
			
		||||
| 
						 | 
				
			
			@ -1,9 +1,9 @@
 | 
			
		|||
use sea_orm_migration::prelude::*;
 | 
			
		||||
 | 
			
		||||
pub struct Migrator;
 | 
			
		||||
pub use sea_orm_migration::prelude::*;
 | 
			
		||||
 | 
			
		||||
mod m20230730_000001_create_repo_tables;
 | 
			
		||||
 | 
			
		||||
pub struct Migrator;
 | 
			
		||||
 | 
			
		||||
#[async_trait::async_trait]
 | 
			
		||||
impl MigratorTrait for Migrator {
 | 
			
		||||
    fn migrations() -> Vec<Box<dyn MigrationTrait>> {
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
use sea_orm_migration::prelude::*;
 | 
			
		||||
 | 
			
		||||
#[async_std::main]
 | 
			
		||||
async fn main() {
 | 
			
		||||
    cli::run_cli(migration::Migrator).await;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -15,7 +15,6 @@ futures = "0.3.28"
 | 
			
		|||
http-body-util = "0.1.1"
 | 
			
		||||
libarchive = { path = "../libarchive" }
 | 
			
		||||
regex = "1.10.5"
 | 
			
		||||
sea-orm-migration = "0.12.1"
 | 
			
		||||
sea-query = { version = "0.30.7", features = ["backend-postgres", "backend-sqlite"] }
 | 
			
		||||
serde = { version = "1.0.178", features = ["derive"] }
 | 
			
		||||
sha256 = "1.1.4"
 | 
			
		||||
| 
						 | 
				
			
			@ -26,6 +25,8 @@ tower-http = { version = "0.5.2", features = ["fs", "trace", "auth"] }
 | 
			
		|||
tracing = "0.1.37"
 | 
			
		||||
tracing-subscriber = { version = "0.3.17", features = ["env-filter"] }
 | 
			
		||||
uuid = { version = "1.4.0", features = ["v4"] }
 | 
			
		||||
migration = { path = "../migration" }
 | 
			
		||||
entity = { path = "../entity" }
 | 
			
		||||
 | 
			
		||||
[dependencies.sea-orm]
 | 
			
		||||
version = "0.12.1"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,55 +1,19 @@
 | 
			
		|||
pub mod entities;
 | 
			
		||||
mod migrator;
 | 
			
		||||
pub mod query;
 | 
			
		||||
 | 
			
		||||
use crate::config::DbConfig;
 | 
			
		||||
 | 
			
		||||
pub use entities::{prelude::*, *};
 | 
			
		||||
pub use migrator::Migrator;
 | 
			
		||||
 | 
			
		||||
use sea_orm::{ConnectionTrait, Database, DbConn, DeriveActiveEnum, EnumIter};
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
use sea_orm::{ConnectionTrait, Database, DbConn};
 | 
			
		||||
use serde::Serialize;
 | 
			
		||||
 | 
			
		||||
type Result<T> = std::result::Result<T, sea_orm::DbErr>;
 | 
			
		||||
 | 
			
		||||
#[derive(EnumIter, DeriveActiveEnum, Serialize, Deserialize, PartialEq, Eq, Clone, Debug)]
 | 
			
		||||
#[sea_orm(rs_type = "i32", db_type = "Integer")]
 | 
			
		||||
#[serde(rename_all = "lowercase")]
 | 
			
		||||
pub enum PackageRelatedEnum {
 | 
			
		||||
    #[sea_orm(num_value = 0)]
 | 
			
		||||
    Conflicts,
 | 
			
		||||
    #[sea_orm(num_value = 1)]
 | 
			
		||||
    Replaces,
 | 
			
		||||
    #[sea_orm(num_value = 2)]
 | 
			
		||||
    Provides,
 | 
			
		||||
    #[sea_orm(num_value = 3)]
 | 
			
		||||
    Depend,
 | 
			
		||||
    #[sea_orm(num_value = 4)]
 | 
			
		||||
    Makedepend,
 | 
			
		||||
    #[sea_orm(num_value = 5)]
 | 
			
		||||
    Checkdepend,
 | 
			
		||||
    #[sea_orm(num_value = 6)]
 | 
			
		||||
    Optdepend,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(EnumIter, DeriveActiveEnum, Deserialize, Serialize, PartialEq, Eq, Clone, Debug)]
 | 
			
		||||
#[sea_orm(rs_type = "i32", db_type = "Integer")]
 | 
			
		||||
pub enum PackageState {
 | 
			
		||||
    #[sea_orm(num_value = 0)]
 | 
			
		||||
    PendingCommit,
 | 
			
		||||
    #[sea_orm(num_value = 1)]
 | 
			
		||||
    Committed,
 | 
			
		||||
    #[sea_orm(num_value = 2)]
 | 
			
		||||
    PendingDeletion,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize)]
 | 
			
		||||
pub struct FullPackage {
 | 
			
		||||
    #[serde(flatten)]
 | 
			
		||||
    entry: package::Model,
 | 
			
		||||
    entry: entity::package::Model,
 | 
			
		||||
    licenses: Vec<String>,
 | 
			
		||||
    groups: Vec<String>,
 | 
			
		||||
    related: Vec<(PackageRelatedEnum, String)>,
 | 
			
		||||
    related: Vec<(entity::PackageRelatedEnum, String)>,
 | 
			
		||||
    files: Vec<String>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,11 @@
 | 
			
		|||
use crate::db::*;
 | 
			
		||||
use crate::db::Result;
 | 
			
		||||
 | 
			
		||||
use sea_orm::{sea_query::IntoCondition, *};
 | 
			
		||||
use entity::{distro, prelude::Distro};
 | 
			
		||||
use sea_orm::{
 | 
			
		||||
    sea_query::IntoCondition, ActiveModelTrait, ColumnTrait, Condition, DbConn, EntityTrait,
 | 
			
		||||
    NotSet, PaginatorTrait, QueryFilter, QueryOrder, Set,
 | 
			
		||||
};
 | 
			
		||||
use serde::Deserialize;
 | 
			
		||||
 | 
			
		||||
#[derive(Deserialize)]
 | 
			
		||||
pub struct Filter {
 | 
			
		||||
| 
						 | 
				
			
			@ -21,7 +26,7 @@ pub async fn page(
 | 
			
		|||
    per_page: u64,
 | 
			
		||||
    page: u64,
 | 
			
		||||
    filter: Filter,
 | 
			
		||||
) -> Result<Vec<distro::Model>> {
 | 
			
		||||
) -> Result<Vec<entity::distro::Model>> {
 | 
			
		||||
    let paginator = Distro::find()
 | 
			
		||||
        .filter(filter)
 | 
			
		||||
        .order_by_asc(distro::Column::Id)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,16 @@
 | 
			
		|||
use crate::db::{self, *};
 | 
			
		||||
use crate::db::{FullPackage, Result};
 | 
			
		||||
 | 
			
		||||
use sea_orm::{sea_query::IntoCondition, *};
 | 
			
		||||
use sea_query::{Alias, Expr, Query, SelectStatement};
 | 
			
		||||
use entity::{
 | 
			
		||||
    package, package_file, package_group, package_license, package_related,
 | 
			
		||||
    prelude::{Package, PackageFile, PackageGroup, PackageLicense, PackageRelated},
 | 
			
		||||
    PackageRelatedEnum, PackageState,
 | 
			
		||||
};
 | 
			
		||||
use sea_orm::{
 | 
			
		||||
    sea_query::IntoCondition, ActiveModelTrait, ColumnTrait, Condition, ConnectionTrait, DbConn,
 | 
			
		||||
    DeleteResult, EntityTrait, FromQueryResult, Iterable, ModelTrait, NotSet, PaginatorTrait,
 | 
			
		||||
    QueryFilter, QuerySelect, SelectModel, SelectorRaw, Set, TransactionTrait,
 | 
			
		||||
};
 | 
			
		||||
use sea_query::{Alias, Expr, JoinType, Order, Query, SelectStatement};
 | 
			
		||||
use serde::Deserialize;
 | 
			
		||||
 | 
			
		||||
/// How many fields may be inserted at once into the database.
 | 
			
		||||
| 
						 | 
				
			
			@ -31,22 +40,22 @@ pub async fn page(
 | 
			
		|||
) -> crate::Result<Vec<package::Model>> {
 | 
			
		||||
    let p2 = Alias::new("p2");
 | 
			
		||||
    let query = Query::select()
 | 
			
		||||
        .columns(db::package::Column::iter().map(|c| (db::package::Entity, c)))
 | 
			
		||||
        .from(db::package::Entity)
 | 
			
		||||
        .columns(package::Column::iter().map(|c| (package::Entity, c)))
 | 
			
		||||
        .from(package::Entity)
 | 
			
		||||
        .join_subquery(
 | 
			
		||||
            JoinType::InnerJoin,
 | 
			
		||||
            max_pkg_ids_query(true),
 | 
			
		||||
            p2.clone(),
 | 
			
		||||
            Expr::col((db::package::Entity, db::package::Column::Id))
 | 
			
		||||
            Expr::col((package::Entity, package::Column::Id))
 | 
			
		||||
                .eq(Expr::col((p2.clone(), Alias::new("max_id")))),
 | 
			
		||||
        )
 | 
			
		||||
        .cond_where(filter)
 | 
			
		||||
        .order_by((db::package::Entity, db::package::Column::Id), Order::Asc)
 | 
			
		||||
        .order_by((package::Entity, package::Column::Id), Order::Asc)
 | 
			
		||||
        .to_owned();
 | 
			
		||||
    let builder = conn.get_database_backend();
 | 
			
		||||
    let sql = builder.build(&query);
 | 
			
		||||
 | 
			
		||||
    Ok(db::Package::find()
 | 
			
		||||
    Ok(Package::find()
 | 
			
		||||
        .from_raw_sql(sql)
 | 
			
		||||
        .paginate(conn, per_page)
 | 
			
		||||
        .fetch_page(page)
 | 
			
		||||
| 
						 | 
				
			
			@ -213,7 +222,7 @@ pub async fn full(conn: &DbConn, id: i32) -> Result<Option<FullPackage>> {
 | 
			
		|||
            .into_tuple()
 | 
			
		||||
            .all(conn)
 | 
			
		||||
            .await?;
 | 
			
		||||
        let related: Vec<(db::PackageRelatedEnum, String)> = entry
 | 
			
		||||
        let related: Vec<(PackageRelatedEnum, String)> = entry
 | 
			
		||||
            .find_related(PackageRelated)
 | 
			
		||||
            .select_only()
 | 
			
		||||
            .columns([package_related::Column::Type, package_related::Column::Name])
 | 
			
		||||
| 
						 | 
				
			
			@ -248,22 +257,22 @@ pub struct PkgToRemove {
 | 
			
		|||
 | 
			
		||||
fn max_pkg_ids_query(committed: bool) -> SelectStatement {
 | 
			
		||||
    let mut query = Query::select()
 | 
			
		||||
        .from(db::package::Entity)
 | 
			
		||||
        .from(package::Entity)
 | 
			
		||||
        .columns([
 | 
			
		||||
            db::package::Column::RepoId,
 | 
			
		||||
            db::package::Column::Arch,
 | 
			
		||||
            db::package::Column::Name,
 | 
			
		||||
            package::Column::RepoId,
 | 
			
		||||
            package::Column::Arch,
 | 
			
		||||
            package::Column::Name,
 | 
			
		||||
        ])
 | 
			
		||||
        .expr_as(db::package::Column::Id.max(), Alias::new("max_id"))
 | 
			
		||||
        .expr_as(package::Column::Id.max(), Alias::new("max_id"))
 | 
			
		||||
        .group_by_columns([
 | 
			
		||||
            db::package::Column::RepoId,
 | 
			
		||||
            db::package::Column::Arch,
 | 
			
		||||
            db::package::Column::Name,
 | 
			
		||||
            package::Column::RepoId,
 | 
			
		||||
            package::Column::Arch,
 | 
			
		||||
            package::Column::Name,
 | 
			
		||||
        ])
 | 
			
		||||
        .to_owned();
 | 
			
		||||
 | 
			
		||||
    if committed {
 | 
			
		||||
        query.cond_where(db::package::Column::State.eq(db::PackageState::Committed));
 | 
			
		||||
        query.cond_where(package::Column::State.eq(PackageState::Committed));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    query
 | 
			
		||||
| 
						 | 
				
			
			@ -278,47 +287,44 @@ pub fn pkgs_to_sync(
 | 
			
		|||
) -> SelectorRaw<SelectModel<package::Model>> {
 | 
			
		||||
    let (p1, p2) = (Alias::new("p1"), Alias::new("p2"));
 | 
			
		||||
    let query = Query::select()
 | 
			
		||||
        .columns(db::package::Column::iter().map(|c| (p1.clone(), c)))
 | 
			
		||||
        .from_as(db::package::Entity, p1.clone())
 | 
			
		||||
        .columns(package::Column::iter().map(|c| (p1.clone(), c)))
 | 
			
		||||
        .from_as(package::Entity, p1.clone())
 | 
			
		||||
        .join_subquery(
 | 
			
		||||
            JoinType::InnerJoin,
 | 
			
		||||
            max_pkg_ids_query(false),
 | 
			
		||||
            p2.clone(),
 | 
			
		||||
            Expr::col((p1.clone(), db::package::Column::Id))
 | 
			
		||||
            Expr::col((p1.clone(), package::Column::Id))
 | 
			
		||||
                .eq(Expr::col((p2.clone(), Alias::new("max_id")))),
 | 
			
		||||
        )
 | 
			
		||||
        .cond_where(
 | 
			
		||||
            Condition::all()
 | 
			
		||||
                .add(Expr::col((p1.clone(), db::package::Column::RepoId)).eq(repo))
 | 
			
		||||
                .add(Expr::col((p1.clone(), package::Column::RepoId)).eq(repo))
 | 
			
		||||
                .add(Expr::col((p1.clone(), package::Column::Arch)).is_in([arch, crate::ANY_ARCH]))
 | 
			
		||||
                .add(
 | 
			
		||||
                    Expr::col((p1.clone(), db::package::Column::Arch))
 | 
			
		||||
                        .is_in([arch, crate::ANY_ARCH]),
 | 
			
		||||
                )
 | 
			
		||||
                .add(
 | 
			
		||||
                    Expr::col((p1.clone(), db::package::Column::State))
 | 
			
		||||
                        .ne(db::PackageState::PendingDeletion),
 | 
			
		||||
                    Expr::col((p1.clone(), package::Column::State))
 | 
			
		||||
                        .ne(PackageState::PendingDeletion),
 | 
			
		||||
                ),
 | 
			
		||||
        )
 | 
			
		||||
        .to_owned();
 | 
			
		||||
    let builder = conn.get_database_backend();
 | 
			
		||||
    let sql = builder.build(&query);
 | 
			
		||||
 | 
			
		||||
    db::Package::find().from_raw_sql(sql)
 | 
			
		||||
    Package::find().from_raw_sql(sql)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn stale_pkgs_query(include_repo: bool) -> SelectStatement {
 | 
			
		||||
    let (p1, p2) = (Alias::new("p1"), Alias::new("p2"));
 | 
			
		||||
    let mut query = Query::select()
 | 
			
		||||
        .from_as(db::package::Entity, p1.clone())
 | 
			
		||||
        .from_as(package::Entity, p1.clone())
 | 
			
		||||
        .to_owned();
 | 
			
		||||
 | 
			
		||||
    if include_repo {
 | 
			
		||||
        query.columns([
 | 
			
		||||
            (p1.clone(), db::package::Column::RepoId),
 | 
			
		||||
            (p1.clone(), db::package::Column::Id),
 | 
			
		||||
            (p1.clone(), package::Column::RepoId),
 | 
			
		||||
            (p1.clone(), package::Column::Id),
 | 
			
		||||
        ]);
 | 
			
		||||
    } else {
 | 
			
		||||
        query.column((p1.clone(), db::package::Column::Id));
 | 
			
		||||
        query.column((p1.clone(), package::Column::Id));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // We left join on the max pkgs query because a repository that has all its packages set to
 | 
			
		||||
| 
						 | 
				
			
			@ -331,27 +337,27 @@ fn stale_pkgs_query(include_repo: bool) -> SelectStatement {
 | 
			
		|||
            p2.clone(),
 | 
			
		||||
            Condition::all()
 | 
			
		||||
                .add(
 | 
			
		||||
                    Expr::col((p1.clone(), db::package::Column::RepoId))
 | 
			
		||||
                        .eq(Expr::col((p2.clone(), db::package::Column::RepoId))),
 | 
			
		||||
                    Expr::col((p1.clone(), package::Column::RepoId))
 | 
			
		||||
                        .eq(Expr::col((p2.clone(), package::Column::RepoId))),
 | 
			
		||||
                )
 | 
			
		||||
                .add(
 | 
			
		||||
                    Expr::col((p1.clone(), db::package::Column::Arch))
 | 
			
		||||
                        .eq(Expr::col((p2.clone(), db::package::Column::Arch))),
 | 
			
		||||
                    Expr::col((p1.clone(), package::Column::Arch))
 | 
			
		||||
                        .eq(Expr::col((p2.clone(), package::Column::Arch))),
 | 
			
		||||
                )
 | 
			
		||||
                .add(
 | 
			
		||||
                    Expr::col((p1.clone(), db::package::Column::Name))
 | 
			
		||||
                        .eq(Expr::col((p2.clone(), db::package::Column::Name))),
 | 
			
		||||
                    Expr::col((p1.clone(), package::Column::Name))
 | 
			
		||||
                        .eq(Expr::col((p2.clone(), package::Column::Name))),
 | 
			
		||||
                ),
 | 
			
		||||
        )
 | 
			
		||||
        .cond_where(
 | 
			
		||||
            Condition::any()
 | 
			
		||||
                .add(
 | 
			
		||||
                    Expr::col((p1.clone(), db::package::Column::Id))
 | 
			
		||||
                    Expr::col((p1.clone(), package::Column::Id))
 | 
			
		||||
                        .lt(Expr::col((p2.clone(), Alias::new("max_id")))),
 | 
			
		||||
                )
 | 
			
		||||
                .add(
 | 
			
		||||
                    Expr::col((p1.clone(), db::package::Column::State))
 | 
			
		||||
                        .eq(db::PackageState::PendingDeletion),
 | 
			
		||||
                    Expr::col((p1.clone(), package::Column::State))
 | 
			
		||||
                        .eq(PackageState::PendingDeletion),
 | 
			
		||||
                ),
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -367,9 +373,9 @@ pub fn stale_pkgs(conn: &DbConn) -> SelectorRaw<SelectModel<PkgToRemove>> {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
pub async fn delete_stale_pkgs(conn: &DbConn, max_id: i32) -> crate::Result<()> {
 | 
			
		||||
    Ok(db::Package::delete_many()
 | 
			
		||||
        .filter(db::package::Column::Id.lte(max_id))
 | 
			
		||||
        .filter(db::package::Column::Id.in_subquery(stale_pkgs_query(false)))
 | 
			
		||||
    Ok(Package::delete_many()
 | 
			
		||||
        .filter(package::Column::Id.lte(max_id))
 | 
			
		||||
        .filter(package::Column::Id.in_subquery(stale_pkgs_query(false)))
 | 
			
		||||
        .exec(conn)
 | 
			
		||||
        .await
 | 
			
		||||
        .map(|_| ())?)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,11 @@
 | 
			
		|||
use crate::db::*;
 | 
			
		||||
use crate::db::Result;
 | 
			
		||||
 | 
			
		||||
use sea_orm::{sea_query::IntoCondition, *};
 | 
			
		||||
use entity::{prelude::Repo, repo};
 | 
			
		||||
use sea_orm::{
 | 
			
		||||
    sea_query::IntoCondition, ActiveModelTrait, ColumnTrait, Condition, DbConn, EntityTrait,
 | 
			
		||||
    NotSet, PaginatorTrait, QueryFilter, QueryOrder, Set,
 | 
			
		||||
};
 | 
			
		||||
use serde::Deserialize;
 | 
			
		||||
 | 
			
		||||
#[derive(Deserialize)]
 | 
			
		||||
pub struct Filter {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,7 +12,7 @@ pub use error::{Result, ServerError};
 | 
			
		|||
use std::{io, path::PathBuf};
 | 
			
		||||
 | 
			
		||||
use clap::Parser;
 | 
			
		||||
use sea_orm_migration::MigratorTrait;
 | 
			
		||||
use migration::MigratorTrait;
 | 
			
		||||
use tokio::runtime;
 | 
			
		||||
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ fn setup(rt: &runtime::Handle, config_file: PathBuf) -> crate::Result<Global> {
 | 
			
		|||
 | 
			
		||||
    tracing::info!("Connecting to database");
 | 
			
		||||
    let db = rt.block_on(crate::db::connect(&config.db))?;
 | 
			
		||||
    rt.block_on(crate::db::Migrator::up(&db, None))?;
 | 
			
		||||
    rt.block_on(migration::Migrator::up(&db, None))?;
 | 
			
		||||
 | 
			
		||||
    let repo = match &config.fs {
 | 
			
		||||
        FsConfig::Local { data_dir } => {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -99,10 +99,10 @@ impl Actor {
 | 
			
		|||
 | 
			
		||||
        if let Some(_guard) = repos.get(&repo).map(|n| n.1.lock()) {
 | 
			
		||||
            let archs: Vec<String> = self.rt.block_on(
 | 
			
		||||
                db::Package::find()
 | 
			
		||||
                    .filter(db::package::Column::RepoId.eq(repo))
 | 
			
		||||
                entity::Package::find()
 | 
			
		||||
                    .filter(entity::package::Column::RepoId.eq(repo))
 | 
			
		||||
                    .select_only()
 | 
			
		||||
                    .column(db::package::Column::Arch)
 | 
			
		||||
                    .column(entity::package::Column::Arch)
 | 
			
		||||
                    .distinct()
 | 
			
		||||
                    .into_tuple()
 | 
			
		||||
                    .all(&self.state.conn),
 | 
			
		||||
| 
						 | 
				
			
			@ -171,12 +171,12 @@ impl Actor {
 | 
			
		|||
 | 
			
		||||
        // Update the state for the newly committed packages
 | 
			
		||||
        self.rt.block_on(
 | 
			
		||||
            db::Package::update_many()
 | 
			
		||||
            entity::Package::update_many()
 | 
			
		||||
                .col_expr(
 | 
			
		||||
                    db::package::Column::State,
 | 
			
		||||
                    Expr::value(db::PackageState::Committed),
 | 
			
		||||
                    entity::package::Column::State,
 | 
			
		||||
                    Expr::value(entity::PackageState::Committed),
 | 
			
		||||
                )
 | 
			
		||||
                .filter(db::package::Column::Id.is_in(committed_ids))
 | 
			
		||||
                .filter(entity::package::Column::Id.is_in(committed_ids))
 | 
			
		||||
                .exec(&self.state.conn),
 | 
			
		||||
        )?;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,3 @@
 | 
			
		|||
use crate::db;
 | 
			
		||||
use std::{
 | 
			
		||||
    io::Write,
 | 
			
		||||
    path::{Path, PathBuf},
 | 
			
		||||
| 
						 | 
				
			
			@ -69,7 +68,7 @@ impl RepoArchivesWriter {
 | 
			
		|||
        Ok(ar.append_path(&mut ar_entry, src_path)?)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn append_pkg(&mut self, pkg: &db::package::Model) -> crate::Result<()> {
 | 
			
		||||
    pub fn append_pkg(&mut self, pkg: &entity::package::Model) -> crate::Result<()> {
 | 
			
		||||
        self.write_desc(&self.tmp_paths[0], pkg)?;
 | 
			
		||||
        self.write_files(&self.tmp_paths[1], pkg)?;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -85,7 +84,11 @@ impl RepoArchivesWriter {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    /// Generate a "files" archive entry for the package in the given path
 | 
			
		||||
    fn write_files(&self, path: impl AsRef<Path>, pkg: &db::package::Model) -> crate::Result<()> {
 | 
			
		||||
    fn write_files(
 | 
			
		||||
        &self,
 | 
			
		||||
        path: impl AsRef<Path>,
 | 
			
		||||
        pkg: &entity::package::Model,
 | 
			
		||||
    ) -> crate::Result<()> {
 | 
			
		||||
        let mut f = std::io::BufWriter::new(std::fs::File::create(path)?);
 | 
			
		||||
 | 
			
		||||
        writeln!(f, "%FILES%")?;
 | 
			
		||||
| 
						 | 
				
			
			@ -93,7 +96,7 @@ impl RepoArchivesWriter {
 | 
			
		|||
        let (tx, mut rx) = mpsc::channel(1);
 | 
			
		||||
 | 
			
		||||
        let conn = self.conn.clone();
 | 
			
		||||
        let query = pkg.find_related(db::PackageFile);
 | 
			
		||||
        let query = pkg.find_related(entity::prelude::PackageFile);
 | 
			
		||||
 | 
			
		||||
        self.rt.spawn(async move {
 | 
			
		||||
            match query.stream(&conn).await {
 | 
			
		||||
| 
						 | 
				
			
			@ -121,7 +124,11 @@ impl RepoArchivesWriter {
 | 
			
		|||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn write_desc(&self, path: impl AsRef<Path>, pkg: &db::package::Model) -> crate::Result<()> {
 | 
			
		||||
    fn write_desc(
 | 
			
		||||
        &self,
 | 
			
		||||
        path: impl AsRef<Path>,
 | 
			
		||||
        pkg: &entity::package::Model,
 | 
			
		||||
    ) -> crate::Result<()> {
 | 
			
		||||
        let mut f = std::io::BufWriter::new(std::fs::File::create(path)?);
 | 
			
		||||
 | 
			
		||||
        let filename = format!(
 | 
			
		||||
| 
						 | 
				
			
			@ -147,9 +154,9 @@ impl RepoArchivesWriter {
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        let groups: Vec<String> = self.rt.block_on(
 | 
			
		||||
            pkg.find_related(db::PackageGroup)
 | 
			
		||||
            pkg.find_related(entity::prelude::PackageGroup)
 | 
			
		||||
                .select_only()
 | 
			
		||||
                .column(db::package_group::Column::Name)
 | 
			
		||||
                .column(entity::package_group::Column::Name)
 | 
			
		||||
                .into_tuple()
 | 
			
		||||
                .all(&self.conn),
 | 
			
		||||
        )?;
 | 
			
		||||
| 
						 | 
				
			
			@ -165,9 +172,9 @@ impl RepoArchivesWriter {
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        let licenses: Vec<String> = self.rt.block_on(
 | 
			
		||||
            pkg.find_related(db::PackageLicense)
 | 
			
		||||
            pkg.find_related(entity::prelude::PackageLicense)
 | 
			
		||||
                .select_only()
 | 
			
		||||
                .column(db::package_license::Column::Name)
 | 
			
		||||
                .column(entity::package_license::Column::Name)
 | 
			
		||||
                .into_tuple()
 | 
			
		||||
                .all(&self.conn),
 | 
			
		||||
        )?;
 | 
			
		||||
| 
						 | 
				
			
			@ -186,21 +193,21 @@ impl RepoArchivesWriter {
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        let related = [
 | 
			
		||||
            ("REPLACES", db::PackageRelatedEnum::Replaces),
 | 
			
		||||
            ("CONFLICTS", db::PackageRelatedEnum::Conflicts),
 | 
			
		||||
            ("PROVIDES", db::PackageRelatedEnum::Provides),
 | 
			
		||||
            ("DEPENDS", db::PackageRelatedEnum::Depend),
 | 
			
		||||
            ("OPTDEPENDS", db::PackageRelatedEnum::Optdepend),
 | 
			
		||||
            ("MAKEDEPENDS", db::PackageRelatedEnum::Makedepend),
 | 
			
		||||
            ("CHECKDEPENDS", db::PackageRelatedEnum::Checkdepend),
 | 
			
		||||
            ("REPLACES", entity::PackageRelatedEnum::Replaces),
 | 
			
		||||
            ("CONFLICTS", entity::PackageRelatedEnum::Conflicts),
 | 
			
		||||
            ("PROVIDES", entity::PackageRelatedEnum::Provides),
 | 
			
		||||
            ("DEPENDS", entity::PackageRelatedEnum::Depend),
 | 
			
		||||
            ("OPTDEPENDS", entity::PackageRelatedEnum::Optdepend),
 | 
			
		||||
            ("MAKEDEPENDS", entity::PackageRelatedEnum::Makedepend),
 | 
			
		||||
            ("CHECKDEPENDS", entity::PackageRelatedEnum::Checkdepend),
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        for (key, attr) in related.into_iter() {
 | 
			
		||||
            let items: Vec<String> = self.rt.block_on(
 | 
			
		||||
                pkg.find_related(db::PackageRelated)
 | 
			
		||||
                    .filter(db::package_related::Column::Type.eq(attr))
 | 
			
		||||
                pkg.find_related(entity::prelude::PackageRelated)
 | 
			
		||||
                    .filter(entity::package_related::Column::Type.eq(attr))
 | 
			
		||||
                    .select_only()
 | 
			
		||||
                    .column(db::package_related::Column::Name)
 | 
			
		||||
                    .column(entity::package_related::Column::Name)
 | 
			
		||||
                    .into_tuple()
 | 
			
		||||
                    .all(&self.conn),
 | 
			
		||||
            )?;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,4 @@
 | 
			
		|||
use super::{Command, SharedState};
 | 
			
		||||
use crate::db;
 | 
			
		||||
 | 
			
		||||
use std::{
 | 
			
		||||
    path::PathBuf,
 | 
			
		||||
| 
						 | 
				
			
			@ -34,10 +33,10 @@ impl Handle {
 | 
			
		|||
    pub async fn get_or_create_repo(&self, distro: &str, repo: &str) -> crate::Result<i32> {
 | 
			
		||||
        let mut repos = self.state.repos.write().await;
 | 
			
		||||
 | 
			
		||||
        let distro_id: Option<i32> = db::Distro::find()
 | 
			
		||||
            .filter(db::distro::Column::Name.eq(distro))
 | 
			
		||||
        let distro_id: Option<i32> = entity::Distro::find()
 | 
			
		||||
            .filter(entity::distro::Column::Name.eq(distro))
 | 
			
		||||
            .select_only()
 | 
			
		||||
            .column(db::distro::Column::Id)
 | 
			
		||||
            .column(entity::distro::Column::Id)
 | 
			
		||||
            .into_tuple()
 | 
			
		||||
            .one(&self.state.conn)
 | 
			
		||||
            .await?;
 | 
			
		||||
| 
						 | 
				
			
			@ -45,7 +44,7 @@ impl Handle {
 | 
			
		|||
        let distro_id = if let Some(id) = distro_id {
 | 
			
		||||
            id
 | 
			
		||||
        } else {
 | 
			
		||||
            let new_distro = db::distro::ActiveModel {
 | 
			
		||||
            let new_distro = entity::distro::ActiveModel {
 | 
			
		||||
                id: NotSet,
 | 
			
		||||
                name: Set(distro.to_string()),
 | 
			
		||||
                description: NotSet,
 | 
			
		||||
| 
						 | 
				
			
			@ -54,11 +53,11 @@ impl Handle {
 | 
			
		|||
            new_distro.insert(&self.state.conn).await?.id
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        let repo_id: Option<i32> = db::Repo::find()
 | 
			
		||||
            .filter(db::repo::Column::DistroId.eq(distro_id))
 | 
			
		||||
            .filter(db::repo::Column::Name.eq(repo))
 | 
			
		||||
        let repo_id: Option<i32> = entity::Repo::find()
 | 
			
		||||
            .filter(entity::repo::Column::DistroId.eq(distro_id))
 | 
			
		||||
            .filter(entity::repo::Column::Name.eq(repo))
 | 
			
		||||
            .select_only()
 | 
			
		||||
            .column(db::repo::Column::Id)
 | 
			
		||||
            .column(entity::repo::Column::Id)
 | 
			
		||||
            .into_tuple()
 | 
			
		||||
            .one(&self.state.conn)
 | 
			
		||||
            .await?;
 | 
			
		||||
| 
						 | 
				
			
			@ -66,7 +65,7 @@ impl Handle {
 | 
			
		|||
        let repo_id = if let Some(id) = repo_id {
 | 
			
		||||
            id
 | 
			
		||||
        } else {
 | 
			
		||||
            let new_repo = db::repo::ActiveModel {
 | 
			
		||||
            let new_repo = entity::repo::ActiveModel {
 | 
			
		||||
                id: NotSet,
 | 
			
		||||
                distro_id: Set(distro_id),
 | 
			
		||||
                name: Set(repo.to_string()),
 | 
			
		||||
| 
						 | 
				
			
			@ -84,12 +83,12 @@ impl Handle {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    pub async fn get_repo(&self, distro: &str, repo: &str) -> crate::Result<Option<i32>> {
 | 
			
		||||
        Ok(db::Repo::find()
 | 
			
		||||
            .find_also_related(db::Distro)
 | 
			
		||||
        Ok(entity::Repo::find()
 | 
			
		||||
            .find_also_related(entity::Distro)
 | 
			
		||||
            .filter(
 | 
			
		||||
                Condition::all()
 | 
			
		||||
                    .add(db::repo::Column::Name.eq(repo))
 | 
			
		||||
                    .add(db::distro::Column::Name.eq(distro)),
 | 
			
		||||
                    .add(entity::repo::Column::Name.eq(repo))
 | 
			
		||||
                    .add(entity::distro::Column::Name.eq(distro)),
 | 
			
		||||
            )
 | 
			
		||||
            .one(&self.state.conn)
 | 
			
		||||
            .await
 | 
			
		||||
| 
						 | 
				
			
			@ -98,7 +97,9 @@ impl Handle {
 | 
			
		|||
 | 
			
		||||
    pub async fn remove_repo(&self, repo: i32) -> crate::Result<()> {
 | 
			
		||||
        self.state.repos.write().await.remove(&repo);
 | 
			
		||||
        db::Repo::delete_by_id(repo).exec(&self.state.conn).await?;
 | 
			
		||||
        entity::Repo::delete_by_id(repo)
 | 
			
		||||
            .exec(&self.state.conn)
 | 
			
		||||
            .await?;
 | 
			
		||||
        let _ = tokio::fs::remove_dir_all(self.state.repos_dir.join(repo.to_string())).await;
 | 
			
		||||
 | 
			
		||||
        Ok(())
 | 
			
		||||
| 
						 | 
				
			
			@ -108,15 +109,15 @@ impl Handle {
 | 
			
		|||
    /// packages with the given architecture as "pending deletion", before performing a manual sync
 | 
			
		||||
    /// & removal of stale packages.
 | 
			
		||||
    pub async fn remove_repo_arch(&self, repo: i32, arch: &str) -> crate::Result<()> {
 | 
			
		||||
        db::Package::update_many()
 | 
			
		||||
        entity::Package::update_many()
 | 
			
		||||
            .col_expr(
 | 
			
		||||
                db::package::Column::State,
 | 
			
		||||
                Expr::value(db::PackageState::PendingDeletion),
 | 
			
		||||
                entity::package::Column::State,
 | 
			
		||||
                Expr::value(entity::PackageState::PendingDeletion),
 | 
			
		||||
            )
 | 
			
		||||
            .filter(
 | 
			
		||||
                Condition::all()
 | 
			
		||||
                    .add(db::package::Column::RepoId.eq(repo))
 | 
			
		||||
                    .add(db::package::Column::Arch.eq(arch)),
 | 
			
		||||
                    .add(entity::package::Column::RepoId.eq(repo))
 | 
			
		||||
                    .add(entity::package::Column::Arch.eq(arch)),
 | 
			
		||||
            )
 | 
			
		||||
            .exec(&self.state.conn)
 | 
			
		||||
            .await?;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,8 +6,6 @@ pub mod package;
 | 
			
		|||
pub use actor::Actor;
 | 
			
		||||
pub use handle::Handle;
 | 
			
		||||
 | 
			
		||||
use crate::db;
 | 
			
		||||
 | 
			
		||||
use std::{
 | 
			
		||||
    collections::HashMap,
 | 
			
		||||
    path::{Path, PathBuf},
 | 
			
		||||
| 
						 | 
				
			
			@ -67,9 +65,9 @@ pub fn start(
 | 
			
		|||
 | 
			
		||||
    let mut repos = HashMap::new();
 | 
			
		||||
    let repo_ids: Vec<i32> = rt.block_on(
 | 
			
		||||
        db::Repo::find()
 | 
			
		||||
        entity::prelude::Repo::find()
 | 
			
		||||
            .select_only()
 | 
			
		||||
            .column(db::repo::Column::Id)
 | 
			
		||||
            .column(entity::repo::Column::Id)
 | 
			
		||||
            .into_tuple()
 | 
			
		||||
            .all(&conn),
 | 
			
		||||
    )?;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,3 @@
 | 
			
		|||
use crate::db::entities::package;
 | 
			
		||||
 | 
			
		||||
use std::{
 | 
			
		||||
    fmt, fs,
 | 
			
		||||
    io::{self, BufRead, BufReader, Read},
 | 
			
		||||
| 
						 | 
				
			
			@ -11,7 +9,6 @@ use libarchive::{
 | 
			
		|||
    read::{Archive, Builder},
 | 
			
		||||
    Entry, ReadFilter,
 | 
			
		||||
};
 | 
			
		||||
use sea_orm::ActiveValue::Set;
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone)]
 | 
			
		||||
pub struct Package {
 | 
			
		||||
| 
						 | 
				
			
			@ -194,26 +191,3 @@ impl Package {
 | 
			
		|||
        )
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<Package> for package::ActiveModel {
 | 
			
		||||
    fn from(pkg: Package) -> Self {
 | 
			
		||||
        let info = pkg.info;
 | 
			
		||||
 | 
			
		||||
        package::ActiveModel {
 | 
			
		||||
            base: Set(info.base),
 | 
			
		||||
            name: Set(info.name),
 | 
			
		||||
            version: Set(info.version),
 | 
			
		||||
            arch: Set(info.arch),
 | 
			
		||||
            size: Set(info.size),
 | 
			
		||||
            c_size: Set(info.csize),
 | 
			
		||||
            description: Set(info.description),
 | 
			
		||||
            url: Set(info.url),
 | 
			
		||||
            build_date: Set(info.build_date),
 | 
			
		||||
            packager: Set(info.packager),
 | 
			
		||||
            pgp_sig: Set(info.pgpsig),
 | 
			
		||||
            pgp_sig_size: Set(info.pgpsigsize),
 | 
			
		||||
            sha256_sum: Set(info.sha256sum),
 | 
			
		||||
            ..Default::default()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,7 @@ async fn get_repos(
 | 
			
		|||
    State(global): State<crate::Global>,
 | 
			
		||||
    Query(pagination): Query<pagination::Query>,
 | 
			
		||||
    Query(filter): Query<db::query::repo::Filter>,
 | 
			
		||||
) -> crate::Result<Json<PaginatedResponse<db::repo::Model>>> {
 | 
			
		||||
) -> crate::Result<Json<PaginatedResponse<entity::repo::Model>>> {
 | 
			
		||||
    let items =
 | 
			
		||||
        db::query::repo::page(&global.db, pagination.per_page, pagination.page - 1, filter).await?;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -31,7 +31,7 @@ async fn get_repos(
 | 
			
		|||
async fn get_single_repo(
 | 
			
		||||
    State(global): State<crate::Global>,
 | 
			
		||||
    Path(id): Path<i32>,
 | 
			
		||||
) -> crate::Result<Json<db::repo::Model>> {
 | 
			
		||||
) -> crate::Result<Json<entity::repo::Model>> {
 | 
			
		||||
    let repo = db::query::repo::by_id(&global.db, id)
 | 
			
		||||
        .await?
 | 
			
		||||
        .ok_or(axum::http::StatusCode::NOT_FOUND)?;
 | 
			
		||||
| 
						 | 
				
			
			@ -43,7 +43,7 @@ async fn get_packages(
 | 
			
		|||
    State(global): State<crate::Global>,
 | 
			
		||||
    Query(pagination): Query<pagination::Query>,
 | 
			
		||||
    Query(filter): Query<db::query::package::Filter>,
 | 
			
		||||
) -> crate::Result<Json<PaginatedResponse<db::package::Model>>> {
 | 
			
		||||
) -> crate::Result<Json<PaginatedResponse<entity::package::Model>>> {
 | 
			
		||||
    let items =
 | 
			
		||||
        db::query::package::page(&global.db, pagination.per_page, pagination.page - 1, filter)
 | 
			
		||||
            .await?;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue