#include "sideband.h"
#include "argv-array.h"
#include "credential.h"
+#include "sha1-array.h"
static struct remote *remote;
/* always ends with a trailing slash */
unsigned long depth;
unsigned progress : 1,
check_self_contained_and_connected : 1,
+ cloning : 1,
+ update_shallow : 1,
followtags : 1,
dry_run : 1,
thin : 1;
string_list_append(&cas_options, val.buf);
strbuf_release(&val);
return 0;
- }
- else {
+ } else if (!strcmp(name, "cloning")) {
+ if (!strcmp(value, "true"))
+ options.cloning = 1;
+ else if (!strcmp(value, "false"))
+ options.cloning = 0;
+ else
+ return -1;
+ return 0;
+ } else if (!strcmp(name, "update-shallow")) {
+ if (!strcmp(value, "true"))
+ options.update_shallow = 1;
+ else if (!strcmp(value, "false"))
+ options.update_shallow = 0;
+ else
+ return -1;
+ return 0;
+ } else {
return 1 /* unsupported */;
}
}
char *buf;
size_t len;
struct ref *refs;
+ struct sha1_array shallow;
unsigned proto_git : 1;
};
static struct discovery *last_discovery;
{
struct ref *list = NULL;
get_remote_heads(-1, heads->buf, heads->len, &list,
- for_push ? REF_NORMAL : 0, NULL);
+ for_push ? REF_NORMAL : 0, NULL, &heads->shallow);
return list;
}
if (d) {
if (d == last_discovery)
last_discovery = NULL;
+ free(d->shallow.sha1);
free(d->buf_alloc);
free_refs(d->refs);
free(d);
}
}
-static int show_http_message(struct strbuf *type, struct strbuf *msg)
+static int show_http_message(struct strbuf *type, struct strbuf *charset,
+ struct strbuf *msg)
{
const char *p, *eol;
/*
* We only show text/plain parts, as other types are likely
* to be ugly to look at on the user's terminal.
- *
- * TODO should handle "; charset=XXX", and re-encode into
- * logoutputencoding
*/
- if (strcasecmp(type->buf, "text/plain"))
+ if (strcmp(type->buf, "text/plain"))
return -1;
+ if (charset->len)
+ strbuf_reencode(msg, charset->buf, get_log_output_encoding());
strbuf_trim(msg);
if (!msg->len)
{
struct strbuf exp = STRBUF_INIT;
struct strbuf type = STRBUF_INIT;
+ struct strbuf charset = STRBUF_INIT;
struct strbuf buffer = STRBUF_INIT;
struct strbuf refs_url = STRBUF_INIT;
struct strbuf effective_url = STRBUF_INIT;
memset(&options, 0, sizeof(options));
options.content_type = &type;
+ options.charset = &charset;
options.effective_url = &effective_url;
options.base_url = &url;
options.no_cache = 1;
case HTTP_OK:
break;
case HTTP_MISSING_TARGET:
- show_http_message(&type, &buffer);
+ show_http_message(&type, &charset, &buffer);
die("repository '%s' not found", url.buf);
case HTTP_NOAUTH:
- show_http_message(&type, &buffer);
+ show_http_message(&type, &charset, &buffer);
die("Authentication failed for '%s'", url.buf);
default:
- show_http_message(&type, &buffer);
+ show_http_message(&type, &charset, &buffer);
die("unable to access '%s': %s", url.buf, curl_errorstr);
}
strbuf_release(&refs_url);
strbuf_release(&exp);
strbuf_release(&type);
+ strbuf_release(&charset);
strbuf_release(&effective_url);
strbuf_release(&buffer);
last_discovery = last;
if (!results)
results = &results_buf;
- slot->results = results;
- slot->curl_result = curl_easy_perform(slot->curl);
- finish_active_slot(slot);
+ err = run_one_slot(slot, results);
- err = handle_curl_result(results);
if (err != HTTP_OK && err != HTTP_REAUTH) {
error("RPC failed; result=%d, HTTP code = %ld",
results->curl_result, results->http_code);
struct strbuf preamble = STRBUF_INIT;
char *depth_arg = NULL;
int argc = 0, i, err;
- const char *argv[16];
+ const char *argv[17];
argv[argc++] = "fetch-pack";
argv[argc++] = "--stateless-rpc";
}
if (options.check_self_contained_and_connected)
argv[argc++] = "--check-self-contained-and-connected";
+ if (options.cloning)
+ argv[argc++] = "--cloning";
+ if (options.update_shallow)
+ argv[argc++] = "--update-shallow";
if (!options.progress)
argv[argc++] = "--no-progress";
if (options.depth) {
struct ref *ref = to_fetch[i];
if (!ref->name || !*ref->name)
die("cannot fetch by sha1 over smart http");
- packet_buf_write(&preamble, "%s\n", ref->name);
+ packet_buf_write(&preamble, "%s %s\n",
+ sha1_to_hex(ref->old_sha1), ref->name);
}
packet_buf_flush(&preamble);