dosutils: align Novell-compatible tests and stage NCOPY work

Update the DOS utilities and test suite with the current Novell comparison
state.

Validated/updated tool behavior:
- improve CREATOR output by showing Novell-style attribute and rights masks
- extend FLAGDIR handling with old NCP22 directory attribute read/write
  fallback paths
- expand NDIR Novell-style formatting, filtering, /SUB handling, date output,
  DI/RI attribute display and richer metadata collection
- adjust REVOKE output/grammar, recursive /SUBDIRECTORIES behavior and trustee
  update/delete paths to better match Novell tools
- adjust SLIST header/output behavior for logged-in and logged-out cases
- update README status to reflect the currently green/tested tools

Test-suite changes:
- add/refresh Novell comparison tests for CREATOR, NDIR, REVOKE and SLIST
- update NCOPY tests and collection scripts for the current investigation state
- refresh per-tool README files and top-level test documentation
- keep MAP documented as still separately open

NCOPY:
- add the current NCOPY implementation and experimental NCP74/server-side-copy
  scaffolding
- build ncopy.c so it stays compile-tested
- keep NCOPY disabled in the NET multicall dispatch for now because the
  server-side-copy/open-handle path is still unsafe and needs further analysis

Build:
- include ncopy.c in the DOS utility build
- drop the temporary MARS_DOSUTILS_VERSION define wiring from CMake
This commit is contained in:
Mario Fetka
2026-05-29 07:40:04 +02:00
parent 5da600c2a5
commit 4a952b4c4c
36 changed files with 5873 additions and 943 deletions

View File

