Skip to content

Conversation

@jfinkels
Copy link
Collaborator

This change uses an enum rather than a trait to represent the possible data sources for dd. This is a refactor only, it does not change any behavior of dd. The purpose of this change is to prepare for a future pull request that will introduce a new enum variant Dest::Fifo to represent writing to a named pipe on Unix systems. The way dd works for named pipes is different from the way it works for regular files or stdout. For example, since a named pipe is not seekable, a seek=1 option should actually cause a read of one block, rather than a seek as in a regular file, or a write as in stdout. This is all to try and get tests/dd/no-allocate.sh in the GNU test suite passing.

Anyway, you can ignore all of that stuff about named pipes to review this pull request, but it provides my motivation for this change. Hopefully this change makes the code easier to read as well.

Copy link
Member

@tertsdiepraam tertsdiepraam left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool! I like this already without the fifo variant because it feels much simpler than the current solution. I would only suggest to make the sparse option a bit more explicit. For example:

enum Dest {
    Stdout(Stdout),
    File { handle: File, sparse: bool },
}

// Or
enum FileWriteMode {
    Dense,
    Sparse,
}

enum Dest {
    Stdout(Stdout),
    File(File, FileWriteMode),
}

(There must be a better name than FileWriteMode, but I can't think of one right now)

Copy link
Member

@tertsdiepraam tertsdiepraam left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd like to see Input get a similar makeover (not in this PR though). Are you planning to do that? if not then I could pick that up.

@jfinkels
Copy link
Collaborator Author

I'd like to see Input get a similar makeover (not in this PR though). Are you planning to do that? if not then I could pick that up.

I did that on my local machine but I ran into an issue and didn't include it here. The issue is that two of the tests at the bottom of the dd.rs use a LazyReader struct (defined only in the tests module) as an Input, which made it difficult to create an enum Input and enumerate all the possible variants (since one variant existed only in the tests module).

I will have a similar need to have a Fifo input, so if you figure out a good solution there that would be helpful.

@github-actions
Copy link

GNU testsuite comparison:

Congrats! The gnu test tests/misc/timeout is no longer failing!

@github-actions
Copy link

GNU testsuite comparison:

Congrats! The gnu test tests/misc/timeout is no longer failing!

@tertsdiepraam
Copy link
Member

tertsdiepraam commented Nov 15, 2022

The issue is that two of the tests at the bottom of the dd.rs use a LazyReader struct (defined only in the tests module)

That's not great, I think we should try to rewrite those tests (if that's possible)

Edit: It's just two small tests, IMO those shouldn't block this change and can be removed, although it would be even better if you can fine some other way to write them of course.

@jfinkels
Copy link
Collaborator Author

Edit: It's just two small tests, IMO those shouldn't block this change and can be removed, although it would be even better if you can fine some other way to write them of course.

I've found a way to re-write the tests, so I'm working on that now. I think it might be simplest to just produce a separate pull request that gives the Input struct a similar makeover. So I propose merging this pull request.

@tertsdiepraam tertsdiepraam merged commit 5acb022 into uutils:main Nov 19, 2022
@jfinkels jfinkels deleted the dd-output-enums branch November 19, 2022 13:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants