[PATCH 1/2] fast-import: add special mode; copy from parent.
From: Felipe Contreras <hidden>
Date: 2016-06-15 22:45:48
Signed-off-by: Felipe Contreras <redacted> --- 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