Code

Add a --dry-run option to git-push.
authorBrian Ewins <brian.ewins@gmail.com>
Thu, 11 Oct 2007 19:32:27 +0000 (20:32 +0100)
committerShawn O. Pearce <spearce@spearce.org>
Tue, 16 Oct 2007 02:02:52 +0000 (22:02 -0400)
The default behaviour of git-push is potentially confusing
for new users, since it will push changes that are not on
the current branch. Publishing patches that were still
cooking on a development branch is hard to undo.

It would also be nice to be able to verify the expansion
of refspecs if you've edited them, so that you know
what branches matched on the server.

Adding a --dry-run flag allows the user to experiment
safely and learn how to use git-push properly. Originally
suggested by Steffen Prohaska.

Signed-off-by: Brian Ewins <brian.ewins@gmail.com>
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Documentation/git-push.txt
builtin-push.c
t/t5516-fetch-push.sh

index 6bc559ddd80e2fa8b3f4fdf57fa4f5ce14eb53af..e5dd4c10662230622299d0a4b2bb2850071be7d8 100644 (file)
@@ -9,7 +9,7 @@ git-push - Update remote refs along with associated objects
 SYNOPSIS
 --------
 [verse]
-'git-push' [--all] [--tags] [--receive-pack=<git-receive-pack>]
+'git-push' [--all] [--dry-run] [--tags] [--receive-pack=<git-receive-pack>]
            [--repo=all] [-f | --force] [-v] [<repository> <refspec>...]
 
 DESCRIPTION
@@ -63,6 +63,9 @@ the remote repository.
        Instead of naming each ref to push, specifies that all
        refs under `$GIT_DIR/refs/heads/` be pushed.
 
+\--dry-run::
+       Do everything except actually send the updates.
+
 \--tags::
        All refs under `$GIT_DIR/refs/tags` are pushed, in
        addition to refspecs explicitly listed on the command
index 88c5024da7c9831e69ee20ca20ed9bdb5ddee63f..141380b852771e107ee5ae1df3f8b9e30cfcea6b 100644 (file)
@@ -7,9 +7,9 @@
 #include "builtin.h"
 #include "remote.h"
 
-static const char push_usage[] = "git-push [--all] [--tags] [--receive-pack=<git-receive-pack>] [--repo=all] [-f | --force] [-v] [<repository> <refspec>...]";
+static const char push_usage[] = "git-push [--all] [--dry-run] [--tags] [--receive-pack=<git-receive-pack>] [--repo=all] [-f | --force] [-v] [<repository> <refspec>...]";
 
-static int all, force, thin, verbose;
+static int all, dry_run, force, thin, verbose;
 static const char *receivepack;
 
 static const char **refspec;
@@ -69,6 +69,8 @@ static int do_push(const char *repo)
        argc = 1;
        if (all)
                argv[argc++] = "--all";
+       if (dry_run)
+               argv[argc++] = "--dry-run";
        if (force)
                argv[argc++] = "--force";
        if (receivepack)
@@ -147,6 +149,10 @@ int cmd_push(int argc, const char **argv, const char *prefix)
                        all = 1;
                        continue;
                }
+               if (!strcmp(arg, "--dry-run")) {
+                       dry_run = 1;
+                       continue;
+               }
                if (!strcmp(arg, "--tags")) {
                        add_refspec("refs/tags/*");
                        continue;
index ca46aafe72fbf74d0569e68a0e7920655d98f9f5..4fbd5b1f473578ac5a1ac61a87883015c04fdc63 100755 (executable)
@@ -244,4 +244,14 @@ test_expect_success 'push with colon-less refspec (4)' '
 
 '
 
+test_expect_success 'push with dry-run' '
+
+       mk_test heads/master &&
+       cd testrepo &&
+       old_commit=$(git show-ref -s --verify refs/heads/master) &&
+       cd .. &&
+       git push --dry-run testrepo &&
+       check_push_result $old_commit heads/master
+'
+
 test_done