git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 1/2] help: add help_unknown_ref

From
Vikrant Varma <vikrant.varma94@gmail.com>
Date
May 1, 2013, 11:22 UTC
Message-ID
<1367407327-5216-2-git-send-email-vikrant.varma94@gmail.com>
In-Reply-To
<1367407327-5216-1-git-send-email-vikrant.varma94@gmail.com>

Give better advice when trying to merge a branch that doesn't exist. If the branch exists in any remotes, display a list of suggestions.

Example:
	$ git merge foo
	fatal: foo - not something we can merge
	Did you mean this?
	    bar/foo
Signed-off-by: Vikrant Varma <vikrant.varma94@gmail.com>
---
 help.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
 help.h |  6 ++++++
 2 files changed, 50 insertions(+)
diff --git a/help.c b/help.c
index 02ba043..faf18b9 100644
--- a/help.c
+++ b/help.c
@@ -7,6 +7,7 @@
 #include "string-list.h"
 #include "column.h"
 #include "version.h"
+#include "refs.h"
 
 void add_cmdname(struct cmdnames *cmds, const char *name, int len)
 {
@@ -404,3 +405,46 @@ int cmd_version(int argc, const char **argv, const char *prefix)
 	printf("git version %s\n", git_version_string);
 	return 0;
 }
+
+struct similar_ref_cb {
+        const char *base_ref;
+        struct string_list similar_refs;
+};
+
+static int append_similar_ref(const char* refname, const unsigned char *sha1, int flags, void *cb_data)
+{
+        int i;
+        struct similar_ref_cb *cb = (struct similar_ref_cb *)(cb_data);
+        for (i = strlen(refname); refname[i] != '/'; i--)
+	        ;
+        /* A remote branch of the same name is deemed similar */
+        if (!prefixcmp(refname, "refs/remotes/") && !strcmp(refname + i + 1, cb->base_ref))
+	       	string_list_append(&(cb->similar_refs), refname + 13);
+        return 0;
+}
+
+void help_unknown_ref(const char* ref) {
+        int i;
+        struct similar_ref_cb ref_cb;
+        ref_cb.similar_refs = (struct string_list)STRING_LIST_INIT_NODUP;
+        ref_cb.base_ref = ref;
+
+        for_each_ref(append_similar_ref, &ref_cb);
+
+        fprintf_ln(stderr, _("fatal: %s - not something we can merge"), ref);
+
+        if (ref_cb.similar_refs.nr > 0) {
+	        fprintf_ln(stderr,
+		           Q_("\nDid you mean this?",
+		              "\nDid you mean one of these?",
+		              ref_cb.similar_refs.nr));
+
+	        for (i = 0; i < ref_cb.similar_refs.nr; i++)
+		        fprintf(stderr, "\t%s\n", ref_cb.similar_refs.items[i].string);
+        }
+        exit(1);
+}
+	
+			
+
+
diff --git a/help.h b/help.h
index 0ae5a12..613cb45 100644
--- a/help.h
+++ b/help.h
@@ -27,4 +27,10 @@ extern void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes);
 extern int is_in_cmdlist(struct cmdnames *cmds, const char *name);
 extern void list_commands(unsigned int colopts, struct cmdnames *main_cmds, struct cmdnames *other_cmds);
 
+/* 
+ * ref is not something that can be merged. Print a list of remote branches of the
+ * same name that the user might have meant. 
+ */
+extern void help_unknown_ref(const char* ref);
+
 #endif /* HELP_H */
-- 
1.8.3-rc0
Previous: Vikrant VarmaNext: Ramkumar Ramachandra
Message 2 of 16 in “Better advice on merge”
  1. 0/2 Better advice on mergeVikrant Varma, May 1, 2013
  2. 1/2 help: add help_unknown_refVikrant Varma, May 1, 2013
  3. Ramkumar RamachandraMay 1, 2013
  4. Matthieu MoyMay 1, 2013
  5. Vikrant VarmaMay 1, 2013
  6. Johannes SixtMay 1, 2013
  7. Ramkumar RamachandraMay 1, 2013
  8. Vikrant VarmaMay 1, 2013
  9. Junio C HamanoMay 1, 2013
  10. Junio C HamanoMay 1, 2013
  11. Vikrant VarmaMay 1, 2013
  12. Junio C HamanoMay 1, 2013
  13. 2/2 merge: use help_unknown_ref instead of dieVikrant Varma, May 1, 2013
  14. Junio C HamanoMay 1, 2013
  15. Jonathan NiederMay 1, 2013
  16. Vikrant VarmaMay 1, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.