On Mon, Feb 05, 2007 at 09:51:19PM -0800, Carl Worth wrote:
I'm not convinced that the complication is a good idea. However, if you
would like to play with it, a patch is below (it depends on my 'add
utility functions for enumerating remotes' patch, which I just posted).
-- >8 --
sha1_name: match refs in 'refs/remotes/*/%s'
If no other matches are found for a ref, then look for it in every defined
remote. This will not complain of ambiguity, since we only do the lookup if
no other ref matches.
---
sha1_name.c | 37 +++++++++++++++++++++++++++++++++++++
1 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/sha1_name.c b/sha1_name.c
index d77f770..d9fe107 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -5,6 +5,7 @@
#include "blob.h"
#include "tree-walk.h"
#include "refs.h"
+#include "remotes.h"
static int find_short_object_filename(int len, const char *name, unsigned char *sha1)
{
@@ -235,6 +236,30 @@ static int ambiguous_path(const char *path, int len)
return slash;
}
+struct match_ref_in_remote_data {
+ const char *ref;
+ int ref_len;
+ int count;
+ unsigned char *sha1;
+ char *resolved;
+};
+static int match_ref_in_remote(const char *remote, void *data)
+{
+ struct match_ref_in_remote_data *md = data;
+ unsigned char sha1_from_ref[20];
+ const char *r;
+
+ r = resolve_ref(
+ mkpath("refs/remotes/%s/%.*s", remote, md->ref_len, md->ref),
+ md->count ? sha1_from_ref : md->sha1,
+ 1, NULL);
+ if (r) {
+ if (!md->count++)
+ md->resolved = xstrdup(r);
+ }
+ return 0;
+}
+
static const char *ref_fmt[] = {
"%.*s",
"refs/%.*s",
@@ -264,6 +289,18 @@ int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref)
break;
}
}
+
+ if (!refs_found) {
+ struct match_ref_in_remote_data md;
+ md.ref = str;
+ md.ref_len = len;
+ md.count = 0;
+ md.sha1 = sha1;
+ for_each_remote(match_ref_in_remote, &md);
+ refs_found = md.count;
+ *ref = md.resolved;
+ }
+
return refs_found;
}
--
1.5.0.rc3.554.ga40e-dirty
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html