cache_name_compare(): do not truncate while comparing paths
[gitweb.git] / read-cache.c
index 79938bf09a7e5c12de90af4cd81be0fdf755113a..0cd13aabb96bd0733040f464733579713c963bd1 100644 (file)
@@ -26,7 +26,7 @@ static struct cache_entry *refresh_cache_entry(struct cache_entry *ce, int reall
 
 #define CACHE_EXT(s) ( (s[0]<<24)|(s[1]<<16)|(s[2]<<8)|(s[3]) )
 #define CACHE_EXT_TREE 0x54524545      /* "TREE" */
-#define CACHE_EXT_RESOLVE_UNDO 0x52455543 /* "REUN" */
+#define CACHE_EXT_RESOLVE_UNDO 0x52455543 /* "REUC" */
 
 struct index_state the_index;
 
@@ -405,10 +405,15 @@ int df_name_compare(const char *name1, int len1, int mode1,
 
 int cache_name_compare(const char *name1, int flags1, const char *name2, int flags2)
 {
-       int len1 = flags1 & CE_NAMEMASK;
-       int len2 = flags2 & CE_NAMEMASK;
-       int len = len1 < len2 ? len1 : len2;
-       int cmp;
+       int len1, len2, len, cmp;
+
+       len1 = flags1 & CE_NAMEMASK;
+       if (CE_NAMEMASK <= len1)
+               len1 = strlen(name1 + CE_NAMEMASK) + CE_NAMEMASK;
+       len2 = flags2 & CE_NAMEMASK;
+       if (CE_NAMEMASK <= len2)
+               len2 = strlen(name2 + CE_NAMEMASK) + CE_NAMEMASK;
+       len = len1 < len2 ? len1 : len2;
 
        cmp = memcmp(name1, name2, len);
        if (cmp)
@@ -612,7 +617,8 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
        if (alias && !ce_stage(alias) && !ie_match_stat(istate, alias, st, ce_option)) {
                /* Nothing changed, really */
                free(ce);
-               ce_mark_uptodate(alias);
+               if (!S_ISGITLINK(alias->ce_mode))
+                       ce_mark_uptodate(alias);
                alias->ce_flags |= CE_ADDED;
                return 0;
        }
@@ -1050,7 +1056,8 @@ static struct cache_entry *refresh_cache_ent(struct index_state *istate,
                         * because CE_UPTODATE flag is in-core only;
                         * we are not going to write this change out.
                         */
-                       ce_mark_uptodate(ce);
+                       if (!S_ISGITLINK(ce->ce_mode))
+                               ce_mark_uptodate(ce);
                        return ce;
                }
        }