Integrate diagnostic decorations and current-source Text input boundaries
This commit is contained in:
@@ -83,7 +83,23 @@ function Get-ArcadiaNotices([string]$Repository, [string]$Target, [string]$Notic
|
||||
}
|
||||
foreach ($id in @($selected | Sort-Object)) {
|
||||
$package = $packages[$id]
|
||||
$root = Split-Path -Parent $package.manifest_path
|
||||
$root = [IO.Path]::GetFullPath((Split-Path -Parent $package.manifest_path)).TrimEnd('\', '/')
|
||||
$isWorkspace = $metadata.workspace_members -contains $id
|
||||
$localPath = $null
|
||||
if (-not $package.source) {
|
||||
$repositoryRoot = [IO.Path]::GetFullPath($Repository).TrimEnd('\', '/')
|
||||
$repositoryPrefix = $repositoryRoot + [IO.Path]::DirectorySeparatorChar
|
||||
$manifestPath = [IO.Path]::GetFullPath($package.manifest_path)
|
||||
$comparison = if ([IO.Path]::DirectorySeparatorChar -eq '/') { [StringComparison]::Ordinal } else { [StringComparison]::OrdinalIgnoreCase }
|
||||
if (-not $manifestPath.StartsWith($repositoryPrefix, $comparison)) { throw "Local dependency is outside repository: $id" }
|
||||
$current = Get-Item -LiteralPath $manifestPath
|
||||
while ($null -ne $current) {
|
||||
if (($current.Attributes -band [IO.FileAttributes]::ReparsePoint) -ne 0) { throw "Local dependency has a reparse ancestor: $id" }
|
||||
if ($current.FullName.Equals($repositoryRoot, $comparison)) { break }
|
||||
$current = if ($current -is [IO.FileInfo]) { $current.Directory } else { $current.Parent }
|
||||
}
|
||||
$localPath = if ($root.Equals($repositoryRoot, $comparison)) { '.' } else { $root.Substring($repositoryPrefix.Length).Replace('\', '/') }
|
||||
}
|
||||
$key = "$($package.name)-$($package.version)"
|
||||
if ($key -notmatch '^[A-Za-z0-9._+-]+$') { throw "Unsafe package identity: $key" }
|
||||
$prefix = "licenses/dependencies/$key"
|
||||
@@ -101,6 +117,7 @@ function Get-ArcadiaNotices([string]$Repository, [string]$Target, [string]$Notic
|
||||
# Hash actual local files (not merely Cargo's cached checksum claims).
|
||||
$sourceHashes = [ordered]@{}
|
||||
$notices = New-Object 'Collections.Generic.List[object]'
|
||||
$hasLicenseText = $false
|
||||
$fontReferences = New-Object 'Collections.Generic.HashSet[string]'
|
||||
foreach ($file in @(Get-ChildItem -LiteralPath $root -Recurse -File | Sort-Object FullName)) {
|
||||
if (($file.Attributes -band [IO.FileAttributes]::ReparsePoint) -ne 0) { throw "Source reparse point requires review: $($file.FullName)" }
|
||||
@@ -110,6 +127,10 @@ function Get-ArcadiaNotices([string]$Repository, [string]$Target, [string]$Notic
|
||||
if ($file.Name -match '(^|[-._])(LICENSE|LICENCE|COPYING|NOTICE|OFL|UNLICENSE|COPYRIGHT)([-._]|$)') {
|
||||
$notices.Add((Add-Notice $file.FullName "$prefix/$relative"))
|
||||
}
|
||||
if ($file.Name -match '(^|[-._])(LICENSE|LICENCE|COPYING|OFL|UNLICENSE)([-._]|$)') { $hasLicenseText = $true }
|
||||
if (-not $package.source -and -not $isWorkspace -and $relative -eq 'ARCADIA-PATCH.md') {
|
||||
$notices.Add((Add-Notice $file.FullName "$prefix/$relative"))
|
||||
}
|
||||
# Literal embedded fonts in production/build source, including feature-gated ones
|
||||
# conservatively. Tests/examples/benches are excluded, never all font files by glob.
|
||||
if ($file.Extension -eq '.rs' -and $relative -notmatch '^(tests|examples|benches)/') {
|
||||
@@ -127,8 +148,10 @@ function Get-ArcadiaNotices([string]$Repository, [string]$Target, [string]$Notic
|
||||
}
|
||||
}
|
||||
}
|
||||
if (-not $package.source) { $notices.Add((Add-Notice (Under-Root $Repository 'LICENSE') "$prefix/workspace-LICENSE")) }
|
||||
$matching = @($supplements.packages | Where-Object { $_.name -eq $package.name -and $_.version -eq $package.version })
|
||||
if ($isWorkspace) { $notices.Add((Add-Notice (Under-Root $Repository 'LICENSE') "$prefix/workspace-LICENSE")) }
|
||||
# Registry supplements bind original .crate bytes, not a local patch
|
||||
# with the same name/version and no registry checksum.
|
||||
$matching = @($supplements.packages | Where-Object { $registryChecksum -and $_.name -eq $package.name -and $_.version -eq $package.version })
|
||||
foreach ($supplement in $matching) {
|
||||
if ($supplement.checksum -ne $registryChecksum) { throw "Supplement is for different registry source: $key" }
|
||||
foreach ($notice in @(Add-Supplements $supplement.notices "$prefix/supplement")) { $notices.Add($notice) }
|
||||
@@ -137,7 +160,9 @@ function Get-ArcadiaNotices([string]$Repository, [string]$Target, [string]$Notic
|
||||
if ($package.license_file) {
|
||||
$licensePath = Under-Root $root $package.license_file
|
||||
$notices.Add((Add-Notice $licensePath "$prefix/declared-license/$([IO.Path]::GetFileName($licensePath))"))
|
||||
$hasLicenseText = $true
|
||||
}
|
||||
if (-not $package.source -and -not $isWorkspace -and -not $hasLicenseText) { $failures.Add("Local dependency requires its own license text: $key") }
|
||||
if ($notices.Count -eq 0) { $failures.Add("No notice text: $key ($($package.license)); provide checksum-bound supplement") }
|
||||
$assets = New-Object 'Collections.Generic.List[object]'
|
||||
foreach ($relative in @($fontReferences | Sort-Object)) {
|
||||
@@ -148,7 +173,7 @@ function Get-ArcadiaNotices([string]$Repository, [string]$Target, [string]$Notic
|
||||
if ($assetNotices.Count -eq 0) { $failures.Add("No embedded font notice: $key/$relative") }
|
||||
$assets.Add([ordered]@{ path = $relative; sha256 = $assetHash; license = $matches[0].license; notices = $assetNotices })
|
||||
}
|
||||
$records.Add([ordered]@{ id = $id; name = $package.name; version = $package.version; license = $package.license; license_file = $package.license_file; repository = $package.repository; source = $package.source; registry_checksum = $registryChecksum; features = $nodes[$id].features; local_source_sha256 = $sourceHashes; notices = @($notices.ToArray()); embedded_fonts = @($assets.ToArray()) })
|
||||
$records.Add([ordered]@{ id = $id; name = $package.name; version = $package.version; license = $package.license; license_file = $package.license_file; repository = $package.repository; source = $package.source; local_path = $localPath; registry_checksum = $registryChecksum; features = $nodes[$id].features; local_source_sha256 = $sourceHashes; notices = @($notices.ToArray()); embedded_fonts = @($assets.ToArray()) })
|
||||
}
|
||||
$rustVersion = @(& rustc -Vv)
|
||||
if ($LASTEXITCODE -ne 0) { throw 'Unable to identify the selected Rust compiler.' }
|
||||
|
||||
Reference in New Issue
Block a user