'From Squeak3.7alpha of ''11 September 2003'' [latest update: #5526] on 9 November 2003 at 2:22:50 am'! Object subclass: #ChangeSetValidator instanceVariableNames: 'filePackage ' classVariableNames: '' poolDictionaries: '' category: 'Tools-File Contents Browser'! !ChangeSetValidator methodsFor: 'validation' stamp: 'dew 11/9/2003 01:35'! checkForMoreRecentUpdateThanChangeSet: updateNumberChangeSet pseudoClass: pseudoClass selector: selector "Returns the source code for a conflict if a conflict is found, otherwise returns nil." | classOrMeta allChangeSets moreRecentChangeSets conflictingChangeSets changeRecordSource classAndMethodPrintString | classAndMethodPrintString _ pseudoClass name, (pseudoClass hasMetaclass ifTrue: [' class'] ifFalse: ['']), '>>', selector asString. changeRecordSource _ pseudoClass sourceCode at: selector. changeRecordSource isText ifTrue: [changeRecordSource _ Text fromString: 'method: ', classAndMethodPrintString, ' was removed'] ifFalse: [changeRecordSource stamp isEmptyOrNil ifTrue: [self notify: 'Warning: ', classAndMethodPrintString, ' in ', self packageName, ' has no timestamp/initials!!']]. pseudoClass exists ifFalse: [(self classes at: pseudoClass name) hasDefinition ifTrue: [^ nil "a method was added for a newly defined class; not a conflict"] ifFalse: [Transcript cr; show: 'CONFLICT found for ', classAndMethodPrintString, '... class ', pseudoClass name asString, ' does not exist in the image and is not defined in the file'. ^ changeRecordSource]]. classOrMeta _ pseudoClass realClass. "Only printout the replacing methods here, but we still check for removed methods too in the rest of this method." (self class verboseConflicts and: [classOrMeta includesSelector: selector]) ifTrue: [Transcript cr; show: '...checking ', classOrMeta asString, '>>', selector asString]. allChangeSets _ ChangeSorter allChangeSets. moreRecentChangeSets _ allChangeSets copyFrom: (allChangeSets indexOf: updateNumberChangeSet) to: (allChangeSets size). conflictingChangeSets _ (moreRecentChangeSets select: [:cs | (cs atSelector: selector class: classOrMeta) ~~ #none]). conflictingChangeSets isEmpty ifTrue: [^ nil]. Transcript cr; show: 'CONFLICT found for ', classAndMethodPrintString, (' with newer changeset' asPluralBasedOn: conflictingChangeSets). conflictingChangeSets do: [:cs | Transcript show: ' ', cs name]. ^ changeRecordSource ! ! !ChangeSetValidator methodsFor: 'validation' stamp: 'dew 11/9/2003 02:20'! validate "Check the changeset in filePackage for various problems. Return true if validation has passed." | localFileName classAndMethodPrintString timeStampsValidated | timeStampsValidated _ true. localFileName _ FileDirectory localNameFor: filePackage fullPackageName. "Smalltalk isMorphic ifTrue: [self currentWorld findATranscript: self currentEvent]." Transcript cr; cr; show: 'Validating ', localFileName, ' ...'; cr. localFileName first isLetter ifFalse: [self inform: 'Changeset name must begin with a letter.'. ^ false]. localFileName size < 28 ifFalse: [self inform: 'Changeset name must be less than 28 characters in length.'. ^ false]. filePackage classes values do: [:pseudoClass | (Array with: pseudoClass with: pseudoClass metaClass) do: [:classOrMeta | classOrMeta selectors do: [:selector | | changeRecordSource | changeRecordSource _ classOrMeta sourceCode at: selector. changeRecordSource isText ifFalse: [changeRecordSource stamp isEmptyOrNil ifTrue: [classAndMethodPrintString _ classOrMeta name, (classOrMeta hasMetaclass ifTrue: [' class'] ifFalse: ['']), '>>', selector asString. Transcript show: 'Warning: ', classAndMethodPrintString, ' in ', filePackage packageName, ' has no timestamp/initials!!'. timeStampsValidated _ false] ]. ]. ]. ]. timeStampsValidated ifFalse: [self inform: 'Some methods in this changset have no timestamp/initials!! See transcript output for details.'. ^ false]. self inform: 'Validation of ', localFileName, ' was successful.'. ^ true ! ! !ChangeSetValidator methodsFor: 'initialize' stamp: 'dew 11/9/2003 01:03'! filePackage: aFilePackage filePackage _ aFilePackage! ! !ChangeSetValidator methodsFor: 'initialize' stamp: 'dew 11/9/2003 01:06'! fromFilePackage: aFilePackage filePackage _ aFilePackage! ! !ChangeSetValidator class methodsFor: 'validation' stamp: 'dew 11/9/2003 01:05'! validate: fullName (self new fromFilePackage: (FilePackage fromFileNamed: fullName)) validate! ! !ChangeSetValidator class methodsFor: 'reader service' stamp: 'dew 11/9/2003 01:21'! fileReaderServicesForFile: fullName suffix: suffix ^(suffix = 'cs') | (suffix = '*') ifTrue: [self services] ifFalse: [#()]! ! !ChangeSetValidator class methodsFor: 'reader service' stamp: 'dew 11/9/2003 00:46'! serviceValidate ^ SimpleServiceEntry provider: self label: 'validate' selector: #validate: description: 'validate that the changeset passes some basic checks to be considered as part of official Squeak' buttonLabel: 'validate'! ! !ChangeSetValidator class methodsFor: 'reader service' stamp: 'dew 11/9/2003 00:45'! services ^ Array with: self serviceValidate! ! !FilePackage methodsFor: 'accessing' stamp: 'dew 11/9/2003 01:19'! sourceSystem ^ sourceSystem! ! ChangeSetValidator class removeSelector: #newFromFilePackage:! !ChangeSetValidator class reorganize! ('validation' validate:) ('reader service' fileReaderServicesForFile:suffix: serviceValidate services) ! ChangeSetValidator removeSelector: #conflictsWithUpdatedMethods! !ChangeSetValidator reorganize! ('validation' checkForMoreRecentUpdateThanChangeSet:pseudoClass:selector: validate) ('initialize' filePackage: fromFilePackage:) ! "Postscript: Register new menu item/button in the FileList." FileList initialize!