[PATCH 2/5] send-pack.c: add an --atomic-push command line argument
flat view
STALE3773d
From: Ronnie Sahlberg <hidden>
Date: 2016-06-15 23:02:06
Subsystem:
documentation, the rest · Maintainers:
Jonathan Corbet, Linus Torvalds
Revision v1 of 2 in this series.
Revisions (2)
- v1 current
- v1
Signed-off-by: Ronnie Sahlberg <redacted> --- 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