Hi Ben,

On Fri, 31 May 2019 at 07:08, Ben Coman <[email protected]> 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 ]

I've come across this so many times that I always add a couple of
methods to my image:

ZnEncodedStream>>asNewLineStream
"Answer the receiver wrapped with a ZnNewLineWriterStream"
^ZnNewLineWriterStream on: self! !


ZnNewLineWriterStream>>asNewLineStream
"Answer the receiver wrapped with a ZnNewLineWriterStream"
^self! !


You could then modify the example above to be:

stream asNewLineStream forLf nextPutAll: class comment

Cheers,
Alistair



> 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 :)

Reply via email to