Fiks Windows-oppstart: git-symlink og PowerShell-server
To uavhengige feil hindret oppstart på Windows:
1. app/notes var committet som en git-symlink (mode 120000). På
Windows uten symlink-støtte materialiseres den som en stray
tekstfil («../notes»), så appen ikke fant notatene. Start.bat
sin reparasjon brukte rmdir/mkdir som begge feiler når notes
er en fil.
→ Avregistrert symlinken fra git og gitignorert den. app/notes
opprettes nå per plattform av launcherne (symlink på unix,
kopi på Windows). Start.bat normaliserer robust: sletter en
stray fil, lager mappe og kopierer *.md. Start.sh håndterer
også fil-tilfellet.
2. server.ps1 krasjet umiddelbart pga. Add-Type System.Web (ikke
tilgjengelig i PowerShell 7), og cmd-vinduet forsvant uten pause.
→ Fjernet System.Web (bruker System.Uri::UnescapeDataString),
la til HttpListener-støttesjekk og tydelige feilmeldinger.
Start.bat pauser nå når serveren stopper, så feil kan leses.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -20,6 +20,10 @@ package.json
|
|||||||
# App localStorage tilstand (lagres pr nettleser)
|
# App localStorage tilstand (lagres pr nettleser)
|
||||||
.cache/
|
.cache/
|
||||||
|
|
||||||
|
# app/notes opprettes av launcherne per plattform (symlink på unix, kopi på Windows).
|
||||||
|
# Committes IKKE — git-symlinks materialiseres som ødelagte tekstfiler på Windows.
|
||||||
|
/app/notes
|
||||||
|
|
||||||
# Verifikasjons-skjermbilder
|
# Verifikasjons-skjermbilder
|
||||||
/screenshots/
|
/screenshots/
|
||||||
.claude/
|
.claude/
|
||||||
|
|||||||
38
Start.bat
38
Start.bat
@@ -120,20 +120,25 @@ if not exist "%VENDOR_DIR%\marked.min.js" (
|
|||||||
echo [v] marked.js OK
|
echo [v] marked.js OK
|
||||||
)
|
)
|
||||||
|
|
||||||
rem --- Verify notes/ exists in app/ ------------------------------------
|
rem --- Ensure app\notes is a real directory with current notes --------
|
||||||
if not exist "%APP_DIR%\notes\uke17-eksamen.md" (
|
rem Git lagrer app/notes som en symlink. Pa Windows uten symlink-stotte
|
||||||
echo [.] Notes mangler i app/ - kopierer ...
|
rem materialiseres den som en STRAY TEKSTFIL (innhold: "../notes"), som
|
||||||
if exist "%APP_DIR%\notes" rmdir /s /q "%APP_DIR%\notes" 2>nul
|
rem bryter appen. Vi normaliserer alltid: fjern fil, lag mappe, kopier.
|
||||||
mkdir "%APP_DIR%\notes" 2>nul
|
rem ("if exist sti\" med etterfolgende backslash er sant kun for mapper.)
|
||||||
xcopy /Y /Q "%SCRIPT_DIR%notes\*.md" "%APP_DIR%\notes\" >nul
|
if exist "%APP_DIR%\notes" if not exist "%APP_DIR%\notes\" (
|
||||||
if exist "%APP_DIR%\notes\uke17-eksamen.md" (
|
echo [.] Fjerner ugyldig notes-fil ^(git-symlink pa Windows^) ...
|
||||||
echo [v] Notes kopiert
|
del /f /q "%APP_DIR%\notes" >nul 2>&1
|
||||||
|
)
|
||||||
|
if not exist "%APP_DIR%\notes\" mkdir "%APP_DIR%\notes" >nul 2>&1
|
||||||
|
xcopy /Y /Q "%SCRIPT_DIR%notes\*.md" "%APP_DIR%\notes\" >nul 2>&1
|
||||||
|
if exist "%APP_DIR%\notes\fast-track.md" (
|
||||||
|
echo [v] Notes OK
|
||||||
) else (
|
) else (
|
||||||
echo [x] Klarte ikke kopiere notes/
|
echo [x] Klarte ikke kopiere notes/ fra "%SCRIPT_DIR%notes"
|
||||||
|
echo Sjekk at notes-mappen finnes i prosjektroten.
|
||||||
pause
|
pause
|
||||||
exit /b 1
|
exit /b 1
|
||||||
)
|
)
|
||||||
)
|
|
||||||
|
|
||||||
rem --- Find a free port -----------------------------------------------
|
rem --- Find a free port -----------------------------------------------
|
||||||
:try_port
|
:try_port
|
||||||
@@ -168,5 +173,18 @@ start "" /min cmd /c "timeout /t 2 >nul & start http://localhost:%PORT%"
|
|||||||
rem --- Start server ----------------------------------------------------
|
rem --- Start server ----------------------------------------------------
|
||||||
cd /d "%APP_DIR%"
|
cd /d "%APP_DIR%"
|
||||||
%SERVER_CMD%
|
%SERVER_CMD%
|
||||||
|
set "SERVER_EXIT=%errorlevel%"
|
||||||
|
|
||||||
|
rem --- Server stoppet: hold vinduet apent sa feil kan leses -----------
|
||||||
|
echo.
|
||||||
|
if not "%SERVER_EXIT%"=="0" (
|
||||||
|
echo [x] Serveren avsluttet med feilkode %SERVER_EXIT%.
|
||||||
|
echo Les meldingen over. Vanlige arsaker: porten var opptatt,
|
||||||
|
echo eller runtime ^(%SERVER_NAME%^) mangler rettigheter.
|
||||||
|
) else (
|
||||||
|
echo Serveren ble stoppet.
|
||||||
|
)
|
||||||
|
echo Trykk en tast for a lukke vinduet ...
|
||||||
|
pause >nul
|
||||||
|
|
||||||
endlocal
|
endlocal
|
||||||
|
|||||||
6
Start.sh
6
Start.sh
@@ -177,10 +177,14 @@ for f in "${required_files[@]}"; do
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# Notes-mappen er en symlink — sjekk at den peker rett
|
# app/notes opprettes per plattform (gitignorert). Den skal være en symlink
|
||||||
|
# til ../notes. Håndter ødelagt symlink ELLER en git-materialisert tekstfil.
|
||||||
if [ -L "$APP_DIR/notes" ] && [ ! -e "$APP_DIR/notes" ]; then
|
if [ -L "$APP_DIR/notes" ] && [ ! -e "$APP_DIR/notes" ]; then
|
||||||
warn "notes-symlink er ødelagt — gjenoppretter …"
|
warn "notes-symlink er ødelagt — gjenoppretter …"
|
||||||
rm -f "$APP_DIR/notes"
|
rm -f "$APP_DIR/notes"
|
||||||
|
elif [ -f "$APP_DIR/notes" ]; then
|
||||||
|
warn "app/notes er en vanlig fil (git-symlink fra Windows) — erstatter med symlink …"
|
||||||
|
rm -f "$APP_DIR/notes"
|
||||||
fi
|
fi
|
||||||
if [ ! -d "$APP_DIR/notes" ]; then
|
if [ ! -d "$APP_DIR/notes" ]; then
|
||||||
if [ -d "$SCRIPT_DIR/notes" ]; then
|
if [ -d "$SCRIPT_DIR/notes" ]; then
|
||||||
|
|||||||
28
server.ps1
28
server.ps1
@@ -9,16 +9,36 @@ param(
|
|||||||
[string]$Root = "."
|
[string]$Root = "."
|
||||||
)
|
)
|
||||||
|
|
||||||
Add-Type -AssemblyName System.Web
|
# Krasj ikke stille: vis full feil og stopp pent.
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
|
||||||
|
# Merk: vi bruker [System.Uri]::UnescapeDataString for URL-dekoding i stedet
|
||||||
|
# for System.Web.HttpUtility. System.Web er ikke tilgjengelig i PowerShell 7
|
||||||
|
# (.NET Core) og kan faile pa enkelte oppsett — det var en kilde til at
|
||||||
|
# vinduet "krasjet umiddelbart". System.Uri finnes i bade PS 5.1 og PS 7.
|
||||||
|
|
||||||
|
try {
|
||||||
|
$RootAbs = (Resolve-Path -LiteralPath $Root -ErrorAction Stop).Path
|
||||||
|
} catch {
|
||||||
|
Write-Host "Fant ikke app-mappen: $Root" -ForegroundColor Red
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not ([System.Net.HttpListener]::IsSupported)) {
|
||||||
|
Write-Host "HttpListener stottes ikke pa denne maskinen." -ForegroundColor Red
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
$RootAbs = (Resolve-Path -LiteralPath $Root).Path
|
|
||||||
$listener = New-Object System.Net.HttpListener
|
$listener = New-Object System.Net.HttpListener
|
||||||
$listener.Prefixes.Add("http://127.0.0.1:$Port/")
|
$listener.Prefixes.Add("http://127.0.0.1:$Port/")
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$listener.Start()
|
$listener.Start()
|
||||||
} catch {
|
} catch {
|
||||||
Write-Host "Klarte ikke starte server pa port ${Port}: $($_.Exception.Message)" -ForegroundColor Red
|
Write-Host ""
|
||||||
|
Write-Host " Klarte ikke starte server pa port ${Port}:" -ForegroundColor Red
|
||||||
|
Write-Host " $($_.Exception.Message)" -ForegroundColor Red
|
||||||
|
Write-Host " Tips: porten kan vaere opptatt, eller en brannmur/policy blokkerer." -ForegroundColor DarkGray
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,7 +77,7 @@ try {
|
|||||||
$res = $context.Response
|
$res = $context.Response
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$path = [System.Web.HttpUtility]::UrlDecode($req.Url.LocalPath)
|
$path = [System.Uri]::UnescapeDataString($req.Url.LocalPath)
|
||||||
if ([string]::IsNullOrEmpty($path) -or $path -eq '/') { $path = '/index.html' }
|
if ([string]::IsNullOrEmpty($path) -or $path -eq '/') { $path = '/index.html' }
|
||||||
|
|
||||||
# Strip leading slash and normalize
|
# Strip leading slash and normalize
|
||||||
|
|||||||
Reference in New Issue
Block a user