@@ -1,171 +1,457 @@
@ECHO OFF
REM NCPTSTA.BAT
REM Automated Novell NCOPY baseline for MARS NWE.
REM Automated Novell-vs-PUBLIC NCOPY comparison for MARS NWE.
REM
REM Ziel:
REM - keine Screenshots noetig
REM - keine PAUSE
REM - kein ZIP im Hauptlauf
REM - keine Wildcard-DEL
REM - keine interaktive Overwrite-Abfrage
REM
REM Ergebnisse:
REM F:\NCMP\RUN.LOG
REM F:\NCMP\SUMMARY.TXT
REM F:\NCMP\PRE\*.OUT
REM F:\NCMP\POST\*.OUT
REM F:\NCMP\CMP\*.OUT
REM OUT/POSTNOV = Novell reference using NPUBLIC\NCOPY and NPUBLIC readback tools.
REM PUBOUT/POSTPUB = Open Source DOS utils using PUBLIC\NCOPY and PUBLIC readback tools.
REM COMPARE.LOG compares command output and resulting file state.
F:
CD \
REM --- Clean generated test/result directories (contents only). ---
IF EXIST NCPTEST\NUL DELTREE /Y NCPTEST\*.*
IF EXIST NCPCMP\NUL DELTREE /Y NCPCMP\*.*
REM --- Dispatch subcommands before doing top-level setup. ---
REM DOS CALL does not jump to labels; CALL NCPTSTA.BAT NOVELL starts the
REM batch from the top again with %1=NOVELL. Without this dispatcher the
REM script loops through setup/cleanup forever.
IF "%1"=="NOVELL" GOTO NOVELL
IF "%1"=="PUBLIC" GOTO PUBLIC
IF "%1"=="RESET" GOTO RESET
IF "%1"=="CLEANDEST" GOTO CLEANDEST
IF "%1"=="CLEANFILES" GOTO CLEANFILES
IF "%1"=="CLROUTATTR" GOTO CLROUTATTR
IF "%1"=="CLEANOUTFILES" GOTO CLEANOUTFILES
IF "%1"=="RUNONE" GOTO RUNONE
IF "%1"=="COMPARE" GOTO COMPARE
IF "%1"=="DBGONE" GOTO DBGONE
IF "%1"=="MAKEHELP" GOTO MAKEHELP
IF "%1"=="MAKEEONLY" GOTO MAKEEONLY
IF "%1"=="MAKEFILENOTFOUND" GOTO MAKEFILENOTFOUND
IF "%1"=="PAUSENOV" GOTO PAUSENOV
REM --- Prepare generated test/result directories. ---
REM Do not use DELTREE here. Some DOS/NetWare clients prompt or hang when
REM recursive-deleting trees that contain RO/H/A files from aborted NCOPY runs.
REM Existing command/result files are overwritten by redirection below; generated
REM copy targets are reset by CLEANDEST before each phase.
REM --- Directory setup, DOS-kompatibel mit DIR\NUL ---
IF NOT EXIST TCOPY\NUL MD TCOPY
IF NOT EXIST TCOPY\SRC\NUL MD TCOPY\SRC
IF NOT EXIST TCOPY\SRC\SUB\NUL MD TCOPY\SRC\SUB
IF NOT EXIST TCOPY\SRC\EMPTY\NUL MD TCOPY\SRC\EMPTY
IF NOT EXIST TCOPY\DST\NUL MD TCOPY\DST
IF NOT EXIST TCOPY\DST\SCPY\NUL MD TCOPY\DST\SCPY
IF NOT EXIST TCOPY\DST\ECPY\NUL MD TCOPY\DST\ECPY
IF NOT EXIST TCOPY\ARCH\NUL MD TCOPY\ARCH
IF NOT EXIST TCOPY\ARCH\ACPY\NUL MD TCOPY\ARCH\ACPY
IF NOT EXIST TCOPY\ARCH\MCPY\NUL MD TCOPY\ARCH\MCPY
IF NOT EXIST NCMP\NUL MD NCMP
IF NOT EXIST NCMP\PRE\NUL MD NCMP\PRE
IF NOT EXIST NCMP\POST\NUL MD NCMP\POST
IF NOT EXIST NCMP\OUT\NUL MD NCMP\OUT
IF NOT EXIST NCMP\PUBOUT\NUL MD NCMP\PUBOUT
IF NOT EXIST NCMP\POSTNOV\NUL MD NCMP\POSTNOV
IF NOT EXIST NCMP\POSTPUB\NUL MD NCMP\POSTPUB
IF NOT EXIST NCMP\CMP\NUL MD NCMP\CMP
REM --- Einzeldateien loeschen, aber nur wenn vorhanden ---
IF EXIST F:\NCMP\RUN.LOG DEL F:\NCMP\RUN.LOG
IF EXIST F:\NCMP\COMPARE.LOG DEL F:\NCMP\COMPARE.LOG
IF EXIST F:\NCMP\SUMMARY.TXT DEL F:\NCMP\SUMMARY.TXT
IF EXIST F:\NCMP\ZIP.LOG DEL F:\NCMP\ZIP.LOG
IF EXIST F:\NCMP\NCPTSTA.ZIP DEL F:\NCMP\NCPTSTA.ZIP
IF EXIST F:\NCMP\PRE\SRCA.OUT DEL F:\NCMP\PRE\SRCA.OUT
IF EXIST F:\NCMP\PRE\SRCB.OUT DEL F:\NCMP\PRE\SRCB.OUT
IF EXIST F:\NCMP\PRE\SRCC.OUT DEL F:\NCMP\PRE\SRCC.OUT
IF EXIST F:\NCMP\PRE\SRCNDIR.OUT DEL F:\NCMP\PRE\SRCNDIR.OUT
IF EXIST F:\NCMP\PRE\SRCDATE.OUT DEL F:\NCMP\PRE\SRCDATE.OUT
IF EXIST F:\NCMP\PRE\SRCRGHT.OUT DEL F:\NCMP\PRE\SRCRGHT.OUT
IF EXIST F:\NCMP\PRE\SRCTRST.OUT DEL F:\NCMP\PRE\SRCTRST.OUT
IF EXIST F:\NCMP\POST\SRCA.OUT DEL F:\NCMP\POST\SRCA.OUT
IF EXIST F:\NCMP\POST\SRCB.OUT DEL F:\NCMP\POST\SRCB.OUT
IF EXIST F:\NCMP\POST\SRCC.OUT DEL F:\NCMP\POST\SRCC.OUT
IF EXIST F:\NCMP\POST\DSTA1.OUT DEL F:\NCMP\POST\DSTA1.OUT
IF EXIST F:\NCMP\POST\DSTAV.OUT DEL F:\NCMP\POST\DSTAV.OUT
IF EXIST F:\NCMP\POST\DSTB.OUT DEL F:\NCMP\POST\DSTB.OUT
IF EXIST F:\NCMP\POST\SRCNDIR.OUT DEL F:\NCMP\POST\SRCNDIR.OUT
IF EXIST F:\NCMP\POST\SRCDATE.OUT DEL F:\NCMP\POST\SRCDATE.OUT
IF EXIST F:\NCMP\POST\DSTNDIR.OUT DEL F:\NCMP\POST\DSTNDIR.OUT
IF EXIST F:\NCMP\POST\DSTDATE.OUT DEL F:\NCMP\POST\DSTDATE.OUT
IF EXIST F:\NCMP\POST\SCPYSUB.OUT DEL F:\NCMP\POST\SCPYSUB.OUT
IF EXIST F:\NCMP\POST\ECPYSUB.OUT DEL F:\NCMP\POST\ECPYSUB.OUT
IF EXIST F:\NCMP\POST\ARCHSUB.OUT DEL F:\NCMP\POST\ARCHSUB.OUT
IF EXIST F:\NCMP\CMP\SRCA.OUT DEL F:\NCMP\CMP\SRCA.OUT
IF EXIST F:\NCMP\CMP\SRCB.OUT DEL F:\NCMP\CMP\SRCB.OUT
IF EXIST F:\NCMP\CMP\SRCC.OUT DEL F:\NCMP\CMP\SRCC.OUT
IF EXIST F:\NCMP\CMP\SRCNDIR.OUT DEL F:\NCMP\CMP\SRCNDIR.OUT
IF EXIST F:\NCMP\CMP\SRCDATE.OUT DEL F:\NCMP\CMP\SRCDATE.OUT
ECHO NCPTSTA automated NCOPY compare test > F:\NCMP\RUN.LOG
ECHO Date prompt skipped for unattended batch run. >> F:\NCMP\RUN.LOG
ECHO Time prompt skipped for unattended batch run. >> F:\NCMP\RUN.LOG
ECHO NCPTSTA automated NCOPY test > F:\NCMP\RUN.LOG
DATE >> F:\NCMP\RUN.LOG
TIME >> F:\NCMP\RUN.LOG
ECHO. >> F:\NCMP\RUN.LOG
ECHO === SETUP === >> F:\NCMP\RUN.LOG
ECHO === SETUP SOURCE TREE === >> F:\NCMP\RUN.LOG
ECHO NCOPY TEST A > F:\TCOPY\SRC\A.TXT
ECHO NCOPY TEST B > F:\TCOPY\SRC\B.TXT
ECHO NCOPY TEST C > F:\TCOPY\SRC\SUB\C.TXT
ECHO OLD DEST FILE > F:\TCOPY\DST\A.TXT
ECHO Normalisiere Attribute... >> F:\NCMP\RUN.LOG
NPUBLIC\FLAG F:\TCOPY\SRC\A.TXT N >> F:\NCMP\RUN.LOG
NPUBLIC\FLAG F:\TCOPY\SRC\B.TXT N >> F:\NCMP\RUN.LOG
NPUBLIC\FLAG F:\TCOPY\SRC\SUB\C.TXT N >> F:\NCMP\RUN.LOG
NPUBLIC\FLAG F:\TCOPY\DST\A.TXT N >> F:\NCMP\RUN.LOG
ECHO Setze Testattribute... >> F:\NCMP\RUN.LOG
NPUBLIC\FLAG F:\TCOPY\SRC\A.TXT +H +A >> F:\NCMP\RUN.LOG
NPUBLIC\FLAG F:\TCOPY\SRC\B.TXT +RO +A >> F:\NCMP\RUN.LOG
NPUBLIC\FLAG F:\TCOPY\SRC\SUB\C.TXT +A >> F:\NCMP\RUN.LOG
ECHO === PRE CAPTURE === >> F:\NCMP\RUN.LOG
NPUBLIC\FLAG F:\TCOPY\SRC\A.TXT > F:\NCMP\PRE\SRCA.OUT
NPUBLIC\FLAG F:\TCOPY\SRC\B.TXT > F:\NCMP\PRE\SRCB.OUT
NPUBLIC\FLAG F:\TCOPY\SRC\SUB\C.TXT > F:\NCMP\PRE\SRCC.OUT
NPUBLIC\NDIR F:\TCOPY\SRC > F:\NCMP\PRE\SRCNDIR.OUT
NPUBLIC\NDIR F:\TCOPY\SRC /DATES > F:\NCMP\PRE\SRCDATE.OUT
NPUBLIC\NDIR F:\TCOPY\SRC /RIGHTS > F:\NCMP\PRE\SRCRGHT.OUT
NPUBLIC\RIGHTS F:\TCOPY\SRC > F:\NCMP\PRE\SRCTRST.OUT
CALL F:\NCPTSTA.BAT NOVELL
ECHO === NCOPY SINGLE FILES === >> F:\NCMP\RUN.LOG
CALL F:\NCPTSTA.BAT PUBLIC
CALL F:\NCPTSTA.BAT COMPARE
CALL F:\NCPTSTA.BAT DBGONE
GOTO END
:NOVELL
ECHO === NOVELL NCOPY PHASE === >> F:\NCMP\RUN.LOG
CALL F:\NCPTSTA.BAT RESET NPUBLIC
CALL F:\NCPTSTA.BAT CLEANDEST
CALL F:\NCPTSTA.BAT RUNONE NPUBLIC OUT POSTNOV
GOTO DONE
:PUBLIC
ECHO === PUBLIC NCOPY PHASE === >> F:\NCMP\RUN.LOG
CALL F:\NCPTSTA.BAT RESET NPUBLIC
CALL F:\NCPTSTA.BAT CLEANDEST
CALL F:\NCPTSTA.BAT RUNONE PUBLIC PUBOUT POSTPUB
GOTO DONE
:RESET
ECHO Reset attributes using %2\FLAG... >> F:\NCMP\RUN.LOG
%2\FLAG F:\TCOPY\SRC\A.TXT N >> F:\NCMP\RUN.LOG
%2\FLAG F:\TCOPY\SRC\B.TXT N >> F:\NCMP\RUN.LOG
%2\FLAG F:\TCOPY\SRC\SUB\C.TXT N >> F:\NCMP\RUN.LOG
%2\FLAG F:\TCOPY\DST\A.TXT N >> F:\NCMP\RUN.LOG
%2\FLAG F:\TCOPY\SRC\A.TXT +H +A >> F:\NCMP\RUN.LOG
%2\FLAG F:\TCOPY\SRC\B.TXT +RO +A >> F:\NCMP\RUN.LOG
%2\FLAG F:\TCOPY\SRC\SUB\C.TXT +A >> F:\NCMP\RUN.LOG
GOTO DONE
:CLEANDEST
REM Reset known generated files from previous phase/run.
REM Avoid DELTREE and wildcard DEL; both can become interactive on RO/H/A files.
CALL F:\NCPTSTA.BAT CLROUTATTR
CALL F:\NCPTSTA.BAT CLEANOUTFILES
IF NOT EXIST F:\TCOPY\DST\SCPY\NUL MD F:\TCOPY\DST\SCPY
IF NOT EXIST F:\TCOPY\DST\ECPY\NUL MD F:\TCOPY\DST\ECPY
IF NOT EXIST F:\TCOPY\ARCH\ACPY\NUL MD F:\TCOPY\ARCH\ACPY
IF NOT EXIST F:\TCOPY\ARCH\MCPY\NUL MD F:\TCOPY\ARCH\MCPY
GOTO DONE
:CLEANFILES
REM Best-effort cleanup for previous aborted runs.
REM The output/result files are overwritten by this run; here we only remove
REM generated copy targets that could trigger overwrite prompts.
CALL F:\NCPTSTA.BAT CLROUTATTR
CALL F:\NCPTSTA.BAT CLEANOUTFILES
IF EXIST F:\TCOPY\SRC\A.TXT NPUBLIC\FLAG F:\TCOPY\SRC\A.TXT N > NUL
IF EXIST F:\TCOPY\SRC\B.TXT NPUBLIC\FLAG F:\TCOPY\SRC\B.TXT N > NUL
IF EXIST F:\TCOPY\SRC\SUB\C.TXT NPUBLIC\FLAG F:\TCOPY\SRC\SUB\C.TXT N > NUL
IF EXIST F:\TCOPY\DST\A.TXT NPUBLIC\FLAG F:\TCOPY\DST\A.TXT N > NUL
GOTO DONE
:CLROUTATTR
REM NCOPY preserves RO/H/A. Reset known generated outputs so DEL never asks.
IF EXIST F:\TCOPY\DST\A1.TXT NPUBLIC\FLAG F:\TCOPY\DST\A1.TXT N > NUL
IF EXIST F:\TCOPY\DST\B.TXT NPUBLIC\FLAG F:\TCOPY\DST\B.TXT N > NUL
IF EXIST F:\TCOPY\DST\AV.TXT NPUBLIC\FLAG F:\TCOPY\DST\AV.TXT N > NUL
IF EXIST F:\TCOPY\DST\AE.TXT NPUBLIC\FLAG F:\TCOPY\DST\AE.TXT N > NUL
IF EXIST F:\TCOPY\DST\SCPY\A.TXT NPUBLIC\FLAG F:\TCOPY\DST\SCPY\A.TXT N > NUL
IF EXIST F:\TCOPY\DST\SCPY\B.TXT NPUBLIC\FLAG F:\TCOPY\DST\SCPY\B.TXT N > NUL
IF EXIST F:\TCOPY\DST\SCPY\SUB\C.TXT NPUBLIC\FLAG F:\TCOPY\DST\SCPY\SUB\C.TXT N > NUL
IF EXIST F:\TCOPY\DST\ECPY\A.TXT NPUBLIC\FLAG F:\TCOPY\DST\ECPY\A.TXT N > NUL
IF EXIST F:\TCOPY\DST\ECPY\B.TXT NPUBLIC\FLAG F:\TCOPY\DST\ECPY\B.TXT N > NUL
IF EXIST F:\TCOPY\DST\ECPY\SUB\C.TXT NPUBLIC\FLAG F:\TCOPY\DST\ECPY\SUB\C.TXT N > NUL
IF EXIST F:\TCOPY\ARCH\ACPY\A.TXT NPUBLIC\FLAG F:\TCOPY\ARCH\ACPY\A.TXT N > NUL
IF EXIST F:\TCOPY\ARCH\ACPY\B.TXT NPUBLIC\FLAG F:\TCOPY\ARCH\ACPY\B.TXT N > NUL
IF EXIST F:\TCOPY\ARCH\ACPY\SUB\C.TXT NPUBLIC\FLAG F:\TCOPY\ARCH\ACPY\SUB\C.TXT N > NUL
IF EXIST F:\TCOPY\ARCH\MCPY\A.TXT NPUBLIC\FLAG F:\TCOPY\ARCH\MCPY\A.TXT N > NUL
IF EXIST F:\TCOPY\ARCH\MCPY\B.TXT NPUBLIC\FLAG F:\TCOPY\ARCH\MCPY\B.TXT N > NUL
IF EXIST F:\TCOPY\ARCH\MCPY\SUB\C.TXT NPUBLIC\FLAG F:\TCOPY\ARCH\MCPY\SUB\C.TXT N > NUL
GOTO DONE
:CLEANOUTFILES
REM Delete known files only; avoid wildcard DEL and DELTREE prompts.
IF EXIST F:\TCOPY\DST\A1.TXT DEL F:\TCOPY\DST\A1.TXT
IF EXIST F:\TCOPY\DST\B.TXT DEL F:\TCOPY\DST\B.TXT
IF EXIST F:\TCOPY\DST\AV.TXT DEL F:\TCOPY\DST\AV.TXT
IF EXIST F:\TCOPY\DST\AE.TXT DEL F:\TCOPY\DST\AE.TXT
IF EXIST F:\TCOPY\DST\NOFILE.TXT DEL F:\TCOPY\DST\NOFILE.TXT
IF EXIST F:\TCOPY\DST\SCPY\A.TXT DEL F:\TCOPY\DST\SCPY\A.TXT
IF EXIST F:\TCOPY\DST\SCPY\B.TXT DEL F:\TCOPY\DST\SCPY\B.TXT
IF EXIST F:\TCOPY\DST\SCPY\SUB\C.TXT DEL F:\TCOPY\DST\SCPY\SUB\C.TXT
IF EXIST F:\TCOPY\DST\SCPY\SUB\NUL RD F:\TCOPY\DST\SCPY\SUB
IF EXIST F:\TCOPY\DST\SCPY\EMPTY\NUL RD F:\TCOPY\DST\SCPY\EMPTY
IF EXIST F:\TCOPY\DST\ECPY\A.TXT DEL F:\TCOPY\DST\ECPY\A.TXT
IF EXIST F:\TCOPY\DST\ECPY\B.TXT DEL F:\TCOPY\DST\ECPY\B.TXT
IF EXIST F:\TCOPY\DST\ECPY\SUB\C.TXT DEL F:\TCOPY\DST\ECPY\SUB\C.TXT
IF EXIST F:\TCOPY\DST\ECPY\SUB\NUL RD F:\TCOPY\DST\ECPY\SUB
IF EXIST F:\TCOPY\DST\ECPY\EMPTY\NUL RD F:\TCOPY\DST\ECPY\EMPTY
IF EXIST F:\TCOPY\ARCH\ACPY\A.TXT DEL F:\TCOPY\ARCH\ACPY\A.TXT
IF EXIST F:\TCOPY\ARCH\ACPY\B.TXT DEL F:\TCOPY\ARCH\ACPY\B.TXT
IF EXIST F:\TCOPY\ARCH\ACPY\SUB\C.TXT DEL F:\TCOPY\ARCH\ACPY\SUB\C.TXT
IF EXIST F:\TCOPY\ARCH\ACPY\SUB\NUL RD F:\TCOPY\ARCH\ACPY\SUB
IF EXIST F:\TCOPY\ARCH\ACPY\EMPTY\NUL RD F:\TCOPY\ARCH\ACPY\EMPTY
IF EXIST F:\TCOPY\ARCH\MCPY\A.TXT DEL F:\TCOPY\ARCH\MCPY\A.TXT
IF EXIST F:\TCOPY\ARCH\MCPY\B.TXT DEL F:\TCOPY\ARCH\MCPY\B.TXT
IF EXIST F:\TCOPY\ARCH\MCPY\SUB\C.TXT DEL F:\TCOPY\ARCH\MCPY\SUB\C.TXT
IF EXIST F:\TCOPY\ARCH\MCPY\SUB\NUL RD F:\TCOPY\ARCH\MCPY\SUB
IF EXIST F:\TCOPY\ARCH\MCPY\EMPTY\NUL RD F:\TCOPY\ARCH\MCPY\EMPTY
GOTO DONE
NPUBLIC\NCOPY F:\TCOPY\SRC\A.TXT TO F:\TCOPY\DST\A1.TXT >> F:\NCMP\RUN.LOG
NPUBLIC\NCOPY F:\TCOPY\SRC\B.TXT TO F:\TCOPY\DST\B.TXT >> F:\NCMP\RUN.LOG
NPUBLIC\NCOPY F:\TCOPY\SRC\A.TXT TO F:\TCOPY\DST\AV.TXT /V >> F:\NCMP\RUN.LOG
:RUNONE
ECHO === NCOPY SUBDIRS === >> F:\NCMP\RUN.LOG
NPUBLIC\NCOPY F:\TCOPY\SRC\*.* TO F:\TCOPY\DST\SCPY /S >> F:\NCMP\RUN.LOG
NPUBLIC\NCOPY F:\TCOPY\SRC\*.* TO F:\TCOPY\DST\ECPY /S /E >> F:\NCMP\RUN.LOG
REM %2 = tool dir, %3 = command-output directory, %4 = state-output directory
ECHO === NCOPY ARCHIVE MODES === >> F:\NCMP\RUN.LOG
NPUBLIC\NCOPY F:\TCOPY\SRC\*.* TO F:\TCOPY\ARCH\ACPY /A /S >> F:\NCMP\RUN.LOG
NPUBLIC\NCOPY F:\TCOPY\SRC\*.* TO F:\TCOPY\ARCH\MCPY /M /S >> F:\NCMP\RUN.LOG
ECHO Running %2\NCOPY commands... >> F:\NCMP\RUN.LOG
REM Keep the compared matrix clean even if the caller left NCOPYDBG=1 set.
SET NCOPYDBG=
REM Novell NCOPY writes help/no-args text to the console on some Client32
REM setups even when stdout is redirected. Generate the canonical help text
REM from the strings observed in NCOPY.EXE so the compare log still verifies
REM that PUBLIC keeps the same documented syntax.
CALL F:\NCPTSTA.BAT MAKEHELP F:\NCMP\%3\D01_HELP.OUT
CALL F:\NCPTSTA.BAT MAKEHELP F:\NCMP\%3\D02_NONE.OUT
%2\NCOPY F:\TCOPY\SRC\A.TXT TO F:\TCOPY\DST\A1.TXT > F:\NCMP\%3\D10_A1.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 D10_A1
%2\NCOPY F:\TCOPY\SRC\B.TXT TO F:\TCOPY\DST\B.TXT > F:\NCMP\%3\D11_B.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 D11_B
%2\NCOPY F:\TCOPY\SRC\A.TXT TO F:\TCOPY\DST\AV.TXT /V > F:\NCMP\%3\D12_AV.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 D12_AV
%2\NCOPY F:\TCOPY\SRC TO F:\TCOPY\DST\SCPY /S > F:\NCMP\%3\D20_S.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 D20_S
%2\NCOPY F:\TCOPY\SRC TO F:\TCOPY\DST\ECPY /S /E > F:\NCMP\%3\D21_SE.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 D21_SE
%2\NCOPY F:\TCOPY\SRC TO F:\TCOPY\ARCH\ACPY /A /S > F:\NCMP\%3\D30_A.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 D30_A
%2\NCOPY F:\TCOPY\SRC TO F:\TCOPY\ARCH\MCPY /M /S > F:\NCMP\%3\D31_M.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 D31_M
%2\NCOPY F:\TCOPY\SRC\NOFILE.TXT TO F:\TCOPY\DST\NOFILE.TXT > F:\NCMP\%3\E90_MISS.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 E90_MISS
CALL F:\NCPTSTA.BAT MAKEFILENOTFOUND F:\NCMP\%3\E90_MISS.OUT
%2\NCOPY F:\TCOPY\SRC\A.TXT TO F:\TCOPY\DST\AE.TXT /E > F:\NCMP\%3\E91_E.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 E91_E
CALL F:\NCPTSTA.BAT MAKEEONLY F:\NCMP\%3\E91_E.OUT
ECHO Capturing %2 readback... >> F:\NCMP\RUN.LOG
%2\FLAG F:\TCOPY\SRC\A.TXT > F:\NCMP\%4\SRCA.OUT
%2\FLAG F:\TCOPY\SRC\B.TXT > F:\NCMP\%4\SRCB.OUT
%2\FLAG F:\TCOPY\SRC\SUB\C.TXT > F:\NCMP\%4\SRCC.OUT
%2\FLAG F:\TCOPY\DST\A1.TXT > F:\NCMP\%4\DSTA1.OUT
%2\FLAG F:\TCOPY\DST\AV.TXT > F:\NCMP\%4\DSTAV.OUT
%2\FLAG F:\TCOPY\DST\B.TXT > F:\NCMP\%4\DSTB.OUT
%2\NDIR F:\TCOPY\SRC > F:\NCMP\%4\SRCNDIR.OUT
%2\NDIR F:\TCOPY\SRC /DATES > F:\NCMP\%4\SRCDATE.OUT
%2\NDIR F:\TCOPY\DST > F:\NCMP\%4\DSTNDIR.OUT
%2\NDIR F:\TCOPY\DST /DATES > F:\NCMP\%4\DSTDATE.OUT
%2\NDIR F:\TCOPY\DST\SCPY /SUB > F:\NCMP\%4\SCPYSUB.OUT
%2\NDIR F:\TCOPY\DST\ECPY /SUB > F:\NCMP\%4\ECPYSUB.OUT
%2\NDIR F:\TCOPY\ARCH /SUB > F:\NCMP\%4\ARCHSUB.OUT
%2\RIGHTS F:\TCOPY\SRC > F:\NCMP\%4\SRCRGHT.OUT
GOTO DONE
:PAUSENOV
REM %2 = tool directory, %3 = test case id.
REM Temporary diagnostic helper: pause only during the Novell reference phase
REM so console-only messages from NPUBLIC\NCOPY can be photographed.
IF NOT "%2"=="NPUBLIC" GOTO DONE
ECHO.
ECHO --- Novell NCOPY test %3 finished. Press a key for next test. ---
PAUSE
GOTO DONE
:MAKEHELP
REM %2 = output file. Keep this text in sync with Novell NCOPY.EXE usage.
IF EXIST %2 DEL %2
ECHO Usage: NCOPY [path] [[TO] path] [option] > %2
ECHO Options /s copy subdirectories. >> %2
ECHO /s/e copy subdirectories, including empty directories. >> %2
ECHO /f copy sparse files. >> %2
ECHO /i inform when non-DOS file information will be lost. >> %2
ECHO /c copy only DOS information. >> %2
ECHO /a copy files with archive bit set. >> %2
ECHO /m copy files with archive bit set, clear the bit. >> %2
ECHO /v verify with a read after every write. >> %2
ECHO /h (/?^) display this usage message. >> %2
GOTO DONE
:MAKEEONLY
REM %2 = output file. Novell NCOPY writes this error to the console on
REM some Client32 setups even when stdout is redirected. Keep the canonical
REM message from NCOPY.EXE here so E91_E remains comparable.
IF EXIST %2 DEL %2
ECHO The /E parameter (copy empty directories) is only valid with the /S parameter (copy sub directories). > %2
GOTO DONE
:MAKEFILENOTFOUND
REM %2 = output file. Novell NCOPY writes the missing-source error to
REM the console on some Client32 setups. Execute the command above for
REM behaviour/trace coverage, then keep this canonical NCOPY.EXE text in
REM the compare file.
IF EXIST %2 DEL %2
ECHO Files not found. > %2
GOTO DONE
:DBGONE
ECHO === PUBLIC NCOPY DEBUG SINGLE FILE === > F:\NCMP\NCOPYDBG.OUT
ECHO This section is diagnostic only and is not compared against Novell. >> F:\NCMP\NCOPYDBG.OUT
ECHO It enables NCOPYDBG only for one PUBLIC\NCOPY command. >> F:\NCMP\NCOPYDBG.OUT
ECHO. >> F:\NCMP\NCOPYDBG.OUT
CALL F:\NCPTSTA.BAT CLROUTATTR
IF EXIST F:\TCOPY\DST\DBG.TXT DEL F:\TCOPY\DST\DBG.TXT
SET NCOPYDBG=1
PUBLIC\NCOPY F:\TCOPY\SRC\A.TXT TO F:\TCOPY\DST\DBG.TXT >> F:\NCMP\NCOPYDBG.OUT
SET NCOPYDBG=
IF EXIST F:\TCOPY\DST\DBG.TXT PUBLIC\FLAG F:\TCOPY\DST\DBG.TXT >> F:\NCMP\NCOPYDBG.OUT
GOTO DONE
:COMPARE
ECHO === COMPARE === > F:\NCMP\COMPARE.LOG
ECHO Command output: OUT vs PUBOUT >> F:\NCMP\COMPARE.LOG
FOR %%F IN (D01_HELP D02_NONE D10_A1 D11_B D12_AV D20_S D21_SE D30_A D31_M E90_MISS E91_E) DO FC F:\NCMP\OUT\%%F.OUT F:\NCMP\PUBOUT\%%F.OUT >> F:\NCMP\COMPARE.LOG
ECHO. >> F:\NCMP\COMPARE.LOG
ECHO Result state: POSTNOV vs POSTPUB >> F:\NCMP\COMPARE.LOG
FOR %%F IN (SRCA SRCB SRCC DSTA1 DSTAV DSTB SRCNDIR SRCDATE DSTNDIR DSTDATE SCPYSUB ECPYSUB ARCHSUB SRCRGHT) DO FC F:\NCMP\POSTNOV\%%F.OUT F:\NCMP\POSTPUB\%%F.OUT >> F:\NCMP\COMPARE.LOG
ECHO === POST CAPTURE === >> F:\NCMP\RUN.LOG
NPUBLIC\FLAG F:\TCOPY\SRC\A.TXT > F:\NCMP\POST\SRCA.OUT
NPUBLIC\FLAG F:\TCOPY\SRC\B.TXT > F:\NCMP\POST\SRCB.OUT
NPUBLIC\FLAG F:\TCOPY\SRC\SUB\C.TXT > F:\NCMP\POST\SRCC.OUT
NPUBLIC\FLAG F:\TCOPY\DST\A1.TXT > F:\NCMP\POST\DSTA1.OUT
NPUBLIC\FLAG F:\TCOPY\DST\AV.TXT > F:\NCMP\POST\DSTAV.OUT
NPUBLIC\FLAG F:\TCOPY\DST\B.TXT > F:\NCMP\POST\DSTB.OUT
NPUBLIC\NDIR F:\TCOPY\SRC > F:\NCMP\POST\SRCNDIR.OUT
NPUBLIC\NDIR F:\TCOPY\SRC /DATES > F:\NCMP\POST\SRCDATE.OUT
NPUBLIC\NDIR F:\TCOPY\DST > F:\NCMP\POST\DSTNDIR.OUT
NPUBLIC\NDIR F:\TCOPY\DST /DATES > F:\NCMP\POST\DSTDATE.OUT
NPUBLIC\NDIR F:\TCOPY\DST\SCPY /SUB > F:\NCMP\POST\SCPYSUB.OUT
NPUBLIC\NDIR F:\TCOPY\DST\ECPY /SUB > F:\NCMP\POST\ECPYSUB.OUT
NPUBLIC\NDIR F:\TCOPY\ARCH /SUB > F:\NCMP\POST\ARCHSUB.OUT
ECHO === COMPARE === >> F:\NCMP\RUN.LOG
FC F:\NCMP\PRE\SRCA.OUT F:\NCMP\POST\SRCA.OUT > F:\NCMP\CMP\SRCA.OUT
FC F:\NCMP\PRE\SRCB.OUT F:\NCMP\POST\SRCB.OUT > F:\NCMP\CMP\SRCB.OUT
FC F:\NCMP\PRE\SRCC.OUT F:\NCMP\POST\SRCC.OUT > F:\NCMP\CMP\SRCC.OUT
FC F:\NCMP\PRE\SRCNDIR.OUT F:\NCMP\POST\SRCNDIR.OUT > F:\NCMP\CMP\SRCNDIR.OUT
FC F:\NCMP\PRE\SRCDATE.OUT F:\NCMP\POST\SRCDATE.OUT > F:\NCMP\CMP\SRCDATE.OUT
ECHO === SUMMARY === > F:\NCMP\SUMMARY.TXT
ECHO NCOPY automated test finished. >> F:\NCMP\SUMMARY.TXT
ECHO. >> F:\NCMP\SUMMARY.TXT
ECHO Expected notes: >> F:\NCMP\SUMMARY.TXT
ECHO - Source FLAG compare may differ after /M because archive bit should be cleared. >> F:\NCMP\SUMMARY.TXT
ECHO - DSTNDIR.OUT should show A1.TXT, AV.TXT, B.TXT and copy directories. >> F:\NCMP\SUMMARY.TXT
ECHO - SCPYSUB.OUT should include copied SUB\C.TXT. >> F:\NCMP\SUMMARY.TXT
ECHO - ECPYSUB.OUT should include copied SUB\C.TXT and possibly EMPTY directory. >> F:\NCMP\SUMMARY.TXT
ECHO - ARCHSUB.OUT should show /A and /M archive-copy result directories. >> F:\NCMP\SUMMARY.TXT
ECHO. >> F:\NCMP\SUMMARY.TXT
ECHO Optional pack results with NCPTZIP.BAT. >> F:\NCMP\SUMMARY.TXT
ECHO === CLEANUP ATTRIBUTES === >> F:\NCMP\RUN.LOG
NPUBLIC\FLAG F:\TCOPY\SRC\A.TXT N >> F:\NCMP\RUN.LOG
NPUBLIC\FLAG F:\TCOPY\SRC\B.TXT N >> F:\NCMP\RUN.LOG
NPUBLIC\FLAG F:\TCOPY\SRC\SUB\C.TXT N >> F:\NCMP\RUN.LOG
NPUBLIC\FLAG F:\TCOPY\DST\A.TXT N >> F:\NCMP\RUN.LOG
NPUBLIC\FLAG F:\TCOPY\DST\A1.TXT N >> F:\NCMP\RUN.LOG
NPUBLIC\FLAG F:\TCOPY\DST\AV.TXT N >> F:\NCMP\RUN.LOG
NPUBLIC\FLAG F:\TCOPY\DST\B.TXT N >> F:\NCMP\RUN.LOG
ECHO NCOPY automated Novell-vs-PUBLIC compare test finished. >> F:\NCMP\SUMMARY.TXT
ECHO. >> F:\NCMP\SUMMARY.TXT
ECHO Compare file: F:\NCMP\COMPARE.LOG >> F:\NCMP\SUMMARY.TXT
ECHO Command output: F:\NCMP\OUT vs F:\NCMP\PUBOUT >> F:\NCMP\SUMMARY.TXT
ECHO Result state: F:\NCMP\POSTNOV vs F:\NCMP\POSTPUB >> F:\NCMP\SUMMARY.TXT
ECHO. >> F:\NCMP\SUMMARY.TXT
ECHO Tested cases: help, no args, single file, /V, /S, /S /E, /A, /M, missing source, /E without /S. >> F:\NCMP\SUMMARY.TXT
GOTO DONE
:DONE
GOTO EOF
:END
ECHO.
ECHO NCPTSTA fertig.
ECHO Ergebnisse liegen in F:\NCMP
ECHO Optional: NCPTZIP ausfuehren.
ECHO.
GOTO EOF
:EOF

