-
Notifications
You must be signed in to change notification settings - Fork 49
Description
I just upgraded to v1.2.0 of this library. With the upgraded stuff on BagIt v1.0 in #118, a new bug has entered the library:
When using the BagLinter, the warning different_case will always be shown. Given it's description:
The bag contains two files that differ only in case. This can cause problems on a filesystem like the one used by apple (HFS).
I would not expect this to happen on a bag with only very distinct files.
I think the bug is as follows: in the code below a manifest file is read and for each line the path is added to the Set paths (after being converted to lowercase).
bagit-java/src/main/java/gov/loc/repository/bagit/conformance/ManifestChecker.java
Lines 119 to 139 in 97a6770
| try(final BufferedReader reader = Files.newBufferedReader(manifestFile, encoding)){ | |
| final Set<String> paths = new HashSet<>(); | |
| String line = reader.readLine(); | |
| while(line != null){ | |
| String path = parsePath(line); | |
| path = checkForManifestCreatedWithMD5SumTools(path, warnings, warningsToIgnore); | |
| paths.add(path.toLowerCase()); | |
| checkForDifferentCase(path, paths, manifestFile, warnings, warningsToIgnore); | |
| if(encoding.name().startsWith("UTF")){ | |
| checkNormalization(path, manifestFile.getParent(), warnings, warningsToIgnore); | |
| } | |
| checkForBagWithinBag(line, warnings, warningsToIgnore, isPayloadManifest); | |
| checkForRelativePaths(line, warnings, warningsToIgnore, manifestFile); | |
| checkForOSSpecificFiles(line, warnings, warningsToIgnore, manifestFile); | |
| line = reader.readLine(); | |
| } | |
| } |
Immediately after that checkForDifferentCase is called, which checks whether paths.contains(path.toLowerCase()). Of course, this is always true, since path was just added to paths before this check.
bagit-java/src/main/java/gov/loc/repository/bagit/conformance/ManifestChecker.java
Lines 174 to 183 in 97a6770
| /* | |
| * Check that the same line doesn't already exist in the set of paths | |
| */ | |
| private static void checkForDifferentCase(final String path, final Set<String> paths, final Path manifestFile, | |
| final Set<BagitWarning> warnings, final Collection<BagitWarning> warningsToIgnore){ | |
| if(!warningsToIgnore.contains(BagitWarning.DIFFERENT_CASE) && paths.contains(path.toLowerCase())){ | |
| logger.warn(messages.getString("different_case_warning"), manifestFile, path); | |
| warnings.add(BagitWarning.DIFFERENT_CASE); | |
| } | |
| } |