Merge 'fixes' branch.
authorJunio C Hamano <junkio@cox.net>
Sat, 24 Sep 2005 01:46:34 +0000 (18:46 -0700)
committerJunio C Hamano <junkio@cox.net>
Sat, 24 Sep 2005 01:46:34 +0000 (18:46 -0700)
Signed-off-by: Junio C Hamano <junkio@cox.net>
.gitignore
Documentation/git-diff-tree.txt
compat/subprocess.py
fetch.c
local-fetch.c
rsh.c

index e8ae8c3..cc70c6c 100644 (file)
@@ -93,3 +93,7 @@ git-verify-pack
 git-verify-tag
 git-whatchanged
 git-write-tree
+#*.tar.gz
+#*.dsc
+#*.deb
+#git-core.spec
index 5aa4adc..7f18bbf 100644 (file)
@@ -9,12 +9,15 @@ git-diff-tree - Compares the content and mode of blobs found via two tree object
 
 SYNOPSIS
 --------
-'git-diff-tree' [--stdin] [-m] [-s] [-v] [--pretty] [-t] [<common diff options>] <tree-ish> <tree-ish> [<path>...]
+'git-diff-tree' [--stdin] [-m] [-s] [-v] [--pretty] [-t] [<common diff options>] <tree-ish> [<tree-ish>] [<path>...]
 
 DESCRIPTION
 -----------
 Compares the content and mode of the blobs found via two tree objects.
 
+If there is only one <tree-ish> given, the commit is compared with its parents
+(see --stdin below).
+
 Note that "git-diff-tree" can use the tree encapsulated in a commit object.
 
 OPTIONS
index 93323df..bbd26c7 100644 (file)
@@ -2,31 +2,12 @@
 #
 # For more information about this module, see PEP 324.
 #
-# Copyright (c) 2003-2004 by Peter Astrand <astrand@lysator.liu.se>
+# This module should remain compatible with Python 2.2, see PEP 291.
 #
-# By obtaining, using, and/or copying this software and/or its
-# associated documentation, you agree that you have read, understood,
-# and will comply with the following terms and conditions:
-#
-# Permission to use, copy, modify, and distribute this software and
-# its associated documentation for any purpose and without fee is
-# hereby granted, provided that the above copyright notice appears in
-# all copies, and that both that copyright notice and this permission
-# notice appear in supporting documentation, and that the name of the
-# author not be used in advertising or publicity pertaining to
-# distribution of the software without specific, written prior
-# permission.
-#
-# THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
-# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
-# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
-# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-#
-# Use of this file within git is permitted under GPLv2.
+# Copyright (c) 2003-2005 by Peter Astrand <astrand@lysator.liu.se>
 #
