Signed-off-by: Felipe Contreras <felipe.contreras@xxxxxxxxx> --- Documentation/git-fast-import.txt | 1 + fast-import.c | 41 +++++++++++++++++++++--------------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt index c2f483a..9d4231e 100644 --- a/Documentation/git-fast-import.txt +++ b/Documentation/git-fast-import.txt @@ -484,6 +484,7 @@ in octal. Git only supports the following modes: * `160000`: A gitlink, SHA-1 of the object refers to a commit in another repository. Git links can only be specified by SHA or through a commit mark. They are used to implement submodules. +* `-`: A special mode; copy the parent's mode. In both formats `<path>` is the complete path of the file to be added (if not already existing) or modified (if already existing). diff --git a/fast-import.c b/fast-import.c index 3c035a5..a00d3fe 100644 --- a/fast-import.c +++ b/fast-import.c @@ -1356,7 +1356,7 @@ static int tree_content_set( struct tree_entry *root, const char *p, const unsigned char *sha1, - const uint16_t mode, + uint16_t mode, struct tree_content *subtree) { struct tree_content *t = root->tree; @@ -1382,7 +1382,9 @@ static int tree_content_set( && e->versions[1].mode == mode && !hashcmp(e->versions[1].sha1, sha1)) return 0; - e->versions[1].mode = mode; + if (mode == S_IFREG) + mode = e->versions[0].mode; + e->versions[1].mode = (mode == S_IFREG) ? (S_IFREG | 0644) : mode; hashcpy(e->versions[1].sha1, sha1); if (e->tree) release_tree_content_recursive(e->tree); @@ -1417,7 +1419,7 @@ static int tree_content_set( tree_content_set(e, slash1 + 1, sha1, mode, subtree); } else { e->tree = subtree; - e->versions[1].mode = mode; + e->versions[1].mode = (mode == S_IFREG) ? (S_IFREG | 0644) : mode; hashcpy(e->versions[1].sha1, sha1); } hashclr(root->versions[1].sha1); @@ -1862,20 +1864,25 @@ static void file_change_m(struct branch *b) unsigned char sha1[20]; uint16_t mode, inline_data = 0; - p = get_mode(p, &mode); - if (!p) - die("Corrupt mode: %s", command_buf.buf); - switch (mode) { - case S_IFREG | 0644: - case S_IFREG | 0755: - case S_IFLNK: - case S_IFGITLINK: - case 0644: - case 0755: - /* ok */ - break; - default: - die("Corrupt mode: %s", command_buf.buf); + if (!prefixcmp(p, "- ")) { + mode = 0; + p += 2; + } else { + p = get_mode(p, &mode); + if (!p) + die("Corrupt mode: %s", command_buf.buf); + switch (mode) { + case S_IFREG | 0644: + case S_IFREG | 0755: + case S_IFLNK: + case S_IFGITLINK: + case 0644: + case 0755: + /* ok */ + break; + default: + die("Corrupt mode: %s", command_buf.buf); + } } if (*p == ':') { -- 1.6.0.6.3.g7ccbd -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html