fast-import: prevent producing bad delta
[gitweb.git] / sha1_name.c
index 709ff2eee64cf106191ad274bede82a95d00e2a3..ff5992acc971ac5a67fa3d4def1e0c064b90519f 100644 (file)
@@ -208,9 +208,7 @@ const char *find_unique_abbrev(const unsigned char *sha1, int len)
                if (exists
                    ? !status
                    : status == SHORT_NAME_NOT_FOUND) {
-                       int cut_at = len + unique_abbrev_extra_length;
-                       cut_at = (cut_at < 40) ? cut_at : 40;
-                       hex[cut_at] = 0;
+                       hex[len] = 0;
                        return hex;
                }
                len++;
@@ -1014,11 +1012,13 @@ static void diagnose_invalid_sha1_path(const char *prefix,
                if (!get_tree_entry(tree_sha1, fullname,
                                    sha1, &mode)) {
                        die("Path '%s' exists, but not '%s'.\n"
-                           "Did you mean '%s:%s'?",
+                           "Did you mean '%s:%s' aka '%s:./%s'?",
                            fullname,
                            filename,
                            object_name,
-                           fullname);
+                           fullname,
+                           object_name,
+                           filename);
                }
                die("Path '%s' does not exist in '%s'",
                    filename, object_name);
@@ -1067,9 +1067,10 @@ static void diagnose_invalid_index_path(int stage,
                if (ce_namelen(ce) == fullnamelen &&
                    !memcmp(ce->name, fullname, fullnamelen))
                        die("Path '%s' is in the index, but not '%s'.\n"
-                           "Did you mean ':%d:%s'?",
+                           "Did you mean ':%d:%s' aka ':%d:./%s'?",
                            fullname, filename,
-                           ce_stage(ce), fullname);
+                           ce_stage(ce), fullname,
+                           ce_stage(ce), filename);
        }
 
        if (!lstat(filename, &st))
@@ -1082,11 +1083,12 @@ static void diagnose_invalid_index_path(int stage,
 }
 
 
-int get_sha1_with_mode_1(const char *name, unsigned char *sha1, unsigned *mode, int gently, const char *prefix)
+int get_sha1_with_mode_1(const char *name, unsigned char *sha1, unsigned *mode,
+                        int only_to_die, const char *prefix)
 {
        struct object_context oc;
        int ret;
-       ret = get_sha1_with_context_1(name, sha1, &oc, gently, prefix);
+       ret = get_sha1_with_context_1(name, sha1, &oc, only_to_die, prefix);
        *mode = oc.mode;
        return ret;
 }
@@ -1110,7 +1112,7 @@ static char *resolve_relative_path(const char *rel)
 
 int get_sha1_with_context_1(const char *name, unsigned char *sha1,
                            struct object_context *oc,
-                           int gently, const char *prefix)
+                           int only_to_die, const char *prefix)
 {
        int ret, bracket_depth;
        int namelen = strlen(name);
@@ -1132,7 +1134,7 @@ int get_sha1_with_context_1(const char *name, unsigned char *sha1,
                struct cache_entry *ce;
                char *new_path = NULL;
                int pos;
-               if (namelen > 2 && name[1] == '/') {
+               if (!only_to_die && namelen > 2 && name[1] == '/') {
                        struct commit_list *list = NULL;
                        for_each_ref(handle_one_ref, &list);
                        return get_sha1_oneline(name + 2, sha1, list);
@@ -1175,7 +1177,7 @@ int get_sha1_with_context_1(const char *name, unsigned char *sha1,
                        }
                        pos++;
                }
-               if (!gently)
+               if (only_to_die && name[1] && name[1] != '/')
                        diagnose_invalid_index_path(stage, prefix, cp);
                free(new_path);
                return -1;
@@ -1191,7 +1193,7 @@ int get_sha1_with_context_1(const char *name, unsigned char *sha1,
        if (*cp == ':') {
                unsigned char tree_sha1[20];
                char *object_name = NULL;
-               if (!gently) {
+               if (only_to_die) {
                        object_name = xmalloc(cp-name+1);
                        strncpy(object_name, name, cp-name);
                        object_name[cp-name] = '\0';
@@ -1204,7 +1206,7 @@ int get_sha1_with_context_1(const char *name, unsigned char *sha1,
                        if (new_filename)
                                filename = new_filename;
                        ret = get_tree_entry(tree_sha1, filename, sha1, &oc->mode);
-                       if (!gently) {
+                       if (only_to_die) {
                                diagnose_invalid_sha1_path(prefix, filename,
                                                           tree_sha1, object_name);
                                free(object_name);
@@ -1217,7 +1219,7 @@ int get_sha1_with_context_1(const char *name, unsigned char *sha1,
                        free(new_filename);
                        return ret;
                } else {
-                       if (!gently)
+                       if (only_to_die)
                                die("Invalid object name '%s'.", object_name);
                }
        }