usage: add set_warn_routine()
[gitweb.git] / apply.c
diff --git a/apply.c b/apply.c
index 98c7f6e1100b899ca5266b797d41aa4a7465f3f5..a9384390f17f1aaa2a6b635122db9897ef348283 100644 (file)
--- a/apply.c
+++ b/apply.c
@@ -125,8 +125,11 @@ int check_apply_state(struct apply_state *state, int force_apply)
                        return error(_("--3way outside a repository"));
                state->check_index = 1;
        }
-       if (state->apply_with_reject)
-               state->apply = state->apply_verbosely = 1;
+       if (state->apply_with_reject) {
+               state->apply = 1;
+               if (state->apply_verbosity == verbosity_normal)
+                       state->apply_verbosity = verbosity_verbose;
+       }
        if (!force_apply && (state->diffstat || state->numstat || state->summary || state->check || state->fake_ancestor))
                state->apply = 0;
        if (state->check_index && is_not_gitdir)
@@ -1620,8 +1623,9 @@ static void record_ws_error(struct apply_state *state,
                return;
 
        err = whitespace_error_string(result);
-       fprintf(stderr, "%s:%d: %s.\n%.*s\n",
-               state->patch_input_file, linenr, err, len, line);
+       if (state->apply_verbosity > verbosity_silent)
+               fprintf(stderr, "%s:%d: %s.\n%.*s\n",
+                       state->patch_input_file, linenr, err, len, line);
        free(err);
 }
 
