git-commit-vandalism/builtin
Jeff King 3efb988098 react to errors in xdi_diff
When we call into xdiff to perform a diff, we generally lose
the return code completely. Typically by ignoring the return
of our xdi_diff wrapper, but sometimes we even propagate
that return value up and then ignore it later.  This can
lead to us silently producing incorrect diffs (e.g., "git
log" might produce no output at all, not even a diff header,
for a content-level diff).

In practice this does not happen very often, because the
typical reason for xdiff to report failure is that it
malloc() failed (it uses straight malloc, and not our
xmalloc wrapper).  But it could also happen when xdiff
triggers one our callbacks, which returns an error (e.g.,
outf() in builtin/rerere.c tries to report a write failure
in this way). And the next patch also plans to add more
failure modes.

Let's notice an error return from xdiff and react
appropriately. In most of the diff.c code, we can simply
die(), which matches the surrounding code (e.g., that is
what we do if we fail to load a file for diffing in the
first place). This is not that elegant, but we are probably
better off dying to let the user know there was a problem,
rather than simply generating bogus output.

We could also just die() directly in xdi_diff, but the
callers typically have a bit more context, and can provide a
better message (and if we do later decide to pass errors up,
we're one step closer to doing so).

There is one interesting case, which is in diff_grep(). Here
if we cannot generate the diff, there is nothing to match,
and we silently return "no hits". This is actually what the
existing code does already, but we make it a little more
explicit.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2015-09-28 14:57:10 -07:00
..
add.c add: ignore only ignored files 2014-11-21 10:19:14 -08:00
annotate.c annotate: use argv_array 2014-07-16 11:10:11 -07:00
apply.c Merge branch 'jc/apply-beyond-symlink' into maint 2015-03-13 22:56:02 -07:00
archive.c replace {pre,suf}fixcmp() with {starts,ends}_with() 2013-12-05 14:13:21 -08:00
bisect--helper.c Replace deprecated OPT_BOOLEAN by OPT_BOOL 2013-08-05 11:32:19 -07:00
blame.c react to errors in xdi_diff 2015-09-28 14:57:10 -07:00
branch.c Merge branch 'mg/branch-d-m-f' 2014-12-22 12:27:36 -08:00
bundle.c
cat-file.c Merge branch 'ak/cat-file-clean-up' 2015-01-22 13:46:38 -08:00
check-attr.c Merge branch 'jc/check-attr-honor-working-tree' into maint 2014-03-18 14:03:03 -07:00
check-ignore.c Merge branch 'dw/check-ignore-sans-index' 2013-09-20 12:37:32 -07:00
check-mailmap.c builtin: add git-check-mailmap command 2013-07-13 10:19:37 -07:00
check-ref-format.c
checkout-index.c Merge branch 'es/checkout-index-temp' 2015-01-12 11:38:28 -08:00
checkout.c Merge branch 'nd/ls-tree-pathspec' 2014-12-22 12:27:12 -08:00
clean.c clean: typofix 2014-12-22 09:57:42 -08:00
clone.c Merge branch 'jk/cleanup-failed-clone' into maint 2015-03-28 09:33:09 -07:00
column.c replace {pre,suf}fixcmp() with {starts,ends}_with() 2013-12-05 14:13:21 -08:00
commit-tree.c commit-tree: simplify parsing of option -S using skip_prefix() 2014-12-29 09:32:45 -08:00
commit.c Merge branch 'mg/commit-author-no-match-malformed-message' into maint 2015-02-24 22:10:38 -08:00
config.c Merge branch 'oh/fix-config-default-user-name-section' into maint-2.3 2015-05-11 14:33:59 -07:00
count-objects.c count-objects: use for_each_loose_file_in_objdir 2014-10-16 10:10:41 -07:00
credential.c git credential fill: output the whole 'struct credential' 2012-06-25 11:56:24 -07:00
describe.c lockfile.h: extract new header file for the functions in lockfile.c 2014-10-01 13:56:14 -07:00
diff-files.c convert read_cache_preload() to take struct pathspec 2013-07-15 10:56:08 -07:00
diff-index.c convert read_cache_preload() to take struct pathspec 2013-07-15 10:56:08 -07:00
diff-tree.c diff-tree: avoid lookup_unknown_object 2014-07-28 10:14:34 -07:00
diff.c lockfile.h: extract new header file for the functions in lockfile.c 2014-10-01 13:56:14 -07:00
fast-export.c teach fast-export an --anonymize option 2014-08-27 10:42:16 -07:00
fetch-pack.c Merge branch 'nd/shallow-clone' 2014-01-17 12:21:20 -08:00
fetch.c do not include the same header twice 2015-02-13 13:16:12 -08:00
fmt-merge-msg.c Merge branch 'rs/use-strbuf-complete-line' 2014-12-22 12:28:22 -08:00
for-each-ref.c Merge branch 'rs/simple-cleanups' into maint 2015-03-06 14:57:57 -08:00
fsck.c refs.c: change resolve_ref_unsafe reading argument to be a flags field 2014-10-15 10:47:24 -07:00
gc.c lockfile.h: extract new header file for the functions in lockfile.c 2014-10-01 13:56:14 -07:00
get-tar-commit-id.c use skip_prefix() to avoid more magic numbers 2014-10-07 11:09:16 -07:00
grep.c Merge branch 'ws/grep-quiet-no-pager' into maint 2015-03-28 09:33:11 -07:00
hash-object.c hash-object: add --literally option 2014-09-11 14:23:51 -07:00
help.c Merge branch 'jc/exec-cmd-system-path-leak-fix' 2014-12-22 12:27:01 -08:00
index-pack.c Merge branch 'rs/deflate-init-cleanup' into maint 2015-03-23 11:23:38 -07:00
init-db.c Merge branch 'jc/exec-cmd-system-path-leak-fix' 2014-12-22 12:27:01 -08:00
interpret-trailers.c trailer: add interpret-trailers command 2014-10-13 13:55:27 -07:00
log.c Merge branch 'dk/format-patch-ignore-diff-submodule' into maint 2015-02-24 22:10:15 -08:00
ls-files.c Merge branch 'jc/report-path-error-to-dir' into maint 2015-03-31 14:53:08 -07:00
ls-remote.c builtin/ls-remote.c: rearrange xcalloc arguments 2014-05-27 14:00:43 -07:00
ls-tree.c ls-tree: disable negative pathspec because it's not supported 2014-12-01 11:33:45 -08:00
mailinfo.c git-mailinfo: add --message-id 2014-11-25 15:24:55 -08:00
mailsplit.c mailsplit: remove unnecessary unlink(2) call 2014-10-07 10:49:57 -07:00
merge-base.c get_merge_bases(): always clean-up object flags 2014-10-30 12:51:10 -07:00
merge-file.c merge-file: correctly open files when in a subdir 2015-02-11 11:01:50 -08:00
merge-index.c Convert "struct cache_entry *" to "const ..." wherever possible 2013-07-09 09:12:48 -07:00
merge-ours.c
merge-recursive.c replace {pre,suf}fixcmp() with {starts,ends}_with() 2013-12-05 14:13:21 -08:00
merge-tree.c react to errors in xdi_diff 2015-09-28 14:57:10 -07:00
merge.c Merge branch 'rs/plug-strbuf-leak-in-merge' 2015-01-12 11:38:37 -08:00
mktag.c
mktree.c builtin/mktree.c: use ALLOC_GROW() in append_to_tree() 2014-03-03 14:54:45 -08:00
mv.c lockfile.h: extract new header file for the functions in lockfile.c 2014-10-01 13:56:14 -07:00
name-rev.c use xstrfmt to replace xmalloc + strcpy/strcat 2014-06-19 15:20:54 -07:00
notes.c builtin/notes: add --allow-empty, to allow storing empty notes 2014-11-12 11:00:11 -08:00
pack-objects.c Merge branch 'rs/deflate-init-cleanup' into maint 2015-03-23 11:23:38 -07:00
pack-redundant.c
pack-refs.c
patch-id.c patch-id: make it stable against hunk reordering 2014-06-10 13:09:24 -07:00
prune-packed.c prune-packed: use for_each_loose_file_in_objdir 2014-10-16 10:10:40 -07:00
prune.c prune: turn on ref_paranoia flag 2015-03-20 12:40:56 -07:00
push.c Merge branch 'jk/push-simple' into maint 2014-12-22 12:18:08 -08:00
read-tree.c lockfile.h: extract new header file for the functions in lockfile.c 2014-10-01 13:56:14 -07:00
receive-pack.c Merge branch 'js/push-to-deploy' 2014-12-22 12:27:04 -08:00
reflog.c Merge branch 'jk/prune-mtime' 2014-10-29 10:07:56 -07:00
remote-ext.c use skip_prefix() to avoid more magic numbers 2014-10-07 11:09:16 -07:00
remote-fd.c
remote.c git remote: allow adding remotes agreeing with url.<...>.insteadOf 2014-12-23 12:42:36 -08:00
repack.c repack: turn on "ref paranoia" when doing a destructive repack 2015-03-20 12:41:38 -07:00
replace.c refs.c: pass the ref log message to _create/delete/update instead of _commit 2014-10-15 10:47:22 -07:00
rerere.c react to errors in xdi_diff 2015-09-28 14:57:10 -07:00
reset.c lockfile.h: extract new header file for the functions in lockfile.c 2014-10-01 13:56:14 -07:00
rev-list.c commit: record buffer length in cache 2014-06-13 12:09:38 -07:00
rev-parse.c Merge branch 'jc/merge-bases' 2015-01-07 12:55:05 -08:00
revert.c parse-options: multi-word argh should use dash to separate words 2014-03-24 10:43:34 -07:00
rm.c lockfile.h: extract new header file for the functions in lockfile.c 2014-10-01 13:56:14 -07:00
send-pack.c Merge branch 'jc/push-cert' 2014-10-08 13:05:25 -07:00
shortlog.c replace {pre,suf}fixcmp() with {starts,ends}_with() 2013-12-05 14:13:21 -08:00
show-branch.c Sync with 2.2.3 2015-09-04 10:29:28 -07:00
show-ref.c replace {pre,suf}fixcmp() with {starts,ends}_with() 2013-12-05 14:13:21 -08:00
stripspace.c builtin/stripspace.c: fix broken indentation 2013-09-06 13:33:17 -07:00
symbolic-ref.c refs.c: change resolve_ref_unsafe reading argument to be a flags field 2014-10-15 10:47:24 -07:00
tag.c Merge branch 'jk/tag-h-column-is-a-listing-option' into maint 2015-03-27 13:00:23 -07:00
unpack-file.c
unpack-objects.c index-pack: terminate object buffers with NUL 2014-12-09 11:56:37 -08:00
update-index.c lockfile.h: extract new header file for the functions in lockfile.c 2014-10-01 13:56:14 -07:00
update-ref.c update-ref: fix "verify" command with missing <oldvalue> 2014-12-11 11:56:53 -08:00
update-server-info.c
upload-archive.c replace {pre,suf}fixcmp() with {starts,ends}_with() 2013-12-05 14:13:21 -08:00
var.c
verify-commit.c verify-commit: scriptable commit signature verification 2014-06-23 15:50:31 -07:00
verify-pack.c run-command: introduce CHILD_PROCESS_INIT 2014-08-20 09:53:37 -07:00
verify-tag.c
write-tree.c