You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
6.3 KiB
PowerShell

Param(
[switch]$Clean,
[switch]$Minimal,
[switch]$AsFolder,
[switch]$Bundle,
[int]$Chunk = 0,
[string]$OutDir = "dist",
[string]$Name = "multimedia_flutter-src"
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
# Ensure output and temp directories
if (-not (Test-Path $OutDir)) {
New-Item -ItemType Directory -Path $OutDir | Out-Null
}
$timestamp = Get-Date -Format 'yyyyMMdd-HHmm'
$baseName = "$Name-$timestamp"
$zipPath = Join-Path $OutDir ("$baseName.zip")
$tempDir = Join-Path ([IO.Path]::GetTempPath()) ("mf_export_" + [Guid]::NewGuid().ToString('N'))
if (-not (Test-Path $tempDir)) { New-Item -ItemType Directory -Path $tempDir -Force | Out-Null }
$stageDir = Join-Path $tempDir 'stage'
if (-not (Test-Path $stageDir)) { New-Item -ItemType Directory -Path $stageDir -Force | Out-Null }
try {
if ($Clean) {
try {
Write-Host "Running 'flutter clean'..." -ForegroundColor Cyan
flutter clean | Out-Null
} catch {
Write-Warning "'flutter clean' failed or Flutter not in PATH. Continuing."
}
}
Write-Host "Staging files to temp folder..." -ForegroundColor Cyan
if ($Minimal) {
# Copy a minimal set for code review in ChatGPT
$includeDirs = @('lib','test','assets')
foreach ($dir in $includeDirs) {
if (Test-Path $dir) {
Copy-Item $dir -Destination (Join-Path $stageDir $dir) -Recurse -Force
}
}
$rootFiles = @('pubspec.yaml','analysis_options.yaml','README.md')
foreach ($f in $rootFiles) {
if (Test-Path $f) { Copy-Item $f -Destination (Join-Path $stageDir $f) -Force }
}
if (Test-Path 'web') {
New-Item -ItemType Directory -Force -Path (Join-Path $stageDir 'web') | Out-Null
foreach ($wf in @('index.html','manifest.json')) {
if (Test-Path (Join-Path 'web' $wf)) {
Copy-Item (Join-Path 'web' $wf) -Destination (Join-Path $stageDir (Join-Path 'web' $wf)) -Force
}
}
}
} else {
# Use robocopy to copy everything except heavy/generated folders
$excludeDirs = @('build', '.dart_tool', 'ios\Pods', 'android\build', '.idea', '.vscode', 'web\build', 'android\.gradle', 'dist', 'tool', '.git', '.github')
$xdArgs = @()
foreach ($d in $excludeDirs) { $xdArgs += @('/XD', $d) }
# robocopy exit codes: treat 0-7 as success
$robocopyCmd = @('robocopy', '.', $stageDir, '/E') + $xdArgs
$p = Start-Process -FilePath $robocopyCmd[0] -ArgumentList $robocopyCmd[1..($robocopyCmd.Length-1)] -Wait -PassThru -NoNewWindow
if ($p.ExitCode -gt 7) {
throw "Robocopy failed with exit code $($p.ExitCode)"
}
}
# Option A: Single bundled text file (bypasses 10-file limit)
if ($Bundle) {
$bundlePath = Join-Path $OutDir ("$baseName-bundle.txt")
if (Test-Path $bundlePath) { Remove-Item $bundlePath -Force }
Write-Host "Creating bundled text: $bundlePath" -ForegroundColor Cyan
$textExt = @('.dart','.yaml','.yml','.md','.json','.html','.htm','.css','.js','.xml','.gradle','.properties','.kt','.swift','.plist','.sh','.bat','.ps1','.txt','.php')
$files = Get-ChildItem -Path $stageDir -Recurse -File | Where-Object { $textExt -contains ([IO.Path]::GetExtension($_.Name).ToLower()) }
foreach ($f in $files) {
$rel = $f.FullName.Substring($stageDir.Length + 1)
"===== BEGIN FILE: $rel =====" | Out-File -FilePath $bundlePath -Append -Encoding utf8
try { (Get-Content -Raw -Path $f.FullName) | Out-File -FilePath $bundlePath -Append -Encoding utf8 } catch { "[binary or unreadable content omitted]" | Out-File -FilePath $bundlePath -Append -Encoding utf8 }
"\n===== END FILE =====\n" | Out-File -FilePath $bundlePath -Append -Encoding utf8
}
Write-Host "Done. Upload this single file to your ChatGPT Project:" -ForegroundColor Green
Write-Host " $bundlePath"
}
elseif ($Chunk -gt 0) {
# Option B: Chunk into folder packs of N files
$outBase = Join-Path $OutDir $baseName
if (Test-Path $outBase) { Remove-Item $outBase -Recurse -Force }
New-Item -ItemType Directory -Path $outBase | Out-Null
$allFiles = Get-ChildItem -Path $stageDir -Recurse -File
if ($allFiles.Count -eq 0) { throw "No files found to export." }
$pack = 1
$inPack = 0
$packDir = Join-Path $outBase ("pack-" + $pack.ToString('000'))
New-Item -ItemType Directory -Path $packDir | Out-Null
foreach ($file in $allFiles) {
if ($inPack -ge $Chunk) {
$pack++
$inPack = 0
$packDir = Join-Path $outBase ("pack-" + $pack.ToString('000'))
New-Item -ItemType Directory -Path $packDir | Out-Null
}
$rel = $file.FullName.Substring($stageDir.Length + 1)
$destPath = Join-Path $packDir $rel
$destDir = Split-Path -Parent $destPath
if (-not (Test-Path $destDir)) { New-Item -ItemType Directory -Path $destDir -Force | Out-Null }
Copy-Item $file.FullName -Destination $destPath -Force
$inPack++
}
Write-Host "Done. Upload each pack folder (<= $Chunk files) one by one:" -ForegroundColor Green
Write-Host " $outBase"
}
elseif ($AsFolder) {
$outFolder = Join-Path $OutDir $baseName
if (Test-Path $outFolder) { Remove-Item $outFolder -Recurse -Force }
Write-Host "Preparing folder for drag-and-drop: $outFolder" -ForegroundColor Cyan
if (-not (Test-Path $outFolder)) { New-Item -ItemType Directory -Path $outFolder | Out-Null }
Copy-Item (Join-Path $stageDir '*') -Destination $outFolder -Recurse -Force
Write-Host "Done. Drag-and-drop this folder into your ChatGPT Project:" -ForegroundColor Green
Write-Host " $outFolder"
} else {
Write-Host "Creating archive: $zipPath" -ForegroundColor Cyan
if (Test-Path $zipPath) { Remove-Item $zipPath -Force }
Compress-Archive -Path (Join-Path $stageDir '*') -DestinationPath $zipPath -Force
Write-Host "Done. Upload this file to your ChatGPT Project:" -ForegroundColor Green
Write-Host " $zipPath"
}
} finally {
if (Test-Path $tempDir) { Remove-Item $tempDir -Recurse -Force }
}