jan@274: "{ Encoding: utf8 }" jan@274: jan@204: "{ Package: 'stx:goodies/builder/reports' }" jan@204: jan@204: "{ NameSpace: Builder }" jan@204: jan@204: ReportSourceInfo subclass:#ReportExtensionsSourceInfo jan@204: instanceVariableNames:'' jan@204: classVariableNames:'' jan@204: poolDictionaries:'' jan@204: category:'Builder-Reports-Utils' jan@204: ! jan@204: jan@204: jan@264: !ReportExtensionsSourceInfo methodsFor:'accessing'! jan@264: jan@264: pathNameAbsolute: aBoolean jan@264: "Return a path (as String) to file containing the source code. The file points to the jan@264: real source file. If `aBoolean` is true, then absolute path is returned, otherwise jan@264: realtive path to package root is returned." jan@264: jan@264: | packageDir | jan@264: jan@264: packageDir := aBoolean jan@264: ifTrue:[ (Smalltalk getPackageDirectoryForPackage: package) pathName ] jan@264: ifFalse: [ package asString replaceAll: $: with: Filename separator; replaceAll: $/ with: Filename separator ]. jan@264: jan@264: ^ packageDir , Filename separator , 'extensions.st'. jan@264: jan@264: " jan@264: (Builder::ReportSourceInfo forExtensionsInPackage: 'stx:libtool') pathNameAbsolute: true jan@264: (Builder::ReportSourceInfo forExtensionsInPackage: 'stx:libtool') pathNameAbsolute: false jan@264: " jan@264: jan@264: "Created: / 16-12-2014 / 10:27:17 / Jan Vrany " jan@264: ! ! jan@264: jan@204: !ReportExtensionsSourceInfo methodsFor:'initialization'! jan@204: jan@204: initializeWithPackage: pkg jan@204: package := pkg. jan@204: self setup. jan@204: jan@204: "Created: / 29-07-2013 / 18:38:20 / Jan Vrany " jan@204: ! ! jan@204: jan@204: !ReportExtensionsSourceInfo methodsFor:'utilities'! jan@204: jan@204: fileOutOn: streamArg jan@204: "This code is stupid as it is a copy-paste of several methods here and there that jan@204: files out an extension.st. But the the original code is so rubbish so I had jan@204: to do it this way. Sorry." jan@204: jan@204: | extensions wide stream s methodsSortedByName defClass scmManagerOrNil | jan@204: jan@204: extensions := ProjectDefinition searchForExtensionsWithProject: package. jan@274: extensions isEmptyOrNil ifTrue:[ ^ self ]. jan@204: wide := false. jan@204: stream := streamArg. jan@204: extensions do:[:method| jan@204: wide := wide or:[method source isWideString]. jan@204: ]. jan@204: wide ifTrue:[ jan@204: stream := EncodedStream stream: stream encoder: (CharacterEncoder encoderForUTF8). jan@204: stream nextPutAll: '"{ Encoding: utf8 }"'; cr;cr. jan@204: ]. jan@204: jan@204: s := stream. jan@204: jan@204: s nextPutAll:'"{ Package: '''. jan@204: s nextPutAll:package asString. jan@204: s nextPutAll:''' }"'; nextPutChunkSeparator; cr; cr. jan@204: jan@204: "/ don't write a timestamp. Otherwise we would always generate a new version, even if nothing changed jan@204: "/ s nextPutAll:(Smalltalk timeStamp). jan@204: "/ s nextPutChunkSeparator. jan@204: "/ s cr; cr. jan@204: jan@204: "/ sort them by name (to avoid conflicts due to SCM merge) jan@204: methodsSortedByName := extensions asOrderedCollection. jan@204: methodsSortedByName sort:[:a :b | jan@204: |clsA clsB| jan@204: jan@204: clsA := a mclass name. jan@204: clsB := b mclass name. jan@204: clsA < clsB ifTrue:[ jan@204: true jan@204: ] ifFalse:[ jan@204: clsA > clsB ifTrue:[ jan@204: false jan@204: ] ifFalse:[ jan@204: a selector < b selector jan@204: ] jan@204: ] jan@204: ]. jan@204: methodsSortedByName do:[:aMethod | jan@274: |cat privacy aStream| jan@204: jan@204: aStream := s. jan@204: jan@204: aStream nextPutChunkSeparator. jan@204: aMethod mclass name printOn:aStream. jan@204: "/ self printClassNameOn:aStream. jan@204: jan@204: (privacy := aMethod privacy) ~~ #public ifTrue:[ jan@204: aStream space; nextPutAll:privacy; nextPutAll:'MethodsFor:'. jan@204: ] ifFalse:[ jan@204: aStream nextPutAll:' methodsFor:'. jan@204: ]. jan@204: jan@204: cat := aMethod category ? ''. jan@204: aStream nextPutAll:cat asString storeString. jan@204: aStream nextPutChunkSeparator; cr; cr. jan@204: jan@204: SmalltalkChunkFileSourceWriter new fileOutMethod:aMethod on:aStream. jan@204: jan@204: aStream space. jan@204: aStream nextPutChunkSeparator. jan@204: aStream cr. jan@204: s cr. jan@204: ]. jan@204: jan@204: scmManagerOrNil := AbstractSourceCodeManager managerForPackage: package. jan@204: scmManagerOrNil notNil ifTrue:[ jan@204: defClass := ProjectDefinition definitionClassForPackage:package. jan@204: defClass notNil ifTrue:[ jan@204: "/ make sure, an extensionVersion_XXX method is included... jan@204: "/ (notice: no need to support a secondary backward compatible non-manager related version method here) jan@204: (methodsSortedByName contains:[:aMethod | aMethod selector == scmManagerOrNil nameOfVersionMethodForExtensions]) ifFalse:[ jan@204: s nextPutLine:('!!%1 class methodsFor:''documentation''!!' bindWith:defClass name). jan@204: s cr. jan@204: s nextChunkPut: jan@204: (scmManagerOrNil versionMethodTemplateForSmalltalkFor:(scmManagerOrNil nameOfVersionMethodForExtensions)). jan@204: s space; nextPutChunkSeparator; cr. jan@204: ]. jan@204: ]. jan@204: ]. jan@204: jan@274: "Modified: / 09-03-2015 / 15:55:17 / Jan Vrany " jan@204: ! jan@204: jan@204: validate jan@274: | extensions file | jan@204: jan@274: extensions := ProjectDefinition searchForExtensionsWithProject: package. jan@204: file := (Smalltalk getPackageDirectoryForPackage: package) / 'extensions.st'. jan@204: jan@274: extensions isEmptyOrNil ifTrue:[ jan@274: self assert: file exists not. jan@274: ] ifFalse:[ jan@274: self validateAgainstReference: file. jan@274: ] jan@274: jan@274: "Modified: / 09-03-2015 / 15:58:25 / Jan Vrany " jan@204: ! ! jan@204: jan@204: !ReportExtensionsSourceInfo class methodsFor:'documentation'! jan@204: jan@204: version jan@204: ^ '$Header$' jan@204: ! jan@204: jan@204: version_CVS jan@204: ^ '$Header$' jan@204: ! ! jan@204: