From 4c0e0f6625bd9a5b6af67c116fb0716b3a07ea2e Mon Sep 17 00:00:00 2001 From: Kurt Kilpela Date: Mon, 30 Jan 2023 08:07:23 -0800 Subject: [PATCH] Ensure files are properly truncated before use. FileSystem previously worked around this issue but truncating to current stream position on #flush. See: https://github.com/GemTalk/FileSystemGs/issues/53 --- .../RwAbstractRowanProjectLoadComponentV2.class.st | 4 +--- .../RwModificationFiletreeWriterVisitor.class.st | 9 +++++++++ .../RwModificationFiletreeWriterVisitorV2.class.st | 9 +++++++++ ...odificationPharoTonelFormatV1WriterVisitorV2.class.st | 1 + .../Rowan-Core/RwModificationTonelWriterVisitor.class.st | 4 ++++ .../RwModificationTonelWriterVisitorV2.class.st | 4 ++++ .../src/Rowan-DefinitionsV2/RwResolvedProjectV2.class.st | 1 + .../RwAbstractRowanProjectLoadComponentV2.extension.st | 2 ++ .../RwLoadSpecificationV2.class.st | 5 ++++- .../RwProjectSpecificationV2.class.st | 4 +++- .../RwResolvedProjectV2.extension.st | 1 + .../Rowan-TestsV2/RwTestProjectLibraryGenerator.class.st | 1 + .../Rowan-TestsV2/RwTestProjectLibraryIndexCard.class.st | 4 +++- 13 files changed, 43 insertions(+), 6 deletions(-) diff --git a/rowan/src/Rowan-ComponentsV2/RwAbstractRowanProjectLoadComponentV2.class.st b/rowan/src/Rowan-ComponentsV2/RwAbstractRowanProjectLoadComponentV2.class.st index b0d28c0d4..bbc0bc8c9 100644 --- a/rowan/src/Rowan-ComponentsV2/RwAbstractRowanProjectLoadComponentV2.class.st +++ b/rowan/src/Rowan-ComponentsV2/RwAbstractRowanProjectLoadComponentV2.class.st @@ -475,10 +475,8 @@ RwAbstractRowanProjectLoadComponentV2 >> exportDoitsToUrl: directoryUrl [ ifNotNil: [ :doitString | | fileRef | fileRef := doitsRoot / doitName , 'st'. - fileRef exists - ifFalse: [ fileRef ensureCreateFile ]. fileRef - writeStreamDo: [ :fileStream | fileStream nextPutAll: doitString ] ] ] ] ] + writeStreamDo: [ :fileStream | fileStream truncate; nextPutAll: doitString ] ] ] ] ] ifFalse: [ self error: 'unsupported url scheme ' , url schemeName printString ] ] diff --git a/rowan/src/Rowan-Core/RwModificationFiletreeWriterVisitor.class.st b/rowan/src/Rowan-Core/RwModificationFiletreeWriterVisitor.class.st index 797650457..226a1304d 100644 --- a/rowan/src/Rowan-Core/RwModificationFiletreeWriterVisitor.class.st +++ b/rowan/src/Rowan-Core/RwModificationFiletreeWriterVisitor.class.st @@ -143,6 +143,7 @@ RwModificationFiletreeWriterVisitor >> _filetreePackagePropertyDictFor: aPackage "create default properties file" propertiesFile writeStreamDo: [:aStream | + aStream truncate. aStream << (self _toJSON: (self class orderedDictionaryClass new @@ -165,6 +166,7 @@ RwModificationFiletreeWriterVisitor >> _filetreeProjectPropertyDictFor: aProject propertiesFile writeStreamDo: [:aStream | | dict | + aStream truncate. dict := (self class orderedDictionaryClass new) at: 'packageExtension' put: '.', self packageExtension; at: 'Metadata' put: self monticelloMetadata; @@ -294,6 +296,7 @@ RwModificationFiletreeWriterVisitor >> addedMethod: aMethodModification [ (methodDir / methodFileName, 'st') writeStreamDo: [:aStream | + aStream truncate. aStream << methodDefinition protocol << self _newLine @@ -319,6 +322,7 @@ RwModificationFiletreeWriterVisitor >> addedMethodExtension: aMethodExtensionMod (methodDir / methodFileName, 'st') writeStreamDo: [:aStream | + aStream truncate. aStream << methodDefinition protocol << self _newLine @@ -335,6 +339,7 @@ RwModificationFiletreeWriterVisitor >> addedPackage: aPackageModification [ self _packageSourceDir ensureCreateDirectory. (self _packageSourceDir / 'properties.json') writeStreamDo: [:aStream | + aStream truncate. aStream << '{' << self _newLine @@ -376,6 +381,7 @@ RwModificationFiletreeWriterVisitor >> changedMethod: aMethodModification [ (methodDir / methodFileName, 'st') writeStreamDo: [:aStream | + aStream truncate. aStream << methodDefinition protocol << self _newLine @@ -480,11 +486,13 @@ RwModificationFiletreeWriterVisitor >> processClass: aClassModification [ (self _classSourceDir / 'README.md') writeStreamDo: [:aStream | + aStream truncate. aStream << (self _commentOf: self currentClassDefinition) ]. (self _classSourceDir / 'properties.json') writeStreamDo: [:aStream | + aStream truncate. aStream << (self _typeClassDefinitionOf: self currentClassDefinition) << self _newLine ]. @@ -513,6 +521,7 @@ RwModificationFiletreeWriterVisitor >> processClassExtension: aClassExtensionMod self _classExtensionSourceDir ensureCreateDirectory. (self _classExtensionSourceDir / 'properties.json') writeStreamDo: [:aStream | + aStream truncate. aStream << (self _classExtensionOf: self currentClassExtension) << self _newLine ]. diff --git a/rowan/src/Rowan-Core/RwModificationFiletreeWriterVisitorV2.class.st b/rowan/src/Rowan-Core/RwModificationFiletreeWriterVisitorV2.class.st index 954a6ea66..e19a944bf 100644 --- a/rowan/src/Rowan-Core/RwModificationFiletreeWriterVisitorV2.class.st +++ b/rowan/src/Rowan-Core/RwModificationFiletreeWriterVisitorV2.class.st @@ -143,6 +143,7 @@ RwModificationFiletreeWriterVisitorV2 >> _filetreePackagePropertyDictFor: aPacka "create default properties file" propertiesFile writeStreamDo: [:aStream | + aStream truncate. aStream << (self _toJSON: (self class orderedDictionaryClass new @@ -165,6 +166,7 @@ RwModificationFiletreeWriterVisitorV2 >> _filetreeProjectPropertyDictFor: aProje propertiesFile writeStreamDo: [:aStream | | dict | + aStream truncate. dict := (self class orderedDictionaryClass new) at: 'packageExtension' put: '.', self packageExtension; at: 'Metadata' put: self monticelloMetadata; @@ -294,6 +296,7 @@ RwModificationFiletreeWriterVisitorV2 >> addedMethod: aMethodModification [ (methodDir / methodFileName, 'st') writeStreamDo: [:aStream | + aStream truncate. aStream << methodDefinition protocol << self _newLine @@ -319,6 +322,7 @@ RwModificationFiletreeWriterVisitorV2 >> addedMethodExtension: aMethodExtensionM (methodDir / methodFileName, 'st') writeStreamDo: [:aStream | + aStream truncate. aStream << methodDefinition protocol << self _newLine @@ -335,6 +339,7 @@ RwModificationFiletreeWriterVisitorV2 >> addedPackage: aPackageModification [ self _packageSourceDir ensureCreateDirectory. (self _packageSourceDir / 'properties.json') writeStreamDo: [:aStream | + aStream truncate. aStream << '{' << self _newLine @@ -376,6 +381,7 @@ RwModificationFiletreeWriterVisitorV2 >> changedMethod: aMethodModification [ (methodDir / methodFileName, 'st') writeStreamDo: [:aStream | + aStream truncate. aStream << methodDefinition protocol << self _newLine @@ -481,11 +487,13 @@ RwModificationFiletreeWriterVisitorV2 >> processClass: aClassModification [ (self _classSourceDir / 'README.md') writeStreamDo: [:aStream | + aStream truncate. aStream << (self _commentOf: self currentClassDefinition) ]. (self _classSourceDir / 'properties.json') writeStreamDo: [:aStream | + aStream truncate. aStream << (self _typeClassDefinitionOf: self currentClassDefinition) << self _newLine ]. @@ -514,6 +522,7 @@ RwModificationFiletreeWriterVisitorV2 >> processClassExtension: aClassExtensionM self _classExtensionSourceDir ensureCreateDirectory. (self _classExtensionSourceDir / 'properties.json') writeStreamDo: [:aStream | + aStream truncate. aStream << (self _classExtensionOf: self currentClassExtension) << self _newLine ]. diff --git a/rowan/src/Rowan-Core/RwModificationPharoTonelFormatV1WriterVisitorV2.class.st b/rowan/src/Rowan-Core/RwModificationPharoTonelFormatV1WriterVisitorV2.class.st index e837f4092..f01eaea15 100644 --- a/rowan/src/Rowan-Core/RwModificationPharoTonelFormatV1WriterVisitorV2.class.st +++ b/rowan/src/Rowan-Core/RwModificationPharoTonelFormatV1WriterVisitorV2.class.st @@ -89,6 +89,7 @@ RwModificationPharoTonelFormatV1WriterVisitorV2 >> addedPackage: aPackageModific self _packageSourceDir ensureCreateDirectory. self _packageSourceDir / 'package.st' writeStreamDo: [ :aStream | + aStream truncate. aStream << 'Package ' << (self _toSTON: exportedPackageProperties) << self _newLine ]. diff --git a/rowan/src/Rowan-Core/RwModificationTonelWriterVisitor.class.st b/rowan/src/Rowan-Core/RwModificationTonelWriterVisitor.class.st index af6235921..c0c42c6b8 100644 --- a/rowan/src/Rowan-Core/RwModificationTonelWriterVisitor.class.st +++ b/rowan/src/Rowan-Core/RwModificationTonelWriterVisitor.class.st @@ -219,6 +219,7 @@ RwModificationTonelWriterVisitor >> addedPackage: aPackageModification [ self _packageSourceDir ensureCreateDirectory. (self _packageSourceDir / 'package.st') writeStreamDo: [:aStream | + aStream truncate. aStream << 'Package ' << (self _toSTON: { #name -> currentPackageDefinition name } asDictionary) @@ -256,6 +257,7 @@ RwModificationTonelWriterVisitor >> processClass: aClassModification [ self _classSourceFile writeStreamDo: [:aStream | + aStream truncate. self _writeClassDefinition: currentClassDefinition on: aStream. self _writeClassSideMethodDefinitions: currentClassDefinition on: aStream. self _writeInstanceSideMethodDefinitions: currentClassDefinition on: aStream ] @@ -271,6 +273,7 @@ RwModificationTonelWriterVisitor >> processClassExtension: aClassExtensionModifi ifFalse: [ self _classExtensionSourceFile writeStreamDo: [:aStream | + aStream truncate. self _writeClassExtension: currentClassExtension on: aStream. self _writeClassSideMethodDefinitions: currentClassExtension on: aStream. self _writeInstanceSideMethodDefinitions: currentClassExtension on: aStream ] ] @@ -290,6 +293,7 @@ RwModificationTonelWriterVisitor >> processProject: aProjectModification [ propertiesFile exists ifFalse: [ propertiesFile writeStreamDo: [ :fileStream | + fileStream truncate. fileStream nextPutAll: '{ #format : ' , format printString , '}'; lf; diff --git a/rowan/src/Rowan-Core/RwModificationTonelWriterVisitorV2.class.st b/rowan/src/Rowan-Core/RwModificationTonelWriterVisitorV2.class.st index e6b7c2d76..c1e4d4b14 100644 --- a/rowan/src/Rowan-Core/RwModificationTonelWriterVisitorV2.class.st +++ b/rowan/src/Rowan-Core/RwModificationTonelWriterVisitorV2.class.st @@ -243,6 +243,7 @@ RwModificationTonelWriterVisitorV2 >> addedPackage: aPackageModification [ self _packageSourceDir ensureCreateDirectory. self _packageSourceDir / 'package.st' writeStreamDo: [ :aStream | + aStream truncate. aStream << 'Package ' << (self _toSTON: exportedPackageProperties) << self _newLine ]. @@ -278,6 +279,7 @@ RwModificationTonelWriterVisitorV2 >> processClass: aClassModification [ self _classSourceFile writeStreamDo: [:aStream | + aStream truncate. self _writeClassDefinition: currentClassDefinition on: aStream. self _writeClassSideMethodDefinitions: currentClassDefinition on: aStream. self _writeInstanceSideMethodDefinitions: currentClassDefinition on: aStream ] @@ -293,6 +295,7 @@ RwModificationTonelWriterVisitorV2 >> processClassExtension: aClassExtensionModi ifFalse: [ self _classExtensionSourceFile writeStreamDo: [:aStream | + aStream truncate. self _writeClassExtension: currentClassExtension on: aStream. self _writeClassSideMethodDefinitions: currentClassExtension on: aStream. self _writeInstanceSideMethodDefinitions: currentClassExtension on: aStream ] ] @@ -312,6 +315,7 @@ RwModificationTonelWriterVisitorV2 >> processProject: aProjectModification [ propertiesFile exists ifFalse: [ propertiesFile writeStreamDo: [ :fileStream | + fileStream truncate. fileStream nextPutAll: '{ #format : ' , format printString , '}'; lf; diff --git a/rowan/src/Rowan-DefinitionsV2/RwResolvedProjectV2.class.st b/rowan/src/Rowan-DefinitionsV2/RwResolvedProjectV2.class.st index a9752050a..6d2014496 100644 --- a/rowan/src/Rowan-DefinitionsV2/RwResolvedProjectV2.class.st +++ b/rowan/src/Rowan-DefinitionsV2/RwResolvedProjectV2.class.st @@ -419,6 +419,7 @@ RwResolvedProjectV2 >> exportPackages: diskProjectSetDefinition packagesRoot: pa sourceProjectSetDefinition := diskProjectSetDefinition. packagesRoot / 'properties' , 'st' writeStreamDo: [ :fileStream | + fileStream truncate. fileStream nextPutAll: '{ '; lf; diff --git a/rowan/src/Rowan-GemStone-ComponentsV2/RwAbstractRowanProjectLoadComponentV2.extension.st b/rowan/src/Rowan-GemStone-ComponentsV2/RwAbstractRowanProjectLoadComponentV2.extension.st index 77b466b68..8a6069666 100644 --- a/rowan/src/Rowan-GemStone-ComponentsV2/RwAbstractRowanProjectLoadComponentV2.extension.st +++ b/rowan/src/Rowan-GemStone-ComponentsV2/RwAbstractRowanProjectLoadComponentV2.extension.st @@ -24,6 +24,7 @@ RwAbstractRowanProjectLoadComponentV2 >> _exportToUrl: directoryUrl [ fileRef writeStreamDo: [ :stream | | string | + stream truncate. string := STON toStringPretty: self. stream nextPutAll: string. ^ self ] ]. @@ -33,6 +34,7 @@ RwAbstractRowanProjectLoadComponentV2 >> _exportToUrl: directoryUrl [ / self name , 'ston' writeStreamDo: [ :stream | | string | + stream truncate. string := STON toStringPretty: self. stream nextPutAll: string. ^ self ] ]. diff --git a/rowan/src/Rowan-SpecificationsV2/RwLoadSpecificationV2.class.st b/rowan/src/Rowan-SpecificationsV2/RwLoadSpecificationV2.class.st index 9f38e7d27..8e234dfd9 100644 --- a/rowan/src/Rowan-SpecificationsV2/RwLoadSpecificationV2.class.st +++ b/rowan/src/Rowan-SpecificationsV2/RwLoadSpecificationV2.class.st @@ -235,7 +235,10 @@ RwLoadSpecificationV2 >> diskUrl: anUrlString [ { #category : 'exporting' } RwLoadSpecificationV2 >> exportTo: directoryReference [ directoryReference / self specName , 'ston' - writeStreamDo: [ :fileStream | self exportToStream: fileStream ] + writeStreamDo: + [ :fileStream | + fileStream truncate. + self exportToStream: fileStream ] ] { #category : 'exporting' } diff --git a/rowan/src/Rowan-SpecificationsV2/RwProjectSpecificationV2.class.st b/rowan/src/Rowan-SpecificationsV2/RwProjectSpecificationV2.class.st index e77725b7d..2e92ab7dd 100644 --- a/rowan/src/Rowan-SpecificationsV2/RwProjectSpecificationV2.class.st +++ b/rowan/src/Rowan-SpecificationsV2/RwProjectSpecificationV2.class.st @@ -97,7 +97,9 @@ RwProjectSpecificationV2 >> componentsPath: aString [ RwProjectSpecificationV2 >> exportTo: directoryReference [ (directoryReference / self projectSpecPath / self specName, 'ston') - writeStreamDo: [ :fileStream | STON put: self copy initializeForExport onStreamPretty: fileStream ] + writeStreamDo: [ :fileStream | + fileStream truncate. + STON put: self copy initializeForExport onStreamPretty: fileStream ] ] { #category : 'comparing' } diff --git a/rowan/src/Rowan-Tests-DefinitionsV2-Extensions-OnlyV2/RwResolvedProjectV2.extension.st b/rowan/src/Rowan-Tests-DefinitionsV2-Extensions-OnlyV2/RwResolvedProjectV2.extension.st index 6d244c4fe..c8663ba23 100644 --- a/rowan/src/Rowan-Tests-DefinitionsV2-Extensions-OnlyV2/RwResolvedProjectV2.extension.st +++ b/rowan/src/Rowan-Tests-DefinitionsV2-Extensions-OnlyV2/RwResolvedProjectV2.extension.st @@ -33,6 +33,7 @@ RwResolvedProjectV2 >> exportPharoTonelFormatV1Packages: diskProjectSetDefinitio | projectSetDefinition visitor projectSetModification writerVisitorClass | packagesRoot / 'properties' , 'st' writeStreamDo: [ :fileStream | + fileStream truncate. fileStream nextPutAll: '{ '; lf; diff --git a/rowan/src/Rowan-TestsV2/RwTestProjectLibraryGenerator.class.st b/rowan/src/Rowan-TestsV2/RwTestProjectLibraryGenerator.class.st index edee9875a..dd9245f89 100644 --- a/rowan/src/Rowan-TestsV2/RwTestProjectLibraryGenerator.class.st +++ b/rowan/src/Rowan-TestsV2/RwTestProjectLibraryGenerator.class.st @@ -3658,6 +3658,7 @@ RwTestProjectLibraryGenerator >> _finishCommitAndPush: specName loadSpecificatio ifNotNil: [ resolvedRepository repositoryRoot / 'README.md' writeStreamDo: [ :fileStream | + fileStream truncate. fileStream nextPutAll: '# ' , projectName , ' - ' , specName; lf; diff --git a/rowan/src/Rowan-TestsV2/RwTestProjectLibraryIndexCard.class.st b/rowan/src/Rowan-TestsV2/RwTestProjectLibraryIndexCard.class.st index 16ff8ce32..c5acf538d 100644 --- a/rowan/src/Rowan-TestsV2/RwTestProjectLibraryIndexCard.class.st +++ b/rowan/src/Rowan-TestsV2/RwTestProjectLibraryIndexCard.class.st @@ -49,7 +49,9 @@ RwTestProjectLibraryIndexCard >> exportTo: directoryReference [ { #category : 'export' } RwTestProjectLibraryIndexCard >> exportTo: directoryReference as: fileName [ directoryReference / fileName - writeStreamDo: [ :fileStream | self exportToStream: fileStream ] + writeStreamDo: [ :fileStream | + fileStream truncate. + self exportToStream: fileStream ] ] { #category : 'export' }