mirror of
https://github.com/HDFGroup/hdf5.git
synced 2024-11-21 01:04:10 +08:00
[svn-r22176] Purpose:
Fix for HDFFV-7644 GMQS: h5diff - incorrect behaviors when comparing HDF5 files with different type of objects (dataset, group, type) as common objects Description: Fixed failure for comparing same named object with different object types in comparing groups. (common object comparison) Prior to the fix, h5diff resulted in error. After the fix, h5diff detects such case as non-comparable and display messages accordingly. Test cases were added and tagged with jira#. Tested: jam (linux32-LE), koala (linux64-LE), ostrich (linuxppc64-BE), tejeda (mac32-LE), linew (solaris-BE), Windows (32-LE cmake), Cmake (jam)
This commit is contained in:
parent
d4ab4456d0
commit
6cef6bca1f
2
MANIFEST
2
MANIFEST
@ -1815,6 +1815,8 @@
|
|||||||
./tools/h5diff/testfiles/h5diff_220.txt
|
./tools/h5diff/testfiles/h5diff_220.txt
|
||||||
./tools/h5diff/testfiles/h5diff_221.txt
|
./tools/h5diff/testfiles/h5diff_221.txt
|
||||||
./tools/h5diff/testfiles/h5diff_222.txt
|
./tools/h5diff/testfiles/h5diff_222.txt
|
||||||
|
./tools/h5diff/testfiles/h5diff_223.txt
|
||||||
|
./tools/h5diff/testfiles/h5diff_224.txt
|
||||||
./tools/h5diff/testfiles/h5diff_300.txt
|
./tools/h5diff/testfiles/h5diff_300.txt
|
||||||
./tools/h5diff/testfiles/h5diff_400.txt
|
./tools/h5diff/testfiles/h5diff_400.txt
|
||||||
./tools/h5diff/testfiles/h5diff_401.txt
|
./tools/h5diff/testfiles/h5diff_401.txt
|
||||||
|
@ -691,6 +691,10 @@ Bug Fixes since HDF5-1.8.0 release
|
|||||||
|
|
||||||
Tools
|
Tools
|
||||||
-----
|
-----
|
||||||
|
- h5diff: Fixed failure for comparing same named object with different
|
||||||
|
object types in comparing groups. Prior to the fix, h5diff resulted
|
||||||
|
in error. After the fix, h5diff detects such case as non-comparable
|
||||||
|
and display messages accordingly. HDFFV-7664 (JKM 2012/03/28)
|
||||||
- h5diff: If unique objects exists only in one file and try to exclude
|
- h5diff: If unique objects exists only in one file and try to exclude
|
||||||
the unique objects with --exclude-path option, h5diff missed
|
the unique objects with --exclude-path option, h5diff missed
|
||||||
excluding some objects.
|
excluding some objects.
|
||||||
|
@ -84,6 +84,8 @@ IF (BUILD_TESTING)
|
|||||||
h5diff_220.txt
|
h5diff_220.txt
|
||||||
h5diff_221.txt
|
h5diff_221.txt
|
||||||
h5diff_222.txt
|
h5diff_222.txt
|
||||||
|
h5diff_223.txt
|
||||||
|
h5diff_224.txt
|
||||||
h5diff_21.txt
|
h5diff_21.txt
|
||||||
h5diff_22.txt
|
h5diff_22.txt
|
||||||
h5diff_23.txt
|
h5diff_23.txt
|
||||||
@ -577,6 +579,10 @@ IF (BUILD_TESTING)
|
|||||||
h5diff_221.out.err
|
h5diff_221.out.err
|
||||||
h5diff_222.out
|
h5diff_222.out
|
||||||
h5diff_222.out.err
|
h5diff_222.out.err
|
||||||
|
h5diff_223.out
|
||||||
|
h5diff_223.out.err
|
||||||
|
h5diff_224.out
|
||||||
|
h5diff_224.out.err
|
||||||
h5diff_21.out
|
h5diff_21.out
|
||||||
h5diff_21.out.err
|
h5diff_21.out.err
|
||||||
h5diff_22.out
|
h5diff_22.out
|
||||||
@ -1164,6 +1170,12 @@ ADD_H5_TEST (h5diff_221 1 -c non_comparables1.h5 non_comparables2.h5 /g2)
|
|||||||
# All the rest comparables should display differences
|
# All the rest comparables should display differences
|
||||||
ADD_H5_TEST (h5diff_222 1 -c non_comparables1.h5 non_comparables2.h5)
|
ADD_H5_TEST (h5diff_222 1 -c non_comparables1.h5 non_comparables2.h5)
|
||||||
|
|
||||||
|
# non-comparable test for common objects (same name) with different object types
|
||||||
|
# (HDFFV-7644)
|
||||||
|
ADD_H5_TEST (h5diff_223 0 -c non_comparables1.h5 non_comparables2.h5 /diffobjtypes)
|
||||||
|
# swap files
|
||||||
|
ADD_H5_TEST (h5diff_224 0 -c non_comparables2.h5 non_comparables1.h5 /diffobjtypes)
|
||||||
|
|
||||||
# ##############################################################################
|
# ##############################################################################
|
||||||
# # Links compare without --follow-symlinks nor --no-dangling-links
|
# # Links compare without --follow-symlinks nor --no-dangling-links
|
||||||
# ##############################################################################
|
# ##############################################################################
|
||||||
|
@ -155,7 +155,8 @@ static void test_comps_array (const char *fname, const char *dset, const char *a
|
|||||||
static void test_comps_vlen (const char *fname, const char *dset,const char *attr, int diff, int is_file_new);
|
static void test_comps_vlen (const char *fname, const char *dset,const char *attr, int diff, int is_file_new);
|
||||||
static void test_comps_array_vlen (const char *fname, const char *dset, const char *attr, int diff, int is_file_new);
|
static void test_comps_array_vlen (const char *fname, const char *dset, const char *attr, int diff, int is_file_new);
|
||||||
static void test_comps_vlen_arry (const char *fname, const char *dset,const char *attr, int diff, int is_file_new);
|
static void test_comps_vlen_arry (const char *fname, const char *dset,const char *attr, int diff, int is_file_new);
|
||||||
static void test_non_comparables (const char *fname, int diff);
|
static void test_data_nocomparables (const char *fname, int diff);
|
||||||
|
static void test_objs_nocomparables (const char *fname1, const char *fname2);
|
||||||
|
|
||||||
/* called by test_attributes() and test_datasets() */
|
/* called by test_attributes() and test_datasets() */
|
||||||
static void write_attr_in(hid_t loc_id,const char* dset_name,hid_t fid,int make_diffs);
|
static void write_attr_in(hid_t loc_id,const char* dset_name,hid_t fid,int make_diffs);
|
||||||
@ -250,8 +251,11 @@ int main(void)
|
|||||||
* comparable datasets and attributes. All the comparables should display
|
* comparable datasets and attributes. All the comparables should display
|
||||||
* differences.
|
* differences.
|
||||||
*/
|
*/
|
||||||
test_non_comparables(NON_COMPARBLES1,0);
|
test_data_nocomparables(NON_COMPARBLES1,0);
|
||||||
test_non_comparables(NON_COMPARBLES2,5);
|
test_data_nocomparables(NON_COMPARBLES2,5);
|
||||||
|
|
||||||
|
/* common objects (same name) with different object types. HDFFV-7644 */
|
||||||
|
test_objs_nocomparables(NON_COMPARBLES1, NON_COMPARBLES2);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -4787,7 +4791,7 @@ static void test_comps_vlen_arry (const char * fname, const char *dset, const ch
|
|||||||
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------
|
/*-------------------------------------------------------------------------
|
||||||
* Function: test_non_comparables
|
* Function: test_data_nocomparables
|
||||||
*
|
*
|
||||||
* Purpose:
|
* Purpose:
|
||||||
* Create test files with non-comparable dataset and attributes with
|
* Create test files with non-comparable dataset and attributes with
|
||||||
@ -4796,7 +4800,7 @@ static void test_comps_vlen_arry (const char * fname, const char *dset, const ch
|
|||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------*/
|
*-------------------------------------------------------------------------*/
|
||||||
#define DIM_ARRY 3
|
#define DIM_ARRY 3
|
||||||
static void test_non_comparables (const char * fname, int make_diffs)
|
static void test_data_nocomparables (const char * fname, int make_diffs)
|
||||||
{
|
{
|
||||||
hid_t fid=0;
|
hid_t fid=0;
|
||||||
hid_t gid1=0;
|
hid_t gid1=0;
|
||||||
@ -4997,6 +5001,155 @@ out:
|
|||||||
H5Tclose(tid_attr1);
|
H5Tclose(tid_attr1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------
|
||||||
|
* Function: test_objs_nocomparables
|
||||||
|
*
|
||||||
|
* Purpose:
|
||||||
|
* Create test files with common objects (same name) but different object
|
||||||
|
* types.
|
||||||
|
* h5diff should show non-comparable output from these common objects.
|
||||||
|
*-------------------------------------------------------------------------*/
|
||||||
|
static void test_objs_nocomparables(const char *fname1, const char *fname2)
|
||||||
|
{
|
||||||
|
herr_t status = SUCCEED;
|
||||||
|
hid_t fid1=0;
|
||||||
|
hid_t fid2=0;
|
||||||
|
hid_t topgid1=0;
|
||||||
|
hid_t topgid2=0;
|
||||||
|
hid_t gid1=0;
|
||||||
|
hid_t did1=0;
|
||||||
|
hid_t tid1=0;
|
||||||
|
hid_t gid2=0;
|
||||||
|
hid_t did2=0;
|
||||||
|
hid_t tid2=0;
|
||||||
|
hsize_t dims[1] = {DIM_ARRY};
|
||||||
|
int data1[DIM_ARRY] = {1,1,1};
|
||||||
|
int data2[DIM_ARRY] = {2,2,2};
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------
|
||||||
|
* Open file(s) to add objects
|
||||||
|
*------------------------------------------------------------------------*/
|
||||||
|
/* file1 */
|
||||||
|
fid1 = H5Fopen (fname1, H5F_ACC_RDWR, H5P_DEFAULT);
|
||||||
|
if (fid1 < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error: %s> H5Fopen failed.\n", fname1);
|
||||||
|
status = FAIL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* file2 */
|
||||||
|
fid2 = H5Fopen (fname2, H5F_ACC_RDWR, H5P_DEFAULT);
|
||||||
|
if (fid2 < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error: %s> H5Fopen failed.\n", fname2);
|
||||||
|
status = FAIL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------
|
||||||
|
* in file1 : add member objects
|
||||||
|
*------------------------------------------------------------------------*/
|
||||||
|
/* parent group */
|
||||||
|
topgid1 = H5Gcreate2(fid1, "diffobjtypes", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
||||||
|
if (topgid1 < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
|
||||||
|
status = FAIL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* dataset */
|
||||||
|
status = write_dset(topgid1, 1, dims,"obj1", H5T_NATIVE_INT, data1);
|
||||||
|
if (status == FAIL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* group */
|
||||||
|
gid1 = H5Gcreate2(topgid1, "obj2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
||||||
|
if (gid1 < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
|
||||||
|
status = FAIL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* committed type */
|
||||||
|
tid1 = H5Tcopy(H5T_NATIVE_INT);
|
||||||
|
status = H5Tcommit2(topgid1, "obj3", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
||||||
|
if (status < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error: %s> H5Tcommit2 failed.\n", fname1);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------
|
||||||
|
* in file2 : add member objects
|
||||||
|
*------------------------------------------------------------------------*/
|
||||||
|
/* parent group */
|
||||||
|
topgid2 = H5Gcreate2(fid2, "diffobjtypes", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
||||||
|
if (topgid2 < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
|
||||||
|
status = FAIL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* group */
|
||||||
|
gid2 = H5Gcreate2(topgid2, "obj1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
||||||
|
if (gid2 < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
|
||||||
|
status = FAIL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* committed type */
|
||||||
|
tid2 = H5Tcopy(H5T_NATIVE_INT);
|
||||||
|
status = H5Tcommit2(topgid2, "obj2", tid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
||||||
|
if (status < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error: %s> H5Tcommit2 failed.\n", fname2);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* dataset */
|
||||||
|
status = write_dset(topgid2, 1, dims,"obj3", H5T_NATIVE_INT, data2);
|
||||||
|
if (status == FAIL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
/*-----------------------------------------------------------------------
|
||||||
|
* Close IDs
|
||||||
|
*-----------------------------------------------------------------------*/
|
||||||
|
if(fid1)
|
||||||
|
H5Fclose(fid1);
|
||||||
|
if(fid2)
|
||||||
|
H5Fclose(fid2);
|
||||||
|
if(topgid1)
|
||||||
|
H5Gclose(topgid1);
|
||||||
|
if(topgid2)
|
||||||
|
H5Gclose(topgid2);
|
||||||
|
if(did1)
|
||||||
|
H5Dclose(did1);
|
||||||
|
if(did2)
|
||||||
|
H5Dclose(did2);
|
||||||
|
if(gid1)
|
||||||
|
H5Gclose(gid1);
|
||||||
|
if(gid2)
|
||||||
|
H5Gclose(gid2);
|
||||||
|
if(tid1)
|
||||||
|
H5Tclose(tid1);
|
||||||
|
if(tid2)
|
||||||
|
H5Tclose(tid2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------
|
/*-------------------------------------------------------------------------
|
||||||
* Function: write_attr_in
|
* Function: write_attr_in
|
||||||
*
|
*
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
</dset> is of type H5G_DATASET and </g1> is of type H5G_GROUP
|
Not comparable: </dset> is of type H5G_DATASET and </g1> is of type H5G_GROUP
|
||||||
--------------------------------
|
--------------------------------
|
||||||
Some objects are not comparable
|
Some objects are not comparable
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
</dset> is of type H5G_DATASET and </l1> is of type H5G_LINK
|
Not comparable: </dset> is of type H5G_DATASET and </l1> is of type H5G_LINK
|
||||||
--------------------------------
|
--------------------------------
|
||||||
Some objects are not comparable
|
Some objects are not comparable
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
</dset> is of type H5G_DATASET and </t1> is of type H5G_TYPE
|
Not comparable: </dset> is of type H5G_DATASET and </t1> is of type H5G_TYPE
|
||||||
--------------------------------
|
--------------------------------
|
||||||
Some objects are not comparable
|
Some objects are not comparable
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
Not comparable: </diffobjtypes/obj1> is of type H5G_DATASET and </diffobjtypes/obj1> is of type H5G_GROUP
|
||||||
|
Not comparable: </diffobjtypes/obj2> is of type H5G_GROUP and </diffobjtypes/obj2> is of type H5G_TYPE
|
||||||
|
Not comparable: </diffobjtypes/obj3> is of type H5G_TYPE and </diffobjtypes/obj3> is of type H5G_DATASET
|
||||||
Not comparable: </g1/dset1> is of class H5T_INTEGER and </g1/dset1> is of class H5T_STRING
|
Not comparable: </g1/dset1> is of class H5T_INTEGER and </g1/dset1> is of class H5T_STRING
|
||||||
attribute: <attr of </g1/dset1>> and <attr of </g1/dset1>>
|
attribute: <attr of </g1/dset1>> and <attr of </g1/dset1>>
|
||||||
3 differences found
|
3 differences found
|
||||||
|
4
tools/h5diff/testfiles/h5diff_223.txt
Normal file
4
tools/h5diff/testfiles/h5diff_223.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
Not comparable: </diffobjtypes/obj1> is of type H5G_DATASET and </diffobjtypes/obj1> is of type H5G_GROUP
|
||||||
|
Not comparable: </diffobjtypes/obj2> is of type H5G_GROUP and </diffobjtypes/obj2> is of type H5G_TYPE
|
||||||
|
Not comparable: </diffobjtypes/obj3> is of type H5G_TYPE and </diffobjtypes/obj3> is of type H5G_DATASET
|
||||||
|
EXIT CODE: 0
|
4
tools/h5diff/testfiles/h5diff_224.txt
Normal file
4
tools/h5diff/testfiles/h5diff_224.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
Not comparable: </diffobjtypes/obj1> is of type H5G_GROUP and </diffobjtypes/obj1> is of type H5G_DATASET
|
||||||
|
Not comparable: </diffobjtypes/obj2> is of type H5G_TYPE and </diffobjtypes/obj2> is of type H5G_GROUP
|
||||||
|
Not comparable: </diffobjtypes/obj3> is of type H5G_DATASET and </diffobjtypes/obj3> is of type H5G_TYPE
|
||||||
|
EXIT CODE: 0
|
@ -1,4 +1,4 @@
|
|||||||
</grp1> is of type H5G_GROUP and </slink_grp1> is of type H5G_LINK
|
Not comparable: </grp1> is of type H5G_GROUP and </slink_grp1> is of type H5G_LINK
|
||||||
--------------------------------
|
--------------------------------
|
||||||
Some objects are not comparable
|
Some objects are not comparable
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
</grp1> is of type H5G_GROUP and </elink_grp1> is of type H5G_UDLINK
|
Not comparable: </grp1> is of type H5G_GROUP and </elink_grp1> is of type H5G_UDLINK
|
||||||
--------------------------------
|
--------------------------------
|
||||||
Some objects are not comparable
|
Some objects are not comparable
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
</slink_grp1> is of type H5G_LINK and </elink_grp1> is of type H5G_UDLINK
|
Not comparable: </slink_grp1> is of type H5G_LINK and </elink_grp1> is of type H5G_UDLINK
|
||||||
--------------------------------
|
--------------------------------
|
||||||
Some objects are not comparable
|
Some objects are not comparable
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
@ -17,8 +17,11 @@ dataset: </dset1> and </dset1>
|
|||||||
0 differences found
|
0 differences found
|
||||||
group : </g1> and </g1>
|
group : </g1> and </g1>
|
||||||
0 differences found
|
0 differences found
|
||||||
group : </g1/g2> and </g1/g2>
|
Not comparable: </g1/g2> is of type H5G_GROUP and </g1/g2> is of type H5G_UDLINK
|
||||||
0 differences found
|
|
||||||
link : </soft_dset1> and </soft_dset1>
|
link : </soft_dset1> and </soft_dset1>
|
||||||
0 differences found
|
0 differences found
|
||||||
|
--------------------------------
|
||||||
|
Some objects are not comparable
|
||||||
|
--------------------------------
|
||||||
|
Use -c for a list of objects without details of differences.
|
||||||
EXIT CODE: 1
|
EXIT CODE: 1
|
||||||
|
@ -10,6 +10,9 @@ group1 group2
|
|||||||
|
|
||||||
group : </g1> and </g1>
|
group : </g1> and </g1>
|
||||||
0 differences found
|
0 differences found
|
||||||
group : </g1/g2> and </g1/g2>
|
Not comparable: </g1/g2> is of type H5G_GROUP and </g1/g2> is of type H5G_UDLINK
|
||||||
0 differences found
|
--------------------------------
|
||||||
|
Some objects are not comparable
|
||||||
|
--------------------------------
|
||||||
|
Use -c for a list of objects without details of differences.
|
||||||
EXIT CODE: 1
|
EXIT CODE: 1
|
||||||
|
Binary file not shown.
Binary file not shown.
@ -156,6 +156,8 @@ $SRC_H5DIFF_TESTFILES/h5diff_208.txt
|
|||||||
$SRC_H5DIFF_TESTFILES/h5diff_220.txt
|
$SRC_H5DIFF_TESTFILES/h5diff_220.txt
|
||||||
$SRC_H5DIFF_TESTFILES/h5diff_221.txt
|
$SRC_H5DIFF_TESTFILES/h5diff_221.txt
|
||||||
$SRC_H5DIFF_TESTFILES/h5diff_222.txt
|
$SRC_H5DIFF_TESTFILES/h5diff_222.txt
|
||||||
|
$SRC_H5DIFF_TESTFILES/h5diff_223.txt
|
||||||
|
$SRC_H5DIFF_TESTFILES/h5diff_224.txt
|
||||||
$SRC_H5DIFF_TESTFILES/h5diff_21.txt
|
$SRC_H5DIFF_TESTFILES/h5diff_21.txt
|
||||||
$SRC_H5DIFF_TESTFILES/h5diff_22.txt
|
$SRC_H5DIFF_TESTFILES/h5diff_22.txt
|
||||||
$SRC_H5DIFF_TESTFILES/h5diff_23.txt
|
$SRC_H5DIFF_TESTFILES/h5diff_23.txt
|
||||||
@ -827,6 +829,12 @@ if test -n "$pmode" -a "$mydomainname" = hdfgroup.uiuc.edu; then
|
|||||||
else
|
else
|
||||||
TOOLTEST h5diff_222.txt -c non_comparables1.h5 non_comparables2.h5
|
TOOLTEST h5diff_222.txt -c non_comparables1.h5 non_comparables2.h5
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# non-comparable test for common objects (same name) with different object types
|
||||||
|
# (HDFFV-7644)
|
||||||
|
TOOLTEST h5diff_223.txt -c non_comparables1.h5 non_comparables2.h5 /diffobjtypes
|
||||||
|
# swap files
|
||||||
|
TOOLTEST h5diff_224.txt -c non_comparables2.h5 non_comparables1.h5 /diffobjtypes
|
||||||
|
|
||||||
# ##############################################################################
|
# ##############################################################################
|
||||||
# # Links compare without --follow-symlinks nor --no-dangling-links
|
# # Links compare without --follow-symlinks nor --no-dangling-links
|
||||||
|
@ -1121,6 +1121,8 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
|
|||||||
char * obj2_fullpath = NULL;
|
char * obj2_fullpath = NULL;
|
||||||
h5trav_type_t objtype;
|
h5trav_type_t objtype;
|
||||||
diff_args_t argdata;
|
diff_args_t argdata;
|
||||||
|
size_t idx1 = 0;
|
||||||
|
size_t idx2 = 0;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1160,17 +1162,6 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* objects with the same name but different HDF5 types */
|
|
||||||
for( i = 0; i < table->nobjs; i++)
|
|
||||||
{
|
|
||||||
if ( table->objs[i].flags[0] && table->objs[i].flags[1] )
|
|
||||||
{
|
|
||||||
if ( table->objs[i].type != table->objs[i].type )
|
|
||||||
{
|
|
||||||
options->contents = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------
|
/*-------------------------------------------------------------------------
|
||||||
* do the diff for common objects
|
* do the diff for common objects
|
||||||
@ -1205,8 +1196,18 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
|
|||||||
HDstrcpy(obj2_fullpath, grp2_path);
|
HDstrcpy(obj2_fullpath, grp2_path);
|
||||||
HDstrcat(obj2_fullpath, table->objs[i].name);
|
HDstrcat(obj2_fullpath, table->objs[i].name);
|
||||||
|
|
||||||
|
/* get index to figure out type of the object in file1 */
|
||||||
|
while ( info1->paths[idx1].path &&
|
||||||
|
(HDstrcmp (obj1_fullpath, info1->paths[idx1].path) != 0) )
|
||||||
|
idx1++;
|
||||||
|
/* get index to figure out type of the object in file2 */
|
||||||
|
while ( info2->paths[idx2].path &&
|
||||||
|
(HDstrcmp (obj2_fullpath, info2->paths[idx2].path) != 0) )
|
||||||
|
idx2++;
|
||||||
|
|
||||||
/* Set argdata to pass other args into diff() */
|
/* Set argdata to pass other args into diff() */
|
||||||
argdata.type = objtype;
|
argdata.type[0] = info1->paths[idx1].type;
|
||||||
|
argdata.type[1] = info2->paths[idx2].type;
|
||||||
argdata.is_same_trgobj = table->objs[i].is_same_trgobj;
|
argdata.is_same_trgobj = table->objs[i].is_same_trgobj;
|
||||||
|
|
||||||
options->cmn_objs = 1;
|
options->cmn_objs = 1;
|
||||||
@ -1242,7 +1243,8 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
|
|||||||
HDstrcpy(args.name1, obj1_fullpath);
|
HDstrcpy(args.name1, obj1_fullpath);
|
||||||
HDstrcpy(args.name2, obj2_fullpath);
|
HDstrcpy(args.name2, obj2_fullpath);
|
||||||
args.options = *options;
|
args.options = *options;
|
||||||
args.argdata.type = objtype;
|
args.argdata.type[0] = info1->paths[idx1].type;
|
||||||
|
args.argdata.type[1] = info2->paths[idx2].type;
|
||||||
args.argdata.is_same_trgobj = table->objs[i].is_same_trgobj;
|
args.argdata.is_same_trgobj = table->objs[i].is_same_trgobj;
|
||||||
|
|
||||||
h5diffdebug2("busyTasks=%d\n", busyTasks);
|
h5diffdebug2("busyTasks=%d\n", busyTasks);
|
||||||
@ -1576,176 +1578,9 @@ hsize_t diff_compare(hid_t file1_id,
|
|||||||
obj1type = info1->paths[i].type;
|
obj1type = info1->paths[i].type;
|
||||||
obj2type = info2->paths[j].type;
|
obj2type = info2->paths[j].type;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------
|
|
||||||
* follow link option, compare with target object
|
|
||||||
*/
|
|
||||||
if (options->follow_links)
|
|
||||||
{
|
|
||||||
/* pass how to handle printing warning to linkinfo option */
|
|
||||||
if(print_warn(options))
|
|
||||||
linkinfo1.opt.msg_mode = linkinfo2.opt.msg_mode = 1;
|
|
||||||
|
|
||||||
/*------------------------------------------------------------
|
|
||||||
* Soft links
|
|
||||||
*------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*--------------------------
|
|
||||||
* if object1 soft link */
|
|
||||||
if (obj1type == H5TRAV_TYPE_LINK)
|
|
||||||
{
|
|
||||||
/* get type of target object */
|
|
||||||
l_ret = H5tools_get_symlink_info(file1_id, obj1name, &linkinfo1, TRUE);
|
|
||||||
/* dangling link */
|
|
||||||
if (l_ret == 0)
|
|
||||||
{
|
|
||||||
if (options->no_dangle_links)
|
|
||||||
{
|
|
||||||
/* gangling link is error */
|
|
||||||
if(options->m_verbose)
|
|
||||||
parallel_print("Warning: <%s> is a dangling link.\n", obj1name);
|
|
||||||
options->err_stat = 1;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
is_dangle_link1 = 1;
|
|
||||||
}
|
|
||||||
/* fail */
|
|
||||||
else if(l_ret < 0)
|
|
||||||
{
|
|
||||||
options->err_stat = 1;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
else /* OK */
|
|
||||||
{
|
|
||||||
/* target type for diff() */
|
|
||||||
obj1type = linkinfo1.trg_type;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-----------------------------
|
|
||||||
* if object2 is soft link */
|
|
||||||
if (obj2type == H5TRAV_TYPE_LINK)
|
|
||||||
{
|
|
||||||
/* get type target object */
|
|
||||||
l_ret = H5tools_get_symlink_info(file2_id, obj2name, &linkinfo2, TRUE);
|
|
||||||
/* dangling link */
|
|
||||||
if (l_ret == 0)
|
|
||||||
{
|
|
||||||
if (options->no_dangle_links)
|
|
||||||
{
|
|
||||||
/* gangling link is error */
|
|
||||||
if(options->m_verbose)
|
|
||||||
parallel_print("Warning: <%s> is a dangling link.\n", obj2name);
|
|
||||||
options->err_stat = 1;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
is_dangle_link2=1;
|
|
||||||
}
|
|
||||||
/* fail */
|
|
||||||
else if(l_ret < 0)
|
|
||||||
{
|
|
||||||
options->err_stat = 1;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
else /* OK */
|
|
||||||
{
|
|
||||||
/* target type for diff() */
|
|
||||||
obj2type = linkinfo2.trg_type;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*------------------------------------------------------------
|
|
||||||
* External links
|
|
||||||
*------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*--------------------------------
|
|
||||||
* if object1 is external link */
|
|
||||||
if (obj1type == H5TRAV_TYPE_UDLINK)
|
|
||||||
{
|
|
||||||
/* get type and name of target object */
|
|
||||||
l_ret = H5tools_get_symlink_info(file1_id, obj1name, &linkinfo1, TRUE);
|
|
||||||
/* dangling link */
|
|
||||||
if (l_ret == 0)
|
|
||||||
{
|
|
||||||
if (options->no_dangle_links)
|
|
||||||
{
|
|
||||||
/* gangling link is error */
|
|
||||||
if(options->m_verbose)
|
|
||||||
parallel_print("Warning: <%s> is a dangling link.\n", obj1name);
|
|
||||||
options->err_stat = 1;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
is_dangle_link1 = 1;
|
|
||||||
}
|
|
||||||
/* fail */
|
|
||||||
else if(l_ret < 0)
|
|
||||||
{
|
|
||||||
options->err_stat = 1;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
else /* OK */
|
|
||||||
{
|
|
||||||
/* for external link */
|
|
||||||
if(linkinfo1.linfo.type == H5L_TYPE_EXTERNAL)
|
|
||||||
obj1type = linkinfo1.trg_type;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------
|
|
||||||
* if object2 is external link */
|
|
||||||
if (obj2type == H5TRAV_TYPE_UDLINK)
|
|
||||||
{
|
|
||||||
/* get type and name of target object */
|
|
||||||
l_ret = H5tools_get_symlink_info(file2_id, obj2name, &linkinfo2, TRUE);
|
|
||||||
/* dangling link */
|
|
||||||
if (l_ret == 0)
|
|
||||||
{
|
|
||||||
if (options->no_dangle_links)
|
|
||||||
{
|
|
||||||
/* gangling link is error */
|
|
||||||
if(options->m_verbose)
|
|
||||||
parallel_print("Warning: <%s> is a dangling link.\n", obj2name);
|
|
||||||
options->err_stat = 1;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
is_dangle_link2 = 1;
|
|
||||||
}
|
|
||||||
/* fail */
|
|
||||||
else if(l_ret < 0)
|
|
||||||
{
|
|
||||||
options->err_stat = 1;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
else /* OK */
|
|
||||||
{
|
|
||||||
/* for external link */
|
|
||||||
if(linkinfo2.linfo.type == H5L_TYPE_EXTERNAL)
|
|
||||||
obj2type = linkinfo2.trg_type;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* found dangling link */
|
|
||||||
if (is_dangle_link1 || is_dangle_link2)
|
|
||||||
goto out;
|
|
||||||
} /* end of follow_links */
|
|
||||||
|
|
||||||
/* objects are not the same type */
|
|
||||||
if (obj1type != obj2type)
|
|
||||||
{
|
|
||||||
if (options->m_verbose||options->m_list_not_cmp)
|
|
||||||
{
|
|
||||||
parallel_print("<%s> is of type %s and <%s> is of type %s\n",
|
|
||||||
obj1name, get_type(obj1type),
|
|
||||||
obj2name, get_type(obj2type));
|
|
||||||
}
|
|
||||||
options->not_cmp=1;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set argdata to pass other args into diff() */
|
/* Set argdata to pass other args into diff() */
|
||||||
argdata.type = obj1type;
|
argdata.type[0] = obj1type;
|
||||||
|
argdata.type[1] = obj2type;
|
||||||
argdata.is_same_trgobj = 0;
|
argdata.is_same_trgobj = 0;
|
||||||
|
|
||||||
nfound = diff(file1_id, obj1name,
|
nfound = diff(file1_id, obj1name,
|
||||||
@ -1806,7 +1641,8 @@ out:
|
|||||||
* Return: Number of differences found
|
* Return: Number of differences found
|
||||||
*
|
*
|
||||||
* Programmer: Jonathan Kim
|
* Programmer: Jonathan Kim
|
||||||
* - add following links feature (Feb 11,2010)
|
* - Move follow symlinks code toward top. (March 2812)
|
||||||
|
* - Add following symlinks feature (Feb 11,2010)
|
||||||
* - Change to use diff_args_t to pass the rest of args.
|
* - Change to use diff_args_t to pass the rest of args.
|
||||||
* Passing through it instead of individual args provides smoother
|
* Passing through it instead of individual args provides smoother
|
||||||
* extensibility through its members along with MPI code update for ph5diff
|
* extensibility through its members along with MPI code update for ph5diff
|
||||||
@ -1834,6 +1670,7 @@ hsize_t diff(hid_t file1_id,
|
|||||||
int is_dangle_link2 = 0;
|
int is_dangle_link2 = 0;
|
||||||
int is_hard_link = 0;
|
int is_hard_link = 0;
|
||||||
hsize_t nfound = 0;
|
hsize_t nfound = 0;
|
||||||
|
h5trav_type_t object_type;
|
||||||
|
|
||||||
|
|
||||||
/* to get link info */
|
/* to get link info */
|
||||||
@ -1848,52 +1685,86 @@ hsize_t diff(hid_t file1_id,
|
|||||||
if(print_warn(options))
|
if(print_warn(options))
|
||||||
linkinfo1.opt.msg_mode = linkinfo2.opt.msg_mode = 1;
|
linkinfo1.opt.msg_mode = linkinfo2.opt.msg_mode = 1;
|
||||||
|
|
||||||
/*
|
/* for symbolic links, take care follow symlink and no dangling link
|
||||||
* Get target object info for obj1 and obj2 and check dangling links.
|
* options */
|
||||||
* (for hard-linked-objects, because diff() only get the obj1's type,
|
if (argdata->type[0] == H5TRAV_TYPE_LINK ||
|
||||||
* so obj2's type should be check here when diff() is called from
|
argdata->type[0] == H5TRAV_TYPE_UDLINK ||
|
||||||
* diff_match() for same-named objects with dangling link only one side.)
|
argdata->type[1] == H5TRAV_TYPE_LINK ||
|
||||||
*/
|
argdata->type[1] == H5TRAV_TYPE_UDLINK )
|
||||||
|
|
||||||
/* target object1 - get type and name */
|
|
||||||
ret = H5tools_get_symlink_info(file1_id, path1, &linkinfo1, TRUE);
|
|
||||||
/* dangling link */
|
|
||||||
if (ret == 0)
|
|
||||||
{
|
{
|
||||||
if (options->no_dangle_links)
|
/*
|
||||||
{
|
* check dangling links for path1 and path2
|
||||||
/* gangling link is error */
|
*/
|
||||||
if(options->m_verbose)
|
|
||||||
parallel_print("Warning: <%s> is a dangling link.\n", path1);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
is_dangle_link1 = 1;
|
|
||||||
}
|
|
||||||
else if (ret < 0)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
/* target object2 - get type and name */
|
/* target object1 - get type and name */
|
||||||
ret = H5tools_get_symlink_info(file2_id, path2, &linkinfo2, TRUE);
|
ret = H5tools_get_symlink_info(file1_id, path1, &linkinfo1, TRUE);
|
||||||
/* dangling link */
|
/* dangling link */
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
{
|
|
||||||
if (options->no_dangle_links)
|
|
||||||
{
|
{
|
||||||
/* gangling link is error */
|
if (options->no_dangle_links)
|
||||||
if(options->m_verbose)
|
{
|
||||||
parallel_print("Warning: <%s> is a dangling link.\n", path2);
|
/* gangling link is error */
|
||||||
goto out;
|
if(options->m_verbose)
|
||||||
|
parallel_print("Warning: <%s> is a dangling link.\n", path1);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
is_dangle_link1 = 1;
|
||||||
|
}
|
||||||
|
else if (ret < 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* target object2 - get type and name */
|
||||||
|
ret = H5tools_get_symlink_info(file2_id, path2, &linkinfo2, TRUE);
|
||||||
|
/* dangling link */
|
||||||
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
if (options->no_dangle_links)
|
||||||
|
{
|
||||||
|
/* gangling link is error */
|
||||||
|
if(options->m_verbose)
|
||||||
|
parallel_print("Warning: <%s> is a dangling link.\n", path2);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
is_dangle_link2 = 1;
|
||||||
|
}
|
||||||
|
else if (ret < 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* found dangling link */
|
||||||
|
if (is_dangle_link1 || is_dangle_link2)
|
||||||
|
goto out2;
|
||||||
|
|
||||||
|
/* follow symbolic link option */
|
||||||
|
if (options->follow_links)
|
||||||
|
{
|
||||||
|
if (linkinfo1.linfo.type == H5L_TYPE_SOFT ||
|
||||||
|
linkinfo1.linfo.type == H5L_TYPE_EXTERNAL)
|
||||||
|
argdata->type[0] = linkinfo1.trg_type;
|
||||||
|
|
||||||
|
if (linkinfo2.linfo.type == H5L_TYPE_SOFT ||
|
||||||
|
linkinfo2.linfo.type == H5L_TYPE_EXTERNAL)
|
||||||
|
argdata->type[1] = linkinfo2.trg_type;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
is_dangle_link2 = 1;
|
|
||||||
}
|
}
|
||||||
else if (ret < 0)
|
/* if objects are not the same type */
|
||||||
goto out;
|
if (argdata->type[0] != argdata->type[1])
|
||||||
|
{
|
||||||
/* found dangling link */
|
if (options->m_verbose||options->m_list_not_cmp)
|
||||||
if (is_dangle_link1 || is_dangle_link2)
|
{
|
||||||
|
parallel_print("Not comparable: <%s> is of type %s and <%s> is of type %s\n",
|
||||||
|
path1, get_type(argdata->type[0]),
|
||||||
|
path2, get_type(argdata->type[1]));
|
||||||
|
}
|
||||||
|
options->not_cmp=1;
|
||||||
|
/* TODO: will need to update non-comparable is different
|
||||||
|
* options->contents = 0;
|
||||||
|
*/
|
||||||
goto out2;
|
goto out2;
|
||||||
|
}
|
||||||
|
else /* now both object types are same */
|
||||||
|
object_type = argdata->type[0];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If both points to the same target object, skip comparing details inside
|
* If both points to the same target object, skip comparing details inside
|
||||||
@ -1903,17 +1774,17 @@ hsize_t diff(hid_t file1_id,
|
|||||||
*
|
*
|
||||||
* Perform this to match the outputs as bypassing.
|
* Perform this to match the outputs as bypassing.
|
||||||
*/
|
*/
|
||||||
is_hard_link = (argdata->type == H5TRAV_TYPE_DATASET ||
|
if (argdata->is_same_trgobj)
|
||||||
argdata->type == H5TRAV_TYPE_NAMED_DATATYPE ||
|
|
||||||
argdata->type == H5TRAV_TYPE_GROUP);
|
|
||||||
if (options->follow_links || is_hard_link)
|
|
||||||
{
|
{
|
||||||
if (argdata->is_same_trgobj)
|
is_hard_link = (object_type == H5TRAV_TYPE_DATASET ||
|
||||||
|
object_type == H5TRAV_TYPE_NAMED_DATATYPE ||
|
||||||
|
object_type == H5TRAV_TYPE_GROUP);
|
||||||
|
if (options->follow_links || is_hard_link)
|
||||||
{
|
{
|
||||||
/* print information is only verbose option is used */
|
/* print information is only verbose option is used */
|
||||||
if(options->m_verbose || options->m_report)
|
if(options->m_verbose || options->m_report)
|
||||||
{
|
{
|
||||||
switch(argdata->type)
|
switch(object_type)
|
||||||
{
|
{
|
||||||
case H5TRAV_TYPE_DATASET:
|
case H5TRAV_TYPE_DATASET:
|
||||||
do_print_objname("dataset", path1, path2, options);
|
do_print_objname("dataset", path1, path2, options);
|
||||||
@ -1935,7 +1806,7 @@ hsize_t diff(hid_t file1_id,
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
parallel_print("Comparison not supported: <%s> and <%s> are of type %s\n",
|
parallel_print("Comparison not supported: <%s> and <%s> are of type %s\n",
|
||||||
path1, path2, get_type(argdata->type) );
|
path1, path2, get_type(object_type) );
|
||||||
options->not_cmp = 1;
|
options->not_cmp = 1;
|
||||||
break;
|
break;
|
||||||
} /* switch(type)*/
|
} /* switch(type)*/
|
||||||
@ -1943,11 +1814,12 @@ hsize_t diff(hid_t file1_id,
|
|||||||
print_found(nfound);
|
print_found(nfound);
|
||||||
} /* if(options->m_verbose || options->m_report) */
|
} /* if(options->m_verbose || options->m_report) */
|
||||||
|
|
||||||
|
/* exact same, so comparison is done */
|
||||||
goto out2;
|
goto out2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(argdata->type)
|
switch(object_type)
|
||||||
{
|
{
|
||||||
/*----------------------------------------------------------------------
|
/*----------------------------------------------------------------------
|
||||||
* H5TRAV_TYPE_DATASET
|
* H5TRAV_TYPE_DATASET
|
||||||
@ -2064,30 +1936,6 @@ hsize_t diff(hid_t file1_id,
|
|||||||
if(print_objname(options, nfound))
|
if(print_objname(options, nfound))
|
||||||
do_print_objname("link", path1, path2, options);
|
do_print_objname("link", path1, path2, options);
|
||||||
|
|
||||||
if (options->follow_links)
|
|
||||||
{
|
|
||||||
/* objects are not the same type */
|
|
||||||
if (linkinfo1.trg_type != linkinfo2.trg_type)
|
|
||||||
{
|
|
||||||
if (options->m_verbose||options->m_list_not_cmp)
|
|
||||||
{
|
|
||||||
parallel_print("<%s> is of type %s and <%s> is of type %s\n", path1, get_type(linkinfo1.trg_type), path2, get_type(linkinfo2.trg_type));
|
|
||||||
}
|
|
||||||
options->not_cmp=1;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Renew type in argdata to pass into diff().
|
|
||||||
* For recursive call, argdata.is_same_trgobj is already
|
|
||||||
* set from initial call, so don't reset here */
|
|
||||||
argdata->type = linkinfo1.trg_type;
|
|
||||||
|
|
||||||
/* call self to compare target object */
|
|
||||||
nfound += diff(file1_id, path1,
|
|
||||||
file2_id, path2,
|
|
||||||
options, argdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* always print the number of differences found in verbose mode */
|
/* always print the number of differences found in verbose mode */
|
||||||
if(options->m_verbose)
|
if(options->m_verbose)
|
||||||
print_found(nfound);
|
print_found(nfound);
|
||||||
@ -2121,28 +1969,6 @@ hsize_t diff(hid_t file1_id,
|
|||||||
if(print_objname(options, nfound))
|
if(print_objname(options, nfound))
|
||||||
do_print_objname("external link", path1, path2, options);
|
do_print_objname("external link", path1, path2, options);
|
||||||
|
|
||||||
if (options->follow_links)
|
|
||||||
{
|
|
||||||
/* objects are not the same type */
|
|
||||||
if (linkinfo1.trg_type != linkinfo2.trg_type)
|
|
||||||
{
|
|
||||||
if (options->m_verbose||options->m_list_not_cmp)
|
|
||||||
{
|
|
||||||
parallel_print("<%s> is of type %s and <%s> is of type %s\n", path1, get_type(linkinfo1.trg_type), path2, get_type(linkinfo2.trg_type));
|
|
||||||
}
|
|
||||||
options->not_cmp=1;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Renew type in argdata to pass into diff().
|
|
||||||
* For recursive call, argdata.is_same_trgobj is already
|
|
||||||
* set from initial call, so don't reset here */
|
|
||||||
argdata->type = linkinfo1.trg_type;
|
|
||||||
|
|
||||||
nfound = diff(file1_id, path1,
|
|
||||||
file2_id, path2,
|
|
||||||
options, argdata);
|
|
||||||
}
|
|
||||||
} /* end if */
|
} /* end if */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2172,7 +1998,7 @@ hsize_t diff(hid_t file1_id,
|
|||||||
default:
|
default:
|
||||||
if(options->m_verbose)
|
if(options->m_verbose)
|
||||||
parallel_print("Comparison not supported: <%s> and <%s> are of type %s\n",
|
parallel_print("Comparison not supported: <%s> and <%s> are of type %s\n",
|
||||||
path1, path2, get_type(argdata->type) );
|
path1, path2, get_type(object_type) );
|
||||||
options->not_cmp = 1;
|
options->not_cmp = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
* as it doesn't require interface change.
|
* as it doesn't require interface change.
|
||||||
*------------------------------------------------------------------------*/
|
*------------------------------------------------------------------------*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
h5trav_type_t type;
|
h5trav_type_t type[2];
|
||||||
hbool_t is_same_trgobj;
|
hbool_t is_same_trgobj;
|
||||||
} diff_args_t;
|
} diff_args_t;
|
||||||
/*-------------------------------------------------------------------------
|
/*-------------------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user