Signed-off-by: Ronnie Sahlberg <sahlb...@google.com>
---
 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.528.gd0e7a84

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to