Re: [PATCH/RFC][GSoC] diff-no-index: transform "$directory $file" args to "$directory/$file $file"
From: Eric Sunshine <hidden>
Date: 2016-06-15 23:04:15
On Sat, Mar 21, 2015 at 8:50 AM, Yurii Shevtsov [off-list ref] wrote:
quoted hunk ↗ jump to hunk
Signed-off-by: Yurii Shevtsov <redacted> ---diff --git a/diff-no-index.c b/diff-no-index.c index 265709b..9a3439a 100644 --- a/diff-no-index.c +++ b/diff-no-index.c@@ -97,8 +97,39 @@ static int queue_diff(struct diff_options *o, if (get_mode(name1, &mode1) || get_mode(name2, &mode2)) return -1;
Somehow, you lost all the tabs in the patch, and everything is instead indented with spaces (including context lines).
- if (mode1 && mode2 && S_ISDIR(mode1) != S_ISDIR(mode2))
- return error("file/directory conflict: %s, %s", name1, name2);
+ if (mode1 && mode2 && S_ISDIR(mode1) != S_ISDIR(mode2)) {
+ struct strbuf path;
+ const char *dir, *file;
+ char *filename, *dirname = 0;
+ int i, ret = 0;
+
+ dir = S_ISDIR(mode1) ? name1 : name2;
+ file = (dir == name1) ? name2 : name1;
+ strbuf_init(&path, strlen(name1) + strlen(name2) + 1);
+ strbuf_addstr(&path, dir);
+ filename = strrchr(file, '/');
+ if (path.len && path.buf[path.len - 1] != '/')
+ strbuf_addch(&path, '/');
+ for (i = path.len - 2; i >= 0; i--)
+ if (path.buf[i] == '/') {
+ dirname = &path.buf[i];
+ break;
+ }
+ if (dirname == 0)
+ dirname = path.buf;
+
+ if (!strncmp(dirname, filename, strlen(filename)))
+ return error("file/directory conflict: %s, %s", name1, name2);Leaking 'path' strbuf.
+
+ strbuf_addstr(&path, filename ? (filename + 1) : file);
+ if (file == name1)
+ ret = queue_diff(o, file, path.buf);
+ else
+ ret = queue_diff(o, path.buf, file);
+ strbuf_release(&path);
+
+ return ret;
+ }
if (S_ISDIR(mode1) || S_ISDIR(mode2)) {
struct strbuf buffer1 = STRBUF_INIT;
--