Re: [PATCH] (preview) Renaming push.

2005-08-04 Thread Junio C Hamano
Linus Torvalds <[EMAIL PROTECTED]> writes:

> Now, for extra bonus points, maybe you should make "git-rev-list" also 
> understand the "rev..rev" format (which you can't do with just the 
> get_sha1() interface, since it expands into more).

Hmph.  That makes sense.

What I set out to do when I started ripping extended_sha1 out of
rev-parse was actually something else.

Remember I was stupidly wondering why "git log master..gitk" did
not do what I wanted to?

The reason I started looking at git-rev-parse was because I
wanted to add "git log master...gitk" (three dots) which is
equivalent to "git log $(git-merge-base master gitk)..gitk".
That was what I wanted to have when I asked that stupid
question.

But unfortunately my GIT day this week is over, so the rest is
for the weekend.

-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] (preview) Renaming push.

2005-08-03 Thread Linus Torvalds


On Wed, 3 Aug 2005, Junio C Hamano wrote:
> 
> While I have not updated the send-pack : syntax, I
> added a horrible hack that some people may love to see.  This
> removes the need to use git-rev-parse from many commands.

Yes, I think this makes sense. We had three different sha1 parsers: 
get_sha1(), get_sha1_hex(), and get_extended_sha1().

None of the users of get_sha1() really have any reason to want the limited
form, so I think your patch does the right thing.

Now, for extra bonus points, maybe you should make "git-rev-list" also 
understand the "rev..rev" format (which you can't do with just the 
get_sha1() interface, since it expands into more).

Of course, most people don't tend to use git-rev-list directly, so maybe 
that's not a biggie, and so git-rev-parse is fine.

Linus
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] (preview) Renaming push.

2005-08-03 Thread Junio C Hamano
Linus Torvalds <[EMAIL PROTECTED]> writes:

> In this format, "src" makes sense as a generic sha1_name, and _not_ 
> necessarily limited to a ref-name.
>
> IOW, there's really no reason to not allow
>
>   git-send-pack .. dest .. :dst-ref
>
> where "" may be something else than a ref (but a ref obviously ends 
> up being one such thing).
>
> For example, let's say that I've got stuff at the HEAD of my tree that I'm
> not quite ready to push out yet, but I _do_ want to push out the parent of
> the current head. I'd love to be able to just do
>
>   git-send-pack parent $(git-rev-parse HEAD^):master
>
> and there's no real reason why that syntax shouldn't just work: it's 
> entirely logical to say "I want to push out the parent of my HEAD as 
> 'master' on the other end", and that's _exactly_ what the above says.

While I have not updated the send-pack : syntax, I
added a horrible hack that some people may love to see.  This
removes the need to use git-rev-parse from many commands.

This is a preview.  I've run the standard test suite and it does
not seem to break anything, but I expect it will stay in "pu"
for a while.


[PATCH] Update get_sha1() to grok extended format.

Everybody envies rev-parse, who is the only one that can grok
the extended sha1 format.  Move the get_extended_sha1() out of
rev-parse, rename it to get_sha1() and make it available to
everybody else.

Signed-off-by: Junio C Hamano <[EMAIL PROTECTED]>
---

 Makefile|3 +
 rev-parse.c |  188 +-
 sha1_file.c |   39 --
 sha1_name.c |  222 +++
 4 files changed, 229 insertions(+), 223 deletions(-)
 create mode 100644 sha1_name.c

99ef7de3e234347d2af1ab2129ce99c5876b591b
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -95,7 +95,8 @@ LIB_H=cache.h object.h blob.h tree.h com
pack.h pkt-line.h refs.h
 LIB_OBJS=read-cache.o sha1_file.o usage.o object.o commit.o tree.o blob.o \
 tag.o date.o index.o diff-delta.o patch-delta.o entry.o path.o \
