git_oid *out,
git_diff *diff,
const char *path,
- uint16_t mode,
+ uint16_t mode,
git_off_t size)
{
git_index_entry entry;
entry.file_size = size;
entry.path = (char *)path;
- return git_diff__oid_for_entry(out, diff, &entry, NULL);
+ return git_diff__oid_for_entry(out, diff, &entry, mode, NULL);
}
int git_diff__oid_for_entry(
git_oid *out,
git_diff *diff,
const git_index_entry *src,
+ uint16_t mode,
const git_oid *update_match)
{
int error = 0;
&full_path, git_repository_workdir(diff->repo), entry.path) < 0)
return -1;
- if (!entry.mode) {
+ if (!mode) {
struct stat st;
diff->perf.stat_calls++;
}
/* calculate OID for file if possible */
- if (S_ISGITLINK(entry.mode)) {
+ if (S_ISGITLINK(mode)) {
git_submodule *sm;
if (!git_submodule_lookup(&sm, diff->repo, entry.path)) {
*/
giterr_clear();
}
- } else if (S_ISLNK(entry.mode)) {
+ } else if (S_ISLNK(mode)) {
error = git_odb__hashlink(out, full_path.ptr);
diff->perf.oid_calculations++;
} else if (!git__is_sizet(entry.file_size)) {
/* update index for entry if requested */
if (!error && update_match && git_oid_equal(out, update_match)) {
git_index *idx;
+ git_index_entry updated_entry;
- if (!(error = git_repository_index__weakptr(&idx, diff->repo))) {
- git_oid_cpy(&entry.id, out);
- error = git_index_add(idx, &entry);
- }
+ memcpy(&updated_entry, &entry, sizeof(git_index_entry));
+ updated_entry.mode = mode;
+ git_oid_cpy(&updated_entry.id, out);
+
+ if (!(error = git_repository_index__weakptr(&idx, diff->repo)))
+ error = git_index_add(idx, &updated_entry);
}
git_buf_free(&full_path);
&oitem->id : NULL;
if ((error = git_diff__oid_for_entry(
- &noid, diff, nitem, update_check)) < 0)
+ &noid, diff, nitem, nmode, update_check)) < 0)
return error;
/* if oid matches, then mark unmodified (except submodules, where
extern int git_diff__oid_for_file(
git_oid *out, git_diff *, const char *, uint16_t, git_off_t);
extern int git_diff__oid_for_entry(
- git_oid *out, git_diff *, const git_index_entry *, const git_oid *update);
+ git_oid *out, git_diff *, const git_index_entry *, uint16_t, const git_oid *update);
extern int git_diff__from_iterators(
git_diff **diff_ptr,