[Pharo-dev] Default line endings while writing to a file stream

Sven Van Caekenberghe sven at stfx.eu
Fri May 31 03:37:03 EDT 2019


Ben,

Inside the image, line endings are CR on all platforms (it would be a terrible mess if not).

You want ZnNewlineWriterStream. It does the necessary translations, if you want that.

HTH,

Sven

> On 31 May 2019, at 07:06, Ben Coman <btc at openinworld.com> wrote:
> 
> 
> I'm on Windows wanting to write a text file with LF endings.
> The code developed on Linux is thus...
>     (destinationDirectory / 'README.md') ensureCreateFile
>             writeStreamDo: [ :stream | stream nextPutAll: class comment ]
> 
> and I am stuck with CR line endings.  
> The specific symptom is that it screws `git diff` 
> Here is a simple experiment...
>     testfile := 'README.md' asFileReference.
>     testfile ensureCreateFile writeStreamDo: [ :stream |
>     stream nextPutAll: 'aa
> bb' ].
>     testfile binaryReadStream contents at: 3      "==>  Character cr " 
> 
> I think its safe to assume on Linux that will result in "==>  Character lf "
> but can someone please confirm?
> 
> So my issue is that I've got
>     #ensureCreateFile - returns a FileReference
> and
>     :stream - is a ZnCharacterWriteStream wrapping a ZnBufferedWriteStream wrapping BinaryFileStream.
> 
> and neither seem to have an easily accessible defaultLineEnding setting.
> Indeed, line endings are not a property of FileReference 
> and Binary & Characters have nothing to do with line endings,
> and questionable if Buffering is related.
> 
> Its more a property of a File, but IIUC that is being deprecated (??)
> 
> MultiByteFileStream has #lineEndConvention:
> but IIUC that also is being deprecated.
> 
> So what is the proper way to force default line endings?
> 
> 
> ------
> Now while composing this email I discovered String>>withUnixLineEndings.
> So I have a solution...
>     testfile := 'README.md' asFileReference.
>     testfile ensureCreateFile writeStreamDo: [ :stream |
>     stream nextPutAll: 'aa
> bb'  withUnixLineEndings ].
>     (testfile binaryReadStream contents at: 3) asCharacter   "==> Character lf "
> 
> but that seems to imply that on Windows...
> 'aa
> bb' at: 3  "==> Character cr "
> 
> and on Linux (someone please confirm)...
> 'aa
> bb' at: 3   "==> Character lf "
> 
> and that is *very* curious.  Strange that I never noticed it before and obviously that hasn't hurt me, 
> but considering the Principal Of Least Surprise it leaves me feeling somewhat violated :)




More information about the Pharo-dev mailing list