+# Licensed to PSF under a Contributor Agreement.
+# See http://www.python.org/2.4/license for licensing details.
 
 r"""subprocess - Subprocesses with accessible I/O streams
 
diff --git a/fetch.c b/fetch.c
index e6fd624..1a33ae9 100644 (file)
--- a/fetch.c
+++ b/fetch.c
@@ -48,6 +48,7 @@ static int process_tree(struct tree *tree)
                struct tree_entry_list *next = entry->next;
                if (process(entry->item.any))
                        return -1;
+               free(entry->name);
                free(entry);
                entry = next;
        }
@@ -206,6 +207,7 @@ int pull(char *target)
        int fd = -1;
 
        save_commit_buffer = 0;
+       track_object_refs = 0;
        if (write_ref && current_ref) {
                fd = lock_ref_sha1(write_ref, current_ref);
                if (fd < 0)
index 8176532..0dbed89 100644 (file)
@@ -38,6 +38,8 @@ static int setup_indices(void)
        unsigned char sha1[20];
        sprintf(filename, "%s/objects/pack/", path);
        dir = opendir(filename);
+       if (!dir)
+               return -1;
        while ((de = readdir(dir)) != NULL) {
                int namelen = strlen(de->d_name);
                if (namelen != 50 || 
@@ -46,10 +48,12 @@ static int setup_indices(void)
                get_sha1_hex(de->d_name + 5, sha1);
                setup_index(sha1);
        }
+       closedir(dir);
        return 0;
 }
 
-static int copy_file(const char *source, const char *dest, const char *hex)
+static int copy_file(const char *source, const char *dest, const char *hex,
+                    int warn_if_not_exists)
 {
        if (use_link) {
                if (!link(source, dest)) {
@@ -58,13 +62,24 @@ static int copy_file(const char *source, const char *dest, const char *hex)
                }
                /* If we got ENOENT there is no point continuing. */
                if (errno == ENOENT) {
-                       fprintf(stderr, "does not exist %s\n", source);
+                       if (warn_if_not_exists)
+                               fprintf(stderr, "does not exist %s\n", source);
                        return -1;
                }
        }
-       if (use_symlink && !symlink(source, dest)) {
-               pull_say("symlink %s\n", hex);
-               return 0;
+       if (use_symlink) {
+               struct stat st;
+               if (stat(source, &st)) {
+                       if (!warn_if_not_exists && errno == ENOENT)
+                               return -1;
+                       fprintf(stderr, "cannot stat %s: %s\n", source,
+                               strerror(errno));
+                       return -1;
+               }
+               if (!symlink(source, dest)) {
+                       pull_say("symlink %s\n", hex);
+                       return 0;
+               }
        }
        if (use_filecopy) {
                int ifd, ofd, status;
@@ -72,7 +87,11 @@ static int copy_file(const char *source, const char *dest, const char *hex)
                void *map;
                ifd = open(source, O_RDONLY);
                if (ifd < 0 || fstat(ifd, &st) < 0) {
-                       close(ifd);
+                       int err = errno;
+                       if (ifd >= 0)
+                               close(ifd);
+                       if (!warn_if_not_exists && err == ENOENT)
+                               return -1;
                        fprintf(stderr, "cannot open %s\n", source);
                        return -1;
                }
@@ -86,7 +105,8 @@ static int copy_file(const char *source, const char *dest, const char *hex)
                status = ((ofd < 0) ||
                          (write(ofd, map, st.st_size) != st.st_size));
                munmap(map, st.st_size);
-               close(ofd);
+               if (ofd >= 0)
+                       close(ofd);
                if (status)
                        fprintf(stderr, "cannot write %s\n", dest);
                else
@@ -116,11 +136,11 @@ static int fetch_pack(const unsigned char *sha1)
        sprintf(filename, "%s/objects/pack/pack-%s.pack", 
                path, sha1_to_hex(target->sha1));
        copy_file(filename, sha1_pack_name(target->sha1),
-                 sha1_to_hex(target->sha1));
+                 sha1_to_hex(target->sha1), 1);
        sprintf(filename, "%s/objects/pack/pack-%s.idx", 
                path, sha1_to_hex(target->sha1));
        copy_file(filename, sha1_pack_index_name(target->sha1),
-                 sha1_to_hex(target->sha1));
+                 sha1_to_hex(target->sha1), 1);
        install_packed_git(target);
        return 0;
 }
@@ -141,7 +161,7 @@ static int fetch_file(const unsigned char *sha1)
        filename[object_name_start+1] = hex[1];
        filename[object_name_start+2] = '/';
        strcpy(filename + object_name_start + 3, hex + 2);
-       return copy_file(filename, dest_filename, hex);
+       return copy_file(filename, dest_filename, hex, 0);
 }
 
 int fetch(unsigned char *sha1)
diff --git a/rsh.c b/rsh.c
index 1c63686..bad5cff 100644 (file)
--- a/rsh.c
+++ b/rsh.c
@@ -53,6 +53,7 @@ static int add_to_string(char **ptrp, int *sizep, const char *str, int quote)
        char *p = *ptrp;
        int size = *sizep;
        int oc;
+       int err = 0;
 
        if ( quote ) {
                oc = shell_quote(p, size, str);
@@ -62,15 +63,14 @@ static int add_to_string(char **ptrp, int *sizep, const char *str, int quote)
        }
 
        if ( oc >= size ) {
-               p[size-1] = '\0';
-               *ptrp += size-1;
-               *sizep = 1;
-               return 1;       /* Overflow, string unusable */
+               err = 1;
+               oc = size-1;
        }
 
        *ptrp  += oc;
+       **ptrp  = '\0';
        *sizep -= oc;
-       return 0;
+       return err;
 }
 
 int setup_connection(int *fd_in, int *fd_out, const char *remote_prog,