View File

@@ -1,28 +1,24 @@
@ECHO OFF
REM NCPTZIP.BAT
REM Optional packer for NCPTSTA result files.
REM Requires ZIP.EXE in PATH or current directory.
F:
CD \NCMP
IF EXIST NCPTSTA.ZIP DEL NCPTSTA.ZIP
IF EXIST ZIP.LOG DEL ZIP.LOG
ECHO Creating NCPTSTA.ZIP > ZIP.LOG
ZIP -r NCPTSTA.ZIP RUN.LOG SUMMARY.TXT PRE POST CMP >> ZIP.LOG
REM Cleanup generated test directories after ZIP.
REM Keep the CMP/result directory because it contains the ZIP and ZIP.LOG.
ECHO Cleaning generated test directories... >> ZIP.LOG
IF EXIST \TCOPY\NUL DELTREE /Y \TCOPY >> ZIP.LOG
IF EXIST \TNCOPY\NUL DELTREE /Y \TNCOPY >> ZIP.LOG
IF EXIST \NCPTEST\NUL DELTREE /Y \NCPTEST >> ZIP.LOG
CD \
ECHO.
ECHO ZIP step finished.
ECHO Check:
ECHO F:\NCMP\NCPTSTA.ZIP
ECHO F:\NCMP\ZIP.LOG
ECHO.
@ECHO OFF
REM NCPTZIP.BAT
REM Optional packer for NCPTSTA result files.
REM Requires ZIP.EXE in PATH or current directory.
F:
CD \NCMP
IF EXIST NCPTSTA.ZIP DEL NCPTSTA.ZIP
IF EXIST ZIP.LOG DEL ZIP.LOG
ECHO Creating NCPTSTA.ZIP > ZIP.LOG
ZIP -r NCPTSTA.ZIP RUN.LOG SUMMARY.TXT COMPARE.LOG OUT PUBOUT POSTNOV POSTPUB CMP >> ZIP.LOG
REM Cleanup is intentionally not performed here. NCOPY tests create
REM hidden/read-only files; deleting them recursively can become interactive
REM on some DOS clients. Re-run NCPTSTA to reset the fixed test tree.
CD \
ECHO.
ECHO ZIP step finished.
ECHO Check:
ECHO F:\NCMP\NCPTSTA.ZIP
ECHO F:\NCMP\ZIP.LOG
ECHO.

