On Mon, Feb 05, 2007 at 09:51:19PM -0800, Carl Worth wrote: > I can imagine the resolution rules are already fairly complicated, (I > don't even know what they all are already). But when there is no > ambiguity, and when the behavior would be backwards compatible to git > before separate-remotes, is there any reason this would be a bad idea? 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@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html