[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#21829: guix import hackage failures

From: Federico Beffa
Subject: bug#21829: guix import hackage failures
Date: Sat, 14 Nov 2015 15:37:35 +0100

On Fri, Nov 13, 2015 at 10:19 PM, Ludovic Courtès <address@hidden> wrote:
> Federico Beffa <address@hidden> skribis:
>> ---------------------------------------------------------------
>> (define (canonical-newline-port port)
>>   "Return an input port that wraps PORT such that all newlines consist
>>   of a single carriage return."
>>   (define (get-position)
>>     (if (port-has-port-position? port) (port-position port) #f))
>>   (define (set-position! position)
>>     (if (port-has-set-port-position!? port)
>>         (set-port-position! position port)
>>         #f))
>>   (define (close) (close-port port))
>>   (define (read! bv start n)
>>     (let loop ((count 0)
>>                (byte (get-u8 port)))
>>       (cond ((or (eof-object? byte) (= count n)) count)
> BYTE is lost here in the case it is not EOF.

Ooops. Thanks for catching it!

> It may be best to move the (= count n) case right before the recursive
> call below.
>>             ((eqv? byte (char->integer #\return)) (loop count (get-u8 port)))
> In practice this discards LF even if it’s not following CR; that’s
> probably a good enough approximation, but an XXX comment would be
> welcome.

This is intentional because, in my ignorance, I only know of uses of
'\r' before or after '\n'. Do you know of any other use in text files?

I've added an "XXX" comment, but I'm not sure what's its use.

>>             (else
>>              (bytevector-u8-set! bv (+ start count) byte)
>>              (loop (+ count 1) (get-u8 port))))))
>>   (make-custom-binary-input-port "canonical-newline-port"
>>                                  read!
>>                                  get-position
>>                                  set-position!
>>                                  close))
>> ---------------------------------------------------------------
>> IMO this is general enough that it could go into "guix/utils.scm". Are
>> you OK with this?
> Looks good!  Could you make a patch that does that, along with adding a
> test or two in tests/utils.scm?

The attached patches fix the parsing of all but two of the failures
reported by Paul.
Two cabal files are still not imported correctly because they are buggy:

* streaming-commons: indentation changes from 4 to 2. But this is
explicitly forbidden. From [1]: "Field names may be indented, but all
field values in the same section must use the same indentation."

* fgl: uses braces to delimit the value of a field. As far as I
understand this is not allowed by [1]: "To continue a field value,
indent the next line relative to the field name." and "Flags,
conditionals, library and executable sections use layout to indicate
structure. ... As an alternative to using layout you can also use
explicit braces {}. ". Thus I understand that braces may be used to
delimit sections, not field values.

Obviously the official 'cabal' program is more permissive than the
description in the documentation.


[1] https://www.haskell.org/cabal/users-guide/developing-packages.html

Attachment: 0001-import-hackage-Add-recognition-of-true-and-false-sym.patch
Description: Text Data

Attachment: 0002-import-hackage-Imporve-parsing-of-tests.patch
Description: Text Data

Attachment: 0003-import-hackage-Make-it-resilient-to-missing-final-ne.patch
Description: Text Data

Attachment: 0004-import-hackage-Make-parsing-of-tests-and-fields-more.patch
Description: Text Data

Attachment: 0005-utils-Add-canonical-newline-port.patch
Description: Text Data

Attachment: 0006-import-hackage-Handle-CRLF-end-of-line-style.patch
Description: Text Data

reply via email to

[Prev in Thread] Current Thread [Next in Thread]