Merge branches 'jc/sha1', 'jc/diff' and 'jc/ws'
authorJunio C Hamano <junkio@cox.net>
Sat, 4 Feb 2006 07:52:20 +0000 (23:52 -0800)
committerJunio C Hamano <junkio@cox.net>
Sat, 4 Feb 2006 07:52:20 +0000 (23:52 -0800)
* jc/sha1:
  get_sha1_1: allow octopus^12 to be properly parsed.

* jc/diff:
  combine-diff: finishing touches to git-diff-tree --cc

* jc/ws:
  whitespace cleanup.

apply.c
daemon.c
git-merge.sh
http-fetch.c
sha1_name.c

diff --git a/apply.c b/apply.c
index 79e23a7..2ad47fb 100644 (file)
--- a/apply.c
+++ b/apply.c
@@ -1564,24 +1564,6 @@ static void add_index_file(const char *path, unsigned mode, void *buf, unsigned
                die("unable to add cache entry for %s", path);
 }
 
-static void create_subdirectories(const char *path)
-{
-       int len = strlen(path);
-       char *buf = xmalloc(len + 1);
-       const char *slash = path;
-
-       while ((slash = strchr(slash+1, '/')) != NULL) {
-               len = slash - path;
-               memcpy(buf, path, len);
-               buf[len] = 0;
-               if (mkdir(buf, 0777) < 0) {
-                       if (errno != EEXIST)
-                               break;
-               }
-       }
-       free(buf);
-}
-
 static int try_create_file(const char *path, unsigned int mode, const char *buf, unsigned long size)
 {
        int fd;
@@ -1610,13 +1592,14 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf,
  * which is true 99% of the time anyway. If they don't,
  * we create them and try again.
  */
-static void create_one_file(const char *path, unsigned mode, const char *buf, unsigned long size)
+static void create_one_file(char *path, unsigned mode, const char *buf, unsigned long size)
 {
        if (!try_create_file(path, mode, buf, size))
                return;
 
        if (errno == ENOENT) {
-               create_subdirectories(path);
+               if (safe_create_leading_directories(path))
+                       return;
                if (!try_create_file(path, mode, buf, size))
                        return;
        }
@@ -1643,7 +1626,7 @@ static void create_one_file(const char *path, unsigned mode, const char *buf, un
 
 static void create_file(struct patch *patch)
 {
-       const char *path = patch->new_name;
+       char *path = patch->new_name;
        unsigned mode = patch->new_mode;
        unsigned long size = patch->resultsize;
        char *buf = patch->result;
index bb014fa..532bb0c 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -147,7 +147,7 @@ static char *path_ok(char *dir)
                static char rpath[PATH_MAX];
                if (*dir != '/') {
                        /* Forbid possible base-path evasion using ~paths. */
-                       logerror("'%s': Non-absolute path denied (base-path active)");
+                       logerror("'%s': Non-absolute path denied (base-path active)", dir);
                        return NULL;
                }
                snprintf(rpath, PATH_MAX, "%s%s", base_path, dir);
index 92e5a65..8c0a92c 100755 (executable)
@@ -293,7 +293,7 @@ for remote
 do
        echo $remote
 done >"$GIT_DIR/MERGE_HEAD"
-echo $merge_msg >"$GIT_DIR/MERGE_MSG"
+echo "$merge_msg" >"$GIT_DIR/MERGE_MSG"
 
 if test "$merge_was_ok" = t
 then
index 97ce13c..72edf28 100644 (file)
@@ -220,7 +220,6 @@ static void start_object_request(struct object_request *obj_req)
                free(obj_req->url);
                return;
        }
-       
 }
 
 static void finish_object_request(struct object_request *obj_req)
@@ -326,7 +325,7 @@ void fill_active_slots(void)
                        slot->curl = NULL;
                }
                slot = slot->next;
-       }                               
+       }
 }
 #endif
 
@@ -382,10 +381,10 @@ static int fetch_index(struct alt_base *repo, unsigned char *sha1)
 
        if (get_verbosely)
                fprintf(stderr, "Getting index for pack %s\n", hex);
-       
+
        url = xmalloc(strlen(repo->base) + 64);
        sprintf(url, "%s/objects/pack/pack-%s.idx", repo->base, hex);
-       
+
        filename = sha1_pack_index_name(sha1);
        snprintf(tmpfile, sizeof(tmpfile), "%s.temp", filename);
        indexfile = fopen(tmpfile, "a");