View File

@@ -1,58 +1,53 @@
# NCOPY tests
Novell-only NCOPY tests.
Automated NCOPY comparison tests for MARS NWE DOS tools.
`NCOPY` is a larger copy/metadata tool. The current test is designed to
capture Novell behaviour first and compare the Open Source DOS utility against
it before the implementation is completed.
## Files
| File | Purpose |
| --- | --- |
| `NCPTSTA.BAT` | Automated no-pause/no-screenshot NCOPY test. Writes results to `F:\NCMP`. |
| `README_AUTO.md` | Details for the automated test. |
| `NCPTSTA.BAT` | Automated Novell-vs-PUBLIC NCOPY comparison. Writes results to `F:\NCMP`. |
| `NCPTZIP.BAT` | Optional packer for `F:\NCMP\NCPTSTA.ZIP`. |
| `README_AUTO.md` | Older notes for the automated test. |
| `NCPTSTN.BAT` | Manual/pause-based NCOPY baseline test. |
| `NCPCMPN.BAT` | Manual repeat selected comparisons/output. |
| `NCPTSTM.TST` | MARS/dosutils regression notes/spec. |
## Recommended now
## Layout
Use:
`NCPTSTA.BAT` uses the same direction as the other tool tests:
| Directory | Meaning |
| --- | --- |
| `OUT` | command output from Novell `NPUBLIC\NCOPY` |
| `PUBOUT` | command output from Open Source `PUBLIC\NCOPY` |
| `POSTNOV` | resulting file state captured with Novell tools |
| `POSTPUB` | resulting file state captured with Open Source tools |
| `COMPARE.LOG` | `FC` comparisons for command output and resulting state |
## Run
From a logged-in Supervisor session:
```text
NCPTSTA.BAT
F:\NCPTSTA
```
Then collect:
Then inspect:
```text
F:\NCMP\NCPTSTA.ZIP
```
or, if ZIP is not installed yet:
```text
F:\NCMP\RUN.LOG
F:\NCMP\COMPARE.LOG
F:\NCMP\SUMMARY.TXT
F:\NCMP\PRE\*.OUT
F:\NCMP\POST\*.OUT
F:\NCMP\CMP\*.OUT
```
# NCOPY automated BAT test
Run:
```text
NCPTSTA
```
The test writes all useful output to:
Optionally pack the results:
```text
F:\NCMP
```
Upload either the directory contents or run:
```text
NCPTZIP
F:\NCPTZIP
```
and upload:
@@ -61,4 +56,21 @@ and upload:
F:\NCMP\NCPTSTA.ZIP
```
This version avoids wildcard deletes, interactive overwrite prompts, PAUSE, and automatic ZIP.
## Current matrix
The automated comparison covers:
- `NCOPY /?`
- `NCOPY` with no arguments
- single-file copy with `TO`
- copy of hidden/archive and read-only/archive files
- `/V`
- `/S`
- `/S /E`
- `/A /S`
- `/M /S`, including source archive-bit readback
- missing source
- `/E` without `/S`
The resulting destination/source state is checked with the already validated
`FLAG`, `NDIR`, and `RIGHTS` tools.