[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: disarchive: disassemble then assemble tarball
From: |
Timothy Sample |
Subject: |
Re: disarchive: disassemble then assemble tarball |
Date: |
Mon, 03 Apr 2023 14:19:33 -0600 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux) |
Hi Simon,
Simon Tournier <zimon.toutoune@gmail.com> writes:
> Discussing in #62153 [1], it is noticed that Disarchive is not working
> as expected.
To be fair, Oleg is experimenting with reusing some internal Disarchive
code in another context. That experiment didn’t go well, and Oleg came
to a good (IMO) conclusion: try the tarball code from Gash-Utils. (The
longer story is that the tarball code in Disarchive is nicer, but it is
specialized for the Disarchive use case. Sometime I might de-specialize
it and use it in Gash-Utils, but Gash-Utils has difficult constraints
due to its use during bootstrapping. We’ll see.)
> scheme@(guile-user)> ,module(disarchive assemblers tarball)
> scheme@(disarchive assemblers tarball)> (assemble-tarball
> (disassemble-tarball "my-gnu.tar") ".")
>
> [...]
>
> $ tar tf
> sha256/7a94f577d3235a5ab954f0bc56b15fbe5518c56354c4235574618f6e666f6a38
>
> [...]
>
> gnu/build/accounts.go
> tar: Unexpected EOF in archive
> tar: Error is not recoverable: exiting now
The ‘assemble-tarball’ procedure assumes (without checking) that it has
access to a copy of its input in the “workspace” directory. Normally,
it would be called from the generic ‘assemble’ procedure, which ensures
this (and also checks the output). It probably just wrote all the
tarball headers without the file contents, producing a corrupt tarball.
Indeed, if you set up logging (using ‘%disarchive-log-port’) it prints a
bunch of “Ignoring irregular file” warnings.
> Well, I am not sure to understand why the name “my-gnu”.
It’s just ‘(basename "my-gnu.tar" ".tar")’. The names are designed to
aid a human while debugging. To my knowledge, Disarchive doesn’t use
them for anything. You can use set the name by passing “--name” to the
‘disassemble’ subcommand.
> And then I do not understand how to use “disarchive assemble”; I get
> something like:
>
> Checking my-gnu digest... fail
> Output is incorrect
>
> What do I do wrong?
You need to put “gnu” in a directory by itself. First,
$ mkdir base
Then either
$ mv gnu base/
or
$ tar -C base -xf my-gnu.tar
Then you can run
$ disarchive assemble base spec
In other words, it’s your old nemesis:
https://lists.gnu.org/archive/html/guix-devel/2023-03/msg00063.html
:) (I tease only because it’s confused me many times too!)
-- Tim