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
630d6bc
..
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 (;;) {
@@
-563,7
+563,7
@@
static int find_header(char *line, unsigned long size, int *hdrsize, struct patc
struct fragment dummy;
if (parse_fragment_header(line, len, &dummy) < 0)
continue;
struct fragment dummy;
if (parse_fragment_header(line, len, &dummy) < 0)
continue;
- error("patch fragment without header at line %d: %.*s", linenr, len-1, line);
+ error("patch fragment without header at line %d: %.*s", linenr,
(int)
len-1, line);
}
if (size < len + 6)
}
if (size < len + 6)
@@
-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;
}
@@
-737,6
+754,7
@@
static const char minuses[]= "--------------------------------------------------
static void show_stats(struct patch *patch)
{
static void show_stats(struct patch *patch)
{
+ const char *prefix = "";
char *name = patch->new_name;
int len, max, add, del, total;
char *name = patch->new_name;
int len, max, add, del, total;
@@
-750,8
+768,15
@@
static void show_stats(struct patch *patch)
max = max_len;
if (max > 50)
max = 50;
max = max_len;
if (max > 50)
max = 50;
- if (len > max)
+ if (len > max) {
+ char *slash;
+ prefix = "...";
+ max -= 3;
name += len - max;
name += len - max;
+ slash = strchr(name, '/');
+ if (slash)
+ name = slash;
+ }
len = max;
/*
len = max;
/*
@@
-770,7
+795,7
@@
static void show_stats(struct patch *patch)
add = (add * max + max_change / 2) / max_change;
del = total - add;
}
add = (add * max + max_change / 2) / max_change;
del = total - add;
}
- printf(" %
-*s |%5d %.*s%.*s\n"
,
+ printf(" %
s%-*s |%5d %.*s%.*s\n", prefix
,
len, name, patch->lines_added + patch->lines_deleted,
add, pluses, del, minuses);
}
len, name, patch->lines_added + patch->lines_deleted,
add, pluses, del, minuses);
}
@@
-960,7
+985,7
@@
static int apply_fragments(struct buffer_desc *desc, struct patch *patch)
while (frag) {
if (apply_one_fragment(desc, frag) < 0)
while (frag) {
if (apply_one_fragment(desc, frag) < 0)
- return error("patch failed: %s:%d", patch->old_name, frag->oldpos);
+ return error("patch failed: %s:%
l
d", patch->old_name, frag->oldpos);
frag = frag->next;
}
return 0;
frag = frag->next;
}
return 0;
@@
-1035,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) {
@@
-1365,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)