Skip to content

search: add --not-one flag for not using exit code 1 when no match#1810

Merged
jqnatividad merged 2 commits intomasterfrom
search/not-one
May 11, 2024
Merged

search: add --not-one flag for not using exit code 1 when no match#1810
jqnatividad merged 2 commits intomasterfrom
search/not-one

Conversation

@rzmk
Copy link
Copy Markdown
Collaborator

@rzmk rzmk commented May 10, 2024

Allows a user to keep using exit code 0 even if there are no matches.

Example

Say I have a file data.csv:

Name,Department,Salary,Phone
,IT,71000,
Alice Johnson,HR,65000,294-203-0222
Bob Anderson,IT,71000,
Jane Smith,Finance,75000,
John Doe,IT,60000,850-240-4924

Now I want to search a value but it doesn't exist:

qsv search 'Jake' data.csv

We'll get the headers back (so no matches):

Name,Department,Salary,Phone

And when we run:

echo $?

The value returned is the exit code, in this case 1. But by using --not-one we get 0.

Copy link
Copy Markdown
Collaborator

@jqnatividad jqnatividad left a comment

Choose a reason for hiding this comment

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

LGTM!

@jqnatividad jqnatividad merged commit 8223f09 into master May 11, 2024
@jqnatividad
Copy link
Copy Markdown
Collaborator

Thanks @rzmk !

@rzmk rzmk deleted the search/not-one branch May 11, 2024 13:05
jqnatividad added a commit that referenced this pull request Apr 29, 2026
- Replace TOCTOU exists-check with hard_link reservation so a concurrent
  process can't clobber an existing .bak between the check and the rename
- Reword stdout warning to "input passed through unchanged" since --output
  does write a file (just unmodified relative to input)
- Test stdout pass-through now also asserts the stderr warning is emitted

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
jqnatividad added a commit that referenced this pull request Apr 29, 2026
…o-ops (#3786)

* edit: review-driven fixes for --in-place, bounds checks, and silent no-ops

- Remove vestigial extension() guard so --in-place works on extensionless files
- Reject --in-place with stdin or missing input instead of mis-renaming "-"
- checked_sub on headers.len() avoids underflow when column == "_" on empty headers
- Numeric column index out of range now errors instead of silently no-op'ing
- Track row match; emit "Row N not found." instead of silently rewriting unchanged
- Only allocate NamedTempFile when --in-place is set
- Build target row via single ByteRecord instead of per-field write loop
- Add tests for extensionless in-place, stdin rejection, and out-of-range row/column

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* edit: address roborev #1808 review findings

- stdout/--output mode now warns and passes input through unchanged when
  the row is out of range (exit 0); --in-place still errors so the .bak
  rename is skipped
- Refuse to overwrite a pre-existing .bak file in --in-place mode
- Use checked_add on row+1 to avoid usize::MAX overflow
- Document new --in-place .bak collision behavior and stdout warn-vs-error
  semantics in USAGE
- Add tests for unknown column name, --in-place out-of-range row, stdout
  out-of-range row pass-through, and pre-existing .bak collision

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* edit: address roborev #1810 review findings

- Replace TOCTOU exists-check with hard_link reservation so a concurrent
  process can't clobber an existing .bak between the check and the rename
- Reword stdout warning to "input passed through unchanged" since --output
  does write a file (just unmodified relative to input)
- Test stdout pass-through now also asserts the stderr warning is emitted

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* edit: address roborev #1811 portability and atomicity findings

- Replace hard_link reservation with create_new on the .bak path: works
  on FAT32/exFAT/SMB filesystems where hard_link is unsupported, while
  still closing the TOCTOU window
- Reject symlinks for --in-place up front rather than silently resolving
  through them and leaving a hard-linked backup pointing at the target
- Place the tempfile in the input's parent directory and persist it via
  rename so input_path is never missing during the swap (no gap window)
- Add unix-only test that --in-place rejects symlinks and leaves both
  the symlink target and any .bak paths untouched
- Document symlink rejection in USAGE

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* edit: address roborev #1812 follow-up findings

- Roll back the .bak rename if tempfile.persist fails so the user isn't
  left with a missing input_path; surface backup location in the error
- Correct the comment to acknowledge a small window (two renames) rather
  than claim "no gap"
- Narrow USAGE wording from "Symlinks" to "Symbolic links" and note that
  other Windows reparse points (junction points) are not detected

Coverage for the new create_new path is already exercised end-to-end by
edit_in_place + edit_in_place_existing_bak_errors (both AlreadyExists
and success branches).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* edit: address roborev #1813 polish on rollback path

- Branch the persist-failure error message on the actual rollback result
  ("original restored from <bak>" vs "rollback also failed ...; original
  remains at <bak>") so the user gets a deterministic statement about
  where their data is, instead of an ambiguous parenthetical
- Add an inline rationale for accepting the small two-rename window
  (copy-then-persist would double disk I/O on every successful edit) so
  future readers don't try to "fix" it again
- Note inline that the persist-failure rollback branch is not directly
  covered by automated tests because reliably forcing the failure
  requires platform-specific filesystem manipulation

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* edit: document Windows rename-replaces-destination behavior

Inline citation of std::fs::rename's documented cross-platform replace
behavior so future reviewers don't flag the create_new placeholder +
rename pattern as broken on Windows. The only refused case is
directory-on-directory, which doesn't apply to our regular-file
placeholder.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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