]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'rs/use-strbuf-addstr'
authorJunio C Hamano <gitster@pobox.com>
Mon, 8 Aug 2016 21:48:41 +0000 (14:48 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 8 Aug 2016 21:48:41 +0000 (14:48 -0700)
* rs/use-strbuf-addstr:
  use strbuf_addstr() instead of strbuf_addf() with "%s"
  use strbuf_addstr() for adding constant strings to a strbuf

1  2 
http-push.c
http.c
send-pack.c
sequencer.c
t/helper/test-run-command.c

diff --combined http-push.c
index dacada9094efd0c929319f39ca74a908668863c7,d0b29ac982028a26c97ebd24f1b3f2cbf188e503..704b1c837c9feaa1215e5fd9767c04275a4c1beb
@@@ -1137,7 -1137,7 +1137,7 @@@ static void remote_ls(const char *path
        ls.userData = userData;
        ls.userFunc = userFunc;
  
-       strbuf_addf(&out_buffer.buf, PROPFIND_ALL_REQUEST);
+       strbuf_addstr(&out_buffer.buf, PROPFIND_ALL_REQUEST);
  
        dav_headers = curl_slist_append(dav_headers, "Depth: 1");
        dav_headers = curl_slist_append(dav_headers, "Content-Type: text/xml");
@@@ -1692,12 -1692,12 +1692,12 @@@ static void run_request_queue(void
  #endif
  }
  
 -int main(int argc, char **argv)
 +int cmd_main(int argc, const char **argv)
  {
        struct transfer_request *request;
        struct transfer_request *next_request;
        int nr_refspec = 0;
 -      char **refspec = NULL;
 +      const char **refspec = NULL;
        struct remote_lock *ref_lock = NULL;
        struct remote_lock *info_ref_lock = NULL;
        struct rev_info revs;
        int new_refs;
        struct ref *ref, *local_refs;
  
 -      git_setup_gettext();
 -
 -      git_extract_argv0_path(argv[0]);
 -
        repo = xcalloc(1, sizeof(*repo));
  
        argv++;
        for (i = 1; i < argc; i++, argv++) {
 -              char *arg = *argv;
 +              const char *arg = *argv;
  
                if (*arg == '-') {
                        if (!strcmp(arg, "--all")) {
diff --combined http.c
index e81dd132d483aa02540bac7d1f55b5e98b1ad736,d8e427b69b43a8cc0607893e59891fc8a4356f51..cd40b012f89397db67e851101ab38c2c57fd18c9
--- 1/http.c
--- 2/http.c
+++ b/http.c
@@@ -11,7 -11,6 +11,7 @@@
  #include "gettext.h"
  #include "transport.h"
  
 +static struct trace_key trace_curl = TRACE_KEY_INIT(CURL);
  #if LIBCURL_VERSION_NUM >= 0x070a08
  long int git_curl_ipresolve = CURL_IPRESOLVE_WHATEVER;
  #else
@@@ -478,125 -477,6 +478,125 @@@ static void set_curl_keepalive(CURL *c
  }
  #endif
  
 +static void redact_sensitive_header(struct strbuf *header)
 +{
 +      const char *sensitive_header;
 +
 +      if (skip_prefix(header->buf, "Authorization:", &sensitive_header) ||
 +          skip_prefix(header->buf, "Proxy-Authorization:", &sensitive_header)) {
 +              /* The first token is the type, which is OK to log */
 +              while (isspace(*sensitive_header))
 +                      sensitive_header++;
 +              while (*sensitive_header && !isspace(*sensitive_header))
 +                      sensitive_header++;
 +              /* Everything else is opaque and possibly sensitive */
 +              strbuf_setlen(header,  sensitive_header - header->buf);
 +              strbuf_addstr(header, " <redacted>");
 +      }
 +}
 +
 +static void curl_dump_header(const char *text, unsigned char *ptr, size_t size, int hide_sensitive_header)
 +{
 +      struct strbuf out = STRBUF_INIT;
 +      struct strbuf **headers, **header;
 +
 +      strbuf_addf(&out, "%s, %10.10ld bytes (0x%8.8lx)\n",
 +              text, (long)size, (long)size);
 +      trace_strbuf(&trace_curl, &out);
 +      strbuf_reset(&out);
 +      strbuf_add(&out, ptr, size);
 +      headers = strbuf_split_max(&out, '\n', 0);
 +
 +      for (header = headers; *header; header++) {
 +              if (hide_sensitive_header)
 +                      redact_sensitive_header(*header);
 +              strbuf_insert((*header), 0, text, strlen(text));
 +              strbuf_insert((*header), strlen(text), ": ", 2);
 +              strbuf_rtrim((*header));
 +              strbuf_addch((*header), '\n');
 +              trace_strbuf(&trace_curl, (*header));
 +      }
 +      strbuf_list_free(headers);
 +      strbuf_release(&out);
 +}
 +
 +static void curl_dump_data(const char *text, unsigned char *ptr, size_t size)
 +{
 +      size_t i;
 +      struct strbuf out = STRBUF_INIT;
 +      unsigned int width = 60;
 +
 +      strbuf_addf(&out, "%s, %10.10ld bytes (0x%8.8lx)\n",
 +              text, (long)size, (long)size);
 +      trace_strbuf(&trace_curl, &out);
 +
 +      for (i = 0; i < size; i += width) {
 +              size_t w;
 +
 +              strbuf_reset(&out);
 +              strbuf_addf(&out, "%s: ", text);
 +              for (w = 0; (w < width) && (i + w < size); w++) {
 +                      unsigned char ch = ptr[i + w];
 +
 +                      strbuf_addch(&out,
 +                                     (ch >= 0x20) && (ch < 0x80)
 +                                     ? ch : '.');
 +              }
 +              strbuf_addch(&out, '\n');
 +              trace_strbuf(&trace_curl, &out);
 +      }
 +      strbuf_release(&out);
 +}
 +
 +static int curl_trace(CURL *handle, curl_infotype type, char *data, size_t size, void *userp)
 +{
 +      const char *text;
 +      enum { NO_FILTER = 0, DO_FILTER = 1 };
 +
 +      switch (type) {
 +      case CURLINFO_TEXT:
 +              trace_printf_key(&trace_curl, "== Info: %s", data);
 +      default:                /* we ignore unknown types by default */
 +              return 0;
 +
 +      case CURLINFO_HEADER_OUT:
 +              text = "=> Send header";
 +              curl_dump_header(text, (unsigned char *)data, size, DO_FILTER);
 +              break;
 +      case CURLINFO_DATA_OUT:
 +              text = "=> Send data";
 +              curl_dump_data(text, (unsigned char *)data, size);
 +              break;
 +      case CURLINFO_SSL_DATA_OUT:
 +              text = "=> Send SSL data";
 +              curl_dump_data(text, (unsigned char *)data, size);
 +              break;
 +      case CURLINFO_HEADER_IN:
 +              text = "<= Recv header";
 +              curl_dump_header(text, (unsigned char *)data, size, NO_FILTER);
 +              break;
 +      case CURLINFO_DATA_IN:
 +              text = "<= Recv data";
 +              curl_dump_data(text, (unsigned char *)data, size);
 +              break;
 +      case CURLINFO_SSL_DATA_IN:
 +              text = "<= Recv SSL data";
 +              curl_dump_data(text, (unsigned char *)data, size);
 +              break;
 +      }
 +      return 0;
 +}
 +
 +void setup_curl_trace(CURL *handle)
 +{
 +      if (!trace_want(&trace_curl))
 +              return;
 +      curl_easy_setopt(handle, CURLOPT_VERBOSE, 1L);
 +      curl_easy_setopt(handle, CURLOPT_DEBUGFUNCTION, curl_trace);
 +      curl_easy_setopt(handle, CURLOPT_DEBUGDATA, NULL);
 +}
 +
 +
  static CURL *get_curl_handle(void)
  {
        CURL *result = curl_easy_init();
                warning("protocol restrictions not applied to curl redirects because\n"
                        "your curl version is too old (>= 7.19.4)");
  #endif
 -
        if (getenv("GIT_CURL_VERBOSE"))
 -              curl_easy_setopt(result, CURLOPT_VERBOSE, 1);
 +              curl_easy_setopt(result, CURLOPT_VERBOSE, 1L);
 +      setup_curl_trace(result);
  
        curl_easy_setopt(result, CURLOPT_USERAGENT,
                user_agent ? user_agent : git_user_agent());
@@@ -1225,7 -1105,7 +1225,7 @@@ void append_remote_object_url(struct st
  
        strbuf_addf(buf, "objects/%.*s/", 2, hex);
        if (!only_two_digit_prefix)
-               strbuf_addf(buf, "%s", hex+2);
+               strbuf_addstr(buf, hex + 2);
  }
  
  char *get_remote_object_url(const char *url, const char *hex,
@@@ -1975,19 -1855,8 +1975,19 @@@ static size_t fwrite_sha1_file(char *pt
        unsigned char expn[4096];
        size_t size = eltsize * nmemb;
        int posn = 0;
 -      struct http_object_request *freq =
 -              (struct http_object_request *)data;
 +      struct http_object_request *freq = data;
 +      struct active_request_slot *slot = freq->slot;
 +
 +      if (slot) {
 +              CURLcode c = curl_easy_getinfo(slot->curl, CURLINFO_HTTP_CODE,
 +                                              &slot->http_code);
 +              if (c != CURLE_OK)
 +                      die("BUG: curl_easy_getinfo for HTTP code failed: %s",
 +                              curl_easy_strerror(c));
 +              if (slot->http_code >= 400)
 +                      return size;
 +      }
 +
        do {
                ssize_t retval = xwrite(freq->localfile,
                                        (char *) ptr + posn, size - posn);
@@@ -2108,7 -1977,6 +2108,7 @@@ struct http_object_request *new_http_ob
        freq->slot = get_active_slot();
  
        curl_easy_setopt(freq->slot->curl, CURLOPT_FILE, freq);
 +      curl_easy_setopt(freq->slot->curl, CURLOPT_FAILONERROR, 0);
        curl_easy_setopt(freq->slot->curl, CURLOPT_WRITEFUNCTION, fwrite_sha1_file);
        curl_easy_setopt(freq->slot->curl, CURLOPT_ERRORBUFFER, freq->errorstr);
        curl_easy_setopt(freq->slot->curl, CURLOPT_URL, freq->url);
diff --combined send-pack.c
index 3a842ac2d1aa351e5182f0c67b74aee1bd67d021,45a2462708b0a00d3383acea48ba2b4163f5f026..90f2ac51a741f14cecab51177120cc7c3f063096
@@@ -36,15 -36,18 +36,15 @@@ int option_parse_push_signed(const stru
        die("bad %s argument: %s", opt->long_name, arg);
  }
  
 -static int feed_object(const unsigned char *sha1, int fd, int negative)
 +static void feed_object(const unsigned char *sha1, FILE *fh, int negative)
  {
 -      char buf[42];
 -
        if (negative && !has_sha1_file(sha1))
 -              return 1;
 +              return;
  
 -      memcpy(buf + negative, sha1_to_hex(sha1), 40);
        if (negative)
 -              buf[0] = '^';
 -      buf[40 + negative] = '\n';
 -      return write_or_whine(fd, buf, 41 + negative, "send-pack: send refs");
 +              putc('^', fh);
 +      fputs(sha1_to_hex(sha1), fh);
 +      putc('\n', fh);
  }
  
  /*
@@@ -70,7 -73,6 +70,7 @@@ static int pack_objects(int fd, struct 
                NULL,
        };
        struct child_process po = CHILD_PROCESS_INIT;
 +      FILE *po_in;
        int i;
  
        i = 4;
         * We feed the pack-objects we just spawned with revision
         * parameters by writing to the pipe.
         */
 +      po_in = xfdopen(po.in, "w");
        for (i = 0; i < extra->nr; i++)
 -              if (!feed_object(extra->sha1[i], po.in, 1))
 -                      break;
 +              feed_object(extra->sha1[i], po_in, 1);
  
        while (refs) {
 -              if (!is_null_oid(&refs->old_oid) &&
 -                  !feed_object(refs->old_oid.hash, po.in, 1))
 -                      break;
 -              if (!is_null_oid(&refs->new_oid) &&
 -                  !feed_object(refs->new_oid.hash, po.in, 0))
 -                      break;
 +              if (!is_null_oid(&refs->old_oid))
 +                      feed_object(refs->old_oid.hash, po_in, 1);
 +              if (!is_null_oid(&refs->new_oid))
 +                      feed_object(refs->new_oid.hash, po_in, 0);
                refs = refs->next;
        }
  
 -      close(po.in);
 +      fflush(po_in);
 +      if (ferror(po_in))
 +              die_errno("error writing to pack-objects");
 +      fclose(po_in);
  
        if (args->stateless_rpc) {
                char *buf = xmalloc(LARGE_PACKET_MAX);
@@@ -260,13 -261,12 +260,13 @@@ static int generate_push_cert(struct st
                              const char *push_cert_nonce)
  {
        const struct ref *ref;
 +      struct string_list_item *item;
        char *signing_key = xstrdup(get_signing_key());
        const char *cp, *np;
        struct strbuf cert = STRBUF_INIT;
        int update_seen = 0;
  
-       strbuf_addf(&cert, "certificate version 0.1\n");
+       strbuf_addstr(&cert, "certificate version 0.1\n");
        strbuf_addf(&cert, "pusher %s ", signing_key);
        datestamp(&cert);
        strbuf_addch(&cert, '\n');
        }
        if (push_cert_nonce[0])
                strbuf_addf(&cert, "nonce %s\n", push_cert_nonce);
 +      if (args->push_options)
 +              for_each_string_list_item(item, args->push_options)
 +                      strbuf_addf(&cert, "push-option %s\n", item->string);
        strbuf_addstr(&cert, "\n");
  
        for (ref = remote_refs; ref; ref = ref->next) {
@@@ -374,8 -371,6 +374,8 @@@ int send_pack(struct send_pack_args *ar
        int agent_supported = 0;
        int use_atomic = 0;
        int atomic_supported = 0;
 +      int use_push_options = 0;
 +      int push_options_supported = 0;
        unsigned cmds_sent = 0;
        int ret;
        struct async demux;
                args->use_thin_pack = 0;
        if (server_supports("atomic"))
                atomic_supported = 1;
 +      if (server_supports("push-options"))
 +              push_options_supported = 1;
  
        if (args->push_cert != SEND_PACK_PUSH_CERT_NEVER) {
                int len;
  
        use_atomic = atomic_supported && args->atomic;
  
 +      if (args->push_options && !push_options_supported)
 +              die(_("the receiving end does not support push options"));
 +
 +      use_push_options = push_options_supported && args->push_options;
 +
        if (status_report)
                strbuf_addstr(&cap_buf, " report-status");
        if (use_sideband)
                strbuf_addstr(&cap_buf, " quiet");
        if (use_atomic)
                strbuf_addstr(&cap_buf, " atomic");
 +      if (use_push_options)
 +              strbuf_addstr(&cap_buf, " push-options");
        if (agent_supported)
                strbuf_addf(&cap_buf, " agent=%s", git_user_agent_sanitized());
  
        strbuf_release(&req_buf);
        strbuf_release(&cap_buf);
  
 +      if (use_push_options) {
 +              struct string_list_item *item;
 +              struct strbuf sb = STRBUF_INIT;
 +
 +              for_each_string_list_item(item, args->push_options)
 +                      packet_buf_write(&sb, "%s", item->string);
 +
 +              write_or_die(out, sb.buf, sb.len);
 +              packet_flush(out);
 +              strbuf_release(&sb);
 +      }
 +
        if (use_sideband && cmds_sent) {
                memset(&demux, 0, sizeof(demux));
                demux.proc = sideband_demux;
diff --combined sequencer.c
index cdfac82b117e9ff1084f3fbe36eeb85f45ce056c,80a17bb3bd01064c80550e6e302750c9e9c3a7ad..7b1eb146455b4b36a1e52298e9fc2405f0a30776
@@@ -112,7 -112,7 +112,7 @@@ static void remove_sequencer_state(void
  {
        struct strbuf seq_dir = STRBUF_INIT;
  
-       strbuf_addf(&seq_dir, "%s", git_path(SEQ_DIR));
+       strbuf_addstr(&seq_dir, git_path(SEQ_DIR));
        remove_dir_recursively(&seq_dir, 0);
        strbuf_release(&seq_dir);
  }
@@@ -190,7 -190,7 +190,7 @@@ static void write_message(struct strbu
                die_errno(_("Could not write to %s"), filename);
        strbuf_release(msgbuf);
        if (commit_lock_file(&msg_file) < 0)
 -              die(_("Error wrapping up %s"), filename);
 +              die(_("Error wrapping up %s."), filename);
  }
  
  static struct tree *empty_tree(void)
@@@ -225,7 -225,7 +225,7 @@@ static int fast_forward_to(const unsign
        if (checkout_fast_forward(from, to, 1))
                exit(128); /* the callee should have complained already */
  
 -      strbuf_addf(&sb, "%s: fast-forward", action_name(opts));
 +      strbuf_addf(&sb, _("%s: fast-forward"), action_name(opts));
  
        transaction = ref_transaction_begin(&err);
        if (!transaction ||
@@@ -695,14 -695,9 +695,14 @@@ static struct commit *parse_insn_line(c
         * opts; we don't support arbitrary instructions
         */
        if (action != opts->action) {
 -              const char *action_str;
 -              action_str = action == REPLAY_REVERT ? "revert" : "cherry-pick";
 -              error(_("Cannot %s during a %s"), action_str, action_name(opts));
 +              if (action == REPLAY_REVERT)
 +                    error((opts->action == REPLAY_REVERT)
 +                          ? _("Cannot revert during a another revert.")
 +                          : _("Cannot revert during a cherry-pick."));
 +              else
 +                    error((opts->action == REPLAY_REVERT)
 +                          ? _("Cannot cherry-pick during a revert.")
 +                          : _("Cannot cherry-pick during another cherry-pick."));
                return NULL;
        }
  
index c71ea4f759bf15253841bda5dd95f0783d0f7ad6,6bb53da3c0faef2989d749d3df5c26ca3cd76b4a..d24d157379f30cafdeeb772e82bf5ee4c862272c
@@@ -26,7 -26,7 +26,7 @@@ static int parallel_next(struct child_p
                return 0;
  
        argv_array_pushv(&cp->args, d->argv);
-       strbuf_addf(err, "preloaded output of a child\n");
+       strbuf_addstr(err, "preloaded output of a child\n");
        number_callbacks++;
        return 1;
  }
@@@ -36,7 -36,7 +36,7 @@@ static int no_job(struct child_process 
                  void *cb,
                  void **task_cb)
  {
-       strbuf_addf(err, "no further jobs available\n");
+       strbuf_addstr(err, "no further jobs available\n");
        return 0;
  }
  
@@@ -45,11 -45,11 +45,11 @@@ static int task_finished(int result
                         void *pp_cb,
                         void *pp_task_cb)
  {
-       strbuf_addf(err, "asking for a quick stop\n");
+       strbuf_addstr(err, "asking for a quick stop\n");
        return 1;
  }
  
 -int main(int argc, char **argv)
 +int cmd_main(int argc, const char **argv)
  {
        struct child_process proc = CHILD_PROCESS_INIT;
        int jobs;