forked from mirrors/kingfisher
preparing for v1.100.0
This commit is contained in:
parent
1636b07810
commit
54d9fc7ecd
11 changed files with 740 additions and 783 deletions
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
|
|
@ -132,7 +132,7 @@ jobs:
|
|||
toolchain: ${{ env.RUST_TOOLCHAIN }}
|
||||
|
||||
- name: Set up MSYS2
|
||||
uses: msys2/setup-msys2@cafece8e6baf9247cf9b1bf95097b0b983cc558d # v2.31.0
|
||||
uses: msys2/setup-msys2@e9898307ac31d1a803454791be09ab9973336e1c # v2.31.1
|
||||
with:
|
||||
msystem: ${{ matrix.msystem }}
|
||||
update: true
|
||||
|
|
|
|||
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
|
|
@ -274,7 +274,7 @@ jobs:
|
|||
toolchain: ${{ env.RUST_TOOLCHAIN }}
|
||||
|
||||
- name: Set up MSYS2
|
||||
uses: msys2/setup-msys2@cafece8e6baf9247cf9b1bf95097b0b983cc558d # v2.31.0
|
||||
uses: msys2/setup-msys2@e9898307ac31d1a803454791be09ab9973336e1c # v2.31.1
|
||||
with:
|
||||
msystem: ${{ matrix.msystem }}
|
||||
update: true
|
||||
|
|
|
|||
769
Cargo.lock
generated
769
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
|
@ -148,15 +148,13 @@ flate2 = "1.1"
|
|||
thousands = "0.2.0"
|
||||
crossbeam-skiplist = "0.1.3"
|
||||
tokio-postgres = { version = "0.7", default-features = false, features = ["runtime"] }
|
||||
mongodb = { version = "3.4", default-features = false, features = ["rustls-tls", "aws-auth", "compat-3-0-0", "dns-resolver"] }
|
||||
mongodb = { git = "https://github.com/mongodb/mongo-rust-driver", rev = "bdddefc50c4794d51d10b944320d42c6eb216b04", default-features = false, features = ["rustls-tls", "aws-auth", "compat-3-0-0", "dns-resolver"] }
|
||||
mysql_async = { version = "0.36.2", default-features = false, features = ["default-rustls"] }
|
||||
aws-config = { version = "1.8.14", default-features = false, features = ["default-https-client", "rt-tokio", "credentials-process", "sso"] }
|
||||
aws-credential-types = "1.2.12"
|
||||
aws-sdk-sts = { version = "1.98.0", default-features = false, features = ["default-https-client", "rt-tokio"] }
|
||||
aws-types = "1.3.12"
|
||||
parking_lot = "0.12.5"
|
||||
octorust = "0.10.0"
|
||||
reqwest-middleware-octorust = { package = "reqwest-middleware", version = "0.4.2" }
|
||||
tracing-subscriber = {version = "0.3.22", features = ["env-filter"] }
|
||||
tracing-core = "0.1.35"
|
||||
aws-smithy-http-client = "1.1.10"
|
||||
|
|
@ -252,7 +250,7 @@ proptest = "1.9.0"
|
|||
[profile.release]
|
||||
debug = false
|
||||
strip = true
|
||||
opt-level = "s" #3 # Maximum optimization for performance
|
||||
opt-level = "s" # Optimize for smaller binary size over speed
|
||||
lto = true # Enable Link Time Optimization
|
||||
codegen-units = 1 # Optimize for size but slower compilation
|
||||
panic = "abort" # Remove unwind tables for panics
|
||||
|
|
|
|||
|
|
@ -235,7 +235,7 @@ impl BlobId {
|
|||
pub fn new(input: &[u8]) -> Self {
|
||||
const CHUNK: usize = 64 * 1024; // 64KB from start and end
|
||||
let mut hasher = Sha1::new();
|
||||
hasher.update(format!("blob {}\0", input.len()).as_bytes());
|
||||
update_git_blob_header(&mut hasher, input.len());
|
||||
if input.len() <= CHUNK * 2 {
|
||||
hasher.update(input);
|
||||
} else {
|
||||
|
|
@ -249,7 +249,7 @@ impl BlobId {
|
|||
/// Computes a `BlobId` from the complete bytes (no truncation).
|
||||
pub fn compute_from_bytes(bytes: &[u8]) -> Self {
|
||||
let mut hasher = Sha1::new();
|
||||
hasher.update(format!("blob {}\0", bytes.len()).as_bytes());
|
||||
update_git_blob_header(&mut hasher, bytes.len());
|
||||
hasher.update(bytes);
|
||||
let digest: [u8; 20] = hasher.finalize().into();
|
||||
BlobId(digest)
|
||||
|
|
@ -277,6 +277,27 @@ impl BlobId {
|
|||
}
|
||||
}
|
||||
|
||||
fn update_git_blob_header(hasher: &mut Sha1, len: usize) {
|
||||
let mut digits = [0u8; 20];
|
||||
let mut n = len;
|
||||
let mut i = digits.len();
|
||||
|
||||
if n == 0 {
|
||||
i -= 1;
|
||||
digits[i] = b'0';
|
||||
} else {
|
||||
while n > 0 {
|
||||
i -= 1;
|
||||
digits[i] = b'0' + (n % 10) as u8;
|
||||
n /= 10;
|
||||
}
|
||||
}
|
||||
|
||||
hasher.update(b"blob ");
|
||||
hasher.update(&digits[i..]);
|
||||
hasher.update(b"\0");
|
||||
}
|
||||
|
||||
impl<'de> Deserialize<'de> for BlobId {
|
||||
fn deserialize<D: serde::Deserializer<'de>>(d: D) -> std::result::Result<Self, D::Error> {
|
||||
struct Vis;
|
||||
|
|
|
|||
|
|
@ -187,7 +187,7 @@ p256 = { version = "0.13.2", optional = true }
|
|||
ed25519-dalek = { version = "2.2", features = ["pkcs8"], optional = true }
|
||||
hex = { workspace = true, optional = true }
|
||||
url = { version = "2.5.7", optional = true }
|
||||
mongodb = { version = "3.4", default-features = false, features = ["rustls-tls", "aws-auth", "compat-3-0-0", "dns-resolver"], optional = true }
|
||||
mongodb = { git = "https://github.com/mongodb/mongo-rust-driver", rev = "bdddefc50c4794d51d10b944320d42c6eb216b04", default-features = false, features = ["rustls-tls", "aws-auth", "compat-3-0-0", "dns-resolver"], optional = true }
|
||||
mysql_async = { version = "0.36.2", default-features = false, features = ["default-rustls"], optional = true }
|
||||
tokio-postgres = { version = "0.7", default-features = false, features = ["runtime"], optional = true }
|
||||
tokio-postgres-rustls = { version = "0.13.0", optional = true }
|
||||
|
|
|
|||
392
fuzz/Cargo.lock
generated
392
fuzz/Cargo.lock
generated
|
|
@ -123,9 +123,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "arc-swap"
|
||||
version = "1.8.2"
|
||||
version = "1.9.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f9f3647c145568cec02c42054e07bdf9a5a698e15b466fb2341bfc393cd24aa5"
|
||||
checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207"
|
||||
dependencies = [
|
||||
"rustversion",
|
||||
]
|
||||
|
|
@ -172,6 +172,15 @@ dependencies = [
|
|||
"generic-array",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "block-buffer"
|
||||
version = "0.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be"
|
||||
dependencies = [
|
||||
"hybrid-array",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bstr"
|
||||
version = "1.12.1"
|
||||
|
|
@ -332,6 +341,12 @@ dependencies = [
|
|||
"cc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cmov"
|
||||
version = "0.5.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3f88a43d011fc4a6876cb7344703e297c71dda42494fee094d5f7c76bf13f746"
|
||||
|
||||
[[package]]
|
||||
name = "colorchoice"
|
||||
version = "1.0.5"
|
||||
|
|
@ -360,6 +375,12 @@ dependencies = [
|
|||
"windows-sys 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "const-oid"
|
||||
version = "0.10.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c"
|
||||
|
||||
[[package]]
|
||||
name = "core-foundation-sys"
|
||||
version = "0.8.7"
|
||||
|
|
@ -447,6 +468,24 @@ dependencies = [
|
|||
"typenum",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crypto-common"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710"
|
||||
dependencies = [
|
||||
"hybrid-array",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ctutils"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e"
|
||||
dependencies = [
|
||||
"cmov",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "dashmap"
|
||||
version = "6.1.0"
|
||||
|
|
@ -494,9 +533,20 @@ version = "0.10.7"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
|
||||
dependencies = [
|
||||
"block-buffer",
|
||||
"crypto-common",
|
||||
"subtle",
|
||||
"block-buffer 0.10.4",
|
||||
"crypto-common 0.1.7",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "digest"
|
||||
version = "0.11.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2"
|
||||
dependencies = [
|
||||
"block-buffer 0.12.0",
|
||||
"const-oid",
|
||||
"crypto-common 0.2.1",
|
||||
"ctutils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -718,9 +768,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix"
|
||||
version = "0.81.0"
|
||||
version = "0.83.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0473c64d9ccbcfb9953a133b47c8b9a335b87ac6c52b983ee4b03d49000b0f3f"
|
||||
checksum = "6ce52001b946a6249d5d0d3011df0a042ac3f8a4d013460db6476577b0b9c567"
|
||||
dependencies = [
|
||||
"gix-actor",
|
||||
"gix-archive",
|
||||
|
|
@ -777,22 +827,21 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-actor"
|
||||
version = "0.40.0"
|
||||
version = "0.41.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0e5e5b518339d5e6718af108fd064d4e9ba33caf728cf487352873d76411df35"
|
||||
checksum = "272916673b83714734b15d4ef3c8b5f1ccddb15fea8ff548430b97c1ab7b7ed8"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-date",
|
||||
"gix-error",
|
||||
"serde",
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gix-archive"
|
||||
version = "0.30.0"
|
||||
version = "0.32.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "651c99be11aac9b303483193ae50b45eb6e094da4f5ed797019b03948f51aad6"
|
||||
checksum = "9a20ec244b733338d4cb60e5e05eac700dab7fcc689647b1d1daa9396b119342"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-date",
|
||||
|
|
@ -803,9 +852,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-attributes"
|
||||
version = "0.31.0"
|
||||
version = "0.33.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c233d6eaa098c0ca5ce03236fd7a96e27f1abe72fad74b46003fbd11fe49563c"
|
||||
checksum = "fe17c5a1c0b6f2ef1476aa1d3222ea50cdff67608016613a58bfc3e078046000"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-glob",
|
||||
|
|
@ -821,18 +870,18 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-bitmap"
|
||||
version = "0.3.0"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e7add20f40d060db8c9b1314d499bac6ed7480f33eb113ce3e1cf5d6ff85d989"
|
||||
checksum = "1ecbfc77ec6852294e341ecc305a490b59f2813e6ca42d79efda5099dcab1894"
|
||||
dependencies = [
|
||||
"gix-error",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gix-blame"
|
||||
version = "0.11.0"
|
||||
version = "0.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c77aaf9f7348f4da3ebfbfbbc35fa0d07155d98377856198dde6f695fd648705"
|
||||
checksum = "14dab9a942ab54a9661ded7397c3bf927274e7afa94494db0d75cfcbde02ca0a"
|
||||
dependencies = [
|
||||
"gix-commitgraph",
|
||||
"gix-date",
|
||||
|
|
@ -850,18 +899,18 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-chunk"
|
||||
version = "0.7.0"
|
||||
version = "0.7.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1096b6608fbe5d27fb4984e20f992b4e76fb8c613f6acb87d07c5831b53a6959"
|
||||
checksum = "edf288be9b60fe7231de03771faa292be1493d84786f68727e33ad1f91764320"
|
||||
dependencies = [
|
||||
"gix-error",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gix-command"
|
||||
version = "0.8.0"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b849c65a609f50d02f8a2774fe371650b3384a743c79c2a070ce0da49b7fb7da"
|
||||
checksum = "86335306511abe43d75c866d4b1f3d90932fe202edcd43e1314036333e7384d8"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-path",
|
||||
|
|
@ -872,9 +921,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-commitgraph"
|
||||
version = "0.35.0"
|
||||
version = "0.37.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3196655fd1443f3c58a48c114aa480be3e4e87b393d7292daaa0d543862eb445"
|
||||
checksum = "fe3b5aa0f24e19028c261d229aeeedafcaaa52ebd71021cc15184620fc9d32eb"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-chunk",
|
||||
|
|
@ -887,9 +936,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-config"
|
||||
version = "0.54.0"
|
||||
version = "0.56.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "08939b4c4ed7a663d0e64be9e1e9bdf23a1fb4fcee1febdf449f12229542e50d"
|
||||
checksum = "8c01848aebd21c67f6ba41f1de8efd46ae96df21f001954a3c9e1517e514d410"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-config-value",
|
||||
|
|
@ -898,18 +947,16 @@ dependencies = [
|
|||
"gix-path",
|
||||
"gix-ref",
|
||||
"gix-sec",
|
||||
"memchr",
|
||||
"smallvec",
|
||||
"thiserror 2.0.18",
|
||||
"unicode-bom",
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gix-config-value"
|
||||
version = "0.17.1"
|
||||
version = "0.18.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "441a300bc3645a1f45cba495b9175f90f47256ce43f2ee161da0031e3ac77c92"
|
||||
checksum = "13b39ed39ee4c10a3b157f9fb94bac8098d9f8e56201f0cf7dee6c187416c4b2"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"bstr",
|
||||
|
|
@ -920,9 +967,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-credentials"
|
||||
version = "0.37.1"
|
||||
version = "0.38.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "38b2a34b8715e3bbd514f3d1705f5d51c4b250e5bfe506b9fb60b133c85c93d9"
|
||||
checksum = "65ca11598b70811d7b16ff90945a6e57dfe521e85b744e51636965fe39cc8f60"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-command",
|
||||
|
|
@ -939,9 +986,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-date"
|
||||
version = "0.15.1"
|
||||
version = "0.15.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "39acf819aa9fee65e4838a2eec5cb2506e47ebb89e02a5ab9918196e491571ea"
|
||||
checksum = "b94cdae4eb4b0f4136e3d9b3aa2d2cd03cfb5bb9b636b31263aea2df86d41543"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-error",
|
||||
|
|
@ -953,31 +1000,30 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-diff"
|
||||
version = "0.61.0"
|
||||
version = "0.63.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "88f3b3475e5d3877d7c30c40827cc2441936ce890efc226e5ba4afe3a7ae33f0"
|
||||
checksum = "dc08e0fa1a91ff5f24affeab052f198056645e1de004910bde7b82b50ea5982a"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-command",
|
||||
"gix-filter",
|
||||
"gix-fs",
|
||||
"gix-hash",
|
||||
"gix-imara-diff",
|
||||
"gix-object",
|
||||
"gix-path",
|
||||
"gix-tempfile",
|
||||
"gix-trace",
|
||||
"gix-traverse",
|
||||
"gix-worktree",
|
||||
"imara-diff 0.1.8",
|
||||
"imara-diff 0.2.0",
|
||||
"thiserror 2.0.18",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gix-dir"
|
||||
version = "0.23.0"
|
||||
version = "0.25.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5da4604a360988f0ba8efe6f90093ca5a844f4a7f8e1a3dcda501ec44e600ea9"
|
||||
checksum = "32a0fc06e9e1e430cbf0a313666976d90f822f461a6525320427aa9b8af5236c"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-discover",
|
||||
|
|
@ -995,9 +1041,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-discover"
|
||||
version = "0.49.0"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c65bd3330fe0cb9d40d875bf862fd5e8ad6fa4164ddbc4842fbeb889c3f0b2c6"
|
||||
checksum = "17852e6a501e688a1702b24ebe5b3761d4719455bc869fd29f38b0b859bcad34"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"dunce",
|
||||
|
|
@ -1010,18 +1056,18 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-error"
|
||||
version = "0.2.1"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2e86d01da904d4a9265def43bd42a18c5e6dc7000a73af512946ba14579c9fbd"
|
||||
checksum = "e207b971746ab724fccdfced2e4e19e854744611904a0195d3aa8fda8a110613"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gix-features"
|
||||
version = "0.46.2"
|
||||
version = "0.48.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "752493cd4b1d5eaaa0138a7493f65c96863fefa990fc021e0e519579e389ab20"
|
||||
checksum = "af375693ad5333d0a2c66b4c5b2cbe9ccc38e34f8e8bf24e4ae42c12307fdc4f"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"crc32fast",
|
||||
|
|
@ -1038,9 +1084,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-filter"
|
||||
version = "0.28.0"
|
||||
version = "0.30.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d37598282a6566da6fb52667570c7fe0aedcb122ac886724a9e62a2180523e35"
|
||||
checksum = "dac917dbe9653c9b615d248db91907a365bd779750c9e1b457a9d9fdeece3a08"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"encoding_rs",
|
||||
|
|
@ -1059,9 +1105,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-fs"
|
||||
version = "0.19.2"
|
||||
version = "0.21.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a964b4aec683eb0bacb87533defa80805bb4768056371a47ab38b00a2d377b72"
|
||||
checksum = "1e1967daac9848757c47c2aef0c57bcadc1a897347f559778249bf286a536c86"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"fastrand",
|
||||
|
|
@ -1073,9 +1119,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-glob"
|
||||
version = "0.24.0"
|
||||
version = "0.26.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b03e6cd88cc0dc1eafa1fddac0fb719e4e74b6ea58dd016e71125fde4a326bee"
|
||||
checksum = "08bf29249a069bf2507f5964f80997f37b134d320ea348d66527726b9be2c38c"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"bstr",
|
||||
|
|
@ -1086,9 +1132,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-hash"
|
||||
version = "0.23.0"
|
||||
version = "0.25.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fb896a02d9ab96fa518475a5f30ad3952010f801a8de5840f633f4a6b985dfb"
|
||||
checksum = "bcf70d1e252337eed16360f8b8ebb71865ece58eab7954b39ce38b420de703d2"
|
||||
dependencies = [
|
||||
"faster-hex",
|
||||
"gix-features",
|
||||
|
|
@ -1099,9 +1145,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-hashtable"
|
||||
version = "0.13.0"
|
||||
version = "0.15.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2664216fc5e89b51e756a4a3ac676315602ce2dac07acf1da959a22038d69b33"
|
||||
checksum = "d33b455e07b3c16d3b2eeebc7b38d2dafcbf8a653de1138ef55d4c2a1fd0b08b"
|
||||
dependencies = [
|
||||
"gix-hash",
|
||||
"hashbrown 0.16.1",
|
||||
|
|
@ -1110,9 +1156,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-ignore"
|
||||
version = "0.19.1"
|
||||
version = "0.21.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09f915dcf6911e3027537166d34e13f0fe101ed12225178d2ae29cd1272cff26"
|
||||
checksum = "6bb13fbbeeafee943e52b61fcc88dfddf6a452fcaf0c4d0cdc8f218fa25bbec5"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-glob",
|
||||
|
|
@ -1123,10 +1169,20 @@ dependencies = [
|
|||
]
|
||||
|
||||
[[package]]
|
||||
name = "gix-index"
|
||||
version = "0.49.0"
|
||||
name = "gix-imara-diff"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1bae54ab14e4e74d5dda60b82ea7afad7c8eb3be68283d6d5f29bd2e6d47fff7"
|
||||
checksum = "39eb0623e15e4cb83c02ce6a959e48fadd1ae3b715b36b5acc01816e01388c82"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"hashbrown 0.16.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gix-index"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "54c3ef97ad08121e4327a6226bd63fed6b9e3c6b976d48bddd4356d9d41191db"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"bstr",
|
||||
|
|
@ -1153,9 +1209,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-lock"
|
||||
version = "21.0.1"
|
||||
version = "23.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cbe09cf05ba7c679bba189acc29eeea137f643e7fff1b5dff879dfd45248be31"
|
||||
checksum = "09b3bc074e5723027b482dcd9ab99d95804a53742f6de812d0172fbba4a186c1"
|
||||
dependencies = [
|
||||
"gix-tempfile",
|
||||
"gix-utils",
|
||||
|
|
@ -1164,9 +1220,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-mailmap"
|
||||
version = "0.32.0"
|
||||
version = "0.33.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c7b4818da522786ec7e32a00884ee8fc40fa4c215c3997c0b15f7b62684d1199"
|
||||
checksum = "023d3a6561cbebe45b89e0764d48928ad970667076f16fa5889e6f86d8432086"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-actor",
|
||||
|
|
@ -1177,9 +1233,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-merge"
|
||||
version = "0.14.0"
|
||||
version = "0.16.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f4606747466512d22c2dffc019142e1941238f543987ea51353c938cca80c500"
|
||||
checksum = "74bbcdcc52b70a32f0a151b024dff9d0fcf56ee48f00d9503e735af9d99ea881"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-command",
|
||||
|
|
@ -1187,6 +1243,7 @@ dependencies = [
|
|||
"gix-filter",
|
||||
"gix-fs",
|
||||
"gix-hash",
|
||||
"gix-imara-diff",
|
||||
"gix-index",
|
||||
"gix-object",
|
||||
"gix-path",
|
||||
|
|
@ -1196,16 +1253,15 @@ dependencies = [
|
|||
"gix-tempfile",
|
||||
"gix-trace",
|
||||
"gix-worktree",
|
||||
"imara-diff 0.1.8",
|
||||
"nonempty",
|
||||
"thiserror 2.0.18",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gix-negotiate"
|
||||
version = "0.29.0"
|
||||
version = "0.31.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6ea064c7595eea08fdd01c70748af747d9acc40f727b61f4c8a2145a5c5fc28c"
|
||||
checksum = "103d42bfade1b8a96ca5005933127bdad461ce588d92422b2c2daa3ff20d780c"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"gix-commitgraph",
|
||||
|
|
@ -1217,9 +1273,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-object"
|
||||
version = "0.58.0"
|
||||
version = "0.60.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cafb802bb688a7c1e69ef965612ff5ff859f046bfb616377e4a0ba4c01e43d47"
|
||||
checksum = "a38075a95d7cc5df8afd38e72c617026c1456952207a4120a7f55a3fbf93b4d7"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-actor",
|
||||
|
|
@ -1227,21 +1283,19 @@ dependencies = [
|
|||
"gix-features",
|
||||
"gix-hash",
|
||||
"gix-hashtable",
|
||||
"gix-path",
|
||||
"gix-utils",
|
||||
"gix-validate",
|
||||
"itoa",
|
||||
"serde",
|
||||
"smallvec",
|
||||
"thiserror 2.0.18",
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gix-odb"
|
||||
version = "0.78.0"
|
||||
version = "0.80.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "24833ae9323b4f7079575fb9f961cf9c414b0afbec428a536ab8e7dd93bc002b"
|
||||
checksum = "aeeda12a9663120418735ecdc1250d06eeab0be75700e47b3402a981331716ba"
|
||||
dependencies = [
|
||||
"arc-swap",
|
||||
"gix-features",
|
||||
|
|
@ -1252,6 +1306,7 @@ dependencies = [
|
|||
"gix-pack",
|
||||
"gix-path",
|
||||
"gix-quote",
|
||||
"memmap2",
|
||||
"parking_lot",
|
||||
"serde",
|
||||
"tempfile",
|
||||
|
|
@ -1260,9 +1315,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-pack"
|
||||
version = "0.68.0"
|
||||
version = "0.70.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e3484119cd19859d7d7639413c27e192478fa354d3f4ff5f7e3c041e8040f0f4"
|
||||
checksum = "daf02e6f5c8f07a069c9ea5245f40d9b14856ada4086091dc99941b49002b4fa"
|
||||
dependencies = [
|
||||
"clru",
|
||||
"gix-chunk",
|
||||
|
|
@ -1280,9 +1335,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-packetline"
|
||||
version = "0.21.2"
|
||||
version = "0.21.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "be19313dcdb7dff75a3ce2f99be00878458295bcc3b6c7f0005591597573345c"
|
||||
checksum = "362246df440ee691699f0664cbf7006a6ece477db6734222be95e4198e5656e6"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"faster-hex",
|
||||
|
|
@ -1292,9 +1347,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-path"
|
||||
version = "0.11.2"
|
||||
version = "0.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09c31d4373bda7fab9eb01822927b55185a378d6e1bf737e0a54c743ad806658"
|
||||
checksum = "671a6059e8a4c1b7f406e24716499cefa3926e060876fb1959ef225efeee346e"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-trace",
|
||||
|
|
@ -1304,9 +1359,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-pathspec"
|
||||
version = "0.16.1"
|
||||
version = "0.18.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f89611f13544ca5ebeb68a502673814ef57200df60c24a61c2ce7b96f612f08b"
|
||||
checksum = "2a84a4f083dd70fb49f4377e13afa6d90df2daaa1c705c49d6ff1331fc7e8855"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"bstr",
|
||||
|
|
@ -1319,9 +1374,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-prompt"
|
||||
version = "0.14.1"
|
||||
version = "0.15.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0f61f6264e1f6c5a951531fe127722c7522bc02ebda80c4528286bda4642055f"
|
||||
checksum = "e041a626c64cb69e4117fcdf80da8d0e454fba3b1f420412792d191f52251aee"
|
||||
dependencies = [
|
||||
"gix-command",
|
||||
"gix-config-value",
|
||||
|
|
@ -1332,9 +1387,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-protocol"
|
||||
version = "0.59.0"
|
||||
version = "0.61.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4f38666350736b5877c79f57ddae02bde07a4ce186d889adc391e831cddcbe76"
|
||||
checksum = "aa4bee82db63ec635996b96efae71cf467c155fa3f34a556184373224a26c4fd"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-date",
|
||||
|
|
@ -1348,14 +1403,13 @@ dependencies = [
|
|||
"nonempty",
|
||||
"serde",
|
||||
"thiserror 2.0.18",
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gix-quote"
|
||||
version = "0.7.0"
|
||||
version = "0.7.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "68533db71259c8776dd4e770d2b7b98696213ecdc1f5c9e3507119e274e0c578"
|
||||
checksum = "6e97b73791a64bc0fa7dd2c5b3e551136115f97750b876ed1c952c7a7dbaf8be"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-error",
|
||||
|
|
@ -1364,9 +1418,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-ref"
|
||||
version = "0.61.0"
|
||||
version = "0.63.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c2159978abb99b7027c8579d15211e262ef0ef2594d5cecb3334fbcbdfe2997c"
|
||||
checksum = "d8ba9cc15f558b274c99349b83130f5ec83459660828fde9718bbbb43a726167"
|
||||
dependencies = [
|
||||
"gix-actor",
|
||||
"gix-features",
|
||||
|
|
@ -1381,14 +1435,13 @@ dependencies = [
|
|||
"memmap2",
|
||||
"serde",
|
||||
"thiserror 2.0.18",
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gix-refspec"
|
||||
version = "0.39.0"
|
||||
version = "0.41.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc806ee13f437428f8a1ba4c72ecfaa3f20e14f5f0d4c2bc17d0b33e794aa6ac"
|
||||
checksum = "61755b27d57edc8940a1b1593c8c61548ca8e4c02da1ed8d5bfeda9eb2a6b761"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-error",
|
||||
|
|
@ -1402,9 +1455,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-revision"
|
||||
version = "0.43.0"
|
||||
version = "0.45.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7c08f1ec5d1e6a524f8ba291c41f0ccaef64e48ed0e8cf790b3461cae45f6d3d"
|
||||
checksum = "1fb5288fac706d3ea3e4e2ba9ec38b78743b8c02f422e18cb342299cfd6ab7e8"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"bstr",
|
||||
|
|
@ -1421,9 +1474,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-revwalk"
|
||||
version = "0.29.0"
|
||||
version = "0.31.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0e4b2b87772b21ca449249e86d32febadba5cba32b0fcce804ab9cefc6f2111c"
|
||||
checksum = "313813706b073a12ff7f9b2896bf3e6504cdac7cfbc97b1920114724705069f0"
|
||||
dependencies = [
|
||||
"gix-commitgraph",
|
||||
"gix-date",
|
||||
|
|
@ -1437,9 +1490,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-sec"
|
||||
version = "0.13.2"
|
||||
version = "0.14.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bf82ae037de9c62850ce67beaa92ec8e3e17785ea307cdde7618edc215603b4f"
|
||||
checksum = "f5a3a2d3e504a238136751e646a6c028252286a0ea64ea9974bf0498633407c6"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"gix-path",
|
||||
|
|
@ -1450,9 +1503,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-shallow"
|
||||
version = "0.10.0"
|
||||
version = "0.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cbf60711c9083b2364b3fac8a352444af76b17201f3682fdebe74fa66d89a772"
|
||||
checksum = "29187305521bfacf4aefd284ab28dbfa9fb74abd39a5e63dd313b1baa5808c27"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-hash",
|
||||
|
|
@ -1464,9 +1517,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-status"
|
||||
version = "0.28.0"
|
||||
version = "0.30.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "23d6c598e3fdbc352fba1c5ba7e709e69402fafbc44d9295edad2e3c4738996b"
|
||||
checksum = "68c6d2a8c521ffa205fe7e268c82e6d1378ba37cd826ca10ab6129fdc29a4b65"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"filetime",
|
||||
|
|
@ -1487,9 +1540,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-submodule"
|
||||
version = "0.28.0"
|
||||
version = "0.30.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0ce5c3929c5e6821f651d35e8420f72fea3cfafe9fc1e928a61e718b462c72a5"
|
||||
checksum = "9fd5fc8692890bd71a596e540fd4c364f8460eaa82c4eaaedebde6e1e3eb4d91"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-config",
|
||||
|
|
@ -1502,9 +1555,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-tempfile"
|
||||
version = "21.0.1"
|
||||
version = "23.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9d9ab2c89fe4bfd4f1d8700aa4516534c170d8a21ae2c554167374607c2eaf16"
|
||||
checksum = "691ea1e31435c7e7d4d04705ec9d1c0d9482c46b2acf512bc723939d8f0af7fb"
|
||||
dependencies = [
|
||||
"dashmap",
|
||||
"gix-fs",
|
||||
|
|
@ -1515,15 +1568,15 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-trace"
|
||||
version = "0.1.18"
|
||||
version = "0.1.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f69a13643b8437d4ca6845e08143e847a36ca82903eed13303475d0ae8b162e0"
|
||||
checksum = "6f23569e55f2ffaf958617353b9734a7d52a7c19c439eeaa5e3efc217fd2270e"
|
||||
|
||||
[[package]]
|
||||
name = "gix-transport"
|
||||
version = "0.55.1"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a521e39c6235ce63ed6c001e2dd79818c830b82c3b7b59247ee7b229c39ec9bb"
|
||||
checksum = "ffd6a5c676b92d4ead5f5a2b2935024415dec69edc997b6090ca9cac010a3018"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-command",
|
||||
|
|
@ -1538,9 +1591,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-traverse"
|
||||
version = "0.55.0"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "963dc2afcdb611092aa587c3f9365e749ac0a0892ff27662dbc75f26c953fbec"
|
||||
checksum = "a14b7052c0786676c03e71fcfde7d7f0f8e8316e642b5cec6bb3998719b2ce5c"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"gix-commitgraph",
|
||||
|
|
@ -1555,9 +1608,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-url"
|
||||
version = "0.35.2"
|
||||
version = "0.36.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d28e8af3d42581190da884f013caf254d2fd4d6ab102408f08d21bfa11de6c8d"
|
||||
checksum = "35842d099e813f6f6bba529e88d4670572149c3df79b7a412952259887721ece"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-path",
|
||||
|
|
@ -1568,9 +1621,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-utils"
|
||||
version = "0.3.1"
|
||||
version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "befcdbdfb1238d2854591f760a48711bed85e72d80a10e8f2f93f656746ef7c5"
|
||||
checksum = "4e477b4f07a6e8da4ba791c53c858102959703c60d70f199932010d5b94adb2c"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"fastrand",
|
||||
|
|
@ -1579,18 +1632,18 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-validate"
|
||||
version = "0.11.0"
|
||||
version = "0.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0ec1eff98d91941f47766367cba1be746bab662bad761d9891ae6f7882f7840b"
|
||||
checksum = "e26ac2602b43eadfdca0560b81d3341944162a3c9f64ccdeef8fc501ad80dad5"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gix-worktree"
|
||||
version = "0.50.0"
|
||||
version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e6bd5830cbc43c9c00918b826467d2afad685b195cb82329cde2b2d116d2c578"
|
||||
checksum = "d69955eb5e2910832f88d041964b809eee01dadd579237e0b55efec58fd406fd"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-attributes",
|
||||
|
|
@ -1607,9 +1660,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-worktree-state"
|
||||
version = "0.28.0"
|
||||
version = "0.30.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "644a1681f96e1be43c2a8384337d9d220e7624f50db54beda70997052aebf707"
|
||||
checksum = "8a96dccbcf9e8fe0291c55f06e08da93ebb2e691c1311276f541eefcc6d70800"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"gix-features",
|
||||
|
|
@ -1625,9 +1678,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gix-worktree-stream"
|
||||
version = "0.30.0"
|
||||
version = "0.32.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "24e3fb70a1f650a5cec7d5b8d10d6d6fe86daf3cf15bde08ba0c70988a2932c3"
|
||||
checksum = "9a8444b8ed4662e1a0c97f3eceda29630001a1bbb2632201e50312623e594213"
|
||||
dependencies = [
|
||||
"gix-attributes",
|
||||
"gix-error",
|
||||
|
|
@ -1748,11 +1801,11 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
|
|||
|
||||
[[package]]
|
||||
name = "hmac"
|
||||
version = "0.12.1"
|
||||
version = "0.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
|
||||
checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f"
|
||||
dependencies = [
|
||||
"digest",
|
||||
"digest 0.11.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -1783,6 +1836,15 @@ dependencies = [
|
|||
"libm",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hybrid-array"
|
||||
version = "0.4.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da"
|
||||
dependencies = [
|
||||
"typenum",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iana-time-zone"
|
||||
version = "0.1.65"
|
||||
|
|
@ -1829,25 +1891,6 @@ dependencies = [
|
|||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "imara-diff"
|
||||
version = "0.1.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "17d34b7d42178945f775e84bc4c36dde7c1c6cdfea656d3354d009056f2bb3d2"
|
||||
dependencies = [
|
||||
"hashbrown 0.15.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "imara-diff"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2f01d462f766df78ab820dd06f5eb700233c51f0f4c2e846520eaf4ba6aa5c5c"
|
||||
dependencies = [
|
||||
"hashbrown 0.15.5",
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "include_dir"
|
||||
version = "0.7.4"
|
||||
|
|
@ -2008,7 +2051,7 @@ dependencies = [
|
|||
"schemars",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"sha1",
|
||||
"sha1 0.11.0",
|
||||
"smallvec",
|
||||
"thiserror 2.0.18",
|
||||
"tokei",
|
||||
|
|
@ -2032,6 +2075,7 @@ dependencies = [
|
|||
"base32",
|
||||
"base64",
|
||||
"crc32fast",
|
||||
"hex",
|
||||
"hmac",
|
||||
"ignore",
|
||||
"include_dir",
|
||||
|
|
@ -2045,8 +2089,8 @@ dependencies = [
|
|||
"serde",
|
||||
"serde_json",
|
||||
"serde_yaml",
|
||||
"sha1",
|
||||
"sha2",
|
||||
"sha1 0.11.0",
|
||||
"sha2 0.11.0",
|
||||
"thiserror 2.0.18",
|
||||
"time",
|
||||
"tracing",
|
||||
|
|
@ -2362,7 +2406,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220"
|
||||
dependencies = [
|
||||
"pest",
|
||||
"sha2",
|
||||
"sha2 0.10.9",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2768,7 +2812,18 @@ checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
|
|||
dependencies = [
|
||||
"cfg-if",
|
||||
"cpufeatures 0.2.17",
|
||||
"digest",
|
||||
"digest 0.10.7",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sha1"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"cpufeatures 0.3.0",
|
||||
"digest 0.11.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2777,8 +2832,8 @@ version = "0.10.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "89f599ac0c323ebb1c6082821a54962b839832b03984598375bff3975b804423"
|
||||
dependencies = [
|
||||
"digest",
|
||||
"sha1",
|
||||
"digest 0.10.7",
|
||||
"sha1 0.10.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2789,7 +2844,18 @@ checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
|
|||
dependencies = [
|
||||
"cfg-if",
|
||||
"cpufeatures 0.2.17",
|
||||
"digest",
|
||||
"digest 0.10.7",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sha2"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"cpufeatures 0.3.0",
|
||||
"digest 0.11.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2847,12 +2913,6 @@ version = "0.11.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
||||
|
||||
[[package]]
|
||||
name = "subtle"
|
||||
version = "2.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.117"
|
||||
|
|
@ -3132,9 +3192,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "typenum"
|
||||
version = "1.19.0"
|
||||
version = "1.20.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb"
|
||||
checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de"
|
||||
|
||||
[[package]]
|
||||
name = "ucd-trie"
|
||||
|
|
|
|||
|
|
@ -50,17 +50,17 @@ pub enum CompressedContent {
|
|||
}
|
||||
|
||||
pub fn is_safe_extract_path(path: &Path) -> bool {
|
||||
for (idx, comp) in path.components().enumerate() {
|
||||
if path.is_absolute() {
|
||||
return false;
|
||||
}
|
||||
|
||||
for comp in path.components() {
|
||||
match comp {
|
||||
// Never allow parent-directory escapes
|
||||
Component::ParentDir => return false,
|
||||
|
||||
// Leading "C:\" (Windows) or "/" (Unix) is fine;
|
||||
// a prefix later in the path would be suspicious.
|
||||
Component::Prefix(_) | Component::RootDir if idx == 0 => continue,
|
||||
|
||||
// A prefix *inside* the path (e.g. "foo/C:\evil") is unsafe
|
||||
Component::Prefix(_) => return false,
|
||||
// Archive entry names must always be relative to the extraction root.
|
||||
Component::Prefix(_) | Component::RootDir => return false,
|
||||
|
||||
_ => {}
|
||||
}
|
||||
|
|
@ -68,6 +68,17 @@ pub fn is_safe_extract_path(path: &Path) -> bool {
|
|||
true
|
||||
}
|
||||
|
||||
fn has_parent_or_embedded_prefix(path: &Path) -> bool {
|
||||
for (idx, comp) in path.components().enumerate() {
|
||||
match comp {
|
||||
Component::ParentDir => return true,
|
||||
Component::Prefix(_) if idx > 0 => return true,
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn is_zip_format(ext: &str) -> bool {
|
||||
ZIP_BASED_FORMATS.iter().any(|z| z == &ext)
|
||||
}
|
||||
|
|
@ -87,6 +98,10 @@ fn handle_tar_archive_streaming(
|
|||
let mut entry = entry?;
|
||||
if entry.header().entry_type().is_file() {
|
||||
let path_in_tar = entry.path()?.to_string_lossy().to_string();
|
||||
if !is_safe_extract_path(Path::new(&path_in_tar)) {
|
||||
tracing::warn!("unsafe tar path: {path_in_tar}");
|
||||
continue;
|
||||
}
|
||||
let logical_path = format!("{}!{}", archive_path.display(), path_in_tar);
|
||||
|
||||
let out_path = base_dir.join(&path_in_tar);
|
||||
|
|
@ -96,10 +111,6 @@ fn handle_tar_archive_streaming(
|
|||
continue;
|
||||
}
|
||||
}
|
||||
if !is_safe_extract_path(&out_path) {
|
||||
tracing::warn!("unsafe tar path: {}", out_path.display());
|
||||
continue;
|
||||
}
|
||||
match fs::File::create(&out_path) {
|
||||
Ok(mut out_file) => {
|
||||
if let Err(e) = std::io::copy(&mut entry, &mut out_file) {
|
||||
|
|
@ -239,6 +250,10 @@ fn handle_zip_archive_streaming(
|
|||
let mut zipped_file = zip.by_index(i)?;
|
||||
if zipped_file.is_file() {
|
||||
let name_in_zip = zipped_file.name().to_string();
|
||||
if !is_safe_extract_path(Path::new(&name_in_zip)) {
|
||||
tracing::warn!("unsafe zip path: {name_in_zip}");
|
||||
continue;
|
||||
}
|
||||
let logical_path = format!("{}!{}", archive_path.display(), name_in_zip);
|
||||
|
||||
let out_path = base_dir.join(&name_in_zip);
|
||||
|
|
@ -248,10 +263,6 @@ fn handle_zip_archive_streaming(
|
|||
continue;
|
||||
}
|
||||
}
|
||||
if !is_safe_extract_path(&out_path) {
|
||||
tracing::warn!("unsafe zip path: {}", out_path.display());
|
||||
continue;
|
||||
}
|
||||
match fs::File::create(&out_path) {
|
||||
Ok(mut out_file) => {
|
||||
let mut limited = (&mut zipped_file).take(MAX_ZIP_ENTRY_DECOMPRESSED_BYTES);
|
||||
|
|
@ -381,7 +392,7 @@ fn handle_asar_archive_in_memory(buffer: &[u8], archive_path: &Path) -> Result<C
|
|||
|
||||
/// Validate and open a file for reading, checking for path traversal attacks.
|
||||
fn safe_open_for_read(path: &Path) -> Result<fs::File> {
|
||||
if !is_safe_extract_path(path) {
|
||||
if has_parent_or_embedded_prefix(path) {
|
||||
anyhow::bail!("unsafe input path during decompression: {}", path.display());
|
||||
}
|
||||
Ok(fs::File::open(path)?)
|
||||
|
|
@ -389,7 +400,7 @@ fn safe_open_for_read(path: &Path) -> Result<fs::File> {
|
|||
|
||||
/// Validate and create a file for writing, checking for path traversal attacks.
|
||||
fn safe_create_for_write(path: &Path) -> Result<fs::File> {
|
||||
if !is_safe_extract_path(path) {
|
||||
if has_parent_or_embedded_prefix(path) {
|
||||
anyhow::bail!("unsafe output path during decompression: {}", path.display());
|
||||
}
|
||||
Ok(fs::File::create(path)?)
|
||||
|
|
|
|||
196
src/github.rs
196
src/github.rs
|
|
@ -8,11 +8,6 @@ use std::{
|
|||
|
||||
use anyhow::{Context, Result};
|
||||
use indicatif::{ProgressBar, ProgressStyle};
|
||||
use octorust::{
|
||||
Client,
|
||||
auth::Credentials,
|
||||
types::{Order, ReposListOrgSort, ReposListOrgType, ReposListUserType},
|
||||
};
|
||||
use reqwest::StatusCode;
|
||||
use serde::Deserialize;
|
||||
use serde_json::Value;
|
||||
|
|
@ -33,6 +28,11 @@ struct GitHubRepo {
|
|||
fork: bool,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct GitHubOrg {
|
||||
login: String,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct RepoSpecifiers {
|
||||
pub user: Vec<String>,
|
||||
|
|
@ -52,21 +52,20 @@ pub enum RepoType {
|
|||
Source,
|
||||
Fork,
|
||||
}
|
||||
impl From<RepoType> for ReposListUserType {
|
||||
fn from(repo_type: RepoType) -> Self {
|
||||
match repo_type {
|
||||
RepoType::All => ReposListUserType::All,
|
||||
RepoType::Source => ReposListUserType::Owner,
|
||||
RepoType::Fork => ReposListUserType::Member,
|
||||
impl RepoType {
|
||||
fn user_query_value(&self) -> &'static str {
|
||||
match self {
|
||||
RepoType::All => "all",
|
||||
RepoType::Source => "owner",
|
||||
RepoType::Fork => "member",
|
||||
}
|
||||
}
|
||||
}
|
||||
impl From<RepoType> for ReposListOrgType {
|
||||
fn from(repo_type: RepoType) -> Self {
|
||||
match repo_type {
|
||||
RepoType::All => ReposListOrgType::All,
|
||||
RepoType::Source => ReposListOrgType::Sources,
|
||||
RepoType::Fork => ReposListOrgType::Forks,
|
||||
|
||||
fn org_query_value(&self) -> &'static str {
|
||||
match self {
|
||||
RepoType::All => "all",
|
||||
RepoType::Source => "sources",
|
||||
RepoType::Fork => "forks",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -128,34 +127,13 @@ fn build_exclude_matcher(exclude_repos: &[String]) -> git_host::ExcludeMatcher {
|
|||
fn should_exclude_repo(clone_url: &str, excludes: &git_host::ExcludeMatcher) -> bool {
|
||||
git_host::should_exclude_repo(clone_url, excludes, parse_repo_name_from_url)
|
||||
}
|
||||
fn create_github_client(github_url: &url::Url, ignore_certs: bool) -> Result<Arc<Client>> {
|
||||
// Try personal access token
|
||||
let credentials = if let Ok(token) = env::var("KF_GITHUB_TOKEN") {
|
||||
Credentials::Token(token)
|
||||
} else {
|
||||
Credentials::Token("".to_string()) // Anonymous access
|
||||
};
|
||||
|
||||
fn create_github_client(ignore_certs: bool) -> Result<Arc<reqwest::Client>> {
|
||||
let mut client_builder = reqwest::Client::builder();
|
||||
if ignore_certs {
|
||||
client_builder = client_builder.danger_accept_invalid_certs(ignore_certs);
|
||||
}
|
||||
|
||||
let reqwest_client = client_builder.build().context("Failed to build HTTP client")?;
|
||||
|
||||
let http_client = reqwest_middleware_octorust::ClientBuilder::new(reqwest_client).build();
|
||||
|
||||
let mut client = Client::custom(
|
||||
concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION")),
|
||||
credentials,
|
||||
http_client,
|
||||
);
|
||||
|
||||
// Override host if not using api.github.com
|
||||
if github_url.host_str() != Some("api.github.com") {
|
||||
client.with_host_override(github_url.as_str());
|
||||
}
|
||||
Ok(Arc::new(client))
|
||||
Ok(Arc::new(client_builder.build().context("Failed to build HTTP client")?))
|
||||
}
|
||||
|
||||
fn normalize_api_base(api_url: &Url) -> Url {
|
||||
|
|
@ -167,6 +145,77 @@ fn normalize_api_base(api_url: &Url) -> Url {
|
|||
base
|
||||
}
|
||||
|
||||
fn github_token() -> Option<String> {
|
||||
env::var("KF_GITHUB_TOKEN").ok().filter(|t| !t.is_empty())
|
||||
}
|
||||
|
||||
fn github_get(client: &reqwest::Client, url: Url, token: Option<&str>) -> reqwest::RequestBuilder {
|
||||
let req = client.get(url).header("User-Agent", GLOBAL_USER_AGENT.as_str());
|
||||
if let Some(token) = token { req.bearer_auth(token) } else { req }
|
||||
}
|
||||
|
||||
async fn fetch_github_orgs(
|
||||
client: &reqwest::Client,
|
||||
api_base: &Url,
|
||||
token: Option<&str>,
|
||||
) -> Result<Vec<String>> {
|
||||
let mut orgs = Vec::new();
|
||||
let mut page = 1;
|
||||
|
||||
loop {
|
||||
let mut url = api_base.join("organizations").context("Failed to build GitHub orgs URL")?;
|
||||
url.query_pairs_mut().append_pair("per_page", "100").append_pair("page", &page.to_string());
|
||||
let resp = github_get(client, url, token).send().await?;
|
||||
if !resp.status().is_success() {
|
||||
warn_on_rate_limit("GitHub", resp.status(), "listing organizations");
|
||||
break;
|
||||
}
|
||||
let page_orgs: Vec<GitHubOrg> = resp.json().await?;
|
||||
if page_orgs.is_empty() {
|
||||
break;
|
||||
}
|
||||
orgs.extend(page_orgs.into_iter().map(|org| org.login));
|
||||
page += 1;
|
||||
}
|
||||
|
||||
Ok(orgs)
|
||||
}
|
||||
|
||||
async fn fetch_github_repos(
|
||||
client: &reqwest::Client,
|
||||
api_base: &Url,
|
||||
path: &str,
|
||||
repo_type: &str,
|
||||
token: Option<&str>,
|
||||
action: &str,
|
||||
) -> Result<Vec<GitHubRepo>> {
|
||||
let mut repos = Vec::new();
|
||||
let mut page = 1;
|
||||
|
||||
loop {
|
||||
let mut url = api_base.join(path).context("Failed to build GitHub repositories URL")?;
|
||||
url.query_pairs_mut()
|
||||
.append_pair("per_page", "100")
|
||||
.append_pair("page", &page.to_string())
|
||||
.append_pair("type", repo_type)
|
||||
.append_pair("sort", "created")
|
||||
.append_pair("direction", "desc");
|
||||
let resp = github_get(client, url, token).send().await?;
|
||||
if !resp.status().is_success() {
|
||||
warn_on_rate_limit("GitHub", resp.status(), action);
|
||||
break;
|
||||
}
|
||||
let page_repos: Vec<GitHubRepo> = resp.json().await?;
|
||||
if page_repos.is_empty() {
|
||||
break;
|
||||
}
|
||||
repos.extend(page_repos);
|
||||
page += 1;
|
||||
}
|
||||
|
||||
Ok(repos)
|
||||
}
|
||||
|
||||
pub async fn enumerate_contributor_repo_urls(
|
||||
repo_url: &GitUrl,
|
||||
github_api_url: &Url,
|
||||
|
|
@ -179,7 +228,7 @@ pub async fn enumerate_contributor_repo_urls(
|
|||
let (_, owner, repo) = parse_repo(repo_url).context("invalid GitHub repo URL")?;
|
||||
let exclude_set = build_exclude_matcher(exclude_repos);
|
||||
let client = reqwest::Client::builder().danger_accept_invalid_certs(ignore_certs).build()?;
|
||||
let token = env::var("KF_GITHUB_TOKEN").ok().filter(|t| !t.is_empty());
|
||||
let token = github_token();
|
||||
let api_base = normalize_api_base(github_api_url);
|
||||
|
||||
let mut contributor_logins = Vec::new();
|
||||
|
|
@ -190,11 +239,7 @@ pub async fn enumerate_contributor_repo_urls(
|
|||
.join(&format!("repos/{owner}/{repo}/contributors"))
|
||||
.context("Failed to build GitHub contributors URL")?;
|
||||
url.query_pairs_mut().append_pair("per_page", "100").append_pair("page", &page.to_string());
|
||||
let mut req = client.get(url).header("User-Agent", GLOBAL_USER_AGENT.as_str());
|
||||
if let Some(token) = token.as_ref() {
|
||||
req = req.bearer_auth(token);
|
||||
}
|
||||
let resp = req.send().await?;
|
||||
let resp = github_get(&client, url, token.as_deref()).send().await?;
|
||||
if !resp.status().is_success() {
|
||||
warn_on_rate_limit("GitHub", resp.status(), "listing contributors");
|
||||
break;
|
||||
|
|
@ -251,11 +296,7 @@ pub async fn enumerate_contributor_repo_urls(
|
|||
.append_pair("type", "all")
|
||||
.append_pair("sort", "updated")
|
||||
.append_pair("direction", "desc");
|
||||
let mut req = client.get(url).header("User-Agent", GLOBAL_USER_AGENT.as_str());
|
||||
if let Some(token) = token.as_ref() {
|
||||
req = req.bearer_auth(token);
|
||||
}
|
||||
let resp = req.send().await?;
|
||||
let resp = github_get(&client, url, token.as_deref()).send().await?;
|
||||
if !resp.status().is_success() {
|
||||
warn_on_rate_limit("GitHub", resp.status(), "listing user repositories");
|
||||
break;
|
||||
|
|
@ -351,22 +392,22 @@ pub async fn enumerate_repo_urls(
|
|||
ignore_certs: bool,
|
||||
mut progress: Option<&mut ProgressBar>,
|
||||
) -> Result<Vec<String>> {
|
||||
let client = create_github_client(&github_url, ignore_certs)?;
|
||||
let client = create_github_client(ignore_certs)?;
|
||||
let mut repo_urls = Vec::new();
|
||||
let exclude_set = build_exclude_matcher(&repo_specifiers.exclude_repos);
|
||||
let user_repo_type: ReposListUserType = repo_specifiers.repo_filter.clone().into();
|
||||
let org_repo_type: ReposListOrgType = repo_specifiers.repo_filter.clone().into();
|
||||
let api_base = normalize_api_base(&github_url);
|
||||
let token = github_token();
|
||||
for username in &repo_specifiers.user {
|
||||
let repos = client
|
||||
.repos()
|
||||
.list_all_for_user(
|
||||
username,
|
||||
user_repo_type.clone(),
|
||||
ReposListOrgSort::Created,
|
||||
Order::Desc,
|
||||
)
|
||||
.await?;
|
||||
repo_urls.extend(repos.body.into_iter().filter_map(|repo| {
|
||||
let repos = fetch_github_repos(
|
||||
&client,
|
||||
&api_base,
|
||||
&format!("users/{username}/repos"),
|
||||
repo_specifiers.repo_filter.user_query_value(),
|
||||
token.as_deref(),
|
||||
"listing user repositories",
|
||||
)
|
||||
.await?;
|
||||
repo_urls.extend(repos.into_iter().filter_map(|repo| {
|
||||
let clone_url = repo.clone_url;
|
||||
if should_exclude_repo(&clone_url, &exclude_set) { None } else { Some(clone_url) }
|
||||
}));
|
||||
|
|
@ -375,24 +416,21 @@ pub async fn enumerate_repo_urls(
|
|||
}
|
||||
}
|
||||
let orgs = if repo_specifiers.all_organizations {
|
||||
let mut all_orgs = Vec::new();
|
||||
let org_list = client.orgs().list_all(100).await?;
|
||||
all_orgs.extend(org_list.body.into_iter().map(|org| org.login));
|
||||
all_orgs
|
||||
fetch_github_orgs(&client, &api_base, token.as_deref()).await?
|
||||
} else {
|
||||
repo_specifiers.organization.clone()
|
||||
};
|
||||
for org_name in orgs {
|
||||
let repos = client
|
||||
.repos()
|
||||
.list_all_for_org(
|
||||
&org_name,
|
||||
org_repo_type.clone(),
|
||||
ReposListOrgSort::Created,
|
||||
Order::Desc,
|
||||
)
|
||||
.await?;
|
||||
repo_urls.extend(repos.body.into_iter().filter_map(|repo| {
|
||||
let repos = fetch_github_repos(
|
||||
&client,
|
||||
&api_base,
|
||||
&format!("orgs/{org_name}/repos"),
|
||||
repo_specifiers.repo_filter.org_query_value(),
|
||||
token.as_deref(),
|
||||
"listing organization repositories",
|
||||
)
|
||||
.await?;
|
||||
repo_urls.extend(repos.into_iter().filter_map(|repo| {
|
||||
let clone_url = repo.clone_url;
|
||||
if should_exclude_repo(&clone_url, &exclude_set) { None } else { Some(clone_url) }
|
||||
}));
|
||||
|
|
|
|||
|
|
@ -2319,7 +2319,11 @@ alerts:
|
|||
};
|
||||
let yaml = super::build_config_yaml(&scan_args, &global_args, init_matches).unwrap();
|
||||
let cfg = parse_str(&yaml).expect("emitted YAML must round-trip");
|
||||
assert_eq!(cfg.git.github_api_url.as_deref(), Some("https://ghe.corp.example.com/api/v3/"),);
|
||||
assert_eq!(
|
||||
cfg.git.github_api_url.as_deref(),
|
||||
Some("https://ghe.corp.example.com/api/v3/"),
|
||||
"github_api_url must preserve a user-supplied trailing slash",
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
use std::{
|
||||
io::Read,
|
||||
marker::PhantomData,
|
||||
path::Path,
|
||||
process::Command,
|
||||
|
|
@ -212,12 +213,10 @@ pub fn enumerate_filesystem_inputs(
|
|||
}
|
||||
Ok(entry) => entry,
|
||||
};
|
||||
// Check if this is an archive file
|
||||
let is_archive = if let Origin::File(file_origin) = &origin.first() {
|
||||
is_compressed_file(&file_origin.path)
|
||||
} else {
|
||||
false
|
||||
};
|
||||
// Check if this is an archive file. `blob_path()` covers both filesystem and git
|
||||
// origins, so archive/binary filtering stays consistent across input modes.
|
||||
let is_archive =
|
||||
origin.first().blob_path().map(is_compressed_file).unwrap_or(false);
|
||||
let is_binary = is_binary(&blob.bytes());
|
||||
let should_skip = if is_archive {
|
||||
// For archives: skip only if --no_extract_archives is true
|
||||
|
|
@ -542,11 +541,10 @@ fn try_extract_git_blob_archive(
|
|||
return Ok(None);
|
||||
}
|
||||
|
||||
// Carry the original filename through so the decompressor picks the
|
||||
// correct format (zip-based, gz, tar, ...). decompress_file_to_temp
|
||||
// dispatches on extension, so the extension MUST match the actual
|
||||
// bytes — using the in-tree filename is the right move.
|
||||
let basename = pb.file_name().and_then(|s| s.to_str()).unwrap_or("blob").to_string();
|
||||
// Use the repo-relative path in reports while staging the blob under its basename so the
|
||||
// decompressor still dispatches on the original extension.
|
||||
let archive_label = blob_path.to_string();
|
||||
let staged_name = pb.file_name().and_then(|s| s.to_str()).unwrap_or("blob").to_string();
|
||||
|
||||
// ── fast path: ZIP-based archives extract entirely in memory ──
|
||||
//
|
||||
|
|
@ -577,18 +575,18 @@ fn try_extract_git_blob_archive(
|
|||
return Ok(None);
|
||||
}
|
||||
if data.len() <= MAX_INMEM_ZIP_ARCHIVE_BYTES {
|
||||
return match extract_zip_archive_in_memory(data, &basename) {
|
||||
return match extract_zip_archive_in_memory(data, &archive_label) {
|
||||
Ok(entries) => Ok(Some(entries)),
|
||||
Err(e) => {
|
||||
debug!(
|
||||
"in-memory zip extract failed for {basename}: {e:#}; falling back to raw scan"
|
||||
"in-memory zip extract failed for {archive_label}: {e:#}; falling back to raw scan"
|
||||
);
|
||||
Ok(None)
|
||||
}
|
||||
};
|
||||
}
|
||||
debug!(
|
||||
"{basename} is {} bytes (> {} MB cap); falling back to disk streaming extractor",
|
||||
"{archive_label} is {} bytes (> {} MB cap); falling back to disk streaming extractor",
|
||||
data.len(),
|
||||
MAX_INMEM_ZIP_ARCHIVE_BYTES / (1024 * 1024)
|
||||
);
|
||||
|
|
@ -599,7 +597,7 @@ fn try_extract_git_blob_archive(
|
|||
// and large ZIP-based archives that exceeded the
|
||||
// in-memory cap above. ──
|
||||
let staging = tempfile::tempdir().context("Failed to create staging tempdir for git blob")?;
|
||||
let staged_path = staging.path().join(&basename);
|
||||
let staged_path = staging.path().join(&staged_name);
|
||||
std::fs::write(&staged_path, data)
|
||||
.with_context(|| format!("Failed to stage blob to {}", staged_path.display()))?;
|
||||
|
||||
|
|
@ -615,11 +613,11 @@ fn try_extract_git_blob_archive(
|
|||
let strip_logical_prefix = |logical: String| -> String {
|
||||
// decompress_file_to_temp builds logicals as
|
||||
// `<staged_path>!<entry>`. Replace the staged-path prefix with the
|
||||
// real archive basename so report paths look like
|
||||
// `aws_leak.apk!res/values/strings.xml`.
|
||||
// real repo-relative archive path so report paths look like
|
||||
// `dir/aws_leak.apk!res/values/strings.xml`.
|
||||
match logical.split_once('!') {
|
||||
Some((_, entry)) => format!("{}!{}", basename, entry),
|
||||
None => format!("{}!{}", basename, logical),
|
||||
Some((_, entry)) => format!("{}!{}", archive_label, entry),
|
||||
None => format!("{}!{}", archive_label, logical),
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -638,10 +636,20 @@ fn try_extract_git_blob_archive(
|
|||
for (logical, bytes) in files {
|
||||
if total >= MAX_DISK_PATH_AGGREGATE_BYTES {
|
||||
debug!(
|
||||
"{basename} disk-archive aggregate cap of {MAX_DISK_PATH_AGGREGATE_BYTES} bytes reached; truncating remaining entries"
|
||||
"{archive_label} disk-archive aggregate cap of {MAX_DISK_PATH_AGGREGATE_BYTES} bytes reached; truncating remaining entries"
|
||||
);
|
||||
break;
|
||||
}
|
||||
let remaining = MAX_DISK_PATH_AGGREGATE_BYTES - total;
|
||||
if bytes.len() as u64 > remaining {
|
||||
debug!(
|
||||
"{archive_label} disk-archive aggregate cap reached while reading {}; truncating entry",
|
||||
logical
|
||||
);
|
||||
let take = remaining as usize;
|
||||
out.push((strip_logical_prefix(logical), bytes[..take].to_vec()));
|
||||
break;
|
||||
}
|
||||
total += bytes.len() as u64;
|
||||
out.push((strip_logical_prefix(logical), bytes));
|
||||
}
|
||||
|
|
@ -654,14 +662,38 @@ fn try_extract_git_blob_archive(
|
|||
for (logical, disk_path) in disk_entries {
|
||||
if total >= MAX_DISK_PATH_AGGREGATE_BYTES {
|
||||
debug!(
|
||||
"{basename} disk-archive aggregate cap of {MAX_DISK_PATH_AGGREGATE_BYTES} bytes reached; truncating remaining entries"
|
||||
"{archive_label} disk-archive aggregate cap of {MAX_DISK_PATH_AGGREGATE_BYTES} bytes reached; truncating remaining entries"
|
||||
);
|
||||
break;
|
||||
}
|
||||
match std::fs::read(&disk_path) {
|
||||
Ok(bytes) => {
|
||||
let remaining = MAX_DISK_PATH_AGGREGATE_BYTES - total;
|
||||
let entry_len = match std::fs::metadata(&disk_path) {
|
||||
Ok(md) => md.len(),
|
||||
Err(e) => {
|
||||
debug!("Failed to stat extracted entry {}: {e}", disk_path.display());
|
||||
continue;
|
||||
}
|
||||
};
|
||||
let file = match std::fs::File::open(&disk_path) {
|
||||
Ok(file) => file,
|
||||
Err(e) => {
|
||||
debug!("Failed to open extracted entry {}: {e}", disk_path.display());
|
||||
continue;
|
||||
}
|
||||
};
|
||||
let to_read = entry_len.min(remaining);
|
||||
let mut bytes = Vec::with_capacity(to_read as usize);
|
||||
match file.take(to_read).read_to_end(&mut bytes) {
|
||||
Ok(_) => {
|
||||
total += bytes.len() as u64;
|
||||
out.push((strip_logical_prefix(logical), bytes));
|
||||
if entry_len > remaining {
|
||||
debug!(
|
||||
"{archive_label} disk-archive aggregate cap reached while reading {}; truncating entry",
|
||||
disk_path.display()
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
debug!("Failed to read extracted entry {}: {e}", disk_path.display());
|
||||
|
|
@ -673,11 +705,9 @@ fn try_extract_git_blob_archive(
|
|||
|
||||
// Single-stream decompression (gz/bz2/xz/zlib) gives one logical
|
||||
// payload — present it as a single entry under the archive name.
|
||||
CompressedContent::Raw(bytes) => {
|
||||
vec![(format!("{}!content", basename), bytes)]
|
||||
}
|
||||
CompressedContent::Raw(bytes) => vec![(format!("{}!content", archive_label), bytes)],
|
||||
CompressedContent::RawFile(path) => match std::fs::read(&path) {
|
||||
Ok(bytes) => vec![(format!("{}!content", basename), bytes)],
|
||||
Ok(bytes) => vec![(format!("{}!content", archive_label), bytes)],
|
||||
Err(e) => {
|
||||
debug!("Failed to read decompressed payload {}: {e}", path.display());
|
||||
return Ok(None);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue