Skip to content

Write at the logical position after buffered reads - #163

Open
OskarEichler wants to merge 1 commit into
net-ssh:masterfrom
OskarEichler:codex/write-logical-position
Open

Write at the logical position after buffered reads#163
OskarEichler wants to merge 1 commit into
net-ssh:masterfrom
OskarEichler:codex/write-logical-position

Conversation

@OskarEichler

Copy link
Copy Markdown

Summary

Use the public file position for writes and invalidate readahead after a successful nonempty write. Failed and empty writes preserve the buffered state.

Reproduction

With a remote file containing abcdef, open r+, call read(2), write("XY"), then read(2). Baseline writes at offset 6, produces abcdefXY, and jumps to position 8. Fixed writes at offset 2, produces abXYef, leaves position 4, and returns ef on the following read.

Verification

  • Baseline and this isolated patch: 433 existing tests, 1,201 assertions, zero failures/errors/skips, Ruby 4.0.6 through rbenv, net-ssh 7.3.3, Minitest 5.27.0 and Mocha 2.1.0.
  • 8,016 external assertions compare 200 deterministic binary read/write/seek sequences with StringIO and check write-error/cache handling. The same read/write case passes through a local /usr/libexec/sftp-server pipe.
  • The combined consumer candidate also passes 10,384 external model assertions, 21 local OpenSSH pipe assertions, and the existing suite with frozen string literals enabled and disabled. These combined checks include separately attributed portions of Handle frozen strings #157/ensure ruby 4 compatibility and address some security concerns #162; they are not claimed as this isolated branch's changes.
  • Packaging preserves all 37 release paths and dependency metadata. All 26 runtime files compile on Ruby 4.0.6 and parse with Parser::Ruby25. Comparative Lint checks retain the same 33 baseline findings; no all-green lint claim.

Breaking changes and limitations

Intentional correction: callers relying on the incorrect readahead offset will now write at the documented logical position. Empty-write behavior and write-error identity remain preserved. This does not add append-mode cursor tracking. Existing PRs #161/#162 already propose bytesize; this PR leaves that optimization separate.

No repository tests were added or modified under the contribution's no-new-tests constraint; focused repro/model drivers ran outside the repository. An external verification Gemfile supplies compatible test tools and RDoc without changing upstream tooling. Actual older Ruby/JRuby/Windows compatibility and upstream CI have not been verified. No production or SSH connections, version bumps, release-tool changes or unrelated modernization are included. Git builds are not signed by the upstream gem release key.

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.

1 participant