projects
/
git.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix wrong filename listing bug in git-ls-tree.
[git.git]
/
apply.c
diff --git
a/apply.c
b/apply.c
index
81607c0
..
f886272
100644
(file)
--- a/
apply.c
+++ b/
apply.c
@@
-387,7
+387,7
@@
static char *git_header_name(char *line)
default:
continue;
case '\n':
default:
continue;
case '\n':
-
break
;
+
return NULL
;
case '\t': case ' ':
second = name+len;
for (;;) {
case '\t': case ' ':
second = name+len;
for (;;) {
@@
-672,9
+672,13
@@
static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
added++;
newlines--;
break;
added++;
newlines--;
break;
- /* We allow "\ No newline at end of file" */
+
+ /* We allow "\ No newline at end of file". Depending
+ * on locale settings when the patch was produced we
+ * don't know what this line looks like. The only
+ * thing we do know is that it begins with "\ ". */
case '\\':
case '\\':
- if (len < 12 || memcmp(line, "\\
No newline", 1
2))
+ if (len < 12 || memcmp(line, "\\
",
2))
return -1;
break;
}
return -1;
break;
}
@@
-683,7
+687,7
@@
static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
* it in the above loop because we hit oldlines == newlines == 0
* before seeing it.
*/
* it in the above loop because we hit oldlines == newlines == 0
* before seeing it.
*/
- if (12 < size && !memcmp(line, "\\
No newline", 1
2))
+ if (12 < size && !memcmp(line, "\\
",
2))
offset += linelen(line, size);
patch->lines_added += added;
offset += linelen(line, size);
patch->lines_added += added;
@@
-719,6
+723,16
@@
static int parse_single_patch(char *line, unsigned long size, struct patch *patc
return offset;
}
return offset;
}
+static inline int metadata_changes(struct patch *patch)
+{
+ return patch->is_rename > 0 ||
+ patch->is_copy > 0 ||
+ patch->is_new > 0 ||
+ patch->is_delete ||
+ (patch->old_mode && patch->new_mode &&
+ patch->old_mode != patch->new_mode);
+}
+
static int parse_chunk(char *buffer, unsigned long size, struct patch *patch)
{
int hdrsize, patchsize;
static int parse_chunk(char *buffer, unsigned long size, struct patch *patch)
{
int hdrsize, patchsize;
@@
-729,6
+743,9
@@
static int parse_chunk(char *buffer, unsigned long size, struct patch *patch)
patchsize = parse_single_patch(buffer + offset + hdrsize, size - offset - hdrsize, patch);
patchsize = parse_single_patch(buffer + offset + hdrsize, size - offset - hdrsize, patch);
+ if (!patchsize && !metadata_changes(patch))
+ die("patch with only garbage at line %d", linenr);
+
return offset + hdrsize + patchsize;
}
return offset + hdrsize + patchsize;
}
@@
-1043,8
+1060,12
@@
static int check_patch(struct patch *patch)
return error("%s: already exists in working directory", new_name);
if (errno != ENOENT)
return error("%s: %s", new_name, strerror(errno));
return error("%s: already exists in working directory", new_name);
if (errno != ENOENT)
return error("%s: %s", new_name, strerror(errno));
- if (!patch->new_mode)
- patch->new_mode = S_IFREG | 0644;
+ if (!patch->new_mode) {
+ if (patch->is_new)
+ patch->new_mode = S_IFREG | 0644;
+ else
+ patch->new_mode = patch->old_mode;
+ }
}
if (new_name && old_name) {
}
if (new_name && old_name) {
@@
-1373,7
+1394,7
@@
static struct excludes {
static int use_patch(struct patch *p)
{
static int use_patch(struct patch *p)
{
- const char *pathname = p->new_name ? : p->old_name;
+ const char *pathname = p->new_name ?
p->new_name
: p->old_name;
struct excludes *x = excludes;
while (x) {
if (fnmatch(x->path, pathname, 0) == 0)
struct excludes *x = excludes;
while (x) {
if (fnmatch(x->path, pathname, 0) == 0)