diff: optimize diffing of files with the same metadata
Signed-off-by: Roman Borisov <ext-roman.borisov@nokia.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
1f4447b2d4
commit
95f5c52e6f
@ -952,6 +952,31 @@ int diff_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
if (gotstdin && (S_ISDIR(stb[0].st_mode) || S_ISDIR(stb[1].st_mode)))
|
if (gotstdin && (S_ISDIR(stb[0].st_mode) || S_ISDIR(stb[1].st_mode)))
|
||||||
bb_error_msg_and_die("can't compare stdin to a directory");
|
bb_error_msg_and_die("can't compare stdin to a directory");
|
||||||
|
|
||||||
|
/* Compare metadata to check if the files are the same physical file.
|
||||||
|
*
|
||||||
|
* Comment from diffutils source says:
|
||||||
|
* POSIX says that two files are identical if st_ino and st_dev are
|
||||||
|
* the same, but many file systems incorrectly assign the same (device,
|
||||||
|
* inode) pair to two distinct files, including:
|
||||||
|
* GNU/Linux NFS servers that export all local file systems as a
|
||||||
|
* single NFS file system, if a local device number (st_dev) exceeds
|
||||||
|
* 255, or if a local inode number (st_ino) exceeds 16777215.
|
||||||
|
*/
|
||||||
|
if (ENABLE_DESKTOP
|
||||||
|
&& stb[0].st_ino == stb[1].st_ino
|
||||||
|
&& stb[0].st_dev == stb[1].st_dev
|
||||||
|
&& stb[0].st_size == stb[1].st_size
|
||||||
|
&& stb[0].st_mtime == stb[1].st_mtime
|
||||||
|
&& stb[0].st_ctime == stb[1].st_ctime
|
||||||
|
&& stb[0].st_mode == stb[1].st_mode
|
||||||
|
&& stb[0].st_nlink == stb[1].st_nlink
|
||||||
|
&& stb[0].st_uid == stb[1].st_uid
|
||||||
|
&& stb[0].st_gid == stb[1].st_gid
|
||||||
|
) {
|
||||||
|
/* files are physically the same; no need to compare them */
|
||||||
|
return STATUS_SAME;
|
||||||
|
}
|
||||||
|
|
||||||
if (S_ISDIR(stb[0].st_mode) && S_ISDIR(stb[1].st_mode)) {
|
if (S_ISDIR(stb[0].st_mode) && S_ISDIR(stb[1].st_mode)) {
|
||||||
#if ENABLE_FEATURE_DIFF_DIR
|
#if ENABLE_FEATURE_DIFF_DIR
|
||||||
diffdir(file, s_start);
|
diffdir(file, s_start);
|
||||||
|
Loading…
Reference in New Issue
Block a user