Mercurial > jhg
comparison src/org/tmatesoft/hg/internal/ConfigFileParser.java @ 498:0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Fri, 26 Oct 2012 18:17:15 +0200 |
| parents | 02140be396d5 |
| children |
comparison
equal
deleted
inserted
replaced
| 497:02140be396d5 | 498:0205a5c4566b |
|---|---|
| 14 * the terms of a license other than GNU General Public License | 14 * the terms of a license other than GNU General Public License |
| 15 * contact TMate Software at support@hg4j.com | 15 * contact TMate Software at support@hg4j.com |
| 16 */ | 16 */ |
| 17 package org.tmatesoft.hg.internal; | 17 package org.tmatesoft.hg.internal; |
| 18 | 18 |
| 19 import java.io.ByteArrayInputStream; | |
| 20 import java.io.ByteArrayOutputStream; | 19 import java.io.ByteArrayOutputStream; |
| 21 import java.io.IOException; | 20 import java.io.IOException; |
| 22 import java.io.InputStream; | 21 import java.io.InputStream; |
| 23 import java.io.OutputStream; | 22 import java.io.OutputStream; |
| 24 import java.util.ArrayList; | 23 import java.util.ArrayList; |
| 207 } | 206 } |
| 208 } | 207 } |
| 209 // if section comes more than once, update only first one. | 208 // if section comes more than once, update only first one. |
| 210 processedSections.add(section.name); | 209 processedSections.add(section.name); |
| 211 } | 210 } |
| 211 // push rest of the contents | |
| 212 out.write(contents, contentsOffset, contents.length - contentsOffset); | 212 out.write(contents, contentsOffset, contents.length - contentsOffset); |
| 213 // | |
| 214 // add entries in new sections | |
| 215 LinkedHashSet<String> newSections = new LinkedHashSet<String>(); | |
| 216 for (Iterator<String> it = additions.iterator(); it.hasNext();) { | |
| 217 String s = it.next(); it.next(); it.next(); | |
| 218 if (!processedSections.contains(s)) { | |
| 219 newSections.add(s); | |
| 220 } | |
| 221 } | |
| 222 for (String newSectionName : newSections) { | |
| 223 out.write(String.format("\n[%s]", newSectionName).getBytes()); | |
| 224 for (Iterator<String> it = additions.iterator(); it.hasNext();) { | |
| 225 String s = it.next(), k = it.next(), v = it.next(); | |
| 226 if (newSectionName.equals(s)) { | |
| 227 out.write(String.format("\n%s = %s", k, v).getBytes()); | |
| 228 } | |
| 229 } | |
| 230 out.write("\n".getBytes()); | |
| 231 } | |
| 213 } | 232 } |
| 214 | 233 |
| 215 private void processLine(int lineNumber, int offset, byte[] line) throws IOException { | 234 private void processLine(int lineNumber, int offset, byte[] line) throws IOException { |
| 216 int localOffset = 0, i = 0; | 235 int localOffset = 0, i = 0; |
| 217 while (i < line.length && Character.isWhitespace(line[i])) { | 236 while (i < line.length && Character.isWhitespace(line[i])) { |
| 357 end = endOffset; | 376 end = endOffset; |
| 358 entries = new Entry[e.size()]; | 377 entries = new Entry[e.size()]; |
| 359 e.toArray(entries); | 378 e.toArray(entries); |
| 360 } | 379 } |
| 361 } | 380 } |
| 362 | |
| 363 public static void main(String[] args) throws Exception { | |
| 364 ConfigFileParser p = new ConfigFileParser(); | |
| 365 p.parse(new ByteArrayInputStream(xx.getBytes())); | |
| 366 System.out.println(">>>"); | |
| 367 System.out.println(xx); | |
| 368 System.out.println("==="); | |
| 369 p.add("sect1", "key5", "x"); | |
| 370 ByteArrayOutputStream out = new ByteArrayOutputStream(xx.length()); | |
| 371 p.update(out); | |
| 372 System.out.println(new String(out.toByteArray())); | |
| 373 /* | |
| 374 for (Section s : p.sections) { | |
| 375 System.out.printf("[%s@%d]\n", s.name, s.start); | |
| 376 for (Entry e : s.entries) { | |
| 377 System.out.printf("%s@%d = %d..%d\n", e.name, e.start, e.valueStart, e.valueEnd); | |
| 378 } | |
| 379 } | |
| 380 */ | |
| 381 } | |
| 382 private static final String xx = "#comment1\n [sect1]\nkey = value #not a comment2\n#comment3\nkey2= \nkey3 = \n value1, #cc\n value2\nkey4 = v1,\n v2 \n ,v3\n\n\n[sect2]\nx = a"; | |
| 383 } | 381 } |