@@ -1816,7 +1820,7 @@ static int parse_single_patch(struct apply_state *state,
                return error(_("new file %s depends on old contents"), patch->new_name);
        if (0 < patch->is_delete && newlines)
                return error(_("deleted file %s still has contents"), patch->old_name);
-       if (!patch->is_delete && !newlines && context)
+       if (!patch->is_delete && !newlines && context && state->apply_verbosity > verbosity_silent)
                fprintf_ln(stderr,
                           _("** warning: "
                             "file %s becomes empty but is not deleted"),
@@ -2911,7 +2915,7 @@ static int apply_one_fragment(struct apply_state *state,
                        /* Ignore it, we already handled it */
                        break;
                default:
-                       if (state->apply_verbosely)
+                       if (state->apply_verbosity > verbosity_normal)
                                error(_("invalid start of line: '%c'"), first);
                        applied_pos = -1;
                        goto out;
@@ -3026,7 +3030,7 @@ static int apply_one_fragment(struct apply_state *state,
                                state->apply = 0;
                }
 
-               if (state->apply_verbosely && applied_pos != pos) {
+               if (state->apply_verbosity > verbosity_normal && applied_pos != pos) {
                        int offset = applied_pos - pos;
                        if (state->apply_in_reverse)
                                offset = 0 - offset;
@@ -3041,14 +3045,14 @@ static int apply_one_fragment(struct apply_state *state,
                 * Warn if it was necessary to reduce the number
                 * of context lines.
                 */
-               if ((leading != frag->leading) ||
-                   (trailing != frag->trailing))
+               if ((leading != frag->leading ||
+                    trailing != frag->trailing) && state->apply_verbosity > verbosity_silent)
                        fprintf_ln(stderr, _("Context reduced to (%ld/%ld)"
                                             " to apply fragment at %d"),
                                   leading, trailing, applied_pos+1);
                update_image(state, img, applied_pos, &preimage, &postimage);
        } else {
-               if (state->apply_verbosely)
+               if (state->apply_verbosity > verbosity_normal)
                        error(_("while searching for:\n%.*s"),
                              (int)(old - oldlines), oldlines);
        }
@@ -3497,7 +3501,7 @@ static int load_current(struct apply_state *state,
        ce = active_cache[pos];
        if (lstat(name, &st)) {
                if (errno != ENOENT)
-                       return error(_("%s: %s"), name, strerror(errno));
+                       return error_errno("%s", name);
                if (checkout_target(&the_index, ce, &st))
                        return -1;
        }
@@ -3539,7 +3543,8 @@ static int try_threeway(struct apply_state *state,
                 read_blob_object(&buf, pre_sha1, patch->old_mode))
                return error("repository lacks the necessary blob to fall back on 3-way merge.");
 
-       fprintf(stderr, "Falling back to three-way merge...\n");
+       if (state->apply_verbosity > verbosity_silent)
+               fprintf(stderr, "Falling back to three-way merge...\n");
 
        img = strbuf_detach(&buf, &len);
        prepare_image(&tmp_image, img, len, 1);
@@ -3569,7 +3574,9 @@ static int try_threeway(struct apply_state *state,
        status = three_way_merge(image, patch->new_name,
                                 pre_sha1, our_sha1, post_sha1);
        if (status < 0) {
-               fprintf(stderr, "Failed to fall back on three-way merge...\n");
+               if (state->apply_verbosity > verbosity_silent)
+                       fprintf(stderr,
+                               "Failed to fall back on three-way merge...\n");
                return status;
        }
 
@@ -3581,9 +3588,15 @@ static int try_threeway(struct apply_state *state,
                        hashcpy(patch->threeway_stage[0].hash, pre_sha1);
                hashcpy(patch->threeway_stage[1].hash, our_sha1);
                hashcpy(patch->threeway_stage[2].hash, post_sha1);
-               fprintf(stderr, "Applied patch to '%s' with conflicts.\n", patch->new_name);
+               if (state->apply_verbosity > verbosity_silent)
+                       fprintf(stderr,
+                               "Applied patch to '%s' with conflicts.\n",
+                               patch->new_name);
        } else {
-               fprintf(stderr, "Applied patch to '%s' cleanly.\n", patch->new_name);
+               if (state->apply_verbosity > verbosity_silent)
+                       fprintf(stderr,
+                               "Applied patch to '%s' cleanly.\n",
+                               patch->new_name);
        }
        return 0;
 }
@@ -3647,7 +3660,7 @@ static int check_preimage(struct apply_state *state,
        } else if (!state->cached) {
                stat_ret = lstat(old_name, st);
                if (stat_ret && errno != ENOENT)
-                       return error(_("%s: %s"), old_name, strerror(errno));
+                       return error_errno("%s", old_name);
        }
 
        if (state->check_index && !previous) {
@@ -3669,7 +3682,7 @@ static int check_preimage(struct apply_state *state,
        } else if (stat_ret < 0) {
                if (patch->is_new < 0)
                        goto is_new;
-               return error(_("%s: %s"), old_name, strerror(errno));
+               return error_errno("%s", old_name);
        }
 
        if (!state->cached && !previous)
@@ -3728,7 +3741,7 @@ static int check_to_create(struct apply_state *state,
 
                return EXISTS_IN_WORKTREE;
        } else if ((errno != ENOENT) && (errno != ENOTDIR)) {
-               return error("%s: %s", new_name, strerror(errno));
+               return error_errno("%s", new_name);
        }
        return 0;
 }
@@ -3956,7 +3969,7 @@ static int check_patch_list(struct apply_state *state, struct patch *patch)
        prepare_fn_table(state, patch);
        while (patch) {
                int res;
-               if (state->apply_verbosely)
+               if (state->apply_verbosity > verbosity_normal)
                        say_patch_name(stderr,
                                       _("Checking patch %s..."), patch);
                res = check_patch(state, patch);
@@ -4247,9 +4260,9 @@ static int add_index_file(struct apply_state *state,
                if (!state->cached) {
                        if (lstat(path, &st) < 0) {
                                free(ce);
-                               return error(_("unable to stat newly "
-                                              "created file '%s': %s"),
-                                            path, strerror(errno));
+                               return error_errno(_("unable to stat newly "
+                                                    "created file '%s'"),
+                                                  path);
                        }
                        fill_stat_cache_info(ce, &st);
                }
@@ -4472,7 +4485,7 @@ static int write_out_one_reject(struct apply_state *state, struct patch *patch)
        }
 
        if (!cnt) {
-               if (state->apply_verbosely)
+               if (state->apply_verbosity > verbosity_normal)
                        say_patch_name(stderr,
                                       _("Applied patch %s cleanly."), patch);
                return 0;
@@ -4489,7 +4502,8 @@ static int write_out_one_reject(struct apply_state *state, struct patch *patch)
                            "Applying patch %%s with %d rejects...",
                            cnt),
                    cnt);
-       say_patch_name(stderr, sb.buf, patch);
+       if (state->apply_verbosity > verbosity_silent)
+               say_patch_name(stderr, sb.buf, patch);
        strbuf_release(&sb);
 
        cnt = strlen(patch->new_name);
@@ -4503,7 +4517,7 @@ static int write_out_one_reject(struct apply_state *state, struct patch *patch)
 
        rej = fopen(namebuf, "w");
        if (!rej)
-               return error(_("cannot open %s: %s"), namebuf, strerror(errno));
+               return error_errno(_("cannot open %s"), namebuf);
 
        /* Normal git tools never deal with .rej, so do not pretend
         * this is a git patch by saying --git or giving extended
@@ -4516,10 +4530,12 @@ static int write_out_one_reject(struct apply_state *state, struct patch *patch)
             frag;
             cnt++, frag = frag->next) {
                if (!frag->rejected) {
-                       fprintf_ln(stderr, _("Hunk #%d applied cleanly."), cnt);
+                       if (state->apply_verbosity > verbosity_silent)
+                               fprintf_ln(stderr, _("Hunk #%d applied cleanly."), cnt);
                        continue;
                }
-               fprintf_ln(stderr, _("Rejected hunk #%d."), cnt);
+               if (state->apply_verbosity > verbosity_silent)
+                       fprintf_ln(stderr, _("Rejected hunk #%d."), cnt);
                fprintf(rej, "%.*s", frag->size, frag->patch);
                if (frag->patch[frag->size-1] != '\n')
                        fputc('\n', rej);
@@ -4568,8 +4584,10 @@ static int write_out_results(struct apply_state *state, struct patch *list)
                struct string_list_item *item;
 
                string_list_sort(&cpath);
-               for_each_string_list_item(item, &cpath)
-                       fprintf(stderr, "U %s\n", item->string);
+               if (state->apply_verbosity > verbosity_silent) {
+                       for_each_string_list_item(item, &cpath)
+                               fprintf(stderr, "U %s\n", item->string);
+               }
                string_list_clear(&cpath, 0);
 
                rerere(0);
@@ -4626,7 +4644,7 @@ static int apply_patch(struct apply_state *state,
                        listp = &patch->next;
                }
                else {
-                       if (state->apply_verbosely)
+                       if (state->apply_verbosity > verbosity_normal)
                                say_patch_name(stderr, _("Skipped patch '%s'."), patch);
                        free_patch(patch);
                        skipped_patch++;
@@ -4684,13 +4702,13 @@ static int apply_patch(struct apply_state *state,
                goto end;
        }
 
-       if (state->diffstat)
+       if (state->diffstat && state->apply_verbosity > verbosity_silent)
                stat_patch_list(state, list);
 
-       if (state->numstat)
+       if (state->numstat && state->apply_verbosity > verbosity_silent)
                numstat_patch_list(state, list);
 
-       if (state->summary)
+       if (state->summary && state->apply_verbosity > verbosity_silent)
                summary_patch_list(list);
 
 end: