aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-15 22:51:44 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-15 22:51:44 -0700
commit95fd5bf82ae28da47dcbf8e6e4570e64d71dc532 (patch)
tree192f84588c8e47a2d8ca3d0c6e50641b7a2491b8
parentc347ea5d6fc6bae6b6ea3196013c4df7ec4406a8 (diff)
downloadgit-95fd5bf82ae28da47dcbf8e6e4570e64d71dc532.tar.gz
git-95fd5bf82ae28da47dcbf8e6e4570e64d71dc532.tar.xz
Make cache entry comparison take the new "state" flag into account.
This is what allows us to have multiple states of the same file in the index, and what makes it always sort correctly.
-rw-r--r--cache.h7
-rw-r--r--read-cache.c12
2 files changed, 13 insertions, 6 deletions
diff --git a/cache.h b/cache.h
index bce48b00d..cc8f686b6 100644
--- a/cache.h
+++ b/cache.h
@@ -63,9 +63,10 @@ struct cache_entry {
char name[0];
};
-#define CE_NAMEMASK (0x0fff)
-#define CE_STAGE1 (0x1000)
-#define CE_STAGE2 (0x2000)
+#define CE_NAMEMASK (0x0fff)
+#define CE_STAGEMASK (0x3000)
+
+#define create_ce_flags(len, stage) ((len) | ((stage) << 12))
const char *sha1_file_directory;
struct cache_entry **active_cache;
diff --git a/read-cache.c b/read-cache.c
index 4173b4e45..acc6e236d 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -313,8 +313,10 @@ int cache_match_stat(struct cache_entry *ce, struct stat *st)
return changed;
}
-int cache_name_compare(const char *name1, int len1, const char *name2, int len2)
+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;
@@ -325,6 +327,10 @@ int cache_name_compare(const char *name1, int len1, const char *name2, int len2)
return -1;
if (len1 > len2)
return 1;
+ if (flags1 < flags2)
+ return -1;
+ if (flags1 > flags2)
+ return 1;
return 0;
}
@@ -337,7 +343,7 @@ int cache_name_pos(const char *name, int namelen)
while (last > first) {
int next = (last + first) >> 1;
struct cache_entry *ce = active_cache[next];
- int cmp = cache_name_compare(name, namelen, ce->name, ce_namelen(ce));
+ int cmp = cache_name_compare(name, namelen, ce->name, htons(ce->ce_flags));
if (!cmp)
return next;
if (cmp < 0) {
@@ -364,7 +370,7 @@ int add_cache_entry(struct cache_entry *ce, int ok_to_add)
{
int pos;
- pos = cache_name_pos(ce->name, ce_namelen(ce));
+ pos = cache_name_pos(ce->name, htons(ce->ce_flags));
/* existing match? Just replace it */
if (pos >= 0) {