Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

269 lines
5.4 KiB

/* sadmin release utilities */
#include "precomp.h"
#pragma hdrstop
EnableAssert
private void SetPv(P1(AD *));
private F FSetPv(P2(AD *, F (*)(AD *pad)));
private F FChangePv(P1(AD *));
private F FRelease(P1(AD *));
/*** RELEASE ***/
F FRelInit(pad)
AD *pad;
{
if (pad->flags&flagAll || pad->pecmd->gl&fglAll)
CreatePeekThread(pad);
return fTrue;
}
F FRelDir(pad)
/* Release the project in this directory. */
AD *pad;
{
return FSetPv(pad, FRelease);
}
private F FSetPv(AD *pad, F (*pfnf)(AD *padX))
{
F fOk;
char szPv[cchPvMax];
char szBuf[cbLogPage];
if (!FLoadStatus(pad, lckAll, flsNone))
return fFalse;
if ((fOk = FChangePv(pad)) && (pfnf == 0 || (*pfnf)(pad)))
{
if (pad->iedCur != iedNil)
SyncVerH(pad, NULL);
/* Write the release to the log. */
OpenLog(pad, fTrue);
SzPrint(szBuf, "%s;%s", SzForPv(szPv, pad->psh->pv, fTrue),
pad->szComment ? pad->szComment : "");
AppendLog(pad, (FI far *)0, (char *)0, szBuf);
CloseLog();
}
FlushStatus(pad);
return fOk;
}
private F FChangePv(pad)
/* Set this project version according to pad->dpv and pad->tdMin.u.pv.szName. */
AD *pad;
{
F fChanged = fFalse;
PV pv;
DPV dpv;
int wCmp;
char szPv[cchPvMax];
pv = pad->psh->pv;
dpv = pad->dpv;
/* Apply the optional project-version-name. */
if (pad->tdMin.tdt == tdtPN)
{
char *szNewName = pad->tdMin.u.pv.szName;
F fSame = SzCmp(pv.szName, szNewName) == 0;
if (pv.szName[0] && !fSame &&
!FQueryApp("%&P/C is already named \"%s\"", "change name",
pad, pv.szName))
return fFalse;
if (!fSame)
{
SzCopy(pv.szName, szNewName);
fChanged = fTrue;
}
}
/* Apply the command line delta-pv. */
pv.rmj = (short)(dpv.fRelRmj ? pv.rmj + dpv.rmj : dpv.rmj);
pv.rmm = (short)(dpv.fRelRmm ? pv.rmm + dpv.rmm : dpv.rmm);
pv.rup = (short)(dpv.fRelRup ? pv.rup + dpv.rup : dpv.rup);
/* Warn the user if the release is less than the current one. */
if ((wCmp = CmpPv(pv, pad->psh->pv)) < 0)
{
char szPv2[cchPvMax];
char szAnyway[20];
if (!FQueryApp("%&P/C version %s is less than the current version (%s)",
SzPrint(szAnyway, "%s anyway", szOp), pad,
SzForPv(szPv, pv, fFalse),
SzForPv(szPv2, pad->psh->pv, fFalse)))
return fFalse;
}
fChanged |= wCmp != 0;
/* Update the status file. */
pad->psh->pv = pv;
if (fChanged)
UpdateVersion(pad);
if (fVerbose)
PrErr("%s %&P/C %s\n", szOp, pad,
SzForPv(szPv, pad->psh->pv, fTrue));
return fTrue;
}
F FRelease(pad)
AD *pad;
{
FI far *pfi;
FI far *pfiMac = pad->rgfi + pad->psh->ifiMac;
char szBuf[80];
int cOutFiles = 0;
/* Check if any files checked out to others */
for (pfi = pad->rgfi; pfi < pfiMac; pfi++)
{
SzPrint(szBuf, "%&C/F is checked out to ", pad, pfi);
if (FOutUsers(szBuf, sizeof szBuf, pad, pfi))
{
Warn("%s\n", szBuf);
++cOutFiles;
}
}
if (cOutFiles > 0 &&
!FQueryApp("%d %s still checked out", "release anyway",
cOutFiles, (cOutFiles == 1) ? "file is" : "files are"))
return fFalse;
/* Release */
pad->psh->fRelease = fTrue;
/* Check if we have any files checked out. */
if (pad->iedCur != iedNil)
CheckLocalVersion(pad);
return fTrue;
}
/*** SETPV ***/
F FSetPvInit(pad)
AD *pad;
{
if ('\0' == pad->tdMin.u.pv.szName[0] &&
fTrue == pad->dpv.fRelRmj &&
fTrue == pad->dpv.fRelRmm &&
fTrue == pad->dpv.fRelRup &&
0 == pad->dpv.rmj &&
0 == pad->dpv.rmm &&
0 == pad->dpv.rup)
{
Error("must specify project version or name\n");
return fFalse;
}
if (pad->flags&flagAll || pad->pecmd->gl&fglAll)
CreatePeekThread(pad);
return fTrue;
}
F FSetPvDir(pad)
/* Set the project name in this directory. */
AD *pad;
{
return FSetPv(pad, (F (*)(AD *))0);
}
/*** SETFV ***/
F FSetFVInit(pad)
AD *pad;
{
if (pad->fv < 1)
{
Error("new file version must be strictly positive\n");
return fFalse;
}
return fTrue;
}
F FSetFVDir(pad)
/* Set the file version of files in this directory. */
AD *pad;
{
FI far *pfi;
FI far *pfiMac;
IED ied;
FS far *pfs;
F fAnyHigher = fFalse;
if (!FLoadStatus(pad, lckAll, flsNone) || !FHaveCurDir(pad))
return fFalse;
MarkList(pad, pad->pneFiles, fFalse);
/* See if this setfv will reduce any files' fvs. */
for (pfi=pad->rgfi, pfiMac=pfi+pad->psh->ifiMac; pfi < pfiMac; pfi++)
{
if (!pfi->fMarked)
continue;
if (pfi->fv > pad->fv)
{
if (!fAnyHigher)
{
fAnyHigher = fTrue;
Warn("these files are higher than v%d:\n", pad->fv);
}
PrErr("%&C/F v%d\n", pad, pfi, pfi->fv);
}
}
if (fAnyHigher &&
!FQueryApp("You won't be able to retrieve the later versions by file version", "setfv anyway"))
{
FlushStatus(pad);
return fFalse;
}
OpenLog(pad, fTrue);
for (pfi = pad->rgfi; pfi < pfiMac; pfi++)
{
if (!pfi->fMarked)
continue;
if (fVerbose)
PrErr("setfv %&C/F v%d\n", pad, pfi, pad->fv);
/* Change all fs's fvs. If equal to current pfi->fv, change
* to new value, else set to 0 (will get set when in sync.)
*/
for (ied = 0; ied < pad->psh->iedMac; ied++) {
if (!FIsFreeEdValid(pad->psh) || !pad->rged[ied].fFreeEd) {
pfs = PfsForPfi(pad, ied, pfi);
pfs->fv = (FV)((pfs->fv == pfi->fv) ? pad->fv : 0);
}
}
pfi->fv = pad->fv;
AppendLog(pad, pfi, (char *)0, pad->szComment);
}
CloseLog();
FlushStatus(pad);
return fTrue;
}