"git-send-pack [--all] [--exec=git-receive-pack] <remote> [<head>...]\n"
" --all and explicit <head> specification are mutually exclusive.";
static const char *exec = "git-receive-pack";
+static int verbose = 0;
static int send_all = 0;
static int force_update = 0;
{
struct ref *ref;
int new_refs;
+ int ret = 0;
/* No funny business with the matcher */
remote_tail = get_remote_heads(in, &remote_refs, 0, NULL, 1);
if (!ref->peer_ref)
continue;
if (!memcmp(ref->old_sha1, ref->peer_ref->new_sha1, 20)) {
- fprintf(stderr, "'%s': up-to-date\n", ref->name);
+ if (verbose)
+ fprintf(stderr, "'%s': up-to-date\n", ref->name);
continue;
}
if (!force_update &&
!is_zero_sha1(ref->old_sha1) &&
!ref->force) {
- if (!has_sha1_file(ref->old_sha1)) {
- error("remote '%s' object %s does not "
- "exist on local",
- ref->name, sha1_to_hex(ref->old_sha1));
- continue;
- }
-
- /* We assume that local is fsck-clean. Otherwise
- * you _could_ have an old tag which points at
- * something you do not have, which may or may not
- * be a commit.
- */
- if (!ref_newer(ref->peer_ref->new_sha1,
+ if (!has_sha1_file(ref->old_sha1) ||
+ !ref_newer(ref->peer_ref->new_sha1,
ref->old_sha1)) {
- error("remote ref '%s' is not a strict "
- "subset of local ref '%s'.", ref->name,
+ /* We do not have the remote ref, or
+ * we know that the remote ref is not
+ * an ancestor of what we are trying to
+ * push. Either way this can be losing
+ * commits at the remote end and likely
+ * we were not up to date to begin with.
+ */
+ error("remote '%s' is not a strict "
+ "subset of local ref '%s'. "
+ "maybe you are not up-to-date and "
+ "need to pull first?",
+ ref->name,
ref->peer_ref->name);
+ ret = -2;
continue;
}
}
memcpy(ref->new_sha1, ref->peer_ref->new_sha1, 20);
if (is_zero_sha1(ref->new_sha1)) {
error("cannot happen anymore");
+ ret = -3;
continue;
}
new_refs++;
packet_flush(out);
if (new_refs)
pack_objects(out, remote_refs);
+ else if (ret == 0)
+ fprintf(stderr, "Everything up-to-date\n");
close(out);
- return 0;
+ return ret;
}
force_update = 1;
continue;
}
+ if (!strcmp(arg, "--verbose")) {
+ verbose = 1;
+ continue;
+ }
usage(send_pack_usage);
}
if (!dest) {