Handling of readme and license files

Robert Goldman rpgoldman at sift.info
Fri Oct 21 21:11:41 UTC 2022


On 21 Oct 2022, at 15:53, Russell Sim wrote:

> Robert Goldman <rpgoldman at sift.info> writes:
>
>> I have been out of town and away from my email for a while. Sorry for
>> the late response. Checked ASDF code and I think you are right: it 
>> would
>> make sense to make `:read-file-form` more generally usable than just 
>> in
>> the `:version` property.
>>
>> Unfortunately, if we were to do this, it would cause new `defsystem`
>> forms to be backwards incompatible, which would be undesirable.
>
> I was thinking about this and I understand the need for backwards
> compatibility, I know that read time conditionals could be used to
> enable backwards compatibility `#+asdf-3.4` or something of that
> nature?

Yes, that is correct: I expect that we would add a new feature for such 
constructs.  See https://gitlab.common-lisp.net/asdf/asdf/-/issues/131
>
>> We could probably instead add a `:license-file` `defsystem` option. 
>> We
>> should think carefully about how this is to be done, though. Probably
>> this should *not* point to a file directly, but to a component
>> (generally a `:static-file`): that would be desirable because using a
>> component already provides a mechanism for specifying the location of 
>> a
>> source file.
>>
>> At this point, though, we are starting to get a structure that is so
>> fussy that it is likely to cause more problems than it fixes.
>
> I agree this sounds overly complicated for the user, introducing
> dependent fields i think is too much. Would it make sense to add a
> special :license-file component type like
> https://gitlab.com/daewok/asdf-release-ops introduces? or implicitly 
> add
> a `:static-file` when a `:license-file` is declared as a `defsystem`
> option?

The problem with implicitly adding a `:static-file` from a 
`:license-file` metadata item is that metadata doesn't have a way of 
allowing the programmer to specify the location of the file, the way 
that a component does (through `pathname` option or the use of modules).

Having a `:license-file` component type would work, but I hate to mix 
together program and meta-program that way.
>
> Supporting multiple license files is better for dual licensed 
> projects,
> so in some ways adding a new component type is the simplest.
>
>> I wonder if this is a technical problem at all. Maybe the problem is
>> just that developers are not putting the right static files into 
>> their
>> systems, and the issue is that our social practices need to be fixed,
>> not our code. If programmers should be putting license files in as
>> static files, maybe we should just be teaching them to do this.

I could have said "most of them don't even put version information in"!

>
> I think it's a combination of the 2, if the tool doesn't provide an
> easy/obvious way to do fill the `:long-description` field.  We are
> relying on the users to copy and paste good examples, or to try and
> write portable code.  I do agree it's a balance, and in a library like
> this it's important consider all options.  Some of this could be fixed
> by providing tooling and better examples.

Allowing `:read-file-form` to be used more widely would be a reasonable 
extension, although it won't be backward compatible.
>
>
> This discussion has given me some good ideas.  Like you say, it's 
> partly
> a social practices issue, which makes me think that tooling like a
> linter would help.  But read time evaluation makes that hard to
> implement.  If the need for that could be removed somehow, that would
> improve things significantly.  One thing that can be seen from the
> `:version`, `:read-file-form` option usage below is that if there is a
> better way to read a file, people will use it.
>
> Cheers,
> Russell
>
>
> --------------------
> Below are some numbers to gauge usage of existing fields and features 
> of
> ASDF.  I have gone and pulled all the systems from Quicklisp so we can
> look at the current usage.
>
> So looking at 4921 asd files found in quicklisp (NB, this total isn't
> perfect there a few minor duplicates, ~10 due to locally having 
> multiple
> versions of some packages) But the rest of the results I manually
> verified.
>
> 70 asd files currently declare a license via a `:static-file` 
> component.
> 1961 asd files currently declare a `:license` option
>
> 76 asd files that declare the readme as either a `:static-file` or a
> `:doc-file` (6 use the `:doc-file` declaration) There is some overlap
> with the following libraries, but not all, so some people are 
> correctly
> declaring a `:static-file` and using read time evaluation.  Sorry I 
> was
> too lazy to calculate the set difference.
>
> 130 systems using read-file-string
> -----------
>   :long-description #.(uiop:read-file-string
>                        (uiop:subpathname *load-pathname* 
> "README.org"))
> -----------
>
> 95 asd files using the `with-open-file` similar to this
> -----------
>   :long-description
>   #.(with-open-file (stream (merge-pathnames
>                              #p"README.markdown"
>                              (or *load-pathname* 
> *compile-file-pathname*))
>                             :if-does-not-exist nil
>                             :direction :input)
>       (when stream
>         (let ((seq (make-array (file-length stream)
>                                :element-type 'character
>                                :fill-pointer t)))
>           (setf (fill-pointer seq) (read-sequence seq stream))
>           seq)))
> -----------
>
> Regarding general use of read time evaluation, there are 7 total
> instances where users are incorrectly using `with-open-file` to fill 
> the
> `:version` defsystem option from a file instead of using
> `:read-file-form` or equivalent line option.
>
> There are ~258 correct usages of the `:version (:read-file-form`
> expression.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/asdf-devel/attachments/20221021/10068f8f/attachment.html>


More information about the asdf-devel mailing list