From: Matthieu Moy <Matthieu.Moy@imag.fr>
To: git@vger.kernel.org, gitster@pobox.com
Cc: Jeff King <peff@peff.net>,
Michael Haggerty <mhagger@alum.mit.edu>,
Matthieu Moy <Matthieu.Moy@imag.fr>
Subject: [PATCH 2/4] push: introduce new push.default mode "simple"
Date: Fri, 20 Apr 2012 16:59:02 +0200 [thread overview]
Message-ID: <1334933944-13446-3-git-send-email-Matthieu.Moy@imag.fr> (raw)
In-Reply-To: <1334933944-13446-1-git-send-email-Matthieu.Moy@imag.fr>
When calling "git push" without argument, we want to allow Git to do
something simple to explain and safe. push.default=matching is unsafe
when use to push to shared repositories, and hard to explain to beginners
in some context. It is debatable whether 'upstream' or 'current' is the
safest or the easiest to explain, so introduce a new mode called 'simple'
that is the intersection of them: push the upstream branch, but only if
it has the same name remotely. If not, give an error that suggest the
right command to push explicitely to 'upstream' or 'current'.
A question is whether to allow pushing when no upstream is configured. An
argument in favor of allowing the push is that it makes the new mode work
in more cases. On the other hand, refusing to push when no upstream is
configured encourages the user to set the upstream, which will be
beneficial on the next pull. Lacking better argument, we chose to deny
the push, because it will be easier to change in the future is someone
shows us wrong.
Original-patch-by: Jeff King <peff@peff.net>
Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
Except for the broken-ness, this adds the last line in the warning message:
"To chose either option permanently, read about push.default in git-config(1)"
Documentation/config.txt | 3 +++
builtin/push.c | 32 +++++++++++++++++++++--
cache.h | 1 +
config.c | 4 ++-
t/t5528-push-default.sh | 63 +++++++++++++++++++++++++++++++++++++++++++---
5 files changed, 97 insertions(+), 6 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 368a770..05d1472 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -1697,6 +1697,9 @@ push.default::
This option allows publishing a branch to a remote repository using
the same naming convention locally and remotely, in a more
conservative and safer way than `matching`.
+* `simple` - like `upstream`, but refuses to push if the upstream
+ branch's name is different from the local one. This is the safest
+ option and is well-suited for beginners.
rebase.stat::
Whether to show a diffstat of what changed upstream since the last
diff --git a/builtin/push.c b/builtin/push.c
index 6936713..ba0d6a0 100644
--- a/builtin/push.c
+++ b/builtin/push.c
@@ -76,7 +76,7 @@ static int push_url_of_remote(struct remote *remote, const char ***url_p)
return remote->url_nr;
}
-static void setup_push_upstream(struct remote *remote)
+static void setup_push_upstream(struct remote *remote, int simple)
{
struct strbuf refspec = STRBUF_INIT;
struct branch *branch = branch_get(NULL);
@@ -103,6 +103,30 @@ static void setup_push_upstream(struct remote *remote)
"your current branch '%s', without telling me what to push\n"
"to update which remote branch."),
remote->name, branch->name);
+ if (simple && strcmp(branch->refname, branch->merge[0]->src)) {
+ /*
+ * There's no point in using shorten_unambiguous_ref here,
+ * as the ambiguity would be on the remote side, not what
+ * we have locally. Plus, this is supposed to be the simple
+ * mode. If the user is doing something crazy like setting
+ * upstream to a non-branch, we should probably be showing
+ * them the big ugly fully qualified ref.
+ */
+ const char *short_up = skip_prefix(branch->merge[0]->src, "refs/heads/");
+ die(_("The upstream branch of your current branch does not match\n"
+ "the name of your current branch. To push to the upstream branch\n"
+ "on the remote, use\n"
+ "\n"
+ " git push %s HEAD:%s\n"
+ "\n"
+ "To push to the branch of the same name on the remote, use\n"
+ "\n"
+ " git push %s %s\n"
+ "\n"
+ "To chose either option permanently, read about push.default in git-config(1)\n"),
+ remote->name, short_up ? short_up : branch->merge[0]->src,
+ remote->name, branch->name);
+ }
strbuf_addf(&refspec, "%s:%s", branch->name, branch->merge[0]->src);
add_refspec(refspec.buf);
@@ -119,8 +143,12 @@ static void setup_default_push_refspecs(struct remote *remote)
add_refspec(":");
break;
+ case PUSH_DEFAULT_SIMPLE:
+ setup_push_upstream(remote, 1);
+ break;
+
case PUSH_DEFAULT_UPSTREAM:
- setup_push_upstream(remote);
+ setup_push_upstream(remote, 0);
break;
case PUSH_DEFAULT_CURRENT:
diff --git a/cache.h b/cache.h
index d8f6f1e..5e419a1 100644
--- a/cache.h
+++ b/cache.h
@@ -580,6 +580,7 @@ enum rebase_setup_type {
enum push_default_type {
PUSH_DEFAULT_NOTHING = 0,
PUSH_DEFAULT_MATCHING,
+ PUSH_DEFAULT_SIMPLE,
PUSH_DEFAULT_UPSTREAM,
PUSH_DEFAULT_CURRENT,
PUSH_DEFAULT_UNSPECIFIED
diff --git a/config.c b/config.c
index 68d3294..024bc74 100644
--- a/config.c
+++ b/config.c
@@ -829,6 +829,8 @@ static int git_default_push_config(const char *var, const char *value)
push_default = PUSH_DEFAULT_NOTHING;
else if (!strcmp(value, "matching"))
push_default = PUSH_DEFAULT_MATCHING;
+ else if (!strcmp(value, "simple"))
+ push_default = PUSH_DEFAULT_SIMPLE;
else if (!strcmp(value, "upstream"))
push_default = PUSH_DEFAULT_UPSTREAM;
else if (!strcmp(value, "tracking")) /* deprecated */
@@ -837,7 +839,7 @@ static int git_default_push_config(const char *var, const char *value)
push_default = PUSH_DEFAULT_CURRENT;
else {
error("Malformed value for %s: %s", var, value);
- return error("Must be one of nothing, matching, "
+ return error("Must be one of simple, nothing, matching, "
"tracking or current.");
}
return 0;
diff --git a/t/t5528-push-default.sh b/t/t5528-push-default.sh
index c334c51..949dbdf 100755
--- a/t/t5528-push-default.sh
+++ b/t/t5528-push-default.sh
@@ -13,6 +13,22 @@ test_expect_success 'setup bare remotes' '
git push parent2 HEAD
'
+# $1 = local revision
+# $2 = remote repository
+# $3 = remote revision (tested to be equal to the local one)
+check_pushed_commit () {
+ git rev-parse "$1" > expect &&
+ git --git-dir="$2" rev-parse "$3" > actual &&
+ test_cmp expect actual
+}
+
+# $1 = push.default value
+# $2 = expected target branch for the push
+test_push_success () {
+ git -c push.default="$1" push &&
+ check_pushed_commit HEAD repo1 "$2"
+}
+
test_expect_success '"upstream" pushes to configured upstream' '
git checkout master &&
test_config branch.master.remote parent1 &&
@@ -20,9 +36,7 @@ test_expect_success '"upstream" pushes to configured upstream' '
test_config push.default upstream &&
test_commit two &&
git push &&
- echo two >expect &&
- git --git-dir=repo1 log -1 --format=%s foo >actual &&
- test_cmp expect actual
+ check_pushed_commit HEAD repo1 foo
'
test_expect_success '"upstream" does not push on unconfigured remote' '
@@ -51,4 +65,47 @@ test_expect_success '"upstream" does not push when remotes do not match' '
test_must_fail git push parent2
'
+test_expect_success 'push from/to new branch with upstream, matching and simple' '
+ git checkout -b new-branch &&
+ test_must_fail git -c push.default=simple push &&
+ test_must_fail git -c push.default=matching push &&
+ test_must_fail git -c push.default=upstream push
+'
+
+test_expect_success 'push from/to new branch with current creates remote branch' '
+ test_config branch.new-branch.remote repo1 &&
+ git checkout new-branch &&
+ test_push_success current new-branch
+'
+
+test_expect_success 'push to existing branch, with no upstream configured' '
+ test_config branch.master.remote repo1 &&
+ git checkout master &&
+ test_must_fail git -c push.default=simple push &&
+ test_must_fail git -c push.default=upstream push
+'
+
+test_expect_success 'push to existing branch, upstream configured with same name' '
+ test_config branch.master.remote repo1 &&
+ test_config branch.master.merge refs/heads/master &&
+ git checkout master &&
+ test_commit six &&
+ test_push_success upstream master &&
+ test_commit seven &&
+ test_push_success simple master &&
+ check_pushed_commit HEAD repo1 master
+'
+
+test_expect_success 'push to existing branch, upstream configured with different name' '
+ test_config branch.master.remote repo1 &&
+ test_config branch.master.merge refs/heads/other-name &&
+ git checkout master &&
+ test_commit eight &&
+ test_push_success upstream other-name &&
+ test_commit nine &&
+ test_must_fail git -c push.default=simple push &&
+ test_push_success current master &&
+ test_must_fail check_pushed_commit HEAD repo1 other-name
+'
+
test_done
--
1.7.10.140.g8c333
next prev parent reply other threads:[~2012-04-20 15:00 UTC|newest]
Thread overview: 152+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-28 19:47 [ANNOUNCE] Git 1.7.10-rc3 Junio C Hamano
2012-03-29 9:52 ` Jeff King
2012-03-29 21:22 ` Junio C Hamano
2012-03-29 22:11 ` Jeff King
2012-03-30 1:54 ` Junio C Hamano
2012-03-30 7:13 ` push.default: current vs upstream Jeff King
2012-03-30 20:25 ` Junio C Hamano
2012-03-30 21:01 ` Jeff King
2012-03-30 21:28 ` Junio C Hamano
2012-03-30 21:53 ` Jeff King
2012-03-30 22:15 ` Junio C Hamano
2012-03-30 22:20 ` Jeff King
2012-03-30 23:12 ` Junio C Hamano
2012-03-31 22:49 ` Nathan Gray
2012-03-31 23:48 ` Seth Robertson
2012-04-01 2:22 ` Junio C Hamano
2012-04-01 5:58 ` Nathan Gray
2012-04-02 7:40 ` Matthieu Moy
2012-04-02 16:48 ` Junio C Hamano
2012-04-02 17:20 ` Matthieu Moy
2012-04-02 18:40 ` Junio C Hamano
2012-04-02 18:58 ` Matthieu Moy
2012-04-02 19:47 ` Junio C Hamano
2012-04-02 20:40 ` Matthieu Moy
2012-04-02 20:50 ` Junio C Hamano
2012-04-02 21:02 ` demerphq
2012-04-02 21:16 ` Matthieu Moy
2012-04-04 7:57 ` demerphq
2012-04-05 13:13 ` Jeff King
2012-04-05 16:46 ` Matthieu Moy
2012-04-06 7:15 ` Jeff King
2012-04-06 7:44 ` Matthieu Moy
2012-04-06 8:00 ` Jeff King
2012-04-06 17:41 ` Junio C Hamano
2012-04-06 18:01 ` Jehan Bing
2012-04-07 7:49 ` Michael Haggerty
2012-04-07 7:51 ` Jeff King
2012-04-07 8:40 ` Andrew Sayers
2012-04-12 7:11 ` Jeff King
2012-04-12 15:04 ` Junio C Hamano
2012-04-12 21:16 ` Andrew Sayers
2012-04-12 21:33 ` Junio C Hamano
2012-04-12 22:11 ` Jeff King
2012-04-12 22:59 ` Philip Oakley
2012-04-13 19:31 ` Junio C Hamano
2012-04-17 20:13 ` Andrew Sayers
2012-04-08 4:43 ` Junio C Hamano
2012-04-11 16:17 ` Matthieu Moy
2012-04-11 16:44 ` Junio C Hamano
2012-04-12 7:55 ` Jeff King
2012-04-12 8:09 ` Matthieu Moy
2012-04-12 8:14 ` Jeff King
2012-04-12 8:59 ` Matthieu Moy
2012-04-12 15:56 ` Junio C Hamano
2012-04-19 16:06 ` Junio C Hamano
2012-04-19 20:38 ` Matthieu Moy
2012-04-19 21:02 ` Junio C Hamano
2012-04-19 22:57 ` [RFC/PATCH 0/3] push.default upcomming change Matthieu Moy
2012-04-19 22:57 ` [PATCH 1/3] push: introduce new push.default mode "simple" Matthieu Moy
2012-04-19 23:46 ` Jeff King
2012-04-20 14:52 ` Matthieu Moy
2012-04-20 14:59 ` [PATCH 0/4 v2] push.default upcomming change Matthieu Moy
2012-04-20 14:59 ` [PATCH 1/4] Documentation: explain push.default option a bit more Matthieu Moy
2012-04-20 20:13 ` Jeff King
2012-04-20 21:28 ` Junio C Hamano
2012-04-21 3:51 ` Michael Haggerty
2012-04-21 4:08 ` Junio C Hamano
2012-04-21 5:01 ` Michael Haggerty
2012-04-21 5:42 ` Junio C Hamano
2012-04-20 14:59 ` Matthieu Moy [this message]
2012-04-20 20:33 ` [PATCH 2/4] push: introduce new push.default mode "simple" Jeff King
2012-04-22 16:24 ` Zbigniew Jędrzejewski-Szmek
2012-04-20 21:42 ` Junio C Hamano
2012-04-23 8:38 ` Matthieu Moy
2012-04-20 14:59 ` [PATCH 3/4] t5570: use explicit push refspec Matthieu Moy
2012-04-20 14:59 ` [PATCH 4/4] push: start warning upcoming default change for push.default Matthieu Moy
2012-04-20 20:35 ` [PATCH 0/4 v2] push.default upcomming change Jeff King
2012-04-22 11:05 ` Matthieu Moy
2012-04-23 2:50 ` Junio C Hamano
2012-04-23 8:37 ` [PATCH 0/7 v3] " Matthieu Moy
2012-04-23 8:37 ` [PATCH 1/7] Documentation: explain push.default option a bit more Matthieu Moy
2012-04-23 15:20 ` Junio C Hamano
2012-04-23 19:00 ` Philip Oakley
2012-04-23 19:11 ` Junio C Hamano
2012-04-23 21:01 ` Philip Oakley
2012-04-23 8:37 ` [PATCH 2/7] Undocument deprecated alias 'push.default=tracking' Matthieu Moy
2012-04-23 15:21 ` Junio C Hamano
2013-01-31 17:10 ` Ævar Arnfjörð Bjarmason
2013-01-31 17:35 ` Junio C Hamano
2013-01-31 19:07 ` Jonathan Nieder
2013-01-31 19:11 ` Jonathan Nieder
2013-01-31 19:58 ` Junio C Hamano
2013-01-31 19:41 ` Junio C Hamano
2013-01-31 19:57 ` Jonathan Nieder
2013-01-31 20:01 ` Junio C Hamano
2013-01-31 20:11 ` Jonathan Nieder
2013-01-31 20:42 ` Junio C Hamano
2013-01-31 20:44 ` Junio C Hamano
2013-01-31 20:04 ` Jonathan Nieder
2013-01-31 20:08 ` Matthieu Moy
2013-01-31 20:21 ` Junio C Hamano
2013-01-31 20:50 ` Junio C Hamano
2013-01-31 21:00 ` Jonathan Nieder
2013-02-01 1:15 ` Junio C Hamano
2013-01-31 21:08 ` Jonathan Nieder
2013-01-31 20:41 ` Philip Oakley
2012-04-23 8:38 ` [PATCH 3/7] t5528-push-default.sh: add helper functions Matthieu Moy
2012-04-23 15:36 ` Junio C Hamano
2012-04-23 16:02 ` Matthieu Moy
2012-04-23 16:16 ` Junio C Hamano
2012-04-23 16:20 ` Matthieu Moy
2012-04-23 16:57 ` Matthieu Moy
2012-04-23 17:09 ` Junio C Hamano
2012-04-23 16:42 ` Junio C Hamano
2012-04-23 16:45 ` [PATCH 2/3] fixup! " Junio C Hamano
2012-04-23 16:48 ` [PATCH 3/3] push: suggested updates to push configuration documentation Junio C Hamano
2012-04-23 8:38 ` [PATCH 4/7] push: introduce new push.default mode "simple" Matthieu Moy
2012-04-23 10:32 ` Michael Haggerty
2012-04-23 11:20 ` Matthieu Moy
2012-04-23 15:52 ` Junio C Hamano
2012-04-23 16:09 ` Matthieu Moy
2012-04-23 8:38 ` [PATCH 5/7] t5570: use explicit push refspec Matthieu Moy
2012-04-23 8:38 ` [PATCH 6/7] push: document the future default change for push.default (matching -> simple) Matthieu Moy
2012-04-23 8:38 ` [PATCH 7/7] push: start warning upcoming default change for push.default Matthieu Moy
2012-04-24 7:49 ` [PATCH 0/7 v4] push.default upcomming change Matthieu Moy
2012-04-24 7:50 ` [PATCH 1/7] Documentation: explain push.default option a bit more Matthieu Moy
2012-04-24 7:50 ` [PATCH 2/7] Undocument deprecated alias 'push.default=tracking' Matthieu Moy
2012-04-24 7:50 ` [PATCH 3/7] t5528-push-default.sh: add helper functions Matthieu Moy
2012-04-24 7:50 ` [PATCH 4/7] push: introduce new push.default mode "simple" Matthieu Moy
2012-04-25 1:53 ` Junio C Hamano
2012-04-25 11:01 ` Matthieu Moy
2012-04-24 7:50 ` [PATCH 5/7] t5570: use explicit push refspec Matthieu Moy
2012-04-24 7:50 ` [PATCH 6/7] push: document the future default change for push.default (matching -> simple) Matthieu Moy
2012-04-24 7:50 ` [PATCH 7/7] push: start warning upcoming default change for push.default Matthieu Moy
2012-04-24 19:28 ` [PATCH 0/7 v4] push.default upcomming change Junio C Hamano
2012-04-19 22:57 ` [PATCH 2/3] t5570: use explicit push refspec Matthieu Moy
2012-04-19 22:57 ` [PATCH 3/3] push: start warning upcoming default change for push.default Matthieu Moy
2012-04-26 5:44 ` [PATCH] t5541: warning message is given even with --quiet Junio C Hamano
2012-04-26 6:31 ` Matthieu Moy
2012-04-11 2:08 ` [RFC/PATCH] Give better 'pull' advice when pushing non-ff updates to current branch Christopher Tiwald
2012-04-06 11:38 ` push.default: current vs upstream Dmitry Potapov
2012-04-06 13:36 ` demerphq
2012-04-06 18:03 ` Dmitry Potapov
2012-04-06 18:48 ` demerphq
2012-04-06 19:38 ` Dmitry Potapov
2012-03-30 23:07 ` Junio C Hamano
2012-04-03 20:59 ` Jeff King
2012-04-03 21:04 ` Jeff King
2012-04-03 22:29 ` Junio C Hamano
2012-04-03 23:23 ` Junio C Hamano
2012-04-05 12:45 ` Jeff King
2012-04-08 12:52 ` Felipe Contreras
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1334933944-13446-3-git-send-email-Matthieu.Moy@imag.fr \
--to=matthieu.moy@imag.fr \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=mhagger@alum.mit.edu \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).