Thread (2 messages) flat view 2 messages, 2 authors, 2016-06-15

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;
--
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help