diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b4564f4dc0..9a70650186 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,6 +54,11 @@ jobs: cargo install cargo-modify --force cargo modify new-resolver + - name: Install nettle on Ubuntu + if: matrix.os == 'ubuntu-latest' + run: | + sudo apt-get install clang llvm pkg-config nettle-dev + - name: Build Debug run: | cargo build @@ -114,6 +119,9 @@ jobs: cargo install cargo-modify --force cargo modify new-resolver + - name: Install nettle-dev + run: | + sudo apt install clang llvm pkg-config nettle-dev - name: Setup MUSL run: | sudo apt-get -qq install musl-tools @@ -164,4 +172,4 @@ jobs: - uses: actions/upload-artifact@v1 with: name: release-notes.txt - path: ./release-notes.txt \ No newline at end of file + path: ./release-notes.txt diff --git a/Cargo.lock b/Cargo.lock index 098887484a..f812623d86 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,13 +17,22 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "aead" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" +dependencies = [ + "generic-array", +] + [[package]] name = "ahash" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43bb833f0bf979d8475d38fbf09ed3b8a55e1885fe93ad3f93239fc6a4f17b98" dependencies = [ - "getrandom", + "getrandom 0.2.3", "once_cell", "version_check", ] @@ -48,9 +57,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.43" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28ae2b3dec75a406790005a200b1bd89785afc02517a00ca99ecfe093ee9e6cf" +checksum = "61604a8f862e1d5c3229fdd78f8b02c68dcf73a4c4b05fd636d12240aaa242c1" [[package]] name = "arrayvec" @@ -61,10 +70,20 @@ dependencies = [ "nodrop", ] +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + [[package]] name = "asyncgit" version = "0.17.1" dependencies = [ + "anyhow", "crossbeam-channel", "easy-cast", "git2", @@ -74,6 +93,7 @@ dependencies = [ "pretty_assertions", "rayon-core", "scopetime", + "sequoia-openpgp", "serial_test", "tempfile", "thiserror", @@ -128,6 +148,25 @@ dependencies = [ "serde", ] +[[package]] +name = "bindgen" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd4865004a46a0aafb2a0a5eb19d3c9fc46ee5f063a6cfc605c69ac9ecf5263d" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", +] + [[package]] name = "bit-set" version = "0.5.2" @@ -149,6 +188,17 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +[[package]] +name = "buffered-reader" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f76f15096822ca97dcc626a98ce3eb93c8afc795f33994a63e8d4ed767007e4" +dependencies = [ + "bzip2", + "flate2", + "libc", +] + [[package]] name = "bugreport" version = "0.4.1" @@ -172,6 +222,27 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c58ec36aac5066d5ca17df51b3e70279f5670a72102f5752cb7e7c856adfc70" +[[package]] +name = "bzip2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6afcd980b5f3a45017c57e57a2fcccbb351cc43a356ce117ef760ef8052b89b0" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + [[package]] name = "cassowary" version = "0.3.0" @@ -187,6 +258,15 @@ dependencies = [ "jobserver", ] +[[package]] +name = "cexpr" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" +dependencies = [ + "nom", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -206,6 +286,26 @@ dependencies = [ "winapi", ] +[[package]] +name = "cipher" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" +dependencies = [ + "generic-array", +] + +[[package]] +name = "clang-sys" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10612c0ec0e0a1ff0e97980647cb058a6e7aedb913d01d009c406b8b7d0b26ee" +dependencies = [ + "glob", + "libc", + "libloading", +] + [[package]] name = "clap" version = "2.33.3" @@ -217,6 +317,16 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "cmac" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73d4de4f7724e5fe70addfb2bd37c2abd2f95084a429d7773b0b9645499b4272" +dependencies = [ + "crypto-mac", + "dbl", +] + [[package]] name = "cpp_demangle" version = "0.3.3" @@ -305,6 +415,23 @@ dependencies = [ "winapi", ] +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-mac" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff07008ec701e8028e2ceb8f83f0e4274ee62bd2dbdc4fefff2e9a91824081a" +dependencies = [ + "cipher", + "generic-array", + "subtle", +] + [[package]] name = "ctor" version = "0.1.21" @@ -315,6 +442,24 @@ dependencies = [ "syn", ] +[[package]] +name = "ctr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb4a30d54f7443bf3d6191dcd486aca19e67cb3c49fa7a06a319966346707e7f" +dependencies = [ + "cipher", +] + +[[package]] +name = "dbl" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37e797687b5f09528a48fcb63b6914d0255b8a6c760699a919af37042f09d9b3" +dependencies = [ + "generic-array", +] + [[package]] name = "debugid" version = "0.7.2" @@ -330,6 +475,15 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "dirs-next" version = "2.0.0" @@ -351,18 +505,46 @@ dependencies = [ "winapi", ] +[[package]] +name = "dyn-clone" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" + [[package]] name = "easy-cast" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bd102ee8c418348759919b83b81cdbdc933ffe29740b903df448b4bafaa348e" +[[package]] +name = "eax" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1f76e7a5e594b299a0fa9a99de627530725e341df41376aa342aecb2c5eb76e" +dependencies = [ + "aead", + "cipher", + "cmac", + "ctr", + "subtle", +] + [[package]] name = "either" version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +[[package]] +name = "ena" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7402b94a93c24e742487327a7cd839dc9d36fec9de9fb25b09f2dae459f36c3" +dependencies = [ + "log", +] + [[package]] name = "fancy-regex" version = "0.7.1" @@ -382,11 +564,17 @@ dependencies = [ "thiserror", ] +[[package]] +name = "fixedbitset" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" + [[package]] name = "flate2" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80edafed416a46fb378521624fab1cfa2eb514784fd8921adbe8a8d8321da811" +checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" dependencies = [ "cfg-if", "crc32fast", @@ -419,6 +607,27 @@ dependencies = [ "thread_local", ] +[[package]] +name = "generic-array" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + [[package]] name = "getrandom" version = "0.2.3" @@ -427,7 +636,7 @@ checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] @@ -522,6 +731,12 @@ dependencies = [ "which", ] +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + [[package]] name = "hashbrown" version = "0.11.2" @@ -613,6 +828,38 @@ dependencies = [ "libc", ] +[[package]] +name = "lalrpop" +version = "0.19.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15174f1c529af5bf1283c3bc0058266b483a67156f79589fab2a25e23cf8988" +dependencies = [ + "ascii-canvas", + "atty", + "bit-set", + "diff", + "ena", + "itertools", + "lalrpop-util", + "petgraph", + "pico-args", + "regex", + "regex-syntax", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "lalrpop-util" +version = "0.19.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e58cce361efcc90ba8a0a5f982c741ff86b603495bb15a998412e957dcd278" +dependencies = [ + "regex", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -627,9 +874,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.101" +version = "0.2.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21" +checksum = "a2a5ac8f984bfcf3a823267e5fde638acc3325f6496633a5da6bb6eb2171e103" [[package]] name = "libgit2-sys" @@ -645,6 +892,16 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "libloading" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +dependencies = [ + "cfg-if", + "winapi", +] + [[package]] name = "libssh2-sys" version = "0.2.21" @@ -735,6 +992,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memsec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af4f95d8737f4ffafbd1fb3c703cdc898868a244a59786793cba0520ebdcbdd" + [[package]] name = "miniz_oxide" version = "0.4.4" @@ -767,6 +1030,35 @@ dependencies = [ "winapi", ] +[[package]] +name = "nettle" +version = "7.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dbaef96ce04e0dafb03b2c5d3803975c84080f876356cb67f44cf85963cedb7" +dependencies = [ + "getrandom 0.1.16", + "libc", + "nettle-sys", + "thiserror", +] + +[[package]] +name = "nettle-sys" +version = "2.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b95aff9e61c8d8132e41dceae74c6e526edcac8d120072c87a300b9ab7e75226" +dependencies = [ + "bindgen", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + [[package]] name = "nix" version = "0.20.1" @@ -786,6 +1078,16 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +[[package]] +name = "nom" +version = "5.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" +dependencies = [ + "memchr", + "version_check", +] + [[package]] name = "ntapi" version = "0.3.6" @@ -912,19 +1214,44 @@ dependencies = [ "winapi", ] +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + [[package]] name = "percent-encoding" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +[[package]] +name = "petgraph" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7" +dependencies = [ + "fixedbitset", + "indexmap", +] + [[package]] name = "phf" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9fc3db1018c4b59d7d582a739436478b6035138b6aecbce989fc91c3e98409f" dependencies = [ - "phf_shared", + "phf_shared 0.10.0", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", ] [[package]] @@ -936,6 +1263,12 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pico-args" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8bcd96cb740d03149cbad5518db9fd87126a10ab519c011893b1754134c468" + [[package]] name = "pkg-config" version = "0.3.19" @@ -980,6 +1313,12 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + [[package]] name = "pretty_assertions" version = "0.7.2" @@ -1053,7 +1392,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom", + "getrandom 0.2.3", ] [[package]] @@ -1093,7 +1432,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" dependencies = [ - "getrandom", + "getrandom 0.2.3", "redox_syscall", ] @@ -1149,6 +1488,18 @@ version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustversion" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" + [[package]] name = "ryu" version = "1.0.5" @@ -1183,6 +1534,35 @@ dependencies = [ "log", ] +[[package]] +name = "sequoia-openpgp" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a727224c28f9834c18551eb1e56e4fa30450a66ce7e8d7179a6d949f291ed84b" +dependencies = [ + "anyhow", + "backtrace", + "base64", + "buffered-reader", + "bzip2", + "chrono", + "dyn-clone", + "eax", + "flate2", + "idna", + "lalrpop", + "lalrpop-util", + "lazy_static", + "libc", + "memsec", + "nettle", + "regex", + "regex-syntax", + "sha1collisiondetection", + "thiserror", + "unicode-normalization", +] + [[package]] name = "serde" version = "1.0.130" @@ -1205,9 +1585,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.67" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7f9e390c27c3c0ce8bc5d725f6e4d30a29d26659494aa4b17535f7522c5c950" +checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8" dependencies = [ "itoa", "ryu", @@ -1236,12 +1616,29 @@ dependencies = [ "syn", ] +[[package]] +name = "sha1collisiondetection" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a6cf187c4059b3e63de2358b7e2f9a2261b6f3fd8ef4e7342308d0863ed082" +dependencies = [ + "digest", + "generic-array", + "libc", +] + [[package]] name = "shell-escape" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" +[[package]] +name = "shlex" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" + [[package]] name = "signal-hook" version = "0.3.10" @@ -1312,6 +1709,24 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9091b6114800a5f2141aee1d1b9d6ca3592ac062dc5decb3764ec5895a47b4eb" +[[package]] +name = "string_cache" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ddb1139b5353f96e429e1a5e19fbaf663bddedaa06d1dbd49f82e352601209a" +dependencies = [ + "lazy_static", + "new_debug_unreachable", + "phf_shared 0.8.0", + "precomputed-hash", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + [[package]] name = "symbolic-common" version = "8.3.0" @@ -1392,6 +1807,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "textwrap" version = "0.11.0" @@ -1451,11 +1877,20 @@ dependencies = [ "winapi", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tinyvec" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848a1e1181b9f6753b5e96a092749e29b11d19ede67dfbbd6c7dc7e0f49b5338" +checksum = "5241dd6f21443a3606b432718b166d3cedc962fd4b8bea54a8bc7f514ebda986" dependencies = [ "tinyvec_macros", ] @@ -1480,6 +1915,12 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "typenum" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" + [[package]] name = "unicode-bidi" version = "0.3.6" @@ -1521,9 +1962,9 @@ dependencies = [ [[package]] name = "unicode-width" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" [[package]] name = "unicode-xid" @@ -1572,6 +2013,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" diff --git a/Cargo.toml b/Cargo.toml index 77e2784ec8..641856e173 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -86,4 +86,4 @@ codegen-units = 1 opt-level = 3 [profile.dev] -split-debuginfo = "unpacked" \ No newline at end of file +split-debuginfo = "unpacked" diff --git a/Makefile b/Makefile index 000e19e03a..2d8971ccf6 100644 --- a/Makefile +++ b/Makefile @@ -35,12 +35,23 @@ release-linux-musl: build-linux-musl-release mkdir -p release tar -C ./target/x86_64-unknown-linux-musl/release/ -czvf ./release/gitui-linux-musl.tar.gz ./gitui +release-linux-gnu: build-linux-gnu-release + strip target/x86_64-unknown-linux-gnu/release/gitui + mkdir -p release + tar -C ./target/x86_64-unknown-linux-gnu/release/ -czvf ./release/gitui-linux-gnu.tar.gz ./gitui + build-linux-musl-debug: cargo build --target=x86_64-unknown-linux-musl build-linux-musl-release: cargo build --release --target=x86_64-unknown-linux-musl +build-linux-gnu-debug: + cargo build --target=x86_64-unknown-linux-gnu + +build-linux-gnu-release: + cargo build --release --target=x86_64-unknown-linux-gnu + test-linux-musl: cargo test --workspace --target=x86_64-unknown-linux-musl @@ -66,4 +77,4 @@ install: cargo install --path "." --offline install-timing: - cargo install --features=timing --path "." --offline \ No newline at end of file + cargo install --features=timing --path "." --offline diff --git a/asyncgit/Cargo.toml b/asyncgit/Cargo.toml index 7f5a35c4fe..f0755efb8e 100644 --- a/asyncgit/Cargo.toml +++ b/asyncgit/Cargo.toml @@ -25,9 +25,11 @@ thiserror = "1.0" url = "2.2" unicode-truncate = "0.2.0" easy-cast = "0.4" +sequoia-openpgp = "1.3.1" +anyhow = "1.0" [dev-dependencies] tempfile = "3.2" invalidstring = { path = "../invalidstring", version = "0.1" } serial_test = "0.5.1" -pretty_assertions = "0.7" \ No newline at end of file +pretty_assertions = "0.7" diff --git a/asyncgit/src/error.rs b/asyncgit/src/error.rs index 9f2a25665c..cf01823da0 100644 --- a/asyncgit/src/error.rs +++ b/asyncgit/src/error.rs @@ -50,6 +50,10 @@ pub enum Error { #[error("git error:{0}")] Git(#[from] git2::Error), + /// + #[error("gpg error:{0}")] + Gpg(#[from] anyhow::Error), + /// #[error("utf8 error:{0}")] Utf8Conversion(#[from] FromUtf8Error), diff --git a/asyncgit/src/sync/commit.rs b/asyncgit/src/sync/commit.rs index 86a9b52908..d8a3d42a06 100644 --- a/asyncgit/src/sync/commit.rs +++ b/asyncgit/src/sync/commit.rs @@ -1,5 +1,9 @@ use super::{utils::repo, CommitId}; -use crate::{error::Result, sync::utils::get_head_repo}; +use crate::{ + error::{Error, Result}, + sync::signer::*, + sync::utils::get_head_repo, +}; use git2::{ErrorCode, ObjectType, Repository, Signature}; use scopetime::scope_time; @@ -62,6 +66,7 @@ pub fn commit(repo_path: &str, msg: &str) -> Result { scope_time!("commit"); let repo = repo(repo_path)?; + let config = repo.config()?; let signature = signature_allow_undefined_name(&repo)?; let mut index = repo.index()?; @@ -76,8 +81,61 @@ pub fn commit(repo_path: &str, msg: &str) -> Result { let parents = parents.iter().collect::>(); - Ok(repo - .commit( + let commit_oid = if config + .get_bool("commit.gpgsign") + .unwrap_or(false) + { + let commit_buffer = repo.commit_create_buffer( + &signature, + &signature, + msg, + &tree, + parents.as_slice(), + )?; + + let commit_content = commit_buffer + .as_str() + .expect("Buffer was not a valid UTF-8"); + + let mut signature_buffer = Vec::new(); + + let config_stuff = config.get_path("gitui.keypath").unwrap(); + + if let Err(err) = create_signature( + &commit_content, + &mut signature_buffer, + &config_stuff, + ) { + return Err(Error::Gpg(err)); + } + + let signature = std::str::from_utf8(&signature_buffer) + .expect("Buffer was not valid UTF-8"); + + let commit_oid = + repo.commit_signed(&commit_content, &signature, None)?; + + match repo.head() { + Ok(mut head) => { + head.set_target(commit_oid, msg)?; + } + Err(_) => { + let default_branch_name = config + .get_str("init.defaultBranch") + .unwrap_or("master"); + + repo.reference( + &format!("refs/heads/{}", default_branch_name), + commit_oid, + true, + msg, + )?; + } + } + + commit_oid + } else { + repo.commit( Some("HEAD"), &signature, &signature, @@ -85,7 +143,9 @@ pub fn commit(repo_path: &str, msg: &str) -> Result { &tree, parents.as_slice(), )? - .into()) + }; + + Ok(commit_oid.into()) } /// Tag a commit. diff --git a/asyncgit/src/sync/mod.rs b/asyncgit/src/sync/mod.rs index 1c8df9ddbe..2467cb0f80 100644 --- a/asyncgit/src/sync/mod.rs +++ b/asyncgit/src/sync/mod.rs @@ -21,6 +21,7 @@ mod patches; mod rebase; pub mod remotes; mod reset; +mod signer; mod staging; mod stash; mod state; diff --git a/asyncgit/src/sync/signer.rs b/asyncgit/src/sync/signer.rs new file mode 100644 index 0000000000..8575984c82 --- /dev/null +++ b/asyncgit/src/sync/signer.rs @@ -0,0 +1,87 @@ +use std::io::Write; +use std::path::Path; + +use anyhow::Context; +use openpgp::armor; +use openpgp::cert::prelude::*; +use openpgp::crypto::KeyPair; +use openpgp::packet::prelude::*; +use openpgp::parse::Parse; +use openpgp::policy::{Policy, StandardPolicy}; +use openpgp::serialize::stream::{Armorer, Message, Signer}; +use openpgp::types::SignatureType; +use sequoia_openpgp as openpgp; + +pub fn get_signing_keys( + cert: &openpgp::Cert, + p: &dyn Policy, +) -> openpgp::Result> { + let mut final_keys = Vec::new(); + + let cert_keys = cert + .keys() + .with_policy(p, None) + .alive() + .revoked(false) + .for_signing() + .supported(); + + 'cert: for key in cert_keys.map(|ka| ka.key()) { + if let Some(secret) = key.optional_secret() { + let unencrypted = match secret { + SecretKeyMaterial::Encrypted(ref _e) => { + return Err(anyhow::anyhow!(format!( + "Signing of commits with encrypted secret not currently supported") + )); + } + SecretKeyMaterial::Unencrypted(ref u) => u.clone(), + }; + + final_keys.push( + KeyPair::new(key.clone(), unencrypted) + .expect("Failed to create keypair"), + ); + + break 'cert; + } + + return Err(anyhow::anyhow!(format!( + "No suitable signing key for: {}, ensure you have properly exported your private key.", + cert + ))); + } + + Ok(final_keys) +} + +pub fn create_signature( + commit: &str, + signature: &mut (dyn Write + Send + Sync), + cert: &Path, +) -> openpgp::Result<()> { + let cert = Cert::from_file(cert) + .context("Failed to read signing key")?; + + let mut keypairs = + get_signing_keys(&cert, &StandardPolicy::new())?; + + let message = Message::new(signature); + let message = + Armorer::new(message).kind(armor::Kind::Signature).build()?; + + let builder = SignatureBuilder::new(SignatureType::Binary); + let mut signer = Signer::with_template( + message, + keypairs.pop().context("No key for signing")?, + builder, + ); + + signer = signer.detached(); + + let mut signer = + signer.build().context("Failed to create signer")?; + signer.write_all(commit.as_bytes())?; + signer.finalize().context("Failed to sign commit")?; + + Ok(()) +} diff --git a/src/components/commit.rs b/src/components/commit.rs index 851bbb1f75..4d2de803ec 100644 --- a/src/components/commit.rs +++ b/src/components/commit.rs @@ -169,16 +169,6 @@ impl CommitComponent { } fn commit(&mut self) -> Result<()> { - let gpgsign = get_config_string(CWD, "commit.gpgsign") - .ok() - .flatten() - .and_then(|path| path.parse::().ok()) - .unwrap_or_default(); - - if gpgsign { - anyhow::bail!("config commit.gpgsign=true detected.\ngpg signing not supported.\ndeactivate in your repo/gitconfig to be able to commit without signing."); - } - let msg = self.input.get_text().to_string(); self.input.clear(); self.commit_with_msg(msg)