@matheusbsbs / matheus-bagliano / commits / f49c2c22fe
Fork 0

racy-git: an empty blob has a fixed object name

We use size=0 as the magic token to say the entry is known to be racily clean, but a sequence that does: - update the path with a non-empty blob and write the index; - update an unrelated path and write the index -- this smudges the above entry; - truncate the path to size zero. would make both the size field for the path in the index and the size on the filesystem zero. We should not mistake it as a clean index entry. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Linus Torvalds committed Jun 10, 2008 at 10:44 UTC f49c2c22fef520fd69ff26869c26dc58a834de2c
1 file changed +16
read-cache.c
+16
@@ -197,6 +197,16 @@ static int ce_modified_check_fs(struct cache_entry *ce, struct stat *st)
197 return 0;
198 }
199
200 +static int is_empty_blob_sha1(const unsigned char *sha1)
201 +{
202 + static const unsigned char empty_blob_sha1[20] = {
203 + 0xe6,0x9d,0xe2,0x9b,0xb2,0xd1,0xd6,0x43,0x4b,0x8b,
204 + 0x29,0xae,0x77,0x5a,0xd8,0xc2,0xe4,0x8c,0x53,0x91
205 + };
206 +
207 + return !hashcmp(sha1, empty_blob_sha1);
208 +}
209 +
210 static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)
211 {
212 unsigned int changed = 0;
@@ -252,6 +262,12 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)
262 if (ce->ce_size != (unsigned int) st->st_size)
263 changed |= DATA_CHANGED;
264
265 + /* Racily smudged entry? */
266 + if (!ce->ce_size) {
267 + if (!is_empty_blob_sha1(ce->sha1))
268 + changed |= DATA_CHANGED;
269 + }
270 +
271 return changed;
272 }
273