-refs.o csum-file.o pack-check.o pkt-line.o connect.o ident.o
+refs.o csum-file.o pack-check.o pkt-line.o connect.o ident.o \
+sha1_name.o
 
 LIB_H += rev-cache.h
 LIB_OBJS += rev-cache.o
diff --git a/rev-parse.c b/rev-parse.c
--- a/rev-parse.c
+++ b/rev-parse.c
@@ -21,8 +21,6 @@ static int output_sq = 0;
 #define REVERSED 1
 static int show_type = NORMAL;
 
-static int get_extended_sha1(char *name, unsigned char *sha1);
-
 /*
  * Some arguments are relevant "revision" arguments,
  * others are about output format or other details.
@@ -107,182 +105,6 @@ static void show_arg(char *arg)
show_norev(arg);
 }
 
-static int get_parent(char *name, unsigned char *result, int idx)
-{
-   unsigned char sha1[20];
-   int ret = get_extended_sha1(name, sha1);
-   struct commit *commit;
-   struct commit_list *p;
-
-   if (ret)
-   return ret;
-   commit = lookup_commit_reference(sha1);
-   if (!commit)
-   return -1;
-   if (parse_commit(commit))
-   return -1;
-   if (!idx) {
-   memcpy(result, commit->object.sha1, 20);
-   return 0;
-   }
-   p = commit->parents;
-   while (p) {
-   if (!--idx) {
-   memcpy(result, p->item->object.sha1, 20);
-   return 0;
-   }
-   p = p->next;
-   }
-   return -1;
-}
-
-static int find_short_object_filename(int len, const char *name, unsigned char 
*sha1)
-{
-   static char dirname[PATH_MAX];
-   char hex[40];
-   DIR *dir;
-   int found;
-
-   snprintf(dirname, sizeof(dirname), "%s/%.2s", get_object_directory(), 
name);
-   dir = opendir(dirname);
-   sprintf(hex, "%.2s", name);
-   found = 0;
-   if (dir) {
-   struct dirent *de;
-   while ((de = readdir(dir)) != NULL) {
-   if (strlen(de->d_name) != 38)
-   continue;
-   if (memcmp(de->d_name, name + 2, len-2))
-   continue;
-   memcpy(hex + 2, de->d_name, 38);
-   if (++found > 1)
-   break;
-   }
-   closedir(dir);
-   }
-   if (found == 1)
-   return get_sha1_hex(hex, sha1) == 0;
-   return 0;
-}
-
-static int match_sha(unsigned len, const unsigned char *a, const unsigned char 
*b)
-{
-   do {
-   if (*a != *b)
-   return 0;
-   a++;
-   b++;
-   len -= 2;
-   } while (len > 1);
-   if (len)
-   if ((*a ^ *b) & 0xf0)
-   return 0;
-   return 1;
-}
-
-static int find_short_packed_object(int len, const unsigned char *match, 
unsigned char *sha1)
-{
-   s

Re: [PATCH] (preview) Renaming push.

2005-08-03 Thread Junio C Hamano
Well, I pushed it out, although I do agree that we should be
able to give anything get_sha()-able on the source side of the
push.  Probably a revised version should have the following
semantics:

$ git-send-pack [--all]  [...]

 - When no  is specified:

   - with '--all', it is the same as specifying the full refs/*
 path for all local refs;

   - without '--all', it is the same as specifying the full
 refs/* path for refs that exist on both ends;

 - When one or more s are specified:

   - a single token  (i.e. no colon) must be a pattern that
 tail-matches refs/* path for an existing local ref.  It is
 an error for the pattern to match no local ref, or more
 than one local refs.  The matching ref is pushed to the
 remote end under the same name.

   - : can have different cases.   is first tried
 as the tail-matching pattern for refs/* path.

 - If more than one matches are found, it is an error.

 - If one match is found,  must either match no remote
   ref and start with "refs/", or match exactly one remote
   ref.  That remote ref is updated with the sha1 value
   obtained by the  sha1.

 - If no match is found, it is given to get_extended_sha1();
   it is an error if get_extended_sha1() does not find an
   object name.  If it succeeds,  must either match
   no remote ref and start with "refs/" or match exactly
   one remote ref.  That remote ref is updated with the sha1
   value.

-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] (preview) Renaming push.

2005-08-03 Thread Linus Torvalds


On Wed, 3 Aug 2005, Junio C Hamano wrote:
>
> > git-send-pack parent $(git-rev-parse HEAD^):master
> 
> When I do something like your example, I create a temporary
> lightweight tag and push it.  Snapshots in JIT are just a bunch
> of lightweight tags so..

I like the scripting, and combining pipelines of commands kind of thing. 

I agree that you can just make a temporary tag, but it's a bit like in any
scripting stuff - you could use a temp-file, but it's just cleaner if you
can keep temporary values in local variables (or in a local cmd pipeline
like the above).

Whenever you script somethign that creates a new tag or ref, you suddenly 
have cleanup and uniqueness issues etc. 

Linus
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] (preview) Renaming push.

2005-08-03 Thread Junio C Hamano
Linus Torvalds <[EMAIL PROTECTED]> writes:

>   git-send-pack parent $(git-rev-parse HEAD^):master
>
> and there's no real reason why that syntax shouldn't just work: it's 
> entirely logical to say "I want to push out the parent of my HEAD as 
> 'master' on the other end", and that's _exactly_ what the above says.

Yes I think allowing get_sha()-able thing on the left hand side
makes things, well, interesting.  I need to think about it a bit.

When I do something like your example, I create a temporary
lightweight tag and push it.  Snapshots in JIT are just a bunch
of lightweight tags so..


-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] (preview) Renaming push.

2005-08-03 Thread Linus Torvalds


On Wed, 3 Aug 2005, Junio C Hamano wrote:
>
> This allows git-send-pack to push local refs to a destination
> repository under different names.

Looks good, except I was almost hoping for one modification:

> Here is the name mapping rules for refs.
> 
> * If there is no ref mapping on the command line:
> 
>  - if '--all' is specified, it is equivalent to specifying
> ":"  for all the existing local refs on the
>command line
>  - otherwise, it is equivalent to specifying  ":"  for
>all the refs that exist on both sides.
> 
> *  is just a shorthand for  ":" 
> 
> *  ":" 
> 
>   push ref that matches  to ref that matches .

In this format, "src" makes sense as a generic sha1_name, and _not_ 
necessarily limited to a ref-name.

IOW, there's really no reason to not allow

git-send-pack .. dest .. :dst-ref

where "" may be something else than a ref (but a ref obviously ends 
up being one such thing).

For example, let's say that I've got stuff at the HEAD of my tree that I'm
not quite ready to push out yet, but I _do_ want to push out the parent of
the current head. I'd love to be able to just do

git-send-pack parent $(git-rev-parse HEAD^):master

and there's no real reason why that syntax shouldn't just work: it's 
entirely logical to say "I want to push out the parent of my HEAD as 
'master' on the other end", and that's _exactly_ what the above says.

So:

>   - It is an error if  does not match exactly one of local
> refs.

I think "src" should just be seen as any random SHA1 name, and we should 
use "get_sha()" to convert it to a SHA1.

In contrast, "dst" is obviously a real ref name, and as such:

>   - It is an error if  matches more than one remote refs.

makes sense.

That makes your next rule a bit iffy, though:

>   - If  does not match any remote refs, either
> 
> - it has to start with "refs/";  is used as the
>   destination literally in this case.
> 
> -  ==  and the ref that matched the  must not
>   exist in the set of remote refs; the ref matched 
>   locally is used as the name of the destination.

since "src" from a local standpoint isn't really a ref-name at all.

But hey, your current patch looks fine already. It doesn't _quite_ do what 
I had in mind, but it gets very very close.

Linus
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html