From: Jay Soffian <jaysoffian@gmail.com>
To: git@vger.kernel.org
Cc: Jay Soffian <jaysoffian@gmail.com>
Subject: [PATCH/RFC] builtin-checkout: suggest creating local branch when appropriate to do so
Date: Mon, 5 Oct 2009 16:46:23 -0400 [thread overview]
Message-ID: <1254775583-49452-1-git-send-email-jaysoffian@gmail.com> (raw)
A user who has just cloned a remote repository and wishes to then work on a
branch other than master may not realize they first need to create the local
branch. e.g.:
$ git clone git://git.kernel.org/pub/scm/git/git.git
$ cd git
$ git checkout next
error: pathspec 'next' did not match any file(s) known to git.
This commit teaches git to make a suggestion to the user:
$ git clone git://git.kernel.org/pub/scm/git/git.git
$ cd git
$ git checkout next
error: pathspec 'next' did not match any file(s) known to git.
To create a local branch from the same named remote branch, use
git checkout -b next origin/next
Motivated by http://article.gmane.org/gmane.comp.version-control.git/129528
Signed-off-by: Jay Soffian <jaysoffian@gmail.com>
---
builtin-checkout.c | 43 +++++++++++++++++++++++++++++++++++++++++--
1 files changed, 41 insertions(+), 2 deletions(-)
I dunno, this seems like a lot of code just to make a suggestion to the
user. Is it worth it?
Also, I initially was going to use for_each_remote_ref and compare every
remote ref name to see if it tail matched what the user gave us, but it was
easier to use for_each_remote and build up the remote ref name and then check
for its existence. Not sure if either approach is preferable.
Thoughts/comments?
diff --git a/builtin-checkout.c b/builtin-checkout.c
index d050c37..7f2e215 100644
--- a/builtin-checkout.c
+++ b/builtin-checkout.c
@@ -145,6 +145,38 @@ static void fill_mm(const unsigned char *sha1, mmfile_t *mm)
mm->size = size;
}
+struct suggest_new_branch_name_data {
+ const char *name, *found;
+ int matches;
+};
+
+static int suggest_new_branch_name_compare(struct remote *remote, void *priv)
+{
+ struct suggest_new_branch_name_data *data = priv;
+ unsigned char sha1[20];
+ struct strbuf buf = STRBUF_INIT;
+ strbuf_addf(&buf, "refs/remotes/%s/%s", remote->name, data->name);
+ if (resolve_ref(buf.buf, sha1, 1, NULL)) {
+ data->matches++;
+ if (data->found)
+ strbuf_release(&buf);
+ else
+ data->found = strbuf_detach(&buf, NULL);
+ }
+ return 0;
+}
+
+static void suggest_new_branch_name(const char *name)
+{
+ struct suggest_new_branch_name_data data;
+ data.name = name;
+ data.found = NULL;
+ data.matches = 0;
+ for_each_remote(suggest_new_branch_name_compare, &data);
+ if (data.matches == 1)
+ fprintf(stderr, "To create a local branch from the same named remote branch, use\n git checkout -b %s %s\n", name, prettify_refname(data.found));
+}
+
static int checkout_merged(int pos, struct checkout *state)
{
struct cache_entry *ce = active_cache[pos];
@@ -231,8 +263,13 @@ static int checkout_paths(struct tree *source_tree, const char **pathspec,
match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, ps_matched);
}
- if (report_path_error(ps_matched, pathspec, 0))
+ if (report_path_error(ps_matched, pathspec, 0)) {
+ for (pos = 0; pathspec[pos]; pos++)
+ ;
+ if (pos == 1)
+ suggest_new_branch_name(pathspec[0]);
return 1;
+ }
/* Any unmerged paths? */
for (pos = 0; pos < active_nr; pos++) {
@@ -675,8 +712,10 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
arg = "@{-1}";
if (get_sha1(arg, rev)) {
- if (has_dash_dash) /* case (1) */
+ if (has_dash_dash) { /* case (1) */
+ suggest_new_branch_name(arg);
die("invalid reference: %s", arg);
+ }
goto no_reference; /* case (3 -> 2) */
}
--
1.6.4.2
next reply other threads:[~2009-10-05 20:57 UTC|newest]
Thread overview: 91+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-05 20:46 Jay Soffian [this message]
2009-10-05 21:03 ` [PATCH/RFC] builtin-checkout: suggest creating local branch when appropriate to do so Sverre Rabbelier
2009-10-05 21:17 ` Johannes Schindelin
2009-10-05 21:26 ` Sverre Rabbelier
2009-10-05 21:57 ` Jay Soffian
2009-10-05 22:00 ` Jay Soffian
2009-10-05 22:45 ` Johannes Schindelin
2009-10-05 22:56 ` Jeff King
2009-10-06 7:32 ` Thomas Rast
2009-10-06 9:16 ` Johannes Schindelin
2009-10-06 11:36 ` Junio C Hamano
2009-10-06 12:02 ` Johannes Schindelin
2009-10-06 20:09 ` Junio C Hamano
2009-10-06 9:12 ` Johannes Schindelin
2009-10-06 9:28 ` Matthieu Moy
2009-10-06 9:41 ` Mikael Magnusson
2009-10-06 10:04 ` Johannes Schindelin
[not found] ` <0016e68fd0123a175304754694b4@google.com>
2009-10-06 16:43 ` Eugene Sajine
2009-10-06 20:33 ` Junio C Hamano
2009-10-12 7:49 ` Johannes Schindelin
2009-10-12 18:36 ` Björn Steinbrink
2009-10-12 21:40 ` Thomas Rast
2009-10-12 22:49 ` Junio C Hamano
2009-10-13 6:36 ` Thomas Rast
2009-10-13 7:16 ` Junio C Hamano
2009-10-13 8:44 ` Junio C Hamano
2009-10-13 8:51 ` Thomas Rast
2009-10-13 9:24 ` Junio C Hamano
2009-10-13 21:20 ` Johannes Schindelin
2009-10-13 21:59 ` Junio C Hamano
2009-10-13 22:06 ` Jeff King
2009-10-13 23:22 ` Johannes Schindelin
2009-10-14 1:05 ` Jay Soffian
2009-10-14 3:28 ` Junio C Hamano
2009-10-14 12:49 ` Jay Soffian
2009-10-14 19:31 ` Junio C Hamano
2009-10-25 17:44 ` Uri Okrent
2009-10-14 4:31 ` Jeff King
2009-10-14 9:56 ` Thomas Rast
2009-10-14 10:46 ` Jakub Narebski
2009-10-13 9:32 ` Johannes Sixt
2009-10-13 18:39 ` Daniel Barkalow
2009-10-13 20:53 ` Junio C Hamano
2009-10-13 21:31 ` Daniel Barkalow
2009-10-13 21:57 ` Jeff King
2009-10-13 22:46 ` Junio C Hamano
2009-10-13 23:16 ` Johannes Schindelin
2009-10-14 9:33 ` Thomas Rast
2009-10-16 11:48 ` Johannes Schindelin
2009-10-16 12:07 ` Thomas Rast
2009-10-25 17:48 ` Uri Okrent
2009-10-26 7:14 ` Junio C Hamano
2009-10-13 22:38 ` Björn Steinbrink
2009-10-18 7:58 ` Junio C Hamano
2009-10-18 8:00 ` [PATCH 1/3] check_filename(): make verify_filename() callable without dying Junio C Hamano
2009-10-18 8:01 ` [PATCH 2/3] DWIM "git checkout frotz" to "git checkout -b frotz origin/frotz" Junio C Hamano
2009-10-18 10:34 ` Nanako Shiraishi
2009-10-18 12:00 ` Björn Steinbrink
2009-10-18 20:20 ` Nanako Shiraishi
2009-10-18 22:50 ` Junio C Hamano
2009-10-19 5:58 ` Björn Steinbrink
2009-10-18 8:01 ` [PATCH 3/3] git checkout --nodwim Junio C Hamano
2009-10-18 12:40 ` Alex Riesen
2009-10-18 19:53 ` Junio C Hamano
2009-10-18 21:02 ` [PATCH] Use "--no-" prefix to switch off some of checkout dwimmery Alex Riesen
2009-10-18 22:49 ` Junio C Hamano
2009-10-19 6:07 ` Alex Riesen
2009-10-19 6:12 ` Alex Riesen
2009-10-19 6:16 ` Junio C Hamano
2009-10-19 7:17 ` Alex Riesen
2009-10-19 7:25 ` Junio C Hamano
2009-10-21 17:29 ` [PATCH 3/3] git checkout --nodwim Avery Pennarun
2009-10-21 21:21 ` Nanako Shiraishi
2009-10-21 22:14 ` Junio C Hamano
2009-10-21 22:35 ` [PATCH] git checkout --no-guess Junio C Hamano
2009-10-21 22:51 ` Avery Pennarun
2009-10-26 18:17 ` Jay Soffian
2009-10-26 18:25 ` Avery Pennarun
2009-10-22 0:27 ` [PATCH 3/3] git checkout --nodwim Johannes Schindelin
2009-10-22 7:09 ` Erik Faye-Lund
2009-10-23 8:57 ` Michael J Gruber
2009-10-24 6:35 ` Junio C Hamano
2009-10-24 14:59 ` David Roundy
2009-10-24 19:25 ` Junio C Hamano
2009-10-26 20:12 ` Johannes Schindelin
2009-10-26 20:40 ` Avery Pennarun
2009-10-26 21:26 ` Jeff King
2009-10-26 22:01 ` Avery Pennarun
2009-10-26 22:14 ` Jeff King
2009-10-26 22:28 ` Avery Pennarun
2009-10-05 22:52 ` [PATCH/RFC] builtin-checkout: suggest creating local branch when appropriate to do so Jeff King
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=1254775583-49452-1-git-send-email-jaysoffian@gmail.com \
--to=jaysoffian@gmail.com \
--cc=git@vger.kernel.org \
/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).