@@ -504,7 +503,7 @@ static void process_alternates_response(void *callback_data)
                        } else if (!memcmp(data + i, "../", 3)) {
                                i += 3;
                                serverlen = strlen(base);
-                               while (i + 2 < posn && 
+                               while (i + 2 < posn &&
                                       !memcmp(data + i, "../", 3)) {
                                        do {
                                                serverlen--;
@@ -513,7 +512,7 @@ static void process_alternates_response(void *callback_data)
                                        i += 3;
                                }
                                // If the server got removed, give up.
-                               okay = strchr(base, ':') - base + 3 < 
+                               okay = strchr(base, ':') - base + 3 <
                                        serverlen;
                        } else if (alt_req->http_specific) {
                                char *colon = strchr(data + i, ':');
@@ -531,7 +530,7 @@ static void process_alternates_response(void *callback_data)
                                        posn - i - 7);
                                target[serverlen + posn - i - 7] = '\0';
                                if (get_verbosely)
-                                       fprintf(stderr, 
+                                       fprintf(stderr,
                                                "Also look at %s\n", target);
                                newalt = xmalloc(sizeof(*newalt));
                                newalt->next = NULL;
@@ -580,7 +579,7 @@ static void fetch_alternates(char *base)
 
        if (get_verbosely)
                fprintf(stderr, "Getting alternates list for %s\n", base);
-       
+
        url = xmalloc(strlen(base) + 31);
        sprintf(url, "%s/objects/info/http-alternates", base);
 
@@ -630,7 +629,7 @@ static int fetch_indices(struct alt_base *repo)
 
        if (get_verbosely)
                fprintf(stderr, "Getting pack list for %s\n", repo->base);
-       
+
        url = xmalloc(strlen(repo->base) + 21);
        sprintf(url, "%s/objects/info/packs", repo->base);
 
@@ -844,7 +843,7 @@ int fetch(unsigned char *sha1)
                fetch_alternates(alt->base);
                altbase = altbase->next;
        }
-       return error("Unable to find %s under %s\n", sha1_to_hex(sha1), 
+       return error("Unable to find %s under %s\n", sha1_to_hex(sha1),
                     alt->base);
 }
 
@@ -905,7 +904,7 @@ int fetch_ref(char *ref, unsigned char *sha1)
         buffer.posn = 0;
         buffer.buffer = hex;
         hex[41] = '\0';
-        
+
        url = quote_ref_url(base, ref);
        slot = get_active_slot();
        slot->results = &results;
index ba0747c..fa85d8a 100644 (file)
@@ -388,43 +388,36 @@ static int peel_onion(const char *name, int len, unsigned char *sha1)
 
 static int get_sha1_1(const char *name, int len, unsigned char *sha1)
 {
-       int parent, ret;
+       int ret, has_suffix;
        const char *cp;
 
-       /* foo^[0-9] or foo^ (== foo^1); we do not do more than 9 parents. */
-       if (len > 2 && name[len-2] == '^' &&
-           name[len-1] >= '0' && name[len-1] <= '9') {
-               parent = name[len-1] - '0';
-               len -= 2;
-       }
-       else if (len > 1 && name[len-1] == '^') {
-               parent = 1;
-               len--;
-       } else
-               parent = -1;
-
-       if (parent >= 0)
-               return get_parent(name, len, sha1, parent);
-
        /* "name~3" is "name^^^",
-        * "name~12" is "name^^^^^^^^^^^^", and
         * "name~" and "name~0" are name -- not "name^0"!
+        * "name^" is not "name^0"; it is "name^1".
         */
-       parent = 0;
+       has_suffix = 0;
        for (cp = name + len - 1; name <= cp; cp--) {
                int ch = *cp;
                if ('0' <= ch && ch <= '9')
                        continue;
-               if (ch != '~')
-                       parent = -1;
+               if (ch == '~' || ch == '^')
+                       has_suffix = ch;
                break;
        }
-       if (!parent && *cp == '~') {
+
+       if (has_suffix) {
+               int num = 0;
                int len1 = cp - name;
                cp++;
                while (cp < name + len)
-                       parent = parent * 10 + *cp++ - '0';
-               return get_nth_ancestor(name, len1, sha1, parent);
+                       num = num * 10 + *cp++ - '0';
+               if (has_suffix == '^') {
+                       if (!num && len1 == len - 1)
+                               num = 1;
+                       return get_parent(name, len1, sha1, num);
+               }
+               /* else if (has_suffix == '~') -- goes without saying */
+               return get_nth_ancestor(name, len1, sha1, num);
        }
 
        ret = peel_onion(name, len, sha1);