From: Linus Torvalds Date: Sun, 01 May 2005 20:46:37 GMT Subject: Re: Complete http-pull; where should it go? Message-ID: In-Reply-To: On Sun, 1 May 2005, Daniel Barkalow wrote: > > Right; what I want to make programs able to do is take explicit > references, instead of only taking the objects they reference. So you > say heads/master or heads/linus instead of > "198b0fb635ed8a007bac0c16eab112c5e2c7995c". That's fine. This is really just an issue of havign a function that does "get_sha1()", and then making the things that take command line arguments use that one instead of "get_sha1_hex()". Then you can have rules like: - if it's a hex number, take it - if it's a filename, look it up - if ".git/refs + str is a filename, look it up. Something like int get_sha1(char *str, unsigned char *result) { static char pathname[PATH_MAX]; if (get_sha1_hex(str, result) == 0) return 0; if (get_sha1_file(str, result) == 0) return 0; snprintf(pathname, sizeof(pathname), ".git/refs/%s", str); if (get_sha1_file(pathname, result) == 0) return 0; ... } where you have int get_sha1_file(char *path, unsigned char *result) { char buffer[60]; int fd = open(path, O_RDONLY); int len; if (fd < 0) return -1; len = read(fd, buffer, sizeof(buffer)); close(fd); if (len < 40) return -1; return get_sha1_hex(buffer, result); } or whatever. The _only_ thing I want to be careful about is that all the _internal_ stuff still have to use the strict "get_sha1_hex()" function, ie we should never _ever_ accept a tree object where the "sha1" ends up being anything but the hex thing. So this "generalized get_sha1()" would have to be used only on real user input (ie argv[] array and the like). Linus