[ 
https://issues.apache.org/jira/browse/MSHARED-1453?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17901333#comment-17901333
 ] 

ASF GitHub Bot commented on MSHARED-1453:
-----------------------------------------

elharo commented on code in PR #77:
URL: https://github.com/apache/maven-archiver/pull/77#discussion_r1859417681


##########
src/main/java/org/apache/maven/shared/archiver/PomPropertiesUtil.java:
##########
@@ -61,38 +60,38 @@ private boolean sameContents(Properties props, Path file) 
throws IOException {
         return fileProps.equals(props);
     }
 
-    private void createPropertiesFile(Properties properties, Path outputFile, 
boolean forceCreation)
+    private void createPropertiesFile(Properties unsortedProperties, Path 
outputFile, boolean forceCreation)
             throws IOException {
         Path outputDir = outputFile.getParent();
         if (outputDir != null && !Files.isDirectory(outputDir)) {
             Files.createDirectories(outputDir);
         }
-        if (!forceCreation && sameContents(properties, outputFile)) {
+        if (!forceCreation && sameContents(unsortedProperties, outputFile)) {
             return;
         }
 
-        try (PrintWriter pw = new PrintWriter(outputFile.toFile(), 
StandardCharsets.ISO_8859_1.name());
-                StringWriter sw = new StringWriter()) {
-
-            properties.store(sw, null);
-
-            List<String> lines = new ArrayList<>();
-            try (BufferedReader r = new BufferedReader(new 
StringReader(sw.toString()))) {
-                String line;
-                while ((line = r.readLine()) != null) {
-                    if (!line.startsWith("#")) {
-                        lines.add(line);
-                    }
-                }
-            }
-
-            Collections.sort(lines);
-            for (String l : lines) {
-                pw.println(l);
+        // For reproducible builds, sort the properties and drop comments.
+        // The java.util.Properties class doesn't guarantee order so we have
+        // to write the file using a Writer.
+        Set<String> propertyNames = unsortedProperties.stringPropertyNames();
+        List<String> sortedPropertyNames = new ArrayList<>(propertyNames);
+        Collections.sort(sortedPropertyNames);
+
+        try (Writer out = Files.newBufferedWriter(outputFile, 
StandardCharsets.ISO_8859_1)) {
+            for (String key : sortedPropertyNames) {
+                out.write(escape(key));
+                out.write("=");
+                out.write(escape(unsortedProperties.getProperty(key)));
+                out.write('\n');
             }
         }
     }
 
+    private static String escape(String s) {
+        String escaped = StringEscapeUtils.escapeJava(s);

Review Comment:
   Yes, I know. I'm working on the additional pieces. That's just the quickest 
way to handle the Unicode part. 





> Canonicalize properties files for reproducible builds
> -----------------------------------------------------
>
>                 Key: MSHARED-1453
>                 URL: https://issues.apache.org/jira/browse/MSHARED-1453
>             Project: Maven Shared Components
>          Issue Type: Bug
>          Components: maven-archiver
>            Reporter: Elliotte Rusty Harold
>            Assignee: Elliotte Rusty Harold
>            Priority: Minor
>
> See discussion on https://github.com/apache/maven-archiver/pull/77/files
> Briefly, properties files have non-unique representations and there's no 
> guarantee two JDKs from different companies and Java versions produce the 
> same byte-per-byte serialization. Our current code accounts for property 
> order and comments, but not variations in escaping (hex vs. UTF-8), separator 
> characters, and insignificant whitespace. 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to