summaryrefslogtreecommitdiffstatshomepage
path: root/ui-diff.c
diff options
context:
space:
mode:
Diffstat (limited to 'ui-diff.c')
-rw-r--r--ui-diff.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/ui-diff.c b/ui-diff.c
index 1cf2ce0..caebd5d 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -36,6 +36,7 @@ static struct fileinfo {
static int use_ssdiff = 0;
static struct diff_filepair *current_filepair;
+static const char *current_prefix;
struct diff_filespec *cgit_get_current_old_file(void)
{
@@ -132,11 +133,30 @@ static void count_diff_lines(char *line, int len)
}
}
+static int show_filepair(struct diff_filepair *pair)
+{
+ /* Always show if we have no limiting prefix. */
+ if (!current_prefix)
+ return 1;
+
+ /* Show if either path in the pair begins with the prefix. */
+ if (starts_with(pair->one->path, current_prefix) ||
+ starts_with(pair->two->path, current_prefix))
+ return 1;
+
+ /* Otherwise we don't want to show this filepair. */
+ return 0;
+}
+
static void inspect_filepair(struct diff_filepair *pair)
{
int binary = 0;
unsigned long old_size = 0;
unsigned long new_size = 0;
+
+ if (!show_filepair(pair))
+ return;
+
files++;
lines_added = 0;
lines_removed = 0;
@@ -279,6 +299,9 @@ static void filepair_cb(struct diff_filepair *pair)
int binary = 0;
linediff_fn print_line_fn = print_line;
+ if (!show_filepair(pair))
+ return;
+
current_filepair = pair;
if (use_ssdiff) {
cgit_ssdiff_header_begin();
@@ -365,6 +388,18 @@ void cgit_print_diff(const char *new_rev, const char *old_rev,
const unsigned char *old_tree_sha1, *new_tree_sha1;
diff_type difftype;
+ /*
+ * If "follow" is set then the diff machinery needs to examine the
+ * entire commit to detect renames so we must limit the paths in our
+ * own callbacks and not pass the prefix to the diff machinery.
+ */
+ if (ctx.qry.follow && ctx.cfg.enable_follow_links) {
+ current_prefix = prefix;
+ prefix = "";
+ } else {
+ current_prefix = NULL;
+ }
+
if (!new_rev)
new_rev = ctx.qry.head;
if (get_sha1(new_rev, new_rev_sha1)) {