commit fc76cabb0c70b61d89701fce09ff96e538615379 from: Stefan Sperling date: Tue Dec 25 14:24:16 2018 UTC store base commit of each blob in file index commit - eaccb85f7218ef3615353170a2a64ec1c48028e2 commit + fc76cabb0c70b61d89701fce09ff96e538615379 blob - 86250c11fe57924c5ca80e01cac4cd1188d8e075 blob + a6bdde165134042c5baf59120676cb60d8c8d153 --- lib/fileindex.c +++ lib/fileindex.c @@ -29,7 +29,8 @@ const struct got_error * got_fileindex_entry_alloc(struct got_fileindex_entry **entry, - const char *ondisk_path, const char *relpath, uint8_t *blob_sha1) + const char *ondisk_path, const char *relpath, uint8_t *blob_sha1, + uint8_t *commit_sha1) { struct stat sb; size_t len; @@ -63,6 +64,7 @@ got_fileindex_entry_alloc(struct got_fileindex_entry * (*entry)->mode |= ((sb.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) << GOT_INDEX_ENTRY_MODE_PERMS_SHIFT); memcpy((*entry)->blob_sha1, blob_sha1, SHA1_DIGEST_LENGTH); + memcpy((*entry)->commit_sha1, commit_sha1, SHA1_DIGEST_LENGTH); len = strlen(relpath); if (len > GOT_INDEX_ENTRY_F_PATH_LEN) len = GOT_INDEX_ENTRY_F_PATH_LEN; @@ -210,6 +212,11 @@ write_fileindex_entry(SHA1_CTX *ctx, struct got_filein SHA1Update(ctx, entry->blob_sha1, SHA1_DIGEST_LENGTH); n = fwrite(entry->blob_sha1, 1, SHA1_DIGEST_LENGTH, outfile); + if (n != SHA1_DIGEST_LENGTH) + return got_ferror(outfile, GOT_ERR_IO); + + SHA1Update(ctx, entry->commit_sha1, SHA1_DIGEST_LENGTH); + n = fwrite(entry->commit_sha1, 1, SHA1_DIGEST_LENGTH, outfile); if (n != SHA1_DIGEST_LENGTH) return got_ferror(outfile, GOT_ERR_IO); @@ -383,6 +390,13 @@ read_fileindex_entry(struct got_fileindex_entry **entr } SHA1Update(ctx, entry->blob_sha1, SHA1_DIGEST_LENGTH); + n = fread(entry->commit_sha1, 1, SHA1_DIGEST_LENGTH, infile); + if (n != SHA1_DIGEST_LENGTH) { + err = got_ferror(infile, GOT_ERR_IO); + goto done; + } + SHA1Update(ctx, entry->commit_sha1, SHA1_DIGEST_LENGTH); + err = read_fileindex_val32(&entry->flags, ctx, infile); if (err) goto done; blob - d0855bedd7a7257124e3ec233a0cae2cb93b85ad blob + e8716e82b5c7226df522570f9907830e40f4274d --- lib/got_lib_fileindex.h +++ lib/got_lib_fileindex.h @@ -45,6 +45,9 @@ struct got_fileindex_entry { /* SHA1 of corresponding blob in repository. */ uint8_t blob_sha1[SHA1_DIGEST_LENGTH]; + /* SHA1 of corresponding base commit in repository. */ + uint8_t commit_sha1[SHA1_DIGEST_LENGTH]; + uint32_t flags; #define GOT_INDEX_ENTRY_F_PATH_LEN 0x00000fff #define GOT_INDEX_ENTRY_F_STAGE 0x00003000 @@ -83,7 +86,7 @@ struct got_fileindex_hdr { }; const struct got_error *got_fileindex_entry_alloc(struct got_fileindex_entry **, - const char *, const char *, uint8_t *); + const char *, const char *, uint8_t *, uint8_t *); void got_fileindex_entry_free(struct got_fileindex_entry *); struct got_fileindex *got_fileindex_alloc(void); void got_fileindex_free(struct got_fileindex *); blob - 4656e2e4a0598b526e576e75b85fc270885e00a5 blob + f8d6e1c9f31ed998a56d9e161ceda32926f2ba60 --- lib/worktree.c +++ lib/worktree.c @@ -461,7 +461,8 @@ add_file_on_disk(struct got_worktree *worktree, struct fsync(fd); err = got_fileindex_entry_alloc(&entry, ondisk_path, - apply_path_prefix(worktree, path), blob->id.sha1); + apply_path_prefix(worktree, path), blob->id.sha1, + worktree->base_commit_id->sha1); if (err) goto done;