David T. Lewis uploaded a new version of System to project The Treated Inbox: http://source.squeak.org/treated/System-dtl.1277.mcz
==================== Summary ====================
Name: System-dtl.1277 Author: dtl Time: 1 January 2022, 2:57:48.389886 pm UUID: 4d975f20-d62d-4b7e-8abb-bc511d976834 Ancestors: System-mt.1276
Look for the sources file in well-known locations on some platforms. For Unix, if not found in the usual locations then look in /usr/share/squeak and /usr/local/share/squeak. Hooks for other platforms may be added to SmalltalkImage>>sourcesFilePaths.
Refactor to reduce duplication of logic in locateSourcesEntry and openSources:forImage: and to ensure that the full set of file paths is searched for stc compressed sources files prior to searching for regular sources files.
=============== Diff against System-mt.1276 ===============
Item was removed: - ----- Method: FileDirectory class>>openChanges:forImage: (in category '*System-Files') ----- - openChanges: changesName forImage: imageName - "find the changes file by looking in - a) the directory derived from the image name - b) the DefaultDirectory (which will normally be the directory derived from the image name or the SecurityManager's choice) - If an old file is not found in either place, check for a read-only file in the same places. If that fails, return nil" - | changes fd | - "look for the changes file or an alias to it in the image directory" - fd := FileDirectory on: (FileDirectory dirPathFor: imageName). - (fd fileExists: changesName) - ifTrue: [changes := fd oldFileNamed: changesName]. - changes ifNotNil:[^changes]. - - "look for the changes in the default directory" - fd := DefaultDirectory. - (fd fileExists: changesName) - ifTrue: [changes := fd oldFileNamed: changesName]. - changes ifNotNil:[^changes]. - - "look for read-only changes in the image directory" - fd := FileDirectory on: (FileDirectory dirPathFor: imageName). - (fd fileExists: changesName) - ifTrue: [changes := fd readOnlyFileNamed: changesName]. - changes ifNotNil:[^changes]. - - "look for read-only changes in the default directory" - fd := DefaultDirectory. - (fd fileExists: changesName) - ifTrue: [changes := fd readOnlyFileNamed: changesName]. - "this may be nil if the last try above failed to open a file" - ^changes - !
Item was removed: - ----- Method: FileDirectory class>>openSources:andChanges:forImage: (in category '*System-Files') ----- - openSources: sourcesName andChanges: changesName forImage: imageName - "Open the changes and sources files and install them in SourceFiles. Inform the user of problems regarding write permissions or CR/CRLF mixups." - "Note: SourcesName and imageName are full paths; changesName is a - local name." - | sources changes msg wmsg | - msg := 'Squeak cannot locate &fileRef. - - Please check that the file is named properly and is in the - same directory as this image.'. - wmsg := 'Squeak cannot write to &fileRef. - - Please check that you have write permission for this file. - - You won''t be able to save this image correctly until you fix this.'. - - sources := self openSources: sourcesName forImage: imageName. - changes := self openChanges: changesName forImage: imageName. - - ((sources == nil or: [sources atEnd]) - and: [Preferences valueOfFlag: #warnIfNoSourcesFile]) - ifTrue: [Smalltalk platformName = 'Mac OS' - ifTrue: [msg := msg , ' - Make sure the sources file is not an Alias.']. - self inform: (msg copyReplaceAll: '&fileRef' with: 'the sources file named ' , sourcesName)]. - - (changes == nil - and: [Preferences valueOfFlag: #warnIfNoChangesFile]) - ifTrue: [self inform: (msg copyReplaceAll: '&fileRef' with: 'the changes file named ' , changesName)]. - - ((Preferences valueOfFlag: #warnIfNoChangesFile) and: [changes notNil]) - ifTrue: [changes isReadOnly - ifTrue: [self inform: (wmsg copyReplaceAll: '&fileRef' with: 'the changes file named ' , changesName)]. - - ((changes next: 200) - includesSubstring: String crlf) - ifTrue: [self inform: 'The changes file named ' , changesName , ' - has been injured by an unpacking utility. Crs were changed to CrLfs. - Please set the preferences in your decompressing program to - "do not convert text files" and unpack the system again.']]. - - SourceFiles := Array with: sources with: changes!
Item was removed: - ----- Method: FileDirectory class>>openSources:forImage: (in category '*System-Files') ----- - openSources: fullSourcesName forImage: imageName - "We first do a check to see if a compressed version ofthe sources file is present. - Open the .sources file read-only after searching in: - a) the directory where the VM lives - b) the directory where the image came from - c) the DefaultDirectory (which is likely the same as b unless the SecurityManager has changed it). - " - - | sources fd sourcesName | - (fullSourcesName endsWith: 'sources') ifTrue: - ["Look first for a sources file in compressed format." - sources := self openSources: (fullSourcesName allButLast: 7) , 'stc' - forImage: imageName. - sources ifNotNil: [^ CompressedSourceStream on: sources]]. - - sourcesName := FileDirectory localNameFor: fullSourcesName. - "look for the sources file or an alias to it in the VM's directory" - fd := FileDirectory on: Smalltalk vmPath. - (fd fileExists: sourcesName) - ifTrue: [sources := fd readOnlyFileNamed: sourcesName]. - sources ifNotNil: [^ sources]. - "look for the sources file or an alias to it in the image directory" - fd := FileDirectory on: (FileDirectory dirPathFor: imageName). - (fd fileExists: sourcesName) - ifTrue: [sources := fd readOnlyFileNamed: sourcesName]. - sources ifNotNil: [^ sources]. - "look for the sources in the current directory" - fd := DefaultDirectory. - (fd fileExists: sourcesName) - ifTrue: [sources := fd readOnlyFileNamed: sourcesName]. - "sources may still be nil here" - ^sources - !
Item was removed: - ----- Method: SmalltalkImage>>locateSourcesEntry (in category 'image, changes names') ----- - locateSourcesEntry - | sourcesFilename | - sourcesFilename := SourceFileVersionString , FileDirectory dot , 'sources'. - ^ {Smalltalk vmPath. - FileDirectory default fullName, FileDirectory slash} - detect: [ : each | (each , sourcesFilename) asDirectoryEntry notNil ] - ifFound: [ : foundPath | (foundPath , sourcesFilename) asDirectoryEntry ] - ifNone: [ nil ]!
Item was added: + ----- Method: SmalltalkImage>>locateSourcesEntry: (in category 'image, changes names') ----- + locateSourcesEntry: sourcesFilename + "Locate sources file entry, looking first in the VM path directory, then in the image + directory, and finally in some well-known locations for various OS platforms" + + ^ self sourcesFilePaths + detect: [ : each | (each , sourcesFilename) asDirectoryEntry notNil ] + ifFound: [ : foundPath | (foundPath , sourcesFilename) asDirectoryEntry ] + ifNone: [ nil ]!
Item was added: + ----- Method: SmalltalkImage>>openChanges:forImage: (in category 'image, changes names') ----- + openChanges: changesName forImage: imageName + "find the changes file by looking in + a) the directory derived from the image name + b) the DefaultDirectory (which will normally be the directory derived from the image name or the SecurityManager's choice) + If an old file is not found in either place, check for a read-only file in the same places. If that fails, return nil" + | changes fd | + "look for the changes file or an alias to it in the image directory" + fd := FileDirectory on: (FileDirectory dirPathFor: imageName). + (fd fileExists: changesName) + ifTrue: [changes := fd oldFileNamed: changesName]. + changes ifNotNil:[^changes]. + + "look for the changes in the default directory" + fd := FileDirectory default. + (fd fileExists: changesName) + ifTrue: [changes := fd oldFileNamed: changesName]. + changes ifNotNil:[^changes]. + + "look for read-only changes in the image directory" + fd := FileDirectory on: (FileDirectory dirPathFor: imageName). + (fd fileExists: changesName) + ifTrue: [changes := fd readOnlyFileNamed: changesName]. + changes ifNotNil:[^changes]. + + "look for read-only changes in the default directory" + fd := FileDirectory default. + (fd fileExists: changesName) + ifTrue: [changes := fd readOnlyFileNamed: changesName]. + "this may be nil if the last try above failed to open a file" + ^changes + !
Item was changed: ----- Method: SmalltalkImage>>openSourceFiles (in category 'sources, changes log') ----- openSourceFiles - self imageName = LastImageName ifFalse: ["Reset the author initials to blank when the image gets moved" LastImageName := self imageName. Utilities authorInitials: '']. + self + openSourcesAndChanges: self changesName - FileDirectory - openSources: self sourcesName - andChanges: self changesName forImage: LastImageName. SourceFileArray install!
Item was added: + ----- Method: SmalltalkImage>>openSources (in category 'image, changes names') ----- + openSources + "Open a sources file from one of several possible locations. Check first for + a compressed sources file and use that if available." + + (self locateSourcesEntry: self sourcesCompressedFileName) + ifNotNil: [ :entry | ^ CompressedSourceStream on: entry readStream ]. + (self locateSourcesEntry: self sourcesFileName) + ifNotNil: [ :entry | ^ entry readStream ]. + ^nil. + !
Item was added: + ----- Method: SmalltalkImage>>openSourcesAndChanges:forImage: (in category 'image, changes names') ----- + openSourcesAndChanges: changesName forImage: imageName + "Open the changes and sources files and install them in SourceFiles. Inform the user of problems regarding write permissions or CR/CRLF mixups." + "Note: SourcesName and imageName are full paths; changesName is a + local name." + | sources changes msg wmsg | + msg := 'Squeak cannot locate &fileRef. + + Please check that the file is named properly and is in the + same directory as this image.'. + wmsg := 'Squeak cannot write to &fileRef. + + Please check that you have write permission for this file. + + You won''t be able to save this image correctly until you fix this.'. + + sources := Smalltalk openSources. + changes := Smalltalk openChanges: changesName forImage: imageName. + + ((sources == nil or: [sources atEnd]) + and: [Preferences valueOfFlag: #warnIfNoSourcesFile]) + ifTrue: [Smalltalk platformName = 'Mac OS' + ifTrue: [msg := msg , ' + Make sure the sources file is not an Alias.']. + self inform: (msg copyReplaceAll: '&fileRef' with: 'the sources file named ' , self sourcesName)]. + + (changes == nil + and: [Preferences valueOfFlag: #warnIfNoChangesFile]) + ifTrue: [self inform: (msg copyReplaceAll: '&fileRef' with: 'the changes file named ' , changesName)]. + + ((Preferences valueOfFlag: #warnIfNoChangesFile) and: [changes notNil]) + ifTrue: [changes isReadOnly + ifTrue: [self inform: (wmsg copyReplaceAll: '&fileRef' with: 'the changes file named ' , changesName)]. + + ((changes next: 200) + includesSubstring: String crlf) + ifTrue: [self inform: 'The changes file named ' , changesName , ' + has been injured by an unpacking utility. Crs were changed to CrLfs. + Please set the preferences in your decompressing program to + "do not convert text files" and unpack the system again.']]. + + SourceFiles := Array with: sources with: changes!
Item was added: + ----- Method: SmalltalkImage>>sourcesCompressedFileName (in category 'image, changes names') ----- + sourcesCompressedFileName + ^SourceFileVersionString , FileDirectory dot, 'stc' + !
Item was added: + ----- Method: SmalltalkImage>>sourcesFileName (in category 'image, changes names') ----- + sourcesFileName + ^SourceFileVersionString , FileDirectory dot , 'sources' + !
Item was added: + ----- Method: SmalltalkImage>>sourcesFilePaths (in category 'image, changes names') ----- + sourcesFilePaths + "A list of likely locations for the sources file. Look first in the VM path directory, then + in the image directory, and finally in some well-known locations for this OS platform" + + | paths vmPath imagePath defaultPath | + paths := OrderedCollection new. + paths add: (vmPath := self vmPath). + paths add: (imagePath := self imagePath, FileDirectory slash). + imagePath = (defaultPath := FileDirectory default fullName, FileDirectory slash) + ifFalse: ["imagePath and defaultPath are usually the same" + paths add: defaultPath]. + ('/usr/*/lib/*' match: vmPath) + ifTrue: ["Unix platform with VM installed in system directories" + paths + add: '/usr/share/squeak/'; + add: '/usr/local/share/squeak/' ]. + "Well known paths for other platform types may be added here" + + ^paths + !
Item was changed: ----- Method: SmalltalkImage>>sourcesName (in category 'image, changes names') ----- sourcesName "Answer the full path to the version-stable source code if it exists, otherwise the desired location" + ^ (self locateSourcesEntry: self sourcesFileName) + ifNil: [ self vmPath , self sourcesFileName ] - ^ self locateSourcesEntry - ifNil: [ self vmPath , SourceFileVersionString , FileDirectory dot , 'sources' ] ifNotNil: [ : entry | entry fullName ]!
packages@lists.squeakfoundation.org