contrib: add credential helper for GnomeKeyring
[gitweb.git] / diff-no-index.c
index 09656bca1d192f21f36ff56f2446c6bcc73442f4..7d805a06afacae7eaa36a192e3a16406ef0fb41f 100644 (file)
@@ -89,7 +89,7 @@ static struct diff_filespec *noindex_filespec(const char *name, int mode)
 }
 
 static int queue_diff(struct diff_options *o,
-               const char *name1, const char *name2)
+                     const char *name1, const char *name2)
 {
        int mode1 = 0, mode2 = 0;
 
@@ -100,10 +100,12 @@ static int queue_diff(struct diff_options *o,
                return error("file/directory conflict: %s, %s", name1, name2);
 
        if (S_ISDIR(mode1) || S_ISDIR(mode2)) {
-               char buffer1[PATH_MAX], buffer2[PATH_MAX];
+               struct strbuf buffer1 = STRBUF_INIT;
+               struct strbuf buffer2 = STRBUF_INIT;
                struct string_list p1 = STRING_LIST_INIT_DUP;
                struct string_list p2 = STRING_LIST_INIT_DUP;
-               int len1 = 0, len2 = 0, i1, i2, ret = 0;
+               int i1, i2, ret = 0;
+               size_t len1 = 0, len2 = 0;
 
                if (name1 && read_directory(name1, &p1))
                        return -1;
@@ -113,53 +115,53 @@ static int queue_diff(struct diff_options *o,
                }
 
                if (name1) {
-                       len1 = strlen(name1);
-                       if (len1 > 0 && name1[len1 - 1] == '/')
-                               len1--;
-                       memcpy(buffer1, name1, len1);
-                       buffer1[len1++] = '/';
+                       strbuf_addstr(&buffer1, name1);
+                       if (buffer1.len && buffer1.buf[buffer1.len - 1] != '/')
+                               strbuf_addch(&buffer1, '/');
+                       len1 = buffer1.len;
                }
 
                if (name2) {
-                       len2 = strlen(name2);
-                       if (len2 > 0 && name2[len2 - 1] == '/')
-                               len2--;
-                       memcpy(buffer2, name2, len2);
-                       buffer2[len2++] = '/';
+                       strbuf_addstr(&buffer2, name2);
+                       if (buffer2.len && buffer2.buf[buffer2.len - 1] != '/')
+                               strbuf_addch(&buffer2, '/');
+                       len2 = buffer2.len;
                }
 
                for (i1 = i2 = 0; !ret && (i1 < p1.nr || i2 < p2.nr); ) {
                        const char *n1, *n2;
                        int comp;
 
+                       strbuf_setlen(&buffer1, len1);
+                       strbuf_setlen(&buffer2, len2);
+
                        if (i1 == p1.nr)
                                comp = 1;
                        else if (i2 == p2.nr)
                                comp = -1;
                        else
-                               comp = strcmp(p1.items[i1].string,
-                                       p2.items[i2].string);
+                               comp = strcmp(p1.items[i1].string, p2.items[i2].string);
 
                        if (comp > 0)
                                n1 = NULL;
                        else {
-                               n1 = buffer1;
-                               strncpy(buffer1 + len1, p1.items[i1++].string,
-                                               PATH_MAX - len1);
+                               strbuf_addstr(&buffer1, p1.items[i1++].string);
+                               n1 = buffer1.buf;
                        }
 
                        if (comp < 0)
                                n2 = NULL;
                        else {
-                               n2 = buffer2;
-                               strncpy(buffer2 + len2, p2.items[i2++].string,
-                                               PATH_MAX - len2);
+                               strbuf_addstr(&buffer2, p2.items[i2++].string);
+                               n2 = buffer2.buf;
                        }
 
                        ret = queue_diff(o, n1, n2);
                }
                string_list_clear(&p1, 0);
                string_list_clear(&p2, 0);
+               strbuf_release(&buffer1);
+               strbuf_release(&buffer2);
 
                return ret;
        } else {
@@ -179,23 +181,6 @@ static int queue_diff(struct diff_options *o,
        }
 }
 
-static int path_outside_repo(const char *path)
-{
-       const char *work_tree;
-       size_t len;
-
-       if (!is_absolute_path(path))
-               return 0;
-       work_tree = get_git_work_tree();
-       if (!work_tree)
-               return 1;
-       len = strlen(work_tree);
-       if (strncmp(path, work_tree, len) ||
-           (path[len] != '\0' && path[len] != '/'))
-               return 1;
-       return 0;
-}
-
 void diff_no_index(struct rev_info *revs,
                   int argc, const char **argv,
                   int nongit, const char *prefix)
@@ -226,8 +211,8 @@ void diff_no_index(struct rev_info *revs,
                 * a colourful "diff" replacement.
                 */
                if ((argc != i + 2) ||
-                   (!path_outside_repo(argv[i]) &&
-                    !path_outside_repo(argv[i+1])))
+                   (path_inside_repo(prefix, argv[i]) &&
+                    path_inside_repo(prefix, argv[i+1])))
                        return;
        }
        if (argc != i + 2)
@@ -253,13 +238,6 @@ void diff_no_index(struct rev_info *revs,
                }
        }
 
-       /*
-        * If the user asked for our exit code then don't start a
-        * pager or we would end up reporting its exit code instead.
-        */
-       if (!DIFF_OPT_TST(&revs->diffopt, EXIT_WITH_STATUS))
-               setup_pager();
-
        prefixlen = prefix ? strlen(prefix) : 0;
        for (i = 0; i < 2; i++) {
                const char *p = argv[argc - 2 + i];
@@ -277,13 +255,15 @@ void diff_no_index(struct rev_info *revs,
        if (!revs->diffopt.output_format)
                revs->diffopt.output_format = DIFF_FORMAT_PATCH;
 
-       DIFF_OPT_SET(&revs->diffopt, EXIT_WITH_STATUS);
        DIFF_OPT_SET(&revs->diffopt, NO_INDEX);
 
        revs->max_count = -2;
        if (diff_setup_done(&revs->diffopt) < 0)
                die("diff_setup_done failed");
 
+       setup_diff_pager(&revs->diffopt);
+       DIFF_OPT_SET(&revs->diffopt, EXIT_WITH_STATUS);
+
        if (queue_diff(&revs->diffopt, paths[0], paths[1]))
                exit(1);
        diff_set_mnemonic_prefix(&revs->diffopt, "1/", "2/");
@@ -294,5 +274,5 @@ void diff_no_index(struct rev_info *revs,
         * The return code for --no-index imitates diff(1):
         * 0 = no changes, 1 = changes, else error
         */
-       exit(revs->diffopt.found_changes);
+       exit(diff_result_code(&revs->diffopt, 0));
 }