diff options
author | Junio C Hamano <gitster@pobox.com> | 2013-02-05 16:13:11 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2013-02-05 16:13:12 -0800 |
commit | 6d81ce0543c2fb7177c08491ba31a69aa54b7930 (patch) | |
tree | 6ef8352fb4ee054fca615d4b525bfa43c50b5686 /builtin | |
parent | Merge branch 'sb/gpg-plug-fd-leak' (diff) | |
parent | apply: diagnose incomplete submodule object name better (diff) | |
download | tgif-6d81ce0543c2fb7177c08491ba31a69aa54b7930.tar.xz |
Merge branch 'jc/fake-ancestor-with-non-blobs'
Rebasing the history of superproject with change in the submodule
was broken since v1.7.12.
* jc/fake-ancestor-with-non-blobs:
apply: diagnose incomplete submodule object name better
apply: simplify build_fake_ancestor()
git-am: record full index line in the patch used while rebasing
Diffstat (limited to 'builtin')
-rw-r--r-- | builtin/apply.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/builtin/apply.c b/builtin/apply.c index 6c11e8bc73..9706ca73ab 100644 --- a/builtin/apply.c +++ b/builtin/apply.c @@ -3609,7 +3609,6 @@ static void build_fake_ancestor(struct patch *list, const char *filename) * worth showing the new sha1 prefix, but until then... */ for (patch = list; patch; patch = patch->next) { - const unsigned char *sha1_ptr; unsigned char sha1[20]; struct cache_entry *ce; const char *name; @@ -3617,20 +3616,23 @@ static void build_fake_ancestor(struct patch *list, const char *filename) name = patch->old_name ? patch->old_name : patch->new_name; if (0 < patch->is_new) continue; - else if (get_sha1_blob(patch->old_sha1_prefix, sha1)) - /* git diff has no index line for mode/type changes */ - if (!patch->lines_added && !patch->lines_deleted) { - if (get_current_sha1(patch->old_name, sha1)) - die("mode change for %s, which is not " - "in current HEAD", name); - sha1_ptr = sha1; - } else - die("sha1 information is lacking or useless " - "(%s).", name); - else - sha1_ptr = sha1; - ce = make_cache_entry(patch->old_mode, sha1_ptr, name, 0, 0); + if (S_ISGITLINK(patch->old_mode)) { + if (get_sha1_hex(patch->old_sha1_prefix, sha1)) + die("submoule change for %s without full index name", + name); + } else if (!get_sha1_blob(patch->old_sha1_prefix, sha1)) { + ; /* ok */ + } else if (!patch->lines_added && !patch->lines_deleted) { + /* mode-only change: update the current */ + if (get_current_sha1(patch->old_name, sha1)) + die("mode change for %s, which is not " + "in current HEAD", name); + } else + die("sha1 information is lacking or useless " + "(%s).", name); + + ce = make_cache_entry(patch->old_mode, sha1, name, 0, 0); if (!ce) die(_("make_cache_entry failed for path '%s'"), name); if (add_index_entry(&result, ce, ADD_CACHE_OK_TO_ADD)) |