Skip to content

Commit bbfd62c

Browse files
authored
fixed #12834 - de-duplicate input files by comparing absolute paths (danmar#8193)
1 parent 7f1225d commit bbfd62c

File tree

3 files changed

+14
-74
lines changed

3 files changed

+14
-74
lines changed

cli/cmdlineparser.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,10 +269,10 @@ bool CmdLineParser::fillSettingsFromArgs(int argc, const char* const argv[])
269269
{
270270
auto it = filesResolved.begin();
271271
while (it != filesResolved.end()) {
272-
const std::string& name = it->path();
272+
const std::string& absname = Path::getAbsoluteFilePath(it->spath());
273273
// TODO: log if duplicated files were dropped
274274
filesResolved.erase(std::remove_if(std::next(it), filesResolved.end(), [&](const FileWithDetails& entry) {
275-
return entry.path() == name;
275+
return Path::getAbsoluteFilePath(entry.spath()) == absname;
276276
}), filesResolved.end());
277277
++it;
278278
}

test/cli/more-projects_test.py

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,7 @@ def test_project_file_duplicate_2(tmpdir):
657657
assert stderr == ''
658658

659659

660-
def test_project_file_duplicate_3(tmpdir):
660+
def test_project_file_duplicate_3(tmpdir): # #12834
661661
test_file_a = os.path.join(tmpdir, 'a.c')
662662
with open(test_file_a, 'wt'):
663663
pass
@@ -687,33 +687,18 @@ def test_project_file_duplicate_3(tmpdir):
687687
</project>""".format(in_file_a, in_file_b, in_file_c, in_file_d, in_file_e, in_file_f, tmpdir))
688688

689689
args = ['--project={}'.format(project_file)]
690-
args.append('-j1') # TODO: remove when fixed
691690

692691
exitcode, stdout, stderr = cppcheck(args, cwd=tmpdir)
693692
assert exitcode == 0
694693
lines = stdout.splitlines()
695-
# TODO: only a single file should be checked
696-
if sys.platform == 'win32':
697-
assert lines == [
698-
'Checking {} ...'.format(test_file_a),
699-
'1/3 files checked 33% done',
700-
'Checking {} ...'.format(test_file_a),
701-
'2/3 files checked 66% done',
702-
'Checking {} ...'.format(test_file_a),
703-
'3/3 files checked 100% done'
704-
]
705-
else:
706-
assert lines == [
707-
'Checking {} ...'.format(test_file_a),
708-
'1/2 files checked 50% done',
709-
'Checking {} ...'.format(test_file_a),
710-
'2/2 files checked 100% done'
711-
]
694+
assert lines == [
695+
'Checking {} ...'.format(test_file_a)
696+
]
712697
assert stderr == ''
713698

714699

715700
@pytest.mark.skipif(sys.platform != 'win32', reason="requires Windows")
716-
def test_project_file_duplicate_4(tmpdir):
701+
def test_project_file_duplicate_4(tmpdir): # #12834
717702
test_file_a = os.path.join(tmpdir, 'a.c')
718703
with open(test_file_a, 'wt'):
719704
pass
@@ -756,19 +741,12 @@ def test_project_file_duplicate_4(tmpdir):
756741
args2[0], args2[1], args2[2], args2[3], args2[4], args2[5], args2[6]))
757742

758743
args = ['--project={}'.format(project_file)]
759-
args.append('-j1') # TODO: remove when fixed
760744

761745
exitcode, stdout, stderr = cppcheck(args, cwd=tmpdir)
762746
assert exitcode == 0
763747
lines = stdout.splitlines()
764-
# TODO: only a single file should be checked
765748
assert lines == [
766-
'Checking {} ...'.format(test_file_a),
767-
'1/3 files checked 33% done',
768-
'Checking {} ...'.format(test_file_a),
769-
'2/3 files checked 66% done',
770-
'Checking {} ...'.format(test_file_a),
771-
'3/3 files checked 100% done'
749+
'Checking {} ...'.format(test_file_a)
772750
]
773751
assert stderr == ''
774752

test/cli/other_test.py

Lines changed: 6 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1216,7 +1216,7 @@ def test_file_duplicate_2(tmpdir):
12161216
assert stderr == ''
12171217

12181218

1219-
def test_file_duplicate_3(tmpdir):
1219+
def test_file_duplicate_3(tmpdir): # #12834
12201220
test_file_a = os.path.join(tmpdir, 'a.c')
12211221
with open(test_file_a, 'wt'):
12221222
pass
@@ -1230,43 +1230,18 @@ def test_file_duplicate_3(tmpdir):
12301230
in_file_f = os.path.join(tmpdir, 'dummy', '..', 'a.c')
12311231

12321232
args = [in_file_a, in_file_b, in_file_c, in_file_d, in_file_e, in_file_f, str(tmpdir)]
1233-
args.append('-j1') # TODO: remove when fixed
12341233

12351234
exitcode, stdout, stderr = cppcheck(args, cwd=tmpdir)
12361235
assert exitcode == 0, stdout if stdout else stderr
12371236
lines = stdout.splitlines()
1238-
# TODO: only a single file should be checked
1239-
if sys.platform == 'win32':
1240-
assert lines == [
1241-
'Checking {} ...'.format('a.c'),
1242-
'1/6 files checked 16% done',
1243-
'Checking {} ...'.format('a.c'),
1244-
'2/6 files checked 33% done',
1245-
'Checking {} ...'.format('a.c'),
1246-
'3/6 files checked 50% done',
1247-
'Checking {} ...'.format(test_file_a),
1248-
'4/6 files checked 66% done',
1249-
'Checking {} ...'.format(test_file_a),
1250-
'5/6 files checked 83% done',
1251-
'Checking {} ...'.format(test_file_a),
1252-
'6/6 files checked 100% done'
1253-
]
1254-
else:
1255-
assert lines == [
1256-
'Checking {} ...'.format('a.c'),
1257-
'1/4 files checked 25% done',
1258-
'Checking {} ...'.format('a.c'),
1259-
'2/4 files checked 50% done',
1260-
'Checking {} ...'.format(test_file_a),
1261-
'3/4 files checked 75% done',
1262-
'Checking {} ...'.format(test_file_a),
1263-
'4/4 files checked 100% done'
1264-
]
1237+
assert lines == [
1238+
'Checking {} ...'.format('a.c')
1239+
]
12651240
assert stderr == ''
12661241

12671242

12681243
@pytest.mark.skipif(sys.platform != 'win32', reason="requires Windows")
1269-
def test_file_duplicate_4(tmpdir):
1244+
def test_file_duplicate_4(tmpdir): # #12834
12701245
test_file_a = os.path.join(tmpdir, 'a.c')
12711246
with open(test_file_a, 'wt'):
12721247
pass
@@ -1284,25 +1259,12 @@ def test_file_duplicate_4(tmpdir):
12841259
for a in args1:
12851260
args2.append(a.replace('\\', '/'))
12861261
args = args1 + args2
1287-
args.append('-j1') # TODO: remove when fixed
12881262

12891263
exitcode, stdout, stderr = cppcheck(args, cwd=tmpdir)
12901264
assert exitcode == 0, stdout if stdout else stderr
12911265
lines = stdout.splitlines()
1292-
# TODO: only a single file should be checked
12931266
assert lines == [
1294-
'Checking {} ...'.format('a.c'),
1295-
'1/6 files checked 16% done',
1296-
'Checking {} ...'.format('a.c'),
1297-
'2/6 files checked 33% done',
1298-
'Checking {} ...'.format('a.c'),
1299-
'3/6 files checked 50% done',
1300-
'Checking {} ...'.format(test_file_a),
1301-
'4/6 files checked 66% done',
1302-
'Checking {} ...'.format(test_file_a),
1303-
'5/6 files checked 83% done',
1304-
'Checking {} ...'.format(test_file_a),
1305-
'6/6 files checked 100% done'
1267+
'Checking {} ...'.format('a.c')
13061268
]
13071269
assert stderr == ''
13081270

0 commit comments

Comments
 (0)