doing a 'diff -r dir1 dir2/' goes bad when there is a trailing / on dir. To reproduce: t:~/work# mkdir test t:~/work# touch test/test1 t:~/work# touch test/test2 t:~/work# touch test/test3 t:~/work# cp -r test/ test2 t:~/work# diff -r test test2/ Only in test2/: est1 Only in test2/: est2 Only in test2/: est3 Only in test: test1 Only in test: test2 Only in test: test3 Expected reslult would be to print nothing since dirs are equal. Originally reported on: http://redmine.alpinelinux.org/issues/381
Possible fix. Might not solve the issue when one of the dirs is / (root). diff --git a/editors/diff.c b/editors/diff.c index 07594e8..e2da626 100644 --- a/editors/diff.c +++ b/editors/diff.c @@ -788,9 +788,15 @@ static void diffdir(char *p[2], const char *s_start) memset(&list, 0, sizeof(list)); for (i = 0; i < 2; i++) { + char *lc; /*list[i].s = list[i].e = 0; - memset did it */ /*list[i].dl = NULL; */ + /* trim trailing / in dirs. */ + lc = last_char_is(p[i], '/'); + if (lc && lc != p[i]) + *lc = '\0'; + /* We need to trim root directory prefix. * Using list.len to specify its length, * add_to_dirlist will remove it. */
Fixed in git, thanks! http://git.busybox.net/busybox/commit/?id=61f5f7823c4f217dd9bad2f1df547f81b9338c76