diff options
author | mnag <mnag@FreeBSD.org> | 2005-11-21 23:29:23 +0000 |
---|---|---|
committer | mnag <mnag@FreeBSD.org> | 2005-11-21 23:29:23 +0000 |
commit | 0f3779afe765f31608ddd6777ede72235d4c84c3 (patch) | |
tree | 982f6d837b90412c3ba49d64adc14aeae0061898 | |
parent | 952a712c2b3d9226ff15d4f97b6760d2f74fa015 (diff) | |
download | FreeBSD-ports-0f3779afe765f31608ddd6777ede72235d4c84c3.zip FreeBSD-ports-0f3779afe765f31608ddd6777ede72235d4c84c3.tar.gz |
Update to 0.3.8_1
* Added --pristine mode that guarentees no inconsistancies in +CONTENTS files
* Fixed (I hope) stdin not being reopened properly after a [Y/N/A] timeout
* Fixed a segfault when portmanager reads a very old pre 4.11 +CONTENTS file,
identified by Andrew Gordon <arg@arg.me.uk>
PR: 89397
Submitted by: Michael C. Shultz <ringworm01@gmail.com> (maintainer)
-rw-r--r-- | ports-mgmt/portmanager/Makefile | 1 | ||||
-rw-r--r-- | ports-mgmt/portmanager/files/patch-0.3.8_1 | 428 | ||||
-rw-r--r-- | sysutils/portmanager/Makefile | 1 | ||||
-rw-r--r-- | sysutils/portmanager/files/patch-0.3.8_1 | 428 |
4 files changed, 858 insertions, 0 deletions
diff --git a/ports-mgmt/portmanager/Makefile b/ports-mgmt/portmanager/Makefile index 2f47b4f..8c0a97d 100644 --- a/ports-mgmt/portmanager/Makefile +++ b/ports-mgmt/portmanager/Makefile @@ -7,6 +7,7 @@ PORTNAME= portmanager PORTVERSION= 0.3.8 +PORTREVISION= 1 CATEGORIES= sysutils MASTER_SITES= http://portmanager.sunsite.dk/distfiles/ \ ${MASTER_SITE_SOURCEFORGE} diff --git a/ports-mgmt/portmanager/files/patch-0.3.8_1 b/ports-mgmt/portmanager/files/patch-0.3.8_1 new file mode 100644 index 0000000..f267719 --- /dev/null +++ b/ports-mgmt/portmanager/files/patch-0.3.8_1 @@ -0,0 +1,428 @@ +diff -ruN ../0.3.8/libMGPM/src/MGPMlogCreate.c ./libMGPM/src/MGPMlogCreate.c +--- ../0.3.8/libMGPM/src/MGPMlogCreate.c Fri Nov 18 07:49:06 2005 ++++ ./libMGPM/src/MGPMlogCreate.c Sun Nov 20 12:50:55 2005 +@@ -106,7 +106,7 @@ + fprintf( logFileStream, "%-25s %d %-25s %d\n", "backUp", property->backUp, "buildDependsAreLeaves", property->buildDependsAreLeaves ); + fprintf( logFileStream, "%-25s %d %-25s %d\n", "forced", property->forced, "interactive", property->interactive ); + fprintf( logFileStream, "%-25s %d %-25s %d\n", "log", property->log, "pmMode", property->pmMode ); +- fprintf( logFileStream, "%-25s %d %-25s %d\n", "resume", property->resume, " ", 0 ); ++ fprintf( logFileStream, "%-25s %d %-25s %d\n", "pristine", property->pristine, "resume", property->resume ); + fprintf( logFileStream, "%s\n", SINGLE_LINES ); + + fclose( logFileStream ); +diff -ruN ../0.3.8/libMGPM/src/MGPMrCommandLine.c ./libMGPM/src/MGPMrCommandLine.c +--- ../0.3.8/libMGPM/src/MGPMrCommandLine.c Sat Nov 19 17:18:08 2005 ++++ ./libMGPM/src/MGPMrCommandLine.c Sun Nov 20 17:08:58 2005 +@@ -50,6 +50,7 @@ + + void MGPMrTimer( int signalId ) + { ++ int idx = 0; + /* + * re-set the signal handler again to MGPMrCatchSignal, for next time + */ +@@ -59,7 +60,14 @@ + */ + while( fflush( stdout ) ); + ++ while( close( 0 ) && idx < 100 ) ++ { ++ printf( "close(0) retry %d of 100\n", idx ); ++ idx++; ++ } ++/* + fclose( stdin ); ++*/ + globalProperty->timeOut = 1; + } + +@@ -88,14 +96,15 @@ + property.autoConflicts = 0; /* 1 = yes to all */ + property.autoMoved = 0; /* if 1 then remove moved ports is Y */ + property.backUp = 0; /* 0 = no packages 1 = build backup packages */ ++ property.bsdPortMkPatched = 0; /* 1 = bsd.port.mk is in patched state */ ++ property.bsdPortMkPatchedBlock = 0; /* 1 = bsd.port.mk can't be patch so quit trying */ + property.forced = 0; /* set by -f on command line */ + property.interactive = 0; /* set by -ui on command line */ + property.log = 0; /* set by -l --LOG on command line */ + property.optionsChanged = 0; /* set by MGPMrUpdate for example to indicate a ports's options just changed */ + property.pmMode = 0; /* 0 = multiple port updates/1 = single */ ++ property.pristine = 0; /* 1 = run in pristine mode */ + property.resume = 0; /* 1 = portmanager updated itself, don't rebuild databases in -u -f mode */ +- property.bsdPortMkPatched = 0; /* 1 = bsd.port.mk is in patched state */ +- property.bsdPortMkPatchedBlock = 0; /* 1 = bsd.port.mk can't be patch so quit trying */ + + /* + * set by Makefile options in ports +diff -ruN ../0.3.8/libMGPM/src/MGPMrController.c ./libMGPM/src/MGPMrController.c +--- ../0.3.8/libMGPM/src/MGPMrController.c Sat Nov 19 11:25:43 2005 ++++ ./libMGPM/src/MGPMrController.c Sun Nov 20 12:33:50 2005 +@@ -47,8 +47,10 @@ + char fix[] = "--fix"; + char id[] = "MGPMrController"; + char ignore[] = "/IGNORE"; ++ char p[] = "-p"; + char package_version[] = PACKAGE_VERSION; + char portmanager[] = "portmanager"; ++ char pristine[] = "--pristine"; + char resume[] = "--resume"; + char space[] = " "; + char ui[] = "-ui"; +@@ -131,16 +133,33 @@ + { + property->resume = 1; + } ++ + MGdbGoTop( property->commandLineDb ); + if( MGdbSeek( property->commandLineDb, property->fieldCommandLineDbKey, ui, property->fieldCommandLineDbKey, exact ) ) + { + property->interactive = 1; + } ++ + MGdbGoTop( property->commandLineDb ); + if( MGdbSeek( property->commandLineDb, property->fieldCommandLineDbKey, upgradeInteractive, property->fieldCommandLineDbKey, exact ) ) + { + property->interactive = 1; + } ++ ++ MGdbGoTop( property->commandLineDb ); ++ if( MGdbSeek( property->commandLineDb, property->fieldCommandLineDbKey, p, property->fieldCommandLineDbKey, exact ) ) ++ { ++ property->pristine = 1; ++ } ++ ++ MGdbGoTop( property->commandLineDb ); ++ if( MGdbSeek( property->commandLineDb, property->fieldCommandLineDbKey, pristine, property->fieldCommandLineDbKey, exact ) ) ++ { ++ property->pristine = 1; ++ } ++ ++ ++ + property->logFile = MGPMlogCreate( property ); + + /* +diff -ruN ../0.3.8/libMGPM/src/MGPMrCreateInstalledDb.c ./libMGPM/src/MGPMrCreateInstalledDb.c +--- ../0.3.8/libMGPM/src/MGPMrCreateInstalledDb.c Fri Nov 18 07:49:06 2005 ++++ ./libMGPM/src/MGPMrCreateInstalledDb.c Mon Nov 21 10:27:28 2005 +@@ -175,7 +175,12 @@ + + buffPtr = portDependencyName + stringSize + 1; + +- portDependencyDir = strstr( buffPtr, "@comment DEPORIGIN:" ); ++ if( ( portDependencyDir = strstr( buffPtr, "@comment DEPORIGIN:" ) ) == NULL ) ++ { ++ /* if here +CONTENTS record is screwed up */ ++ break; ++ } ++ + portDependencyDir += strlen( "@comment DEPORIGIN:" ); + stringSize = strstr( portDependencyDir, "\n" ) - portDependencyDir; + portDependencyDir[stringSize] = 0; +diff -ruN ../0.3.8/libMGPM/src/MGPMrGetPortName.c ./libMGPM/src/MGPMrGetPortName.c +--- ../0.3.8/libMGPM/src/MGPMrGetPortName.c Sat Nov 19 17:45:28 2005 ++++ ./libMGPM/src/MGPMrGetPortName.c Mon Nov 21 11:55:45 2005 +@@ -42,6 +42,7 @@ + int answer = 0; + int bufferSize = 0xffff; + int stdinFileDescriptor = 0; ++ int stdinFileDescriptorIdx = 0; + + command = (char*)calloc( bufferSize, 1 ); + +@@ -156,8 +157,16 @@ + * reset alarm, reopen stdin after timeout + */ + alarm(0); +- stdinFileDescriptor = open( "/dev/tty", O_RDWR ); ++/* ++ stdinFileDescriptorIdx = 0; ++ while( ( stdinFileDescriptor = open( "/dev/tty", O_RDWR ) ) != -1 && stdinFileDescriptorIdx < 10000 ) ++ { ++ printf( "open( /dev/tty ) retry %d of 100\n", stdinFileDescriptorIdx ); ++ stdinFileDescriptorIdx++; ++ } + stdin = fdopen( stdinFileDescriptor, "r" ); ++*/ ++ stdin = fdopen( 0, "r" ); + property->timeOut = 0; + MGPMlogAdd( property, "installed ", portName, + " removed from system after 5 minute timeout: no longer in ports tree: see /usr/ports/MOVED", " ", " " ); +diff -ruN ../0.3.8/libMGPM/src/MGPMrReadConfigure.c ./libMGPM/src/MGPMrReadConfigure.c +--- ../0.3.8/libMGPM/src/MGPMrReadConfigure.c Fri Nov 18 07:49:06 2005 ++++ ./libMGPM/src/MGPMrReadConfigure.c Sun Nov 20 17:21:54 2005 +@@ -54,7 +54,7 @@ + { + FILE* configDbStream = NULL; + char* configFileNameOld = NULL; +-/* char id[] = "MGPMrReadConfigure"; */ ++ char id[] = "MGPMrReadConfigure"; + char* buffer = NULL; + char* command = NULL; + char* nullBase = NULL; +@@ -107,7 +107,12 @@ + strcat( command, property->configConfFileName ); + strcat( command, " >> " ); + strcat( command, property->configDbFileName ); +- system( command ); ++ if( system( command ) ) ++ { ++ fprintf( stdout, "%s %s: error: command %s reurned an error\n", id, PACKAGE_VERSION ); ++ while( fflush( stdout ) ); ++ assert( 0 ); ++ } + configDbFileSize = MGrFileSize( property->configDbFileName ); + buffer = malloc( configDbFileSize + 1 ); + configDbStream = fopen( property->configDbFileName, "r" ); +diff -ruN ../0.3.8/libMGPM/src/MGPMrSinglePortStatus.c ./libMGPM/src/MGPMrSinglePortStatus.c +--- ../0.3.8/libMGPM/src/MGPMrSinglePortStatus.c Fri Nov 18 14:40:55 2005 ++++ ./libMGPM/src/MGPMrSinglePortStatus.c Sun Nov 20 15:16:01 2005 +@@ -57,6 +57,7 @@ + int counter = 0; + int installedPortsDbIDX = 0; + int old = 0; ++ int returnCode = 0; + int* counterPtr = NULL; + + counterPtr = &counter; +@@ -147,22 +148,47 @@ + installedPortsDbIDX, + property->fieldInstalledPortsDbPortDir ) ); + +- if( rCheckForOldDependencies( property, installedPortsDbPortDir, oldDependencyName, oldDependencyDir, counterPtr ) ) ++ if( ( returnCode = rCheckForOldDependencies( property, ++ installedPortsDbPortDir, ++ oldDependencyName, ++ oldDependencyDir, ++ counterPtr ) ) ) + { +- fprintf( stdout, "%05d have:%-35s %-35s built with OLD dependency: %s\n", +- counter, +- installedPortsDbPortName, +- installedPortsDbPortDir, +- oldDependencyName ); +- while( fflush( stdout ) ); ++ if( returnCode == 2 ) ++ { ++ fprintf( stdout, "%05d PRISTINE MODE: %-35s %-35s has incorrect %s entry in +CONTENTS file\n", ++ counter, ++ installedPortsDbPortName, ++ installedPortsDbPortDir, ++ oldDependencyName ); ++ while( fflush( stdout ) ); ++ ++ MGdbAdd( property->oldPortsDb, ++ installedPortsDbPortDir, ++ installedPortsDbPortName, ++ "PRISTINE MODE: incorrect +CONTENTS file entry", ++ oldDependencyName, ++ oldDependencyDir, ++ NULL ); ++ } ++ else ++ { ++ fprintf( stdout, "%05d have:%-35s %-35s built with OLD dependency: %s\n", ++ counter, ++ installedPortsDbPortName, ++ installedPortsDbPortDir, ++ oldDependencyName ); ++ while( fflush( stdout ) ); ++ ++ MGdbAdd( property->oldPortsDb, ++ installedPortsDbPortDir, ++ installedPortsDbPortName, ++ "built with OLD dependency", ++ oldDependencyName, ++ oldDependencyDir, ++ NULL ); ++ } + +- MGdbAdd( property->oldPortsDb, +- installedPortsDbPortDir, +- installedPortsDbPortName, +- "built with OLD dependency", +- oldDependencyName, +- oldDependencyDir, +- NULL ); + } + else + { +@@ -353,11 +379,11 @@ + char exact[] = "exact"; + char* availableDependenciesDbDependencyNamePtr = NULL; + char* installedPortsDbPortNamePtr = NULL; +- ++ + counterPtr[0]++; + + /* +- * Are all dpendencies belonging to installedPortsDbPortName in installedPortsDb? ++ * Are all availableDependencies belonging to installedPortsDbPortName in installedPortsDb? + */ + MGdbGoTop( property->availableDependenciesDb ); + +@@ -385,7 +411,7 @@ + } + + /* +- * installedPortsDbPortName has no dependencies, were done here ++ * installedPortsDbPortName has no available Dependencies, we are done here + */ + if( availableDependenciesDbDependencyNamePtr == NULL ) + { +@@ -406,7 +432,7 @@ + property->fieldInstalledPortsDbPortName, + exact ); + /* +- * dependency is not in installedPortsDb ++ * availableDependency is not in installedPortsDb + */ + if( installedPortsDbPortNamePtr == NULL ) + { +@@ -421,6 +447,38 @@ + installedPortsDbPortDir, + property->fieldAvailableDependenciesDbDependencyName, + exact ); ++ } ++ ++ if( property->pristine || property->forced ) ++ { ++ /* ++ * One last test is to check that each of installedPortsDbPortDir's dependencies found in dependencyDb are indeed in ++ * installedDB, this verifies that +CONTENTS file is correct ++ */ ++ MGdbGoTop( property->dependencyPortsDb ); ++ while( MGdbSeek( property->dependencyPortsDb, ++ property->fieldDependencyDbPortDir, ++ installedPortsDbPortDir, ++ property->fieldDependencyDbPortDir, ++ exact ) ) ++ { ++ strcpy( oldDependencyName, MGdbGet( property->dependencyPortsDb, ++ MGdbGetRecno( property->dependencyPortsDb ) - 1, ++ property->fieldDependencyDbDependencyPortName ) ); ++ ++ MGdbGoTop( property->installedPortsDb ); ++ if( MGdbSeek( property->installedPortsDb, ++ property->fieldInstalledPortsDbPortName, ++ oldDependencyName, ++ property->fieldInstalledPortsDbPortName, ++ exact ) == NULL ) ++ { ++ strcpy( oldDependencyDir, MGdbGet( property->dependencyPortsDb, ++ MGdbGetRecno( property->dependencyPortsDb ) - 1, ++ property->fieldDependencyDbDependencyPortDir ) ); ++ return( 2 ); ++ } ++ } + } + oldDependencyDir[0] = 0; + oldDependencyName[0] = 0; +diff -ruN ../0.3.8/libMGPM/src/MGPMrUpdate.c ./libMGPM/src/MGPMrUpdate.c +--- ../0.3.8/libMGPM/src/MGPMrUpdate.c Sat Nov 19 18:01:27 2005 ++++ ./libMGPM/src/MGPMrUpdate.c Mon Nov 21 11:55:19 2005 +@@ -76,6 +76,7 @@ + int installedPortsDbIDX = 0; + int installedPortsDbQTY = 0; + int stdinFileDescriptor = 0; ++ int stdinFileDescriptorIdx = 0; + int answer = 1; + + structLocalProperty localProperty; +@@ -610,7 +611,8 @@ + stinker = strstr( bufferBase, localProperty.installedPortName ); + if( stinker ) + { +- fprintf( stdout, "OK to remove conflicting port %s Yy/Nn/Aa [Y]\? ", localProperty.installedPortName ); ++ fprintf( stdout, "OK to remove conflicting port %s Yy/Nn/Aa [Y]\?\n", localProperty.installedPortName ); ++ fprintf( stdout, "Will timeout after 5 minutes and default to [Y] if no selection is made\n" ); + while( fflush( stdout ) ); + if( property->autoConflicts == 0 ) + { +@@ -693,8 +695,16 @@ + * reset alarm, reopen stdin after timeout + */ + alarm(0); +- stdinFileDescriptor = open( "/dev/tty", O_RDWR ); ++/* ++ stdinFileDescriptorIdx = 0; ++ while( ( stdinFileDescriptor = open( "/dev/tty", O_RDWR ) ) != -1 && stdinFileDescriptorIdx < 10000 ) ++ { ++ printf( "open( /dev/tty ) retry %d of 100\n", stdinFileDescriptorIdx ); ++ stdinFileDescriptorIdx++; ++ } + stdin = fdopen( stdinFileDescriptor, "r" ); ++*/ ++ stdin = fdopen( 0, "r" ); + property->timeOut = 0; + MGPMlogAdd( property, "conflicting installed ", localProperty.installedPortName, + " removed from system after 5 minute timeout: conflicted with ", oldPortName, " " ); +diff -ruN ../0.3.8/libMGPM/src/libMGPM.h ./libMGPM/src/libMGPM.h +--- ../0.3.8/libMGPM/src/libMGPM.h Sat Nov 19 17:08:06 2005 ++++ ./libMGPM/src/libMGPM.h Sun Nov 20 16:54:55 2005 +@@ -119,6 +119,8 @@ + int autoConflicts; /* if 1 then conflicts Y/N default is Y */ + int autoMoved; /* if 1 then remove moved ports is Y */ + int backUp; /* if 1 then make packages for updatyed ports */ ++ int bsdPortMkPatched; /* 1 = bsd.port.mk is in patched state */ ++ int bsdPortMkPatchedBlock; /* 1 = bsd.port.mk can't be patch so quit trying */ + int buildDependsAreLeaves; /* 1 = treat build depends as if they don't exist in availableDependencies.db */ + int forced; /* 1 = forced updates 0 = normal */ + int interactive; /* 0 = non, 1 = interactive */ +@@ -126,10 +128,9 @@ + int objIdx; + int optionsChanged; /* set by MGPMrUpdate for example to indicate a ports's options just changed */ + int pmMode; /* singlePort Upgrade = 1 multiple upgrade = 0 */ ++ int pristine; /* 1 = run in pristine mode */ + int resume; /* 0=normal 1=don't create databases*/ + int verbose; +- int bsdPortMkPatched; /* 1 = bsd.port.mk is in patched state */ +- int bsdPortMkPatchedBlock; /* 1 = bsd.port.mk can't be patch so quit trying */ + + /* + * misc +@@ -236,7 +237,7 @@ + int MGPMrStatus( structProperty* property ); + int MGPMrUpdate(structProperty* property, char* oldPortDir, char* oldPortName ); + int MGPMrBsdPortMkRevertPatch( structProperty* property ); +-void MGPMrCatchSignal(int signalId ); /* located in MGPMrController.c */ +-void MGPMrTimer( int signalId ); ++void MGPMrCatchSignal(int signalId ); /* located in MGPMrCommandLine.c */ ++void MGPMrTimer( int signalId ); /* located in MGPMrCommandLine.c */ + + #endif +diff -ruN ../0.3.8/portmanager/help.txt ./portmanager/help.txt +--- ../0.3.8/portmanager/help.txt Fri Nov 18 07:49:06 2005 ++++ ./portmanager/help.txt Sun Nov 20 11:44:28 2005 +@@ -33,6 +33,14 @@ + instead of starting from the beggining by + trying this option + ++ -p or --pristine Updates a port if any dependency in it's ++ /var/db/pkg/{port name}/+CONTENTS does not ++ match what is installed. The effect is when a ++ port is updated, any port who uses the updated ++ port in it's dependency chain, no matter how ++ deep, are rebuilt. Normally only ports one ++ level up are rebuilt. ++ + examples: + + to add or update a single port with logging: +diff -ruN ../0.3.8/portmanager/portmanager.1 ./portmanager/portmanager.1 +--- ../0.3.8/portmanager/portmanager.1 Fri Nov 18 07:49:06 2005 ++++ ./portmanager/portmanager.1 Sun Nov 20 12:37:51 2005 +@@ -88,6 +88,13 @@ + from the ports tree (see /usr/ports/MOVED for a list of these) + .sp + .It ++\fB\&-p\fR or \fB\&--pristine\fR ++ Updates a port if any dependency in it's /var/db/pkg/{port name}/+CONTENTS ++does not match what is installed. The effect is when a port is updated, any ++port who uses the updated port in it's dependency chain, no matter how deep, ++are rebuilt. Normally only ports one level up are rebuilt. ++.sp ++.It + \fB\&--resume\fR + bypass installed port dependency data collection: if you quit in the middle of a forced update for example, + you may be able to resume instead of starting from the beginning with this option. After you have updated diff --git a/sysutils/portmanager/Makefile b/sysutils/portmanager/Makefile index 2f47b4f..8c0a97d 100644 --- a/sysutils/portmanager/Makefile +++ b/sysutils/portmanager/Makefile @@ -7,6 +7,7 @@ PORTNAME= portmanager PORTVERSION= 0.3.8 +PORTREVISION= 1 CATEGORIES= sysutils MASTER_SITES= http://portmanager.sunsite.dk/distfiles/ \ ${MASTER_SITE_SOURCEFORGE} diff --git a/sysutils/portmanager/files/patch-0.3.8_1 b/sysutils/portmanager/files/patch-0.3.8_1 new file mode 100644 index 0000000..f267719 --- /dev/null +++ b/sysutils/portmanager/files/patch-0.3.8_1 @@ -0,0 +1,428 @@ +diff -ruN ../0.3.8/libMGPM/src/MGPMlogCreate.c ./libMGPM/src/MGPMlogCreate.c +--- ../0.3.8/libMGPM/src/MGPMlogCreate.c Fri Nov 18 07:49:06 2005 ++++ ./libMGPM/src/MGPMlogCreate.c Sun Nov 20 12:50:55 2005 +@@ -106,7 +106,7 @@ + fprintf( logFileStream, "%-25s %d %-25s %d\n", "backUp", property->backUp, "buildDependsAreLeaves", property->buildDependsAreLeaves ); + fprintf( logFileStream, "%-25s %d %-25s %d\n", "forced", property->forced, "interactive", property->interactive ); + fprintf( logFileStream, "%-25s %d %-25s %d\n", "log", property->log, "pmMode", property->pmMode ); +- fprintf( logFileStream, "%-25s %d %-25s %d\n", "resume", property->resume, " ", 0 ); ++ fprintf( logFileStream, "%-25s %d %-25s %d\n", "pristine", property->pristine, "resume", property->resume ); + fprintf( logFileStream, "%s\n", SINGLE_LINES ); + + fclose( logFileStream ); +diff -ruN ../0.3.8/libMGPM/src/MGPMrCommandLine.c ./libMGPM/src/MGPMrCommandLine.c +--- ../0.3.8/libMGPM/src/MGPMrCommandLine.c Sat Nov 19 17:18:08 2005 ++++ ./libMGPM/src/MGPMrCommandLine.c Sun Nov 20 17:08:58 2005 +@@ -50,6 +50,7 @@ + + void MGPMrTimer( int signalId ) + { ++ int idx = 0; + /* + * re-set the signal handler again to MGPMrCatchSignal, for next time + */ +@@ -59,7 +60,14 @@ + */ + while( fflush( stdout ) ); + ++ while( close( 0 ) && idx < 100 ) ++ { ++ printf( "close(0) retry %d of 100\n", idx ); ++ idx++; ++ } ++/* + fclose( stdin ); ++*/ + globalProperty->timeOut = 1; + } + +@@ -88,14 +96,15 @@ + property.autoConflicts = 0; /* 1 = yes to all */ + property.autoMoved = 0; /* if 1 then remove moved ports is Y */ + property.backUp = 0; /* 0 = no packages 1 = build backup packages */ ++ property.bsdPortMkPatched = 0; /* 1 = bsd.port.mk is in patched state */ ++ property.bsdPortMkPatchedBlock = 0; /* 1 = bsd.port.mk can't be patch so quit trying */ + property.forced = 0; /* set by -f on command line */ + property.interactive = 0; /* set by -ui on command line */ + property.log = 0; /* set by -l --LOG on command line */ + property.optionsChanged = 0; /* set by MGPMrUpdate for example to indicate a ports's options just changed */ + property.pmMode = 0; /* 0 = multiple port updates/1 = single */ ++ property.pristine = 0; /* 1 = run in pristine mode */ + property.resume = 0; /* 1 = portmanager updated itself, don't rebuild databases in -u -f mode */ +- property.bsdPortMkPatched = 0; /* 1 = bsd.port.mk is in patched state */ +- property.bsdPortMkPatchedBlock = 0; /* 1 = bsd.port.mk can't be patch so quit trying */ + + /* + * set by Makefile options in ports +diff -ruN ../0.3.8/libMGPM/src/MGPMrController.c ./libMGPM/src/MGPMrController.c +--- ../0.3.8/libMGPM/src/MGPMrController.c Sat Nov 19 11:25:43 2005 ++++ ./libMGPM/src/MGPMrController.c Sun Nov 20 12:33:50 2005 +@@ -47,8 +47,10 @@ + char fix[] = "--fix"; + char id[] = "MGPMrController"; + char ignore[] = "/IGNORE"; ++ char p[] = "-p"; + char package_version[] = PACKAGE_VERSION; + char portmanager[] = "portmanager"; ++ char pristine[] = "--pristine"; + char resume[] = "--resume"; + char space[] = " "; + char ui[] = "-ui"; +@@ -131,16 +133,33 @@ + { + property->resume = 1; + } ++ + MGdbGoTop( property->commandLineDb ); + if( MGdbSeek( property->commandLineDb, property->fieldCommandLineDbKey, ui, property->fieldCommandLineDbKey, exact ) ) + { + property->interactive = 1; + } ++ + MGdbGoTop( property->commandLineDb ); + if( MGdbSeek( property->commandLineDb, property->fieldCommandLineDbKey, upgradeInteractive, property->fieldCommandLineDbKey, exact ) ) + { + property->interactive = 1; + } ++ ++ MGdbGoTop( property->commandLineDb ); ++ if( MGdbSeek( property->commandLineDb, property->fieldCommandLineDbKey, p, property->fieldCommandLineDbKey, exact ) ) ++ { ++ property->pristine = 1; ++ } ++ ++ MGdbGoTop( property->commandLineDb ); ++ if( MGdbSeek( property->commandLineDb, property->fieldCommandLineDbKey, pristine, property->fieldCommandLineDbKey, exact ) ) ++ { ++ property->pristine = 1; ++ } ++ ++ ++ + property->logFile = MGPMlogCreate( property ); + + /* +diff -ruN ../0.3.8/libMGPM/src/MGPMrCreateInstalledDb.c ./libMGPM/src/MGPMrCreateInstalledDb.c +--- ../0.3.8/libMGPM/src/MGPMrCreateInstalledDb.c Fri Nov 18 07:49:06 2005 ++++ ./libMGPM/src/MGPMrCreateInstalledDb.c Mon Nov 21 10:27:28 2005 +@@ -175,7 +175,12 @@ + + buffPtr = portDependencyName + stringSize + 1; + +- portDependencyDir = strstr( buffPtr, "@comment DEPORIGIN:" ); ++ if( ( portDependencyDir = strstr( buffPtr, "@comment DEPORIGIN:" ) ) == NULL ) ++ { ++ /* if here +CONTENTS record is screwed up */ ++ break; ++ } ++ + portDependencyDir += strlen( "@comment DEPORIGIN:" ); + stringSize = strstr( portDependencyDir, "\n" ) - portDependencyDir; + portDependencyDir[stringSize] = 0; +diff -ruN ../0.3.8/libMGPM/src/MGPMrGetPortName.c ./libMGPM/src/MGPMrGetPortName.c +--- ../0.3.8/libMGPM/src/MGPMrGetPortName.c Sat Nov 19 17:45:28 2005 ++++ ./libMGPM/src/MGPMrGetPortName.c Mon Nov 21 11:55:45 2005 +@@ -42,6 +42,7 @@ + int answer = 0; + int bufferSize = 0xffff; + int stdinFileDescriptor = 0; ++ int stdinFileDescriptorIdx = 0; + + command = (char*)calloc( bufferSize, 1 ); + +@@ -156,8 +157,16 @@ + * reset alarm, reopen stdin after timeout + */ + alarm(0); +- stdinFileDescriptor = open( "/dev/tty", O_RDWR ); ++/* ++ stdinFileDescriptorIdx = 0; ++ while( ( stdinFileDescriptor = open( "/dev/tty", O_RDWR ) ) != -1 && stdinFileDescriptorIdx < 10000 ) ++ { ++ printf( "open( /dev/tty ) retry %d of 100\n", stdinFileDescriptorIdx ); ++ stdinFileDescriptorIdx++; ++ } + stdin = fdopen( stdinFileDescriptor, "r" ); ++*/ ++ stdin = fdopen( 0, "r" ); + property->timeOut = 0; + MGPMlogAdd( property, "installed ", portName, + " removed from system after 5 minute timeout: no longer in ports tree: see /usr/ports/MOVED", " ", " " ); +diff -ruN ../0.3.8/libMGPM/src/MGPMrReadConfigure.c ./libMGPM/src/MGPMrReadConfigure.c +--- ../0.3.8/libMGPM/src/MGPMrReadConfigure.c Fri Nov 18 07:49:06 2005 ++++ ./libMGPM/src/MGPMrReadConfigure.c Sun Nov 20 17:21:54 2005 +@@ -54,7 +54,7 @@ + { + FILE* configDbStream = NULL; + char* configFileNameOld = NULL; +-/* char id[] = "MGPMrReadConfigure"; */ ++ char id[] = "MGPMrReadConfigure"; + char* buffer = NULL; + char* command = NULL; + char* nullBase = NULL; +@@ -107,7 +107,12 @@ + strcat( command, property->configConfFileName ); + strcat( command, " >> " ); + strcat( command, property->configDbFileName ); +- system( command ); ++ if( system( command ) ) ++ { ++ fprintf( stdout, "%s %s: error: command %s reurned an error\n", id, PACKAGE_VERSION ); ++ while( fflush( stdout ) ); ++ assert( 0 ); ++ } + configDbFileSize = MGrFileSize( property->configDbFileName ); + buffer = malloc( configDbFileSize + 1 ); + configDbStream = fopen( property->configDbFileName, "r" ); +diff -ruN ../0.3.8/libMGPM/src/MGPMrSinglePortStatus.c ./libMGPM/src/MGPMrSinglePortStatus.c +--- ../0.3.8/libMGPM/src/MGPMrSinglePortStatus.c Fri Nov 18 14:40:55 2005 ++++ ./libMGPM/src/MGPMrSinglePortStatus.c Sun Nov 20 15:16:01 2005 +@@ -57,6 +57,7 @@ + int counter = 0; + int installedPortsDbIDX = 0; + int old = 0; ++ int returnCode = 0; + int* counterPtr = NULL; + + counterPtr = &counter; +@@ -147,22 +148,47 @@ + installedPortsDbIDX, + property->fieldInstalledPortsDbPortDir ) ); + +- if( rCheckForOldDependencies( property, installedPortsDbPortDir, oldDependencyName, oldDependencyDir, counterPtr ) ) ++ if( ( returnCode = rCheckForOldDependencies( property, ++ installedPortsDbPortDir, ++ oldDependencyName, ++ oldDependencyDir, ++ counterPtr ) ) ) + { +- fprintf( stdout, "%05d have:%-35s %-35s built with OLD dependency: %s\n", +- counter, +- installedPortsDbPortName, +- installedPortsDbPortDir, +- oldDependencyName ); +- while( fflush( stdout ) ); ++ if( returnCode == 2 ) ++ { ++ fprintf( stdout, "%05d PRISTINE MODE: %-35s %-35s has incorrect %s entry in +CONTENTS file\n", ++ counter, ++ installedPortsDbPortName, ++ installedPortsDbPortDir, ++ oldDependencyName ); ++ while( fflush( stdout ) ); ++ ++ MGdbAdd( property->oldPortsDb, ++ installedPortsDbPortDir, ++ installedPortsDbPortName, ++ "PRISTINE MODE: incorrect +CONTENTS file entry", ++ oldDependencyName, ++ oldDependencyDir, ++ NULL ); ++ } ++ else ++ { ++ fprintf( stdout, "%05d have:%-35s %-35s built with OLD dependency: %s\n", ++ counter, ++ installedPortsDbPortName, ++ installedPortsDbPortDir, ++ oldDependencyName ); ++ while( fflush( stdout ) ); ++ ++ MGdbAdd( property->oldPortsDb, ++ installedPortsDbPortDir, ++ installedPortsDbPortName, ++ "built with OLD dependency", ++ oldDependencyName, ++ oldDependencyDir, ++ NULL ); ++ } + +- MGdbAdd( property->oldPortsDb, +- installedPortsDbPortDir, +- installedPortsDbPortName, +- "built with OLD dependency", +- oldDependencyName, +- oldDependencyDir, +- NULL ); + } + else + { +@@ -353,11 +379,11 @@ + char exact[] = "exact"; + char* availableDependenciesDbDependencyNamePtr = NULL; + char* installedPortsDbPortNamePtr = NULL; +- ++ + counterPtr[0]++; + + /* +- * Are all dpendencies belonging to installedPortsDbPortName in installedPortsDb? ++ * Are all availableDependencies belonging to installedPortsDbPortName in installedPortsDb? + */ + MGdbGoTop( property->availableDependenciesDb ); + +@@ -385,7 +411,7 @@ + } + + /* +- * installedPortsDbPortName has no dependencies, were done here ++ * installedPortsDbPortName has no available Dependencies, we are done here + */ + if( availableDependenciesDbDependencyNamePtr == NULL ) + { +@@ -406,7 +432,7 @@ + property->fieldInstalledPortsDbPortName, + exact ); + /* +- * dependency is not in installedPortsDb ++ * availableDependency is not in installedPortsDb + */ + if( installedPortsDbPortNamePtr == NULL ) + { +@@ -421,6 +447,38 @@ + installedPortsDbPortDir, + property->fieldAvailableDependenciesDbDependencyName, + exact ); ++ } ++ ++ if( property->pristine || property->forced ) ++ { ++ /* ++ * One last test is to check that each of installedPortsDbPortDir's dependencies found in dependencyDb are indeed in ++ * installedDB, this verifies that +CONTENTS file is correct ++ */ ++ MGdbGoTop( property->dependencyPortsDb ); ++ while( MGdbSeek( property->dependencyPortsDb, ++ property->fieldDependencyDbPortDir, ++ installedPortsDbPortDir, ++ property->fieldDependencyDbPortDir, ++ exact ) ) ++ { ++ strcpy( oldDependencyName, MGdbGet( property->dependencyPortsDb, ++ MGdbGetRecno( property->dependencyPortsDb ) - 1, ++ property->fieldDependencyDbDependencyPortName ) ); ++ ++ MGdbGoTop( property->installedPortsDb ); ++ if( MGdbSeek( property->installedPortsDb, ++ property->fieldInstalledPortsDbPortName, ++ oldDependencyName, ++ property->fieldInstalledPortsDbPortName, ++ exact ) == NULL ) ++ { ++ strcpy( oldDependencyDir, MGdbGet( property->dependencyPortsDb, ++ MGdbGetRecno( property->dependencyPortsDb ) - 1, ++ property->fieldDependencyDbDependencyPortDir ) ); ++ return( 2 ); ++ } ++ } + } + oldDependencyDir[0] = 0; + oldDependencyName[0] = 0; +diff -ruN ../0.3.8/libMGPM/src/MGPMrUpdate.c ./libMGPM/src/MGPMrUpdate.c +--- ../0.3.8/libMGPM/src/MGPMrUpdate.c Sat Nov 19 18:01:27 2005 ++++ ./libMGPM/src/MGPMrUpdate.c Mon Nov 21 11:55:19 2005 +@@ -76,6 +76,7 @@ + int installedPortsDbIDX = 0; + int installedPortsDbQTY = 0; + int stdinFileDescriptor = 0; ++ int stdinFileDescriptorIdx = 0; + int answer = 1; + + structLocalProperty localProperty; +@@ -610,7 +611,8 @@ + stinker = strstr( bufferBase, localProperty.installedPortName ); + if( stinker ) + { +- fprintf( stdout, "OK to remove conflicting port %s Yy/Nn/Aa [Y]\? ", localProperty.installedPortName ); ++ fprintf( stdout, "OK to remove conflicting port %s Yy/Nn/Aa [Y]\?\n", localProperty.installedPortName ); ++ fprintf( stdout, "Will timeout after 5 minutes and default to [Y] if no selection is made\n" ); + while( fflush( stdout ) ); + if( property->autoConflicts == 0 ) + { +@@ -693,8 +695,16 @@ + * reset alarm, reopen stdin after timeout + */ + alarm(0); +- stdinFileDescriptor = open( "/dev/tty", O_RDWR ); ++/* ++ stdinFileDescriptorIdx = 0; ++ while( ( stdinFileDescriptor = open( "/dev/tty", O_RDWR ) ) != -1 && stdinFileDescriptorIdx < 10000 ) ++ { ++ printf( "open( /dev/tty ) retry %d of 100\n", stdinFileDescriptorIdx ); ++ stdinFileDescriptorIdx++; ++ } + stdin = fdopen( stdinFileDescriptor, "r" ); ++*/ ++ stdin = fdopen( 0, "r" ); + property->timeOut = 0; + MGPMlogAdd( property, "conflicting installed ", localProperty.installedPortName, + " removed from system after 5 minute timeout: conflicted with ", oldPortName, " " ); +diff -ruN ../0.3.8/libMGPM/src/libMGPM.h ./libMGPM/src/libMGPM.h +--- ../0.3.8/libMGPM/src/libMGPM.h Sat Nov 19 17:08:06 2005 ++++ ./libMGPM/src/libMGPM.h Sun Nov 20 16:54:55 2005 +@@ -119,6 +119,8 @@ + int autoConflicts; /* if 1 then conflicts Y/N default is Y */ + int autoMoved; /* if 1 then remove moved ports is Y */ + int backUp; /* if 1 then make packages for updatyed ports */ ++ int bsdPortMkPatched; /* 1 = bsd.port.mk is in patched state */ ++ int bsdPortMkPatchedBlock; /* 1 = bsd.port.mk can't be patch so quit trying */ + int buildDependsAreLeaves; /* 1 = treat build depends as if they don't exist in availableDependencies.db */ + int forced; /* 1 = forced updates 0 = normal */ + int interactive; /* 0 = non, 1 = interactive */ +@@ -126,10 +128,9 @@ + int objIdx; + int optionsChanged; /* set by MGPMrUpdate for example to indicate a ports's options just changed */ + int pmMode; /* singlePort Upgrade = 1 multiple upgrade = 0 */ ++ int pristine; /* 1 = run in pristine mode */ + int resume; /* 0=normal 1=don't create databases*/ + int verbose; +- int bsdPortMkPatched; /* 1 = bsd.port.mk is in patched state */ +- int bsdPortMkPatchedBlock; /* 1 = bsd.port.mk can't be patch so quit trying */ + + /* + * misc +@@ -236,7 +237,7 @@ + int MGPMrStatus( structProperty* property ); + int MGPMrUpdate(structProperty* property, char* oldPortDir, char* oldPortName ); + int MGPMrBsdPortMkRevertPatch( structProperty* property ); +-void MGPMrCatchSignal(int signalId ); /* located in MGPMrController.c */ +-void MGPMrTimer( int signalId ); ++void MGPMrCatchSignal(int signalId ); /* located in MGPMrCommandLine.c */ ++void MGPMrTimer( int signalId ); /* located in MGPMrCommandLine.c */ + + #endif +diff -ruN ../0.3.8/portmanager/help.txt ./portmanager/help.txt +--- ../0.3.8/portmanager/help.txt Fri Nov 18 07:49:06 2005 ++++ ./portmanager/help.txt Sun Nov 20 11:44:28 2005 +@@ -33,6 +33,14 @@ + instead of starting from the beggining by + trying this option + ++ -p or --pristine Updates a port if any dependency in it's ++ /var/db/pkg/{port name}/+CONTENTS does not ++ match what is installed. The effect is when a ++ port is updated, any port who uses the updated ++ port in it's dependency chain, no matter how ++ deep, are rebuilt. Normally only ports one ++ level up are rebuilt. ++ + examples: + + to add or update a single port with logging: +diff -ruN ../0.3.8/portmanager/portmanager.1 ./portmanager/portmanager.1 +--- ../0.3.8/portmanager/portmanager.1 Fri Nov 18 07:49:06 2005 ++++ ./portmanager/portmanager.1 Sun Nov 20 12:37:51 2005 +@@ -88,6 +88,13 @@ + from the ports tree (see /usr/ports/MOVED for a list of these) + .sp + .It ++\fB\&-p\fR or \fB\&--pristine\fR ++ Updates a port if any dependency in it's /var/db/pkg/{port name}/+CONTENTS ++does not match what is installed. The effect is when a port is updated, any ++port who uses the updated port in it's dependency chain, no matter how deep, ++are rebuilt. Normally only ports one level up are rebuilt. ++.sp ++.It + \fB\&--resume\fR + bypass installed port dependency data collection: if you quit in the middle of a forced update for example, + you may be able to resume instead of starting from the beginning with this option. After you have updated |