git-commit-vandalism/t/helper
Jeff King 06f46f237a avoid "write_in_full(fd, buf, len) != len" pattern
The return value of write_in_full() is either "-1", or the
requested number of bytes[1]. If we make a partial write
before seeing an error, we still return -1, not a partial
value. This goes back to f6aa66cb95 (write_in_full: really
write in full or return error on disk full., 2007-01-11).

So checking anything except "was the return value negative"
is pointless. And there are a couple of reasons not to do
so:

  1. It can do a funny signed/unsigned comparison. If your
     "len" is signed (e.g., a size_t) then the compiler will
     promote the "-1" to its unsigned variant.

     This works out for "!= len" (unless you really were
     trying to write the maximum size_t bytes), but is a
     bug if you check "< len" (an example of which was fixed
     recently in config.c).

     We should avoid promoting the mental model that you
     need to check the length at all, so that new sites are
     not tempted to copy us.

  2. Checking for a negative value is shorter to type,
     especially when the length is an expression.

  3. Linus says so. In d34cf19b89 (Clean up write_in_full()
     users, 2007-01-11), right after the write_in_full()
     semantics were changed, he wrote:

       I really wish every "write_in_full()" user would just
       check against "<0" now, but this fixes the nasty and
       stupid ones.

     Appeals to authority aside, this makes it clear that
     writing it this way does not have an intentional
     benefit. It's a historical curiosity that we never
     bothered to clean up (and which was undoubtedly
     cargo-culted into new sites).

So let's convert these obviously-correct cases (this
includes write_str_in_full(), which is just a wrapper for
write_in_full()).

[1] A careful reader may notice there is one way that
    write_in_full() can return a different value. If we ask
    write() to write N bytes and get a return value that is
    _larger_ than N, we could return a larger total. But
    besides the fact that this would imply a totally broken
    version of write(), it would already invoke undefined
    behavior. Our internal remaining counter is an unsigned
    size_t, which means that subtracting too many byte will
    wrap it around to a very large number. So we'll instantly
    begin reading off the end of the buffer, trying to write
    gigabytes (or petabytes) of data.

Signed-off-by: Jeff King <peff@peff.net>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-09-14 15:17:59 +09:00
..
.gitignore Merge branch 'jh/add-index-entry-optim' 2017-04-26 15:39:07 +09:00
test-chmtime.c
test-config.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
test-ctype.c
test-date.c timestamp_t: a new data type for timestamps 2017-04-27 13:07:39 +09:00
test-delta.c avoid "write_in_full(fd, buf, len) != len" pattern 2017-09-14 15:17:59 +09:00
test-dump-cache-tree.c Convert struct cache_tree to use struct object_id 2017-05-02 10:46:41 +09:00
test-dump-split-index.c
test-dump-untracked-cache.c use QSORT 2016-09-29 15:42:18 -07:00
test-fake-ssh.c
test-genrandom.c
test-hashmap.c hashmap.h: compare function has access to a data field 2017-06-30 12:49:28 -07:00
test-index-version.c
test-lazy-init-name-hash.c name-hash: add test-lazy-init-name-hash 2017-03-24 11:00:03 -07:00
test-line-buffer.c
test-match-trees.c tree: convert parse_tree_indirect to struct object_id 2017-05-08 15:12:58 +09:00
test-mergesort.c
test-mktemp.c
test-online-cpus.c test-online-cpus: helper to return cpu count 2017-04-12 23:17:19 -07:00
test-parse-options.c timestamp_t: a new data type for timestamps 2017-04-27 13:07:39 +09:00
test-path-utils.c test-path-utils: handle const parameter of basename and dirname 2017-08-07 10:50:08 -07:00
test-prio-queue.c
test-read-cache.c test-read-cache: setup git dir 2017-04-16 20:05:11 -07:00
test-ref-store.c ref_store: take a msg parameter when deleting references 2017-05-23 14:29:53 +09:00
test-regex.c
test-revision-walking.c
test-run-command.c
test-scrap-cache-tree.c hold_locked_index(): align error handling with hold_lockfile_for_update() 2016-12-07 11:31:59 -08:00
test-sha1-array.c Rename sha1_array to oid_array 2017-03-31 08:33:56 -07:00
test-sha1.c
test-sha1.sh
test-sigchain.c
test-strcmp-offset.c Spelling fixes 2017-06-27 10:35:49 -07:00
test-string-list.c perf: add basic sort performance test 2017-01-23 11:02:37 -08:00
test-submodule-config.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
test-subprocess.c
test-svn-fe.c
test-urlmatch-normalization.c
test-wildmatch.c wildmatch: remove unused wildopts parameter 2017-06-23 18:27:07 -07:00