Signed-off-by: Ronnie Sahlberg <sahlberg@xxxxxxxxxx> --- Documentation/git-send-pack.txt | 7 ++++++- builtin/send-pack.c | 6 +++++- send-pack.c | 8 +++++++- send-pack.h | 1 + 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Documentation/git-send-pack.txt b/Documentation/git-send-pack.txt index dc3a568..4ee2ca1 100644 --- a/Documentation/git-send-pack.txt +++ b/Documentation/git-send-pack.txt @@ -9,7 +9,7 @@ git-send-pack - Push objects over Git protocol to another repository SYNOPSIS -------- [verse] -'git send-pack' [--all] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [<host>:]<directory> [<ref>...] +'git send-pack' [--all] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [--atomic-push] [<host>:]<directory> [<ref>...] DESCRIPTION ----------- @@ -52,6 +52,11 @@ OPTIONS Send a "thin" pack, which records objects in deltified form based on objects not included in the pack to reduce network traffic. +--atomic-push:: + With atomic-push all refs are updated in one single atomic transaction. + This means that if any of the refs fails then the entire push will + fail without changing any refs. + <host>:: A remote host to house the repository. When this part is specified, 'git-receive-pack' is invoked via diff --git a/builtin/send-pack.c b/builtin/send-pack.c index f420b74..78e7d8f 100644 --- a/builtin/send-pack.c +++ b/builtin/send-pack.c @@ -13,7 +13,7 @@ #include "sha1-array.h" static const char send_pack_usage[] = -"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [<host>:]<directory> [<ref>...]\n" +"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [--atomic-push] [<host>:]<directory> [<ref>...]\n" " --all and explicit <ref> specification are mutually exclusive."; static struct send_pack_args args; @@ -165,6 +165,10 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix) args.use_thin_pack = 1; continue; } + if (!strcmp(arg, "--atomic-push")) { + args.use_atomic_push = 1; + continue; + } if (!strcmp(arg, "--stateless-rpc")) { args.stateless_rpc = 1; continue; diff --git a/send-pack.c b/send-pack.c index f91b8d9..66f3724 100644 --- a/send-pack.c +++ b/send-pack.c @@ -228,6 +228,11 @@ int send_pack(struct send_pack_args *args, if (server_supports("atomic-push")) atomic_push_supported = 1; + if (args->use_atomic_push && !atomic_push_supported) { + fprintf(stderr, "Server does not support atomic-push."); + return -1; + } + if (!remote_refs) { fprintf(stderr, "No refs in common and none specified; doing nothing.\n" "Perhaps you should specify a branch such as 'master'.\n"); @@ -272,7 +277,8 @@ int send_pack(struct send_pack_args *args, char *old_hex = sha1_to_hex(ref->old_sha1); char *new_hex = sha1_to_hex(ref->new_sha1); int quiet = quiet_supported && (args->quiet || !args->progress); - int atomic_push = atomic_push_supported; + int atomic_push = atomic_push_supported && + args->use_atomic_push; if (!cmds_sent && (status_report || use_sideband || quiet || agent_supported || diff --git a/send-pack.h b/send-pack.h index 8e84392..0374ed8 100644 --- a/send-pack.h +++ b/send-pack.h @@ -10,6 +10,7 @@ struct send_pack_args { force_update:1, use_thin_pack:1, use_ofs_delta:1, + use_atomic_push:1, dry_run:1, stateless_rpc:1; }; -- 2.0.1.556.ge8f7cba.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html