Fix sparse warnings
Fix warnings from 'make check'.
- These files don't include 'builtin.h' causing sparse to complain that
cmd_* isn't declared:
builtin/clone.c:364, builtin/fetch-pack.c:797,
builtin/fmt-merge-msg.c:34, builtin/hash-object.c:78,
builtin/merge-index.c:69, builtin/merge-recursive.c:22
builtin/merge-tree.c:341, builtin/mktag.c:156, builtin/notes.c:426
builtin/notes.c:822, builtin/pack-redundant.c:596,
builtin/pack-refs.c:10, builtin/patch-id.c:60, builtin/patch-id.c:149,
builtin/remote.c:1512, builtin/remote-ext.c:240,
builtin/remote-fd.c:53, builtin/reset.c:236, builtin/send-pack.c:384,
builtin/unpack-file.c:25, builtin/var.c:75
- These files have symbols which should be marked static since they're
only file scope:
submodule.c:12, diff.c:631, replace_object.c:92, submodule.c:13,
submodule.c:14, trace.c:78, transport.c:195, transport-helper.c:79,
unpack-trees.c:19, url.c:3, url.c:18, url.c:104, url.c:117, url.c:123,
url.c:129, url.c:136, thread-utils.c:21, thread-utils.c:48
- These files redeclare symbols to be different types:
builtin/index-pack.c:210, parse-options.c:564, parse-options.c:571,
usage.c:49, usage.c:58, usage.c:63, usage.c:72
- These files use a literal integer 0 when they really should use a NULL
pointer:
daemon.c:663, fast-import.c:2942, imap-send.c:1072, notes-merge.c:362
While we're in the area, clean up some unused #includes in builtin files
(mostly exec_cmd.h).
Signed-off-by: Stephen Boyd <bebarino@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-03-22 07:51:05 +00:00
|
|
|
#include "builtin.h"
|
2005-07-19 11:03:47 +00:00
|
|
|
#include "commit.h"
|
2005-07-08 20:58:40 +00:00
|
|
|
#include "refs.h"
|
2005-06-30 03:50:15 +00:00
|
|
|
#include "pkt-line.h"
|
2009-10-31 00:47:41 +00:00
|
|
|
#include "sideband.h"
|
2007-03-12 23:00:29 +00:00
|
|
|
#include "run-command.h"
|
2007-05-12 15:45:59 +00:00
|
|
|
#include "remote.h"
|
2007-10-30 02:03:39 +00:00
|
|
|
#include "send-pack.h"
|
2009-10-31 00:47:41 +00:00
|
|
|
#include "quote.h"
|
2010-02-16 23:42:52 +00:00
|
|
|
#include "transport.h"
|
2012-08-03 16:19:16 +00:00
|
|
|
#include "version.h"
|
2005-06-30 02:09:05 +00:00
|
|
|
|
2005-07-14 07:10:05 +00:00
|
|
|
static const char send_pack_usage[] =
|
2008-07-13 13:36:15 +00:00
|
|
|
"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [<host>:]<directory> [<ref>...]\n"
|
2007-01-19 12:43:00 +00:00
|
|
|
" --all and explicit <ref> specification are mutually exclusive.";
|
2007-10-30 02:03:39 +00:00
|
|
|
|
2009-03-27 02:37:53 +00:00
|
|
|
static struct send_pack_args args;
|
2005-06-30 02:09:05 +00:00
|
|
|
|
2009-10-31 00:47:41 +00:00
|
|
|
static void print_helper_status(struct ref *ref)
|
|
|
|
{
|
|
|
|
struct strbuf buf = STRBUF_INIT;
|
|
|
|
|
|
|
|
for (; ref; ref = ref->next) {
|
|
|
|
const char *msg = NULL;
|
|
|
|
const char *res;
|
|
|
|
|
|
|
|
switch(ref->status) {
|
|
|
|
case REF_STATUS_NONE:
|
|
|
|
res = "error";
|
|
|
|
msg = "no match";
|
|
|
|
break;
|
|
|
|
|
|
|
|
case REF_STATUS_OK:
|
|
|
|
res = "ok";
|
|
|
|
break;
|
|
|
|
|
|
|
|
case REF_STATUS_UPTODATE:
|
|
|
|
res = "ok";
|
|
|
|
msg = "up to date";
|
|
|
|
break;
|
|
|
|
|
|
|
|
case REF_STATUS_REJECT_NONFASTFORWARD:
|
|
|
|
res = "error";
|
|
|
|
msg = "non-fast forward";
|
|
|
|
break;
|
|
|
|
|
|
|
|
case REF_STATUS_REJECT_NODELETE:
|
|
|
|
case REF_STATUS_REMOTE_REJECT:
|
|
|
|
res = "error";
|
|
|
|
break;
|
|
|
|
|
|
|
|
case REF_STATUS_EXPECTING_REPORT:
|
|
|
|
default:
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
strbuf_reset(&buf);
|
|
|
|
strbuf_addf(&buf, "%s %s", res, ref->name);
|
|
|
|
if (ref->remote_status)
|
|
|
|
msg = ref->remote_status;
|
|
|
|
if (msg) {
|
|
|
|
strbuf_addch(&buf, ' ');
|
|
|
|
quote_two_c_style(&buf, "", msg, 0);
|
|
|
|
}
|
|
|
|
strbuf_addch(&buf, '\n');
|
|
|
|
|
|
|
|
safe_write(1, buf.buf, buf.len);
|
|
|
|
}
|
|
|
|
strbuf_release(&buf);
|
|
|
|
}
|
|
|
|
|
2007-10-30 02:03:39 +00:00
|
|
|
int cmd_send_pack(int argc, const char **argv, const char *prefix)
|
2005-06-30 02:09:05 +00:00
|
|
|
{
|
2009-03-09 01:06:07 +00:00
|
|
|
int i, nr_refspecs = 0;
|
|
|
|
const char **refspecs = NULL;
|
2007-10-30 02:03:39 +00:00
|
|
|
const char *remote_name = NULL;
|
2007-05-16 02:50:19 +00:00
|
|
|
struct remote *remote = NULL;
|
2007-10-30 02:03:39 +00:00
|
|
|
const char *dest = NULL;
|
2009-03-09 01:06:07 +00:00
|
|
|
int fd[2];
|
|
|
|
struct child_process *conn;
|
|
|
|
struct extra_have_objects extra_have;
|
2009-05-31 14:26:48 +00:00
|
|
|
struct ref *remote_refs, *local_refs;
|
2009-03-09 01:06:07 +00:00
|
|
|
int ret;
|
2009-10-31 00:47:41 +00:00
|
|
|
int helper_status = 0;
|
2009-03-09 01:06:07 +00:00
|
|
|
int send_all = 0;
|
|
|
|
const char *receivepack = "git-receive-pack";
|
|
|
|
int flags;
|
2010-02-16 23:42:52 +00:00
|
|
|
int nonfastforward = 0;
|
2012-05-01 08:42:24 +00:00
|
|
|
int progress = -1;
|
2006-03-24 07:41:18 +00:00
|
|
|
|
2005-06-30 02:09:05 +00:00
|
|
|
argv++;
|
2005-07-16 20:26:33 +00:00
|
|
|
for (i = 1; i < argc; i++, argv++) {
|
2007-10-30 02:03:39 +00:00
|
|
|
const char *arg = *argv;
|
2005-06-30 02:09:05 +00:00
|
|
|
|
|
|
|
if (*arg == '-') {
|
Mechanical conversion to use prefixcmp()
This mechanically converts strncmp() to use prefixcmp(), but only when
the parameters match specific patterns, so that they can be verified
easily. Leftover from this will be fixed in a separate step, including
idiotic conversions like
if (!strncmp("foo", arg, 3))
=>
if (!(-prefixcmp(arg, "foo")))
This was done by using this script in px.perl
#!/usr/bin/perl -i.bak -p
if (/strncmp\(([^,]+), "([^\\"]*)", (\d+)\)/ && (length($2) == $3)) {
s|strncmp\(([^,]+), "([^\\"]*)", (\d+)\)|prefixcmp($1, "$2")|;
}
if (/strncmp\("([^\\"]*)", ([^,]+), (\d+)\)/ && (length($1) == $3)) {
s|strncmp\("([^\\"]*)", ([^,]+), (\d+)\)|(-prefixcmp($2, "$1"))|;
}
and running:
$ git grep -l strncmp -- '*.c' | xargs perl px.perl
Signed-off-by: Junio C Hamano <junkio@cox.net>
2007-02-20 09:53:29 +00:00
|
|
|
if (!prefixcmp(arg, "--receive-pack=")) {
|
2009-03-09 01:06:07 +00:00
|
|
|
receivepack = arg + 15;
|
2007-01-19 12:49:27 +00:00
|
|
|
continue;
|
|
|
|
}
|
Mechanical conversion to use prefixcmp()
This mechanically converts strncmp() to use prefixcmp(), but only when
the parameters match specific patterns, so that they can be verified
easily. Leftover from this will be fixed in a separate step, including
idiotic conversions like
if (!strncmp("foo", arg, 3))
=>
if (!(-prefixcmp(arg, "foo")))
This was done by using this script in px.perl
#!/usr/bin/perl -i.bak -p
if (/strncmp\(([^,]+), "([^\\"]*)", (\d+)\)/ && (length($2) == $3)) {
s|strncmp\(([^,]+), "([^\\"]*)", (\d+)\)|prefixcmp($1, "$2")|;
}
if (/strncmp\("([^\\"]*)", ([^,]+), (\d+)\)/ && (length($1) == $3)) {
s|strncmp\("([^\\"]*)", ([^,]+), (\d+)\)|(-prefixcmp($2, "$1"))|;
}
and running:
$ git grep -l strncmp -- '*.c' | xargs perl px.perl
Signed-off-by: Junio C Hamano <junkio@cox.net>
2007-02-20 09:53:29 +00:00
|
|
|
if (!prefixcmp(arg, "--exec=")) {
|
2009-03-09 01:06:07 +00:00
|
|
|
receivepack = arg + 7;
|
2005-06-30 02:09:05 +00:00
|
|
|
continue;
|
|
|
|
}
|
2007-05-16 02:50:19 +00:00
|
|
|
if (!prefixcmp(arg, "--remote=")) {
|
|
|
|
remote_name = arg + 9;
|
|
|
|
continue;
|
|
|
|
}
|
2005-07-16 20:26:33 +00:00
|
|
|
if (!strcmp(arg, "--all")) {
|
2009-03-09 01:06:07 +00:00
|
|
|
send_all = 1;
|
2005-07-16 20:26:33 +00:00
|
|
|
continue;
|
|
|
|
}
|
2007-10-11 19:32:26 +00:00
|
|
|
if (!strcmp(arg, "--dry-run")) {
|
2007-10-30 02:03:39 +00:00
|
|
|
args.dry_run = 1;
|
2007-10-11 19:32:26 +00:00
|
|
|
continue;
|
|
|
|
}
|
2007-11-09 23:32:10 +00:00
|
|
|
if (!strcmp(arg, "--mirror")) {
|
|
|
|
args.send_mirror = 1;
|
|
|
|
continue;
|
|
|
|
}
|
2005-07-19 11:03:47 +00:00
|
|
|
if (!strcmp(arg, "--force")) {
|
2007-10-30 02:03:39 +00:00
|
|
|
args.force_update = 1;
|
2005-07-19 11:03:47 +00:00
|
|
|
continue;
|
|
|
|
}
|
2012-01-08 21:06:20 +00:00
|
|
|
if (!strcmp(arg, "--quiet")) {
|
|
|
|
args.quiet = 1;
|
|
|
|
continue;
|
|
|
|
}
|
2005-12-21 02:13:02 +00:00
|
|
|
if (!strcmp(arg, "--verbose")) {
|
2007-10-30 02:03:39 +00:00
|
|
|
args.verbose = 1;
|
2005-12-21 02:13:02 +00:00
|
|
|
continue;
|
|
|
|
}
|
2012-05-01 08:42:24 +00:00
|
|
|
if (!strcmp(arg, "--progress")) {
|
|
|
|
progress = 1;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (!strcmp(arg, "--no-progress")) {
|
|
|
|
progress = 0;
|
|
|
|
continue;
|
|
|
|
}
|
2006-02-19 23:03:49 +00:00
|
|
|
if (!strcmp(arg, "--thin")) {
|
2007-10-30 02:03:39 +00:00
|
|
|
args.use_thin_pack = 1;
|
2006-02-19 23:03:49 +00:00
|
|
|
continue;
|
|
|
|
}
|
2009-10-31 00:47:41 +00:00
|
|
|
if (!strcmp(arg, "--stateless-rpc")) {
|
|
|
|
args.stateless_rpc = 1;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (!strcmp(arg, "--helper-status")) {
|
|
|
|
helper_status = 1;
|
|
|
|
continue;
|
|
|
|
}
|
2005-06-30 02:09:05 +00:00
|
|
|
usage(send_pack_usage);
|
|
|
|
}
|
2005-07-16 20:26:33 +00:00
|
|
|
if (!dest) {
|
|
|
|
dest = arg;
|
|
|
|
continue;
|
|
|
|
}
|
2009-03-09 01:06:07 +00:00
|
|
|
refspecs = (const char **) argv;
|
|
|
|
nr_refspecs = argc - i;
|
2005-06-30 02:09:05 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (!dest)
|
|
|
|
usage(send_pack_usage);
|
2007-11-09 23:32:10 +00:00
|
|
|
/*
|
|
|
|
* --all and --mirror are incompatible; neither makes sense
|
|
|
|
* with any refspecs.
|
|
|
|
*/
|
2009-03-09 01:06:07 +00:00
|
|
|
if ((refspecs && (send_all || args.send_mirror)) ||
|
|
|
|
(send_all && args.send_mirror))
|
2005-08-02 19:20:27 +00:00
|
|
|
usage(send_pack_usage);
|
2006-12-13 18:30:11 +00:00
|
|
|
|
2007-05-16 02:50:19 +00:00
|
|
|
if (remote_name) {
|
|
|
|
remote = remote_get(remote_name);
|
2007-09-19 04:49:27 +00:00
|
|
|
if (!remote_has_url(remote, dest)) {
|
2007-05-16 02:50:19 +00:00
|
|
|
die("Destination %s is not a uri for %s",
|
|
|
|
dest, remote_name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-05-01 08:42:24 +00:00
|
|
|
if (progress == -1)
|
|
|
|
progress = !args.quiet && isatty(2);
|
|
|
|
args.progress = progress;
|
send-pack: show progress when isatty(2)
The send_pack_args struct has two verbosity flags: "quiet"
and "progress". Originally, if "quiet" was set, we would
tell pack-objects explicitly to be quiet, and if "progress"
was set, we would tell it to show progress. Otherwise, we
told it neither, and it relied on isatty(2) to make the
decision itself.
However, commit 01fdc21 changed the meaning of these
variables. Now both "quiet" and "!progress" instruct us to
tell pack-objects to be quiet (and a non-zero "progress"
means the same as before). This works well for transports
which call send_pack directly, as the transport code copies
transport->progress into send_pack_args->progress, and they
both have the same meaning.
However, the code path of calling "git send-pack" was left
behind. It always sets "progress" to 0, and thus always
tells pack-objects to be quiet. We can work around this by
checking isatty(2) ourselves in the cmd_send_pack code path,
restoring the original behavior of the send-pack command.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-05-01 08:41:42 +00:00
|
|
|
|
2009-10-31 00:47:41 +00:00
|
|
|
if (args.stateless_rpc) {
|
|
|
|
conn = NULL;
|
|
|
|
fd[0] = 0;
|
|
|
|
fd[1] = 1;
|
|
|
|
} else {
|
2011-09-06 18:06:32 +00:00
|
|
|
conn = git_connect(fd, dest, receivepack,
|
2009-10-31 00:47:41 +00:00
|
|
|
args.verbose ? CONNECT_VERBOSE : 0);
|
|
|
|
}
|
2007-10-30 02:03:39 +00:00
|
|
|
|
2009-03-09 01:06:07 +00:00
|
|
|
memset(&extra_have, 0, sizeof(extra_have));
|
|
|
|
|
2011-12-13 00:41:37 +00:00
|
|
|
get_remote_heads(fd[0], &remote_refs, REF_NORMAL, &extra_have);
|
2009-03-09 01:06:07 +00:00
|
|
|
|
2010-02-16 23:42:52 +00:00
|
|
|
transport_verify_remote_names(nr_refspecs, refspecs);
|
2009-03-09 01:06:07 +00:00
|
|
|
|
|
|
|
local_refs = get_local_heads();
|
2007-10-30 02:03:39 +00:00
|
|
|
|
2009-03-09 01:06:07 +00:00
|
|
|
flags = MATCH_REFS_NONE;
|
|
|
|
|
|
|
|
if (send_all)
|
|
|
|
flags |= MATCH_REFS_ALL;
|
|
|
|
if (args.send_mirror)
|
|
|
|
flags |= MATCH_REFS_MIRROR;
|
|
|
|
|
|
|
|
/* match them up */
|
2011-09-09 18:54:58 +00:00
|
|
|
if (match_push_refs(local_refs, &remote_refs, nr_refspecs, refspecs, flags))
|
2009-03-09 01:06:07 +00:00
|
|
|
return -1;
|
2007-10-30 02:03:39 +00:00
|
|
|
|
2010-01-08 02:12:42 +00:00
|
|
|
set_ref_status_for_push(remote_refs, args.send_mirror,
|
|
|
|
args.force_update);
|
|
|
|
|
2009-03-09 01:06:07 +00:00
|
|
|
ret = send_pack(&args, fd, conn, remote_refs, &extra_have);
|
2007-10-30 02:03:39 +00:00
|
|
|
|
2009-10-31 00:47:41 +00:00
|
|
|
if (helper_status)
|
|
|
|
print_helper_status(remote_refs);
|
|
|
|
|
2009-03-09 01:06:07 +00:00
|
|
|
close(fd[1]);
|
2005-06-30 05:50:48 +00:00
|
|
|
close(fd[0]);
|
2009-03-09 01:06:07 +00:00
|
|
|
|
2007-10-19 19:47:53 +00:00
|
|
|
ret |= finish_connect(conn);
|
2009-03-09 01:06:07 +00:00
|
|
|
|
2009-10-31 00:47:41 +00:00
|
|
|
if (!helper_status)
|
2010-02-16 23:42:52 +00:00
|
|
|
transport_print_push_status(dest, remote_refs, args.verbose, 0, &nonfastforward);
|
2009-03-09 01:06:07 +00:00
|
|
|
|
|
|
|
if (!args.dry_run && remote) {
|
|
|
|
struct ref *ref;
|
|
|
|
for (ref = remote_refs; ref; ref = ref->next)
|
2010-02-16 23:42:52 +00:00
|
|
|
transport_update_tracking_ref(remote, ref, args.verbose);
|
2009-03-09 01:06:07 +00:00
|
|
|
}
|
|
|
|
|
2010-02-16 23:42:52 +00:00
|
|
|
if (!ret && !transport_refs_pushed(remote_refs))
|
2009-03-09 01:06:07 +00:00
|
|
|
fprintf(stderr, "Everything up-to-date\n");
|
|
|
|
|
|
|
|
return ret;
|
2005-06-30 02:09:05 +00:00
|
|
